1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
#include <stdio.h>
#include <stdlib.h>
typedef struct {
unsigned char r, g, b, a;
} Colour;
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 c[4];
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];
c[0].r = (float)((palette & (31 << 11)) >> 11) / 32.0f;
c[0].g = (float)((palette & (63 << 5)) >> 5) / 64.0f;
c[0].b = (float)((palette & (31 )) ) / 32.0f;
c[1].r = (float)((palette & (31 << 27)) >> 27) / 32.0f;
c[1].g = (float)((palette & (63 << 21)) >> 21) / 64.0f;
c[1].b = (float)((palette & (31 << 16)) >> 16) / 32.0f;
c[2].r = 2.0f/3.0f*c[0].r + 1.0f/3.0f*c[1].r;
c[2].g = 2.0f/3.0f*c[0].g + 1.0f/3.0f*c[1].g;
c[2].b = 2.0f/3.0f*c[0].b + 1.0f/3.0f*c[1].b;
c[3].r = 1.0f/3.0f*c[0].r + 2.0f/3.0f*c[1].r;
c[3].g = 1.0f/3.0f*c[0].g + 2.0f/3.0f*c[1].g;
c[3].b = 1.0f/3.0f*c[0].b + 2.0f/3.0f*c[1].b;
i = x % 4 + (y % 4) * 4;
i = (indices & (3 << i * 2)) >> i * 2;
r.r = (int)(c[i].r * 255.0f);
r.g = (int)(c[i].g * 255.0f);
r.b = (int)(c[i].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;
}
fseek(infile, 4, SEEK_SET);
fread(&w, 1, 4, infile);
fread(&h, 1, 4, infile);
fseek(infile, 4, SEEK_CUR);
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);
}
}
}
|