diff options
Diffstat (limited to 'src/img.c')
-rw-r--r-- | src/img.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/img.c b/src/img.c new file mode 100644 index 0000000..09f000b --- /dev/null +++ b/src/img.c @@ -0,0 +1,95 @@ +#define QOI_IMPLEMENTATION +#include "../lib/qoi/qoi.h" + +#include <stdio.h> + +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; + } +} |