diff options
Diffstat (limited to 'pxpal.c')
-rw-r--r-- | pxpal.c | 51 |
1 files changed, 51 insertions, 0 deletions
@@ -0,0 +1,51 @@ +#include <stdint.h> +#include <stdio.h> +#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"); +} |