#define QOI_IMPLEMENTATION #include "../lib/qoi/qoi.h" #include typedef struct { unsigned char r, g, b, a; } Color; int pixels(char *index, char *filename) { qoi_desc desc; Color *pixels = qoi_read(filename, &desc, 4); Color colors[16]; int colorsLen = 0; char *compressed = malloc(desc.width * desc.height); for (int i = 0; i < (int) (desc.width * desc.height); i++) { char c = -1; for (int j = 0; j < colorsLen; j++) { if (*((int *) &colors[j]) == *((int *) pixels + i)) { c = j; break; } } if (c == -1) { c = colorsLen; if (colorsLen >= 16) { return 1; } colors[colorsLen++] = pixels[i]; } compressed[i] = c; } printf("const char imagePixels%s[%d * %d] = {\n", index, desc.width, desc.height); for (int y = 0; y < (int) desc.height; y++) { for (int x = 0; x < (int) desc.width; x++) { printf("%d,", compressed[x + y * desc.width]); } printf("\n"); } printf("};\n"); return 0; } int image(char *index, char *filename) { qoi_desc desc; Color *pixels = qoi_read(filename, &desc, 4); Color colors[16]; int colorsLen = 0; char *compressed = malloc(desc.width * desc.height); for (int i = 0; i < (int) (desc.width * desc.height); i++) { char c = -1; for (int j = 0; j < colorsLen; j++) { if (*((int *) &colors[j]) == *((int *) pixels + i)) { c = j; break; } } if (c == -1) { c = colorsLen; if (colorsLen >= 16) { return 1; } colors[colorsLen++] = pixels[i]; } compressed[i] = c; } printf("{\n.width = %d,\n.height = %d,\n.colors = {\n", desc.width, desc.height); for (int i = 0; i < colorsLen; i++) { printf("\t{%u, %u, %u, %u},\n", colors[i].r, colors[i].g, colors[i].b, colors[i].a); } printf("},\n.pixels = imagePixels%s,\n},\n", index); return 0; } int main(int argc, char **argv) { if (argc != 4) { return 1; } if (!strcmp(argv[1], "pixels")) { return pixels(argv[3], argv[2]); } else if (!strcmp(argv[1], "image")) { return image(argv[3], argv[2]); } else { return 1; } }