summaryrefslogtreecommitdiff
path: root/tools/png_dimensions.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/png_dimensions.c')
-rw-r--r--tools/png_dimensions.c62
1 files changed, 14 insertions, 48 deletions
diff --git a/tools/png_dimensions.c b/tools/png_dimensions.c
index 900485bd..aea9c0d0 100644
--- a/tools/png_dimensions.c
+++ b/tools/png_dimensions.c
@@ -1,57 +1,23 @@
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
+#define PROGRAM_NAME "png_dimensions"
+#define USAGE_OPTS "front.png front.dimensions"
-void usage(void) {
- fprintf(stderr, "Usage: png_dimensions infile outfile\n");
- 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);
- int size = fread(bytes, 1, 4, f);
- fclose(f);
- if (size != 4) {
- fprintf(stderr, "failed to read at offset 0x10 in file %s\n", png_filename);
- exit(1);
- }
+#include "common.h"
- width = 0;
- for (i = 0; i < 4; i++) {
- width |= bytes[i] << (8 * (3 - i));
+uint8_t read_png_dimensions(const char *filename) {
+ uint32_t width_px = read_png_width_verbose(filename);
+ if (width_px != 40 && width_px != 48 && width_px != 56) {
+ error_exit("Not a valid width for \"%s\": %" PRIu32 " px\n", filename, width_px);
}
- 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);
+ uint8_t width_tiles = (uint8_t)(width_px / 8);
+ return (width_tiles << 4) | width_tiles;
}
-int main(int argc, char* argv[]) {
+int main(int argc, char *argv[]) {
if (argc < 3) {
- usage();
+ usage_exit(1);
}
- output_dimensions(argv[1], argv[2]);
+
+ uint8_t output_byte = read_png_dimensions(argv[1]);
+ write_u8(argv[2], &output_byte, 1);
return 0;
}