38static double alpha_decode(
const double a0,
const double a1,
int alpha_idx) {
43 case 2:
return (6.0 * a0 + 1.0 * a1) / 7.0;
44 case 3:
return (5.0 * a0 + 2.0 * a1) / 7.0;
45 case 4:
return (4.0 * a0 + 3.0 * a1) / 7.0;
46 case 5:
return (3.0 * a0 + 4.0 * a1) / 7.0;
47 case 6:
return (2.0 * a0 + 5.0 * a1) / 7.0;
48 case 7:
return (1.0 * a0 + 6.0 * a1) / 7.0;
54 case 2:
return (4.0 * a0 + 1.0 * a1) / 5.0;
55 case 3:
return (3.0 * a0 + 2.0 * a1) / 5.0;
56 case 4:
return (2.0 * a0 + 3.0 * a1) / 5.0;
57 case 5:
return (1.0 * a0 + 4.0 * a1) / 5.0;
66 double a, r[4], g[4], b[4];
67 const double alpha_max = (alpha_code & 0xFF) / 255.0;
68 const double alpha_min = ((alpha_code >> 8) & 0xFF) / 255.0;
70 b[0] = (rgb_code & 0x1F) / 31.0;
71 g[0] = ((rgb_code >> 5) & 0x3F) / 63.0;
72 r[0] = ((rgb_code >> 11) & 0x1F) / 31.0;
73 b[1] = ((rgb_code >> 16) & 0x1F) / 31.0;
74 g[1] = ((rgb_code >> 21) & 0x3F) / 63.0;
75 r[1] = ((rgb_code >> 27) & 0x1F) / 31.0;
76 b[2] = (2.0 * b[0] + 1.0 * b[1]) / 3.0;
77 g[2] = (2.0 * g[0] + 1.0 * g[1]) / 3.0;
78 r[2] = (2.0 * r[0] + 1.0 * r[1]) / 3.0;
79 b[3] = (1.0 * b[0] + 2.0 * b[1]) / 3.0;
80 g[3] = (1.0 * g[0] + 2.0 * g[1]) / 3.0;
81 r[3] = (1.0 * r[0] + 2.0 * r[1]) / 3.0;
85 for(y = 0; y < 4; y++) {
86 for(x = 0; x < 4; x++) {
88 rgb_idx = rgb_code & 3;
91 ycocg_to_bgr(x_offset + x, y_offset + y, out, out_stride,
92 a, r[rgb_idx], g[rgb_idx], b[rgb_idx]);
120int main(
int argc,
char** argv) {
121 FILE *in_file, *tga_file;
122 size_t in_size, tga_size;
125 void * tga = 0, * in = 0;
129 usage(argv[0],
"Incorrect argument count.");
134 size_x = atoi(argv[1]);
135 size_y = atoi(argv[2]);
136 if(size_x <= 0 || (size_x & 3) || (size_y <= 0) || (size_y & 3)) {
137 usage(argv[0],
"Image sizes must be positive numbers divisible by 4.");
142 in_size = size_x * size_y;
144 in = malloc(in_size);
145 tga = malloc(tga_size);
147 usage(argv[0],
"Cannot allocate buffers.\n");
152 in_file = fopen(argv[3],
"r");
154 usage(argv[0],
"Could not open input file.");
159 if(1 != fread(in, in_size, 1, in_file)) {
160 usage(argv[0],
"Could not read from input file.");
167 usage(argv[0],
"DXT6 decompression error.");
172 tga_header = (
u8*)tga;
173 *(tga_header + 0) = 0;
174 *(tga_header + 1) = 0;
175 *(tga_header + 2) = 2;
176 *(tga_header + 3) = 0;
177 *(tga_header + 4) = 0;
178 *(tga_header + 5) = 0;
179 *(tga_header + 6) = 0;
180 *(tga_header + 7) = 0;
181 *((
u16*)(tga_header + 8)) = 0;
182 *((
u16*)(tga_header + 10)) = 0;
183 *((
u16*)(tga_header + 12)) = size_x;
184 *((
u16*)(tga_header + 14)) = size_y;
185 *(tga_header + 16) = 24;
186 *(tga_header + 17) = 1 << 5;
189 tga_file = fopen(argv[4],
"w");
191 usage(argv[0],
"Could not open output file for writing.");
196 if(1 != fwrite(tga, tga_size, 1, tga_file)) {
197 usage(argv[0],
"Could not write into output file.");
static int ycocg_to_bgr(int x, int y, u8 *out, int out_stride, double a, double r, double g, double b)
static int dxt5ycocg_block_to_bgr(int x_offset, int y_offset, u8 *out, int out_stride, u64 alpha_code, u64 rgb_code)