summaryrefslogtreecommitdiff
path: root/pxpal.c
diff options
context:
space:
mode:
Diffstat (limited to 'pxpal.c')
-rw-r--r--pxpal.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/pxpal.c b/pxpal.c
new file mode 100644
index 0000000..83f736c
--- /dev/null
+++ b/pxpal.c
@@ -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");
+}