106 satır
1.9 KiB
C
106 satır
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;
|
|
}
|
|
|