#include #include #include "render.h" typedef struct { float r, g, b; } vec3; void lerp(vec3* d, const vec3* a, const vec3* b, float t) { d->r = a->r + t * (b->r - a->r); d->g = a->g + t * (b->g - a->g); d->b = a->b + t * (b->b - a->b); } Colour get_pixel(unsigned* data, int x, int y, int w) { vec3 start, end, col; float t; int i; Colour r = { 0 }; unsigned palette = data[(x / 4 + y / 4 * (w / 4)) * 2]; unsigned indices = data[(x / 4 + y / 4 * (w / 4)) * 2 + 1]; start.r = (float)((palette & (31 << 27)) >> 27) / 32.0f; start.g = (float)((palette & (63 << 21)) >> 21) / 64.0f; start.b = (float)((palette & (31 << 16)) >> 16) / 32.0f; end.r = (float)((palette & (31 << 11)) >> 11) / 32.0f; end.g = (float)((palette & (63 << 5)) >> 5) / 64.0f; end.b = (float)((palette & (31 )) ) / 32.0f; i = x % 4 + (y % 4) * 4; i = (indices & (3 << i * 2)) >> i * 2; t = (float)i / 3.0f; lerp(&col, &start, &end, t); r.r = (int)(col.r * 255.0f); r.g = (int)(col.g * 255.0f); r.b = (int)(col.b * 255.0f); return r; } int main(int argc, const char** argv) { FILE* infile, * outfile; unsigned* data; int w, h, x, y, cw, ch; unsigned palette, indices; vec3 colour; if (argc < 3) { fprintf(stderr, "Usage: %s infile outfile.\n", argv[0]); return 1; } infile = fopen(argv[1], "rb"); if (!infile) { fprintf(stderr, "Failed to open %s.\n", argv[1]); return 2; } outfile = fopen(argv[2], "w"); if (!infile) { fprintf(stderr, "Failed to open %s.\n", argv[2]); return 3; } fread(&w, 1, 4, infile); fread(&h, 1, 4, infile); cw = w / 4; ch = h / 4; data = malloc(cw * ch * 8); fread(data, 1, cw * ch * 8, infile); fprintf(outfile, "P3\n"); fprintf(outfile, "%d %d\n", w, h); fprintf(outfile, "255\n"); for (y = 0; y < h; y++) { for (x = 0; x < w; x++) { Colour c = get_pixel(data, x, y, w); fprintf(outfile, "%d %d %d\n", c.r, c.g, c.b); } } }