1
0
Форкнуть 0
2020-embedded-game-programming/tools/src/palette_processor.c

106 строки
1.9 KiB
C

#include <assert.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
if (argc != 3)
{
fprintf(stderr, "Usage: %s <input palette> <output header>\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;
}