#include #include #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "usage: %s palette.png\n", argv[0]); return 1; } int pal_w, pal_h, pal_col_chans; uint8_t *const pal_data = stbi_load(argv[1], &pal_w, &pal_h, &pal_col_chans, 3); if (pal_data == NULL) { fprintf(stderr, "error: failed to load palette\n"); return 1; } if (pal_col_chans != 3) { fprintf(stderr, "error: palette isn't RGB\n"); stbi_image_free(pal_data); return 1; } if (pal_w * pal_h == 0) { fprintf(stderr, "error: palette size is 0\n"); stbi_image_free(pal_data); return 1; } if (pal_w * pal_h >= 256) { fprintf(stderr, "error: palette size is greater than 255\n"); stbi_image_free(pal_data); return 1; } printf("#include \"px.h\"\n\n" "__attribute__((constructor))\n" "static void set_pxpal(void)\n" "{\n"); for (int i = 0; i < pal_w * pal_h; i++) { printf("\tpxpal[%d].r = %u; " "pxpal[%d].g = %u; " "pxpal[%d].b = %u;\n", i, (unsigned)pal_data[i * 3], i, (unsigned)pal_data[i * 3 + 1], i, (unsigned)pal_data[i * 3 + 2]); } printf("}\n"); }