summaryrefslogtreecommitdiff
path: root/tools/palette.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/palette.c')
-rw-r--r--tools/palette.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/tools/palette.c b/tools/palette.c
new file mode 100644
index 000000000..c1beb40e4
--- /dev/null
+++ b/tools/palette.c
@@ -0,0 +1,89 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+void usage(void) {
+ printf("Usage: palette palfile\n");
+ exit(1);
+}
+
+void print_rgb(uint16_t word) {
+ int r, g, b;
+ r = word & 0x1f;
+ g = (word >> 5) & 0x1f;
+ b = (word >> 10) & 0x1f;
+ printf("\tRGB %2d, %2d, %2d\n", r, g, b);
+}
+
+void print_pokemon_palette(char* palette_filename) {
+ FILE* f;
+ uint8_t bytes[4];
+
+ f = fopen(palette_filename, "rb");
+ if (f == NULL) {
+ fprintf(stderr, "failed to open file %s\n", palette_filename);
+ exit(1);
+ }
+
+ fseek(f, 2, SEEK_SET);
+ fread(bytes, 1, 4, f);
+ fclose(f);
+
+ print_rgb((bytes[1] << 8) | bytes[0]);
+ print_rgb((bytes[3] << 8) | bytes[2]);
+}
+
+void print_palette(char* palette_filename) {
+ FILE* f;
+ uint8_t* bytes;
+ long size;
+ int i;
+
+ f = fopen(palette_filename, "rb");
+ if (f == NULL) {
+ fprintf(stderr, "failed to open file %s\n", palette_filename);
+ exit(1);
+ }
+
+ fseek(f, 0, SEEK_END);
+ size = ftell(f);
+ rewind(f);
+
+ bytes = malloc(size);
+
+ fseek(f, 0, SEEK_SET);
+ fread(bytes, 1, size, f);
+ fclose(f);
+
+ for (i = 0; i + 1 < size; i += 2) {
+ print_rgb((bytes[i + 1] << 8) | bytes[i]);
+ }
+}
+
+int main(int argc, char* argv[]) {
+ int ch;
+ bool pokemon;
+
+ while ((ch = getopt(argc, argv, "p")) != -1) {
+ switch (ch) {
+ case 'p':
+ pokemon = true;
+ break;
+ default:
+ usage();
+ }
+ }
+ argc -= optind;
+ argv += optind;
+ if (argc < 1) {
+ usage();
+ }
+ if (pokemon) {
+ print_pokemon_palette(argv[0]);
+ } else {
+ print_palette(argv[0]);
+ }
+ return 0;
+}