2016-08-25 01:56:07 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
void usage(void) {
|
2017-08-20 16:33:36 +00:00
|
|
|
fprintf(stderr, "Usage: png_dimensions infile outfile\n");
|
2016-08-25 01:56:07 +00:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void output_dimensions(char* png_filename, char* out_filename) {
|
|
|
|
FILE* f;
|
|
|
|
int width, height;
|
|
|
|
int i;
|
|
|
|
uint8_t bytes[4];
|
|
|
|
uint8_t output;
|
|
|
|
|
|
|
|
f = fopen(png_filename, "rb");
|
|
|
|
if (f == NULL) {
|
|
|
|
fprintf(stderr, "failed to open file %s\n", png_filename);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
// width
|
|
|
|
fseek(f, 16, SEEK_SET);
|
2017-12-28 06:25:25 +00:00
|
|
|
int size = fread(bytes, 1, 4, f);
|
2016-08-25 01:56:07 +00:00
|
|
|
fclose(f);
|
2017-12-28 06:25:25 +00:00
|
|
|
if (size != 4) {
|
|
|
|
fprintf(stderr, "failed to read at offset 0x10 in file %s\n", png_filename);
|
|
|
|
exit(1);
|
|
|
|
}
|
2016-08-25 01:56:07 +00:00
|
|
|
|
|
|
|
width = 0;
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
|
|
width |= bytes[i] << (8 * (3 - i));
|
|
|
|
}
|
|
|
|
width >>= 3;
|
|
|
|
height = width;
|
|
|
|
|
|
|
|
output = width & 0xf;
|
|
|
|
output |= (height & 0xf) << 4;
|
|
|
|
|
|
|
|
f = fopen(out_filename, "wb");
|
|
|
|
if (f == NULL) {
|
|
|
|
fprintf(stderr, "failed to open file %s\n", out_filename);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
fwrite(&output, 1, 1, f);
|
|
|
|
fclose(f);
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char* argv[]) {
|
|
|
|
if (argc < 3) {
|
|
|
|
usage();
|
|
|
|
}
|
|
|
|
output_dimensions(argv[1], argv[2]);
|
|
|
|
return 0;
|
|
|
|
}
|