1 /* 2 ** Copyright 2004, Marcus Overhagen. All rights reserved. 3 ** Distributed under the terms of the MIT license. 4 ** 5 ** This file generates the lookup tables used by image 6 ** format conversion from planar YCbCr420 format to 7 ** linear RGB32 format in file gfx_conv_c_lookup.cpp 8 */ 9 10 #include <strings.h> 11 #include <stdio.h> 12 13 double precision = 32768.0; 14 int shift = 15; 15 16 /* 17 R = 1.164(Y � 16) + 1.596(Cr � 128) 18 G = 1.164(Y - 16) � 0.813(Cr � 128) � 0.392(Cb � 128) 19 B = 1.164(Y � 16) + 2.017(Cb � 128) 20 */ 21 22 int main() 23 { 24 printf("const int32 Cb_Gtab[256] = {\n\t"); 25 for (int i = 0; i < 256; i++) { 26 int Cr_R = (- 128 + i) * 1.596 * precision + 0.5; 27 int Cr_G = (- 128 + i) * -0.813 * precision + 0.5; 28 int Cb_G = (- 128 + i) * -0.392 * precision + 0.5; 29 int Cb_B = (- 128 + i) * 2.017 * precision + 0.5; 30 printf("%d, ", Cb_G); 31 if ((i % 10) == 9) 32 printf("\n\t"); 33 } 34 printf("\n};\n\n"); 35 36 printf("const int32 Cb_Btab[256] = {\n\t"); 37 for (int i = 0; i < 256; i++) { 38 int Cr_R = (- 128 + i) * 1.596 * precision + 0.5; 39 int Cr_G = (- 128 + i) * -0.813 * precision + 0.5; 40 int Cb_G = (- 128 + i) * -0.392 * precision + 0.5; 41 int Cb_B = (- 128 + i) * 2.017 * precision + 0.5; 42 printf("%d, ", Cb_B); 43 if ((i % 10) == 9) 44 printf("\n\t"); 45 } 46 printf("\n};\n\n"); 47 48 printf("const int32 Cr_Rtab[256] = {\n\t"); 49 for (int i = 0; i < 256; i++) { 50 int Cr_R = (- 128 + i) * 1.596 * precision + 0.5; 51 int Cr_G = (- 128 + i) * -0.813 * precision + 0.5; 52 int Cb_G = (- 128 + i) * -0.392 * precision + 0.5; 53 int Cb_B = (- 128 + i) * 2.017 * precision + 0.5; 54 printf("%d, ", Cr_R); 55 if ((i % 10) == 9) 56 printf("\n\t"); 57 } 58 printf("\n};\n\n"); 59 60 printf("const int32 Cr_Gtab[256] = {\n\t"); 61 for (int i = 0; i < 256; i++) { 62 int Cr_R = (- 128 + i) * 1.596 * precision + 0.5; 63 int Cr_G = (- 128 + i) * -0.813 * precision + 0.5; 64 int Cb_G = (- 128 + i) * -0.392 * precision + 0.5; 65 int Cb_B = (- 128 + i) * 2.017 * precision + 0.5; 66 printf("%d, ", Cr_G); 67 if ((i % 10) == 9) 68 printf("\n\t"); 69 } 70 printf("\n};\n\n"); 71 72 printf("const int32 Ytab[256] = {\n\t"); 73 for (int i = 0; i < 256; i++) { 74 int Y = (i - 16) * 1.164 * precision + 0.5; 75 printf("%d, ", Y); 76 if ((i % 10) == 9) 77 printf("\n\t"); 78 } 79 printf("\n};\n\n"); 80 81 int Ymin = (0 - 16) * 1.164 * precision + 0.5; 82 int Ymax = (255 - 16) * 1.164 * precision + 0.5; 83 84 int Cr_Rmin = (- 128 + 0) * 1.596 * precision + 0.5; 85 int Cr_Rmax = (- 128 + 255) * 1.596 * precision + 0.5; 86 int Cr_Gmin = (- 128 + 255) * -0.813 * precision + 0.5; 87 int Cr_Gmax = (- 128 + 0) * -0.813 * precision + 0.5; 88 int Cb_Gmin = (- 128 + 255) * -0.392 * precision + 0.5; 89 int Cb_Gmax = (- 128 + 0) * -0.392 * precision + 0.5; 90 int Cb_Bmin = (- 128 + 0) * 2.017 * precision + 0.5; 91 int Cb_Bmax = (- 128 + 255) * 2.017 * precision + 0.5; 92 93 printf("Cr_Rmin %d\n", Cr_Rmin); 94 printf("Cr_Rmax %d\n", Cr_Rmax); 95 printf("Cr_Gmin %d\n", Cr_Gmin); 96 printf("Cr_Gmax %d\n", Cr_Gmax); 97 printf("Cb_Gmin %d\n", Cb_Gmin); 98 printf("Cb_Gmax %d\n", Cb_Gmax); 99 printf("Cb_Bmin %d\n", Cb_Bmin); 100 printf("Cb_Bmax %d\n", Cb_Bmax); 101 102 int Rmax = (Ymax + Cr_Rmax) >> shift; 103 int Rmin = (Ymin + Cr_Rmin) >> shift; 104 int Gmax = (Ymax + Cr_Gmax + Cb_Gmax) >> shift; 105 int Gmin = (Ymin + Cr_Gmin + Cb_Gmin) >> shift; 106 int Bmax = (Ymax + Cb_Bmax) >> shift; 107 int Bmin = (Ymin + Cb_Bmin) >> shift; 108 109 printf("Rmax %d\n", Rmax); 110 printf("Rmin %d\n", Rmin); 111 printf("Gmax %d\n", Gmax); 112 printf("Gmin %d\n", Gmin); 113 printf("Bmax %d\n", Bmax); 114 printf("Bmin %d\n", Bmin); 115 116 int num_Rneg = (Rmin < 0) ? -Rmin : 0; 117 int num_Rpos = (Rmax > 255) ? Rmax - 255 : 0; 118 int num_Rent = num_Rneg + 256 + num_Rpos; 119 120 printf("num_Rneg %d\n", num_Rneg); 121 printf("num_Rpos %d\n", num_Rpos); 122 printf("num_Rent %d\n", num_Rent); 123 124 printf("const uint32 Rsat[%d] = {\n\t", num_Rent); 125 for (int i = 0; i < num_Rneg; i++) { 126 printf("0x000000, "); 127 if ((i % 10) == 9) 128 printf("\n\t"); 129 } 130 printf("\n\t"); 131 for (int i = 0; i < 256; i++) { 132 printf("0x%06x, ", i << 16); 133 if ((i % 10) == 9) 134 printf("\n\t"); 135 } 136 printf("\n\t"); 137 for (int i = 0; i < num_Rpos; i++) { 138 printf("0x%06x, ", 255 << 16); 139 if ((i % 10) == 9) 140 printf("\n\t"); 141 } 142 printf("\n};\n"); 143 printf("const uint32 *Rtab = &Rsat[%d];\n\n", num_Rneg); 144 145 146 147 int num_Gneg = (Gmin < 0) ? -Gmin : 0; 148 int num_Gpos = (Gmax > 255) ? Gmax - 255 : 0; 149 int num_Gent = num_Gneg + 256 + num_Gpos; 150 151 printf("num_Gneg %d\n", num_Gneg); 152 printf("num_Gpos %d\n", num_Gpos); 153 printf("num_Gent %d\n", num_Gent); 154 155 printf("const uint32 Gsat[%d] = {\n\t", num_Gent); 156 for (int i = 0; i < num_Gneg; i++) { 157 printf("0x000000, "); 158 if ((i % 10) == 9) 159 printf("\n\t"); 160 } 161 printf("\n\t"); 162 for (int i = 0; i < 256; i++) { 163 printf("0x%06x, ", i << 8); 164 if ((i % 10) == 9) 165 printf("\n\t"); 166 } 167 printf("\n\t"); 168 for (int i = 0; i < num_Gpos; i++) { 169 printf("0x%06x, ", 255 << 8); 170 if ((i % 10) == 9) 171 printf("\n\t"); 172 } 173 printf("\n};\n"); 174 printf("const uint32 *Gtab = &Gsat[%d];\n\n", num_Gneg); 175 176 177 int num_Bneg = (Bmin < 0) ? -Bmin : 0; 178 int num_Bpos = (Bmax > 255) ? Bmax - 255 : 0; 179 int num_Bent = num_Bneg + 256 + num_Bpos; 180 181 printf("num_Bneg %d\n", num_Bneg); 182 printf("num_Bpos %d\n", num_Bpos); 183 printf("num_Bent %d\n", num_Bent); 184 185 printf("const uint32 Bsat[%d] = {\n\t", num_Bent); 186 for (int i = 0; i < num_Bneg; i++) { 187 printf("0x000000, "); 188 if ((i % 10) == 9) 189 printf("\n\t"); 190 } 191 printf("\n\t"); 192 for (int i = 0; i < 256; i++) { 193 printf("0x%06x, ", i << 0); 194 if ((i % 10) == 9) 195 printf("\n\t"); 196 } 197 printf("\n\t"); 198 for (int i = 0; i < num_Bpos; i++) { 199 printf("0x%06x, ", 255 << 0); 200 if ((i % 10) == 9) 201 printf("\n\t"); 202 } 203 printf("\n};\n"); 204 printf("const uint32 *Btab = &Bsat[%d];\n\n", num_Bneg); 205 206 return 0; 207 } 208