CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
hrydgard

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: hrydgard/ppsspp
Path: blob/master/ext/native/tools/zimtool.cpp
Views: 1401
1
#include <cstring>
2
#include <cstdlib>
3
#include <cstdio>
4
5
#include "Common/Data/Format/PNGLoad.h"
6
#include "Common/Data/Format/ZIMLoad.h"
7
#include "Common/Data/Format/ZIMSave.h"
8
9
#include "Common/Common.h"
10
11
char magic[5] = "ZIMG";
12
13
const char *format_strings[4] = { "8888", "4444", "565", "ETC1" };
14
int formats[3] = { ZIM_RGBA8888, ZIM_RGBA4444, ZIM_RGB565 };
15
16
void printusage() {
17
fprintf(stderr, "Usage: zimtool infile.png outfile.zim [-f=FORMAT] [-m] [-g] [-z[LEVEL]]\n");
18
fprintf(stderr, "Formats: 8888 4444 565 ETC1\n");
19
}
20
21
int filesize(const char *filename) {
22
FILE *f = fopen(filename, "rb");
23
fseek(f, 0, SEEK_END);
24
int sz = ftell(f);
25
fclose(f);
26
return sz;
27
}
28
29
int main(int argc, char **argv) {
30
// Parse command line arguments.
31
const char *FLAGS_infile;
32
const char *FLAGS_outfile;
33
if (argc >= 3) {
34
FLAGS_infile = argv[1];
35
FLAGS_outfile = argv[2];
36
} else {
37
fprintf(stderr, "ERROR: Not enough parameters.\n");
38
printusage();
39
return 1;
40
}
41
42
int flags = 0;
43
int level = 0;
44
bool format_set = false;
45
for (int i = 3; i < argc; i++) {
46
if (argv[i][0] != '-') {
47
fprintf(stderr, "Additional arguments must start with '-'\n");
48
return 1;
49
}
50
switch (argv[i][1]) {
51
case 'm':
52
flags |= ZIM_HAS_MIPS;
53
// Generates mips directly here. We can generate gamma
54
// corrected mips, and mips for ETC1.
55
break;
56
case 'g':
57
flags |= ZIM_GEN_MIPS;
58
break;
59
case 'c':
60
flags |= ZIM_CLAMP;
61
break;
62
case 'f':
63
{
64
for (int j = 0; j < 4; j++) {
65
if (!strcmp(format_strings[j], argv[i] + 3)) {
66
flags |= j;
67
format_set = true;
68
}
69
}
70
}
71
break;
72
case 'z':
73
flags |= ZIM_ZSTD_COMPRESSED;
74
if (argv[i][2] != '\0') {
75
int pos = 2;
76
while (argv[i][pos] >= '0' && argv[i][pos] <= '9') {
77
level = level * 10 + argv[i][pos] - '0';
78
pos++;
79
}
80
}
81
break;
82
}
83
}
84
// TODO: make setting?
85
flags |= ZIM_ETC1_MEDIUM;
86
if (!format_set) {
87
fprintf(stderr, "Must set format\n");
88
printusage();
89
return 1;
90
}
91
92
uint8_t *image_data;
93
int width, height;
94
if (1 != pngLoad(FLAGS_infile, &width, &height, &image_data)) {
95
fprintf(stderr, "Input not a PNG file\n");
96
printusage();
97
return 1;
98
}
99
100
FILE *f = fopen(FLAGS_outfile, "wb");
101
SaveZIM(f, width, height, width * 4, flags, image_data, level);
102
fclose(f);
103
int in_file_size = filesize(FLAGS_infile);
104
int out_file_size = filesize(FLAGS_outfile);
105
fprintf(stdout, "Converted %s to %s. %i b to %i b. %ix%i, %s.\n", FLAGS_infile, FLAGS_outfile, in_file_size, out_file_size, width, height, format_strings[flags & ZIM_FORMAT_MASK]);
106
return 0;
107
}
108
109