Back to shtanton's homepage
summaryrefslogtreecommitdiff
path: root/src/img.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/img.c')
-rw-r--r--src/img.c95
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;
+ }
+}