#include #include #include #include #include int main(int argc, char** argv) { if (argc != 3) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } const char* inFilename = argv[1]; const char* outFilename = argv[2]; // Read the file uint16_t* palette; int paletteSize; { FILE* inFile = fopen(inFilename, "r"); assert(inFile); char* line; size_t len = 0; getline(&line, &len, inFile); assert(strncmp(line, "JASC-PAL", 8) == 0); getline(&line, &len, inFile); assert(strncmp(line, "0100", 4) == 0); getline(&line, &len, inFile); paletteSize = atoi(line); palette = malloc(sizeof(*palette) * paletteSize); assert(palette); // Each line is of form R G B for (int i = 0; i < paletteSize; ++i) { getline(&line, &len, inFile); char* tok = strtok(line, " "); int red = atoi(tok); tok = strtok(NULL, " "); int green = atoi(tok); tok = strtok(NULL, " "); int blue = atoi(tok); uint16_t rgb565 = ((red >> 3u) << 11u) | ((green >> 2u) << 5u) | (blue >> 3u); uint16_t endianSwap = ((rgb565 & 0xFFu) << 8u) | (rgb565 >> 8u); palette[i] = endianSwap; } fclose(inFile); } printf("Input: %s\n", inFilename); printf("Output: %s\n", outFilename); printf("Palette Size: %d\n", paletteSize); // Output to the file { FILE* outFile = fopen(outFilename, "w"); assert(outFile); fprintf(outFile, "// AUTOMATICALLY GENERATED. DO NOT EDIT.\n"); fprintf(outFile, "\n"); fprintf(outFile, "#pragma once\n"); fprintf(outFile, "\n"); fprintf(outFile, "\n"); fprintf(outFile, "uint16_t palette[%d] =\n", paletteSize); fprintf(outFile, "{\n"); for (int i = 0; i < paletteSize; ++i) { fprintf(outFile, " 0x%04X,\n", palette[i]); } fprintf(outFile, "};\n"); fprintf(outFile, "\n"); fclose(outFile); } printf("\n"); printf("DONE\n"); return 0; }