• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // imageformats.h: Defines image format types with functions for mip generation
8 // and copying.
9 
10 #ifndef LIBGLESV2_RENDERER_IMAGEFORMATS_H_
11 #define LIBGLESV2_RENDERER_IMAGEFORMATS_H_
12 
13 #include "common/mathutil.h"
14 
15 namespace rx
16 {
17 
18 // Several structures share functionality for reading, writing or mipmapping but the layout
19 // must match the texture format which the structure represents. If collapsing or typedefing
20 // structs in this header, make sure the functionality and memory layout is exactly the same.
21 
22 struct L8
23 {
24     unsigned char L;
25 
readColorL826     static void readColor(gl::ColorF *dst, const L8 *src)
27     {
28         const float lum = gl::normalizedToFloat(src->L);
29         dst->red   = lum;
30         dst->green = lum;
31         dst->blue  = lum;
32         dst->alpha = 1.0f;
33     }
34 
writeColorL835     static void writeColor(L8 *dst, const gl::ColorF *src)
36     {
37         dst->L = gl::floatToNormalized<unsigned char>((src->red + src->green + src->blue) / 3.0f);
38     }
39 
averageL840     static void average(L8 *dst, const L8 *src1, const L8 *src2)
41     {
42         dst->L = gl::average(src1->L, src2->L);
43     }
44 };
45 
46 struct R8
47 {
48     unsigned char R;
49 
readColorR850     static void readColor(gl::ColorF *dst, const R8 *src)
51     {
52         dst->red   = gl::normalizedToFloat(src->R);
53         dst->green = 0.0f;
54         dst->blue  = 0.0f;
55         dst->alpha = 1.0f;
56     }
57 
readColorR858     static void readColor(gl::ColorUI *dst, const R8 *src)
59     {
60         dst->red   = src->R;
61         dst->green = 0;
62         dst->blue  = 0;
63         dst->alpha = 1;
64     }
65 
writeColorR866     static void writeColor(R8 *dst, const gl::ColorF *src)
67     {
68         dst->R = gl::floatToNormalized<unsigned char>(src->red);
69     }
70 
writeColorR871     static void writeColor(R8 *dst, const gl::ColorUI *src)
72     {
73         dst->R = static_cast<unsigned char>(src->red);
74     }
75 
averageR876     static void average(R8 *dst, const R8 *src1, const R8 *src2)
77     {
78         dst->R = gl::average(src1->R, src2->R);
79     }
80 };
81 
82 struct A8
83 {
84     unsigned char A;
85 
readColorA886     static void readColor(gl::ColorF *dst, const A8 *src)
87     {
88         dst->red   = 0.0f;
89         dst->green = 0.0f;
90         dst->blue  = 0.0f;
91         dst->alpha = gl::normalizedToFloat(src->A);
92     }
93 
writeColorA894     static void writeColor(A8 *dst, const gl::ColorF *src)
95     {
96         dst->A = gl::floatToNormalized<unsigned char>(src->alpha);
97     }
98 
averageA899     static void average(A8 *dst, const A8 *src1, const A8 *src2)
100     {
101         dst->A = gl::average(src1->A, src2->A);
102     }
103 };
104 
105 struct L8A8
106 {
107     unsigned char L;
108     unsigned char A;
109 
readColorL8A8110     static void readColor(gl::ColorF *dst, const L8A8 *src)
111     {
112         const float lum = gl::normalizedToFloat(src->L);
113         dst->red   = lum;
114         dst->green = lum;
115         dst->blue  = lum;
116         dst->alpha = gl::normalizedToFloat(src->A);
117     }
118 
writeColorL8A8119     static void writeColor(L8A8 *dst, const gl::ColorF *src)
120     {
121         dst->L = gl::floatToNormalized<unsigned char>((src->red + src->green + src->blue) / 3.0f);
122         dst->A = gl::floatToNormalized<unsigned char>(src->alpha);
123     }
124 
averageL8A8125     static void average(L8A8 *dst, const L8A8 *src1, const L8A8 *src2)
126     {
127         *(unsigned short*)dst = (((*(unsigned short*)src1 ^ *(unsigned short*)src2) & 0xFEFE) >> 1) + (*(unsigned short*)src1 & *(unsigned short*)src2);
128     }
129 };
130 
131 struct A8L8
132 {
133     unsigned char A;
134     unsigned char L;
135 
readColorA8L8136     static void readColor(gl::ColorF *dst, const A8L8 *src)
137     {
138         const float lum = gl::normalizedToFloat(src->L);
139         dst->red   = lum;
140         dst->green = lum;
141         dst->blue  = lum;
142         dst->alpha = gl::normalizedToFloat(src->A);
143     }
144 
writeColorA8L8145     static void writeColor(A8L8 *dst, const gl::ColorF *src)
146     {
147         dst->L = gl::floatToNormalized<unsigned char>((src->red + src->green + src->blue) / 3.0f);
148         dst->A = gl::floatToNormalized<unsigned char>(src->alpha);
149     }
150 
averageA8L8151     static void average(A8L8 *dst, const A8L8 *src1, const A8L8 *src2)
152     {
153         *(unsigned short*)dst = (((*(unsigned short*)src1 ^ *(unsigned short*)src2) & 0xFEFE) >> 1) + (*(unsigned short*)src1 & *(unsigned short*)src2);
154     }
155 };
156 
157 struct R8G8
158 {
159     unsigned char R;
160     unsigned char G;
161 
readColorR8G8162     static void readColor(gl::ColorF *dst, const R8G8 *src)
163     {
164         dst->red   = gl::normalizedToFloat(src->R);
165         dst->green = gl::normalizedToFloat(src->G);
166         dst->blue  = 0.0f;
167         dst->alpha = 1.0f;
168     }
169 
readColorR8G8170     static void readColor(gl::ColorUI *dst, const R8G8 *src)
171     {
172         dst->red   = src->R;
173         dst->green = src->G;
174         dst->blue  = 0;
175         dst->alpha = 1;
176     }
177 
writeColorR8G8178     static void writeColor(R8G8 *dst, const gl::ColorF *src)
179     {
180         dst->R = gl::floatToNormalized<unsigned char>(src->red);
181         dst->G = gl::floatToNormalized<unsigned char>(src->green);
182     }
183 
writeColorR8G8184     static void writeColor(R8G8 *dst, const gl::ColorUI *src)
185     {
186         dst->R = static_cast<unsigned char>(src->red);
187         dst->G = static_cast<unsigned char>(src->green);
188     }
189 
averageR8G8190     static void average(R8G8 *dst, const R8G8 *src1, const R8G8 *src2)
191     {
192         *(unsigned short*)dst = (((*(unsigned short*)src1 ^ *(unsigned short*)src2) & 0xFEFE) >> 1) + (*(unsigned short*)src1 & *(unsigned short*)src2);
193     }
194 };
195 
196 struct R8G8B8
197 {
198     unsigned char R;
199     unsigned char G;
200     unsigned char B;
201 
readColorR8G8B8202     static void readColor(gl::ColorF *dst, const R8G8B8 *src)
203     {
204         dst->red   = gl::normalizedToFloat(src->R);
205         dst->green = gl::normalizedToFloat(src->G);
206         dst->blue  = gl::normalizedToFloat(src->B);
207         dst->alpha = 1.0f;
208     }
209 
readColorR8G8B8210     static void readColor(gl::ColorUI *dst, const R8G8B8 *src)
211     {
212         dst->red   = src->R;
213         dst->green = src->G;
214         dst->blue  = src->G;
215         dst->alpha = 1;
216     }
217 
writeColorR8G8B8218     static void writeColor(R8G8B8 *dst, const gl::ColorF *src)
219     {
220         dst->R = gl::floatToNormalized<unsigned char>(src->red);
221         dst->G = gl::floatToNormalized<unsigned char>(src->green);
222         dst->B = gl::floatToNormalized<unsigned char>(src->blue);
223     }
224 
writeColorR8G8B8225     static void writeColor(R8G8B8 *dst, const gl::ColorUI *src)
226     {
227         dst->R = static_cast<unsigned char>(src->red);
228         dst->G = static_cast<unsigned char>(src->green);
229         dst->B = static_cast<unsigned char>(src->blue);
230     }
231 
averageR8G8B8232     static void average(R8G8B8 *dst, const R8G8B8 *src1, const R8G8B8 *src2)
233     {
234         dst->R = gl::average(src1->R, src2->R);
235         dst->G = gl::average(src1->G, src2->G);
236         dst->B = gl::average(src1->B, src2->B);
237     }
238 };
239 
240 struct B8G8R8
241 {
242     unsigned char B;
243     unsigned char G;
244     unsigned char R;
245 
readColorB8G8R8246     static void readColor(gl::ColorF *dst, const B8G8R8 *src)
247     {
248         dst->red   = gl::normalizedToFloat(src->R);
249         dst->green = gl::normalizedToFloat(src->G);
250         dst->blue  = gl::normalizedToFloat(src->B);
251         dst->alpha = 1.0f;
252     }
253 
readColorB8G8R8254     static void readColor(gl::ColorUI *dst, const B8G8R8 *src)
255     {
256         dst->red   = src->R;
257         dst->green = src->G;
258         dst->blue  = src->G;
259         dst->alpha = 1;
260     }
261 
writeColorB8G8R8262     static void writeColor(B8G8R8 *dst, const gl::ColorF *src)
263     {
264         dst->R = gl::floatToNormalized<unsigned char>(src->red);
265         dst->G = gl::floatToNormalized<unsigned char>(src->green);
266         dst->B = gl::floatToNormalized<unsigned char>(src->blue);
267     }
268 
writeColorB8G8R8269     static void writeColor(B8G8R8 *dst, const gl::ColorUI *src)
270     {
271         dst->R = static_cast<unsigned char>(src->red);
272         dst->G = static_cast<unsigned char>(src->green);
273         dst->B = static_cast<unsigned char>(src->blue);
274     }
275 
averageB8G8R8276     static void average(B8G8R8 *dst, const B8G8R8 *src1, const B8G8R8 *src2)
277     {
278         dst->R = gl::average(src1->R, src2->R);
279         dst->G = gl::average(src1->G, src2->G);
280         dst->B = gl::average(src1->B, src2->B);
281     }
282 };
283 
284 struct R5G6B5
285 {
286     unsigned short RGB;
287 
readColorR5G6B5288     static void readColor(gl::ColorF *dst, const R5G6B5 *src)
289     {
290         dst->red   = gl::normalizedToFloat<5>(gl::getShiftedData<5, 11>(src->RGB));
291         dst->green = gl::normalizedToFloat<6>(gl::getShiftedData<6,  5>(src->RGB));
292         dst->blue  = gl::normalizedToFloat<5>(gl::getShiftedData<5,  0>(src->RGB));
293         dst->alpha = 1.0f;
294     }
295 
writeColorR5G6B5296     static void writeColor(R5G6B5 *dst, const gl::ColorF *src)
297     {
298         dst->RGB = gl::shiftData<5, 11>(gl::floatToNormalized<5, unsigned short>(src->red))   |
299                    gl::shiftData<6,  5>(gl::floatToNormalized<6, unsigned short>(src->green)) |
300                    gl::shiftData<5,  0>(gl::floatToNormalized<5, unsigned short>(src->blue));
301     }
302 
averageR5G6B5303     static void average(R5G6B5 *dst, const R5G6B5 *src1, const R5G6B5 *src2)
304     {
305         dst->RGB = gl::shiftData<5, 11>(gl::average(gl::getShiftedData<5, 11>(src1->RGB), gl::getShiftedData<5, 11>(src2->RGB))) |
306                    gl::shiftData<6,  5>(gl::average(gl::getShiftedData<6,  5>(src1->RGB), gl::getShiftedData<6,  5>(src2->RGB))) |
307                    gl::shiftData<5,  0>(gl::average(gl::getShiftedData<5,  0>(src1->RGB), gl::getShiftedData<5,  0>(src2->RGB)));
308     }
309 };
310 
311 struct A8R8G8B8
312 {
313     unsigned char A;
314     unsigned char R;
315     unsigned char G;
316     unsigned char B;
317 
readColorA8R8G8B8318     static void readColor(gl::ColorF *dst, const A8R8G8B8 *src)
319     {
320         dst->red   = gl::normalizedToFloat(src->R);
321         dst->green = gl::normalizedToFloat(src->G);
322         dst->blue  = gl::normalizedToFloat(src->B);
323         dst->alpha = gl::normalizedToFloat(src->A);
324     }
325 
readColorA8R8G8B8326     static void readColor(gl::ColorUI *dst, const A8R8G8B8 *src)
327     {
328         dst->red   = src->R;
329         dst->green = src->G;
330         dst->blue  = src->B;
331         dst->alpha = src->A;
332     }
333 
writeColorA8R8G8B8334     static void writeColor(A8R8G8B8 *dst, const gl::ColorF *src)
335     {
336         dst->R = gl::floatToNormalized<unsigned char>(src->red);
337         dst->G = gl::floatToNormalized<unsigned char>(src->green);
338         dst->B = gl::floatToNormalized<unsigned char>(src->blue);
339         dst->A = gl::floatToNormalized<unsigned char>(src->alpha);
340     }
341 
writeColorA8R8G8B8342     static void writeColor(A8R8G8B8 *dst, const gl::ColorUI *src)
343     {
344         dst->R = static_cast<unsigned char>(src->red);
345         dst->G = static_cast<unsigned char>(src->green);
346         dst->B = static_cast<unsigned char>(src->blue);
347         dst->A = static_cast<unsigned char>(src->alpha);
348     }
349 
averageA8R8G8B8350     static void average(A8R8G8B8 *dst, const A8R8G8B8 *src1, const A8R8G8B8 *src2)
351     {
352         *(unsigned int*)dst = (((*(unsigned int*)src1 ^ *(unsigned int*)src2) & 0xFEFEFEFE) >> 1) + (*(unsigned int*)src1 & *(unsigned int*)src2);
353     }
354 };
355 
356 struct R8G8B8A8
357 {
358     unsigned char R;
359     unsigned char G;
360     unsigned char B;
361     unsigned char A;
362 
readColorR8G8B8A8363     static void readColor(gl::ColorF *dst, const R8G8B8A8 *src)
364     {
365         dst->red   = gl::normalizedToFloat(src->R);
366         dst->green = gl::normalizedToFloat(src->G);
367         dst->blue  = gl::normalizedToFloat(src->B);
368         dst->alpha = gl::normalizedToFloat(src->A);
369     }
370 
readColorR8G8B8A8371     static void readColor(gl::ColorUI *dst, const R8G8B8A8 *src)
372     {
373         dst->red   = src->R;
374         dst->green = src->G;
375         dst->blue  = src->B;
376         dst->alpha = src->A;
377     }
378 
writeColorR8G8B8A8379     static void writeColor(R8G8B8A8 *dst, const gl::ColorF *src)
380     {
381         dst->R = gl::floatToNormalized<unsigned char>(src->red);
382         dst->G = gl::floatToNormalized<unsigned char>(src->green);
383         dst->B = gl::floatToNormalized<unsigned char>(src->blue);
384         dst->A = gl::floatToNormalized<unsigned char>(src->alpha);
385     }
386 
writeColorR8G8B8A8387     static void writeColor(R8G8B8A8 *dst, const gl::ColorUI *src)
388     {
389         dst->R = static_cast<unsigned char>(src->red);
390         dst->G = static_cast<unsigned char>(src->green);
391         dst->B = static_cast<unsigned char>(src->blue);
392         dst->A = static_cast<unsigned char>(src->alpha);
393     }
394 
averageR8G8B8A8395     static void average(R8G8B8A8 *dst, const R8G8B8A8 *src1, const R8G8B8A8 *src2)
396     {
397         *(unsigned int*)dst = (((*(unsigned int*)src1 ^ *(unsigned int*)src2) & 0xFEFEFEFE) >> 1) + (*(unsigned int*)src1 & *(unsigned int*)src2);
398     }
399 };
400 
401 struct B8G8R8A8
402 {
403     unsigned char B;
404     unsigned char G;
405     unsigned char R;
406     unsigned char A;
407 
readColorB8G8R8A8408     static void readColor(gl::ColorF *dst, const B8G8R8A8 *src)
409     {
410         dst->red   = gl::normalizedToFloat(src->R);
411         dst->green = gl::normalizedToFloat(src->G);
412         dst->blue  = gl::normalizedToFloat(src->B);
413         dst->alpha = gl::normalizedToFloat(src->A);
414     }
415 
readColorB8G8R8A8416     static void readColor(gl::ColorUI *dst, const B8G8R8A8 *src)
417     {
418         dst->red   = src->R;
419         dst->green = src->G;
420         dst->blue  = src->B;
421         dst->alpha = src->A;
422     }
423 
writeColorB8G8R8A8424     static void writeColor(B8G8R8A8 *dst, const gl::ColorF *src)
425     {
426         dst->R = gl::floatToNormalized<unsigned char>(src->red);
427         dst->G = gl::floatToNormalized<unsigned char>(src->green);
428         dst->B = gl::floatToNormalized<unsigned char>(src->blue);
429         dst->A = gl::floatToNormalized<unsigned char>(src->alpha);
430     }
431 
writeColorB8G8R8A8432     static void writeColor(B8G8R8A8 *dst, const gl::ColorUI *src)
433     {
434         dst->R = static_cast<unsigned char>(src->red);
435         dst->G = static_cast<unsigned char>(src->green);
436         dst->B = static_cast<unsigned char>(src->blue);
437         dst->A = static_cast<unsigned char>(src->alpha);
438     }
439 
averageB8G8R8A8440     static void average(B8G8R8A8 *dst, const B8G8R8A8 *src1, const B8G8R8A8 *src2)
441     {
442         *(unsigned int*)dst = (((*(unsigned int*)src1 ^ *(unsigned int*)src2) & 0xFEFEFEFE) >> 1) + (*(unsigned int*)src1 & *(unsigned int*)src2);
443     }
444 };
445 
446 struct B8G8R8X8
447 {
448     unsigned char B;
449     unsigned char G;
450     unsigned char R;
451     unsigned char X;
452 
readColorB8G8R8X8453     static void readColor(gl::ColorF *dst, const B8G8R8X8 *src)
454     {
455         dst->red = gl::normalizedToFloat(src->R);
456         dst->green = gl::normalizedToFloat(src->G);
457         dst->blue = gl::normalizedToFloat(src->B);
458         dst->alpha = 1.0f;
459     }
460 
readColorB8G8R8X8461     static void readColor(gl::ColorUI *dst, const B8G8R8X8 *src)
462     {
463         dst->red = src->R;
464         dst->green = src->G;
465         dst->blue = src->B;
466         dst->alpha = 1;
467     }
468 
writeColorB8G8R8X8469     static void writeColor(B8G8R8X8 *dst, const gl::ColorF *src)
470     {
471         dst->R = gl::floatToNormalized<unsigned char>(src->red);
472         dst->G = gl::floatToNormalized<unsigned char>(src->green);
473         dst->B = gl::floatToNormalized<unsigned char>(src->blue);
474         dst->X = 255;
475     }
476 
writeColorB8G8R8X8477     static void writeColor(B8G8R8X8 *dst, const gl::ColorUI *src)
478     {
479         dst->R = static_cast<unsigned char>(src->red);
480         dst->G = static_cast<unsigned char>(src->green);
481         dst->B = static_cast<unsigned char>(src->blue);
482         dst->X = 255;
483     }
484 
averageB8G8R8X8485     static void average(B8G8R8X8 *dst, const B8G8R8X8 *src1, const B8G8R8X8 *src2)
486     {
487         *(unsigned int*)dst = (((*(unsigned int*)src1 ^ *(unsigned int*)src2) & 0xFEFEFEFE) >> 1) + (*(unsigned int*)src1 & *(unsigned int*)src2);
488         dst->X = 255;
489     }
490 };
491 
492 struct B5G5R5A1
493 {
494     unsigned short BGRA;
495 
readColorB5G5R5A1496     static void readColor(gl::ColorF *dst, const B5G5R5A1 *src)
497     {
498         dst->alpha = gl::normalizedToFloat<1>(gl::getShiftedData<1, 15>(src->BGRA));
499         dst->red   = gl::normalizedToFloat<5>(gl::getShiftedData<5, 10>(src->BGRA));
500         dst->green = gl::normalizedToFloat<5>(gl::getShiftedData<5,  5>(src->BGRA));
501         dst->blue  = gl::normalizedToFloat<5>(gl::getShiftedData<5,  0>(src->BGRA));
502     }
503 
writeColorB5G5R5A1504     static void writeColor(B5G5R5A1 *dst, const gl::ColorF *src)
505     {
506         dst->BGRA = gl::shiftData<1, 15>(gl::floatToNormalized<1, unsigned short>(src->alpha)) |
507                     gl::shiftData<5, 10>(gl::floatToNormalized<5, unsigned short>(src->red))   |
508                     gl::shiftData<5,  5>(gl::floatToNormalized<5, unsigned short>(src->green)) |
509                     gl::shiftData<5,  0>(gl::floatToNormalized<5, unsigned short>(src->blue));
510     }
511 
averageB5G5R5A1512     static void average(B5G5R5A1 *dst, const B5G5R5A1 *src1, const B5G5R5A1 *src2)
513     {
514         dst->BGRA = gl::shiftData<1, 15>(gl::average(gl::getShiftedData<1, 15>(src1->BGRA), gl::getShiftedData<1, 15>(src2->BGRA))) |
515                     gl::shiftData<5, 10>(gl::average(gl::getShiftedData<5, 10>(src1->BGRA), gl::getShiftedData<5, 10>(src2->BGRA))) |
516                     gl::shiftData<5,  5>(gl::average(gl::getShiftedData<5,  5>(src1->BGRA), gl::getShiftedData<5,  5>(src2->BGRA))) |
517                     gl::shiftData<5,  0>(gl::average(gl::getShiftedData<5,  0>(src1->BGRA), gl::getShiftedData<5,  0>(src2->BGRA)));
518     }
519 };
520 
521 struct R5G5B5A1
522 {
523     unsigned short RGBA;
524 
readColorR5G5B5A1525     static void readColor(gl::ColorF *dst, const R5G5B5A1 *src)
526     {
527         dst->alpha = gl::normalizedToFloat<1>(gl::getShiftedData<1, 15>(src->RGBA));
528         dst->blue  = gl::normalizedToFloat<5>(gl::getShiftedData<5, 10>(src->RGBA));
529         dst->green = gl::normalizedToFloat<5>(gl::getShiftedData<5,  5>(src->RGBA));
530         dst->red   = gl::normalizedToFloat<5>(gl::getShiftedData<5,  0>(src->RGBA));
531     }
532 
writeColorR5G5B5A1533     static void writeColor(R5G5B5A1 *dst, const gl::ColorF *src)
534     {
535         dst->RGBA = gl::shiftData<1, 15>(gl::floatToNormalized<1, unsigned short>(src->alpha)) |
536                     gl::shiftData<5, 10>(gl::floatToNormalized<5, unsigned short>(src->blue))  |
537                     gl::shiftData<5,  5>(gl::floatToNormalized<5, unsigned short>(src->green)) |
538                     gl::shiftData<5,  0>(gl::floatToNormalized<5, unsigned short>(src->red));
539     }
540 
averageR5G5B5A1541     static void average(R5G5B5A1 *dst, const R5G5B5A1 *src1, const R5G5B5A1 *src2)
542     {
543         dst->RGBA = gl::shiftData<1, 15>(gl::average(gl::getShiftedData<1, 15>(src1->RGBA), gl::getShiftedData<1, 15>(src2->RGBA))) |
544                     gl::shiftData<5, 10>(gl::average(gl::getShiftedData<5, 10>(src1->RGBA), gl::getShiftedData<5, 10>(src2->RGBA))) |
545                     gl::shiftData<5,  5>(gl::average(gl::getShiftedData<5,  5>(src1->RGBA), gl::getShiftedData<5,  5>(src2->RGBA))) |
546                     gl::shiftData<5,  0>(gl::average(gl::getShiftedData<5,  0>(src1->RGBA), gl::getShiftedData<5,  0>(src2->RGBA)));
547     }
548 };
549 
550 struct R4G4B4A4
551 {
552     unsigned char R : 4;
553     unsigned char G : 4;
554     unsigned char B : 4;
555     unsigned char A : 4;
556 
readColorR4G4B4A4557     static void readColor(gl::ColorF *dst, const R4G4B4A4 *src)
558     {
559         dst->red   = gl::normalizedToFloat<4>(src->R);
560         dst->green = gl::normalizedToFloat<4>(src->G);
561         dst->blue  = gl::normalizedToFloat<4>(src->B);
562         dst->alpha = gl::normalizedToFloat<4>(src->A);
563     }
564 
writeColorR4G4B4A4565     static void writeColor(R4G4B4A4 *dst, const gl::ColorF *src)
566     {
567         dst->R = gl::floatToNormalized<4, unsigned char>(src->red);
568         dst->G = gl::floatToNormalized<4, unsigned char>(src->green);
569         dst->B = gl::floatToNormalized<4, unsigned char>(src->blue);
570         dst->A = gl::floatToNormalized<4, unsigned char>(src->alpha);
571     }
572 
averageR4G4B4A4573     static void average(R4G4B4A4 *dst, const R4G4B4A4 *src1, const R4G4B4A4 *src2)
574     {
575         dst->R = gl::average(src1->R, src2->R);
576         dst->G = gl::average(src1->G, src2->G);
577         dst->B = gl::average(src1->B, src2->B);
578         dst->A = gl::average(src1->A, src2->A);
579     }
580 };
581 
582 struct A4R4G4B4
583 {
584     unsigned char A : 4;
585     unsigned char R : 4;
586     unsigned char G : 4;
587     unsigned char B : 4;
588 
readColorA4R4G4B4589     static void readColor(gl::ColorF *dst, const A4R4G4B4 *src)
590     {
591         dst->red   = gl::normalizedToFloat<4>(src->R);
592         dst->green = gl::normalizedToFloat<4>(src->G);
593         dst->blue  = gl::normalizedToFloat<4>(src->B);
594         dst->alpha = gl::normalizedToFloat<4>(src->A);
595     }
596 
writeColorA4R4G4B4597     static void writeColor(A4R4G4B4 *dst, const gl::ColorF *src)
598     {
599         dst->R = gl::floatToNormalized<4, unsigned char>(src->red);
600         dst->G = gl::floatToNormalized<4, unsigned char>(src->green);
601         dst->B = gl::floatToNormalized<4, unsigned char>(src->blue);
602         dst->A = gl::floatToNormalized<4, unsigned char>(src->alpha);
603     }
604 
averageA4R4G4B4605     static void average(A4R4G4B4 *dst, const A4R4G4B4 *src1, const A4R4G4B4 *src2)
606     {
607         dst->R = gl::average(src1->R, src2->R);
608         dst->G = gl::average(src1->G, src2->G);
609         dst->B = gl::average(src1->B, src2->B);
610         dst->A = gl::average(src1->A, src2->A);
611     }
612 };
613 
614 struct B4G4R4A4
615 {
616     unsigned char B : 4;
617     unsigned char G : 4;
618     unsigned char R : 4;
619     unsigned char A : 4;
620 
readColorB4G4R4A4621     static void readColor(gl::ColorF *dst, const B4G4R4A4 *src)
622     {
623         dst->red   = gl::normalizedToFloat<4>(src->R);
624         dst->green = gl::normalizedToFloat<4>(src->G);
625         dst->blue  = gl::normalizedToFloat<4>(src->B);
626         dst->alpha = gl::normalizedToFloat<4>(src->A);
627     }
628 
writeColorB4G4R4A4629     static void writeColor(B4G4R4A4 *dst, const gl::ColorF *src)
630     {
631         dst->R = gl::floatToNormalized<4, unsigned char>(src->red);
632         dst->G = gl::floatToNormalized<4, unsigned char>(src->green);
633         dst->B = gl::floatToNormalized<4, unsigned char>(src->blue);
634         dst->A = gl::floatToNormalized<4, unsigned char>(src->alpha);
635     }
636 
averageB4G4R4A4637     static void average(B4G4R4A4 *dst, const B4G4R4A4 *src1, const B4G4R4A4 *src2)
638     {
639         dst->R = gl::average(src1->R, src2->R);
640         dst->G = gl::average(src1->G, src2->G);
641         dst->B = gl::average(src1->B, src2->B);
642         dst->A = gl::average(src1->A, src2->A);
643     }
644 };
645 
646 struct R16
647 {
648     unsigned short R;
649 
readColorR16650     static void readColor(gl::ColorF *dst, const R16 *src)
651     {
652         dst->red   = gl::normalizedToFloat(src->R);
653         dst->green = 0.0f;
654         dst->blue  = 0.0f;
655         dst->alpha = 1.0f;
656     }
657 
readColorR16658     static void readColor(gl::ColorUI *dst, const R16 *src)
659     {
660         dst->red   = src->R;
661         dst->green = 0;
662         dst->blue  = 0;
663         dst->alpha = 1;
664     }
665 
writeColorR16666     static void writeColor(R16 *dst, const gl::ColorF *src)
667     {
668         dst->R = gl::floatToNormalized<unsigned short>(src->red);
669     }
670 
writeColorR16671     static void writeColor(R16 *dst, const gl::ColorUI *src)
672     {
673         dst->R = static_cast<unsigned short>(src->red);
674     }
675 
averageR16676     static void average(R16 *dst, const R16 *src1, const R16 *src2)
677     {
678         dst->R = gl::average(src1->R, src2->R);
679     }
680 };
681 
682 struct R16G16
683 {
684     unsigned short R;
685     unsigned short G;
686 
readColorR16G16687     static void readColor(gl::ColorF *dst, const R16G16 *src)
688     {
689         dst->red   = gl::normalizedToFloat(src->R);
690         dst->green = gl::normalizedToFloat(src->G);
691         dst->blue  = 0.0f;
692         dst->alpha = 1.0f;
693     }
694 
readColorR16G16695     static void readColor(gl::ColorUI *dst, const R16G16 *src)
696     {
697         dst->red = src->R;
698         dst->green = src->G;
699         dst->blue  = 0;
700         dst->alpha = 1;
701     }
702 
writeColorR16G16703     static void writeColor(R16G16 *dst, const gl::ColorF *src)
704     {
705         dst->R = gl::floatToNormalized<unsigned short>(src->red);
706         dst->G = gl::floatToNormalized<unsigned short>(src->green);
707     }
708 
writeColorR16G16709     static void writeColor(R16G16 *dst, const gl::ColorUI *src)
710     {
711         dst->R = static_cast<unsigned short>(src->red);
712         dst->G = static_cast<unsigned short>(src->green);
713     }
714 
averageR16G16715     static void average(R16G16 *dst, const R16G16 *src1, const R16G16 *src2)
716     {
717         dst->R = gl::average(src1->R, src2->R);
718         dst->G = gl::average(src1->G, src2->G);
719     }
720 };
721 
722 struct R16G16B16
723 {
724     unsigned short R;
725     unsigned short G;
726     unsigned short B;
727 
readColorR16G16B16728     static void readColor(gl::ColorF *dst, const R16G16B16 *src)
729     {
730         dst->red   = gl::normalizedToFloat(src->R);
731         dst->green = gl::normalizedToFloat(src->G);
732         dst->blue  = gl::normalizedToFloat(src->B);
733         dst->alpha = 1.0f;
734     }
735 
readColorR16G16B16736     static void readColor(gl::ColorUI *dst, const R16G16B16 *src)
737     {
738         dst->red   = src->R;
739         dst->green = src->G;
740         dst->blue  = src->B;
741         dst->alpha = 1;
742     }
743 
writeColorR16G16B16744     static void writeColor(R16G16B16 *dst, const gl::ColorF *src)
745     {
746         dst->R = gl::floatToNormalized<unsigned short>(src->red);
747         dst->G = gl::floatToNormalized<unsigned short>(src->green);
748         dst->B = gl::floatToNormalized<unsigned short>(src->blue);
749     }
750 
writeColorR16G16B16751     static void writeColor(R16G16B16 *dst, const gl::ColorUI *src)
752     {
753         dst->R = static_cast<unsigned short>(src->red);
754         dst->G = static_cast<unsigned short>(src->green);
755         dst->B = static_cast<unsigned short>(src->blue);
756     }
757 
averageR16G16B16758     static void average(R16G16B16 *dst, const R16G16B16 *src1, const R16G16B16 *src2)
759     {
760         dst->R = gl::average(src1->R, src2->R);
761         dst->G = gl::average(src1->G, src2->G);
762         dst->B = gl::average(src1->B, src2->B);
763     }
764 };
765 
766 struct R16G16B16A16
767 {
768     unsigned short R;
769     unsigned short G;
770     unsigned short B;
771     unsigned short A;
772 
readColorR16G16B16A16773     static void readColor(gl::ColorF *dst, const R16G16B16A16 *src)
774     {
775         dst->red   = gl::normalizedToFloat(src->R);
776         dst->green = gl::normalizedToFloat(src->G);
777         dst->blue  = gl::normalizedToFloat(src->B);
778         dst->alpha = gl::normalizedToFloat(src->A);
779     }
780 
readColorR16G16B16A16781     static void readColor(gl::ColorUI *dst, const R16G16B16A16 *src)
782     {
783         dst->red   = src->R;
784         dst->green = src->G;
785         dst->blue  = src->B;
786         dst->alpha = src->A;
787     }
788 
writeColorR16G16B16A16789     static void writeColor(R16G16B16A16 *dst, const gl::ColorF *src)
790     {
791         dst->R = gl::floatToNormalized<unsigned short>(src->red);
792         dst->G = gl::floatToNormalized<unsigned short>(src->green);
793         dst->B = gl::floatToNormalized<unsigned short>(src->blue);
794         dst->A = gl::floatToNormalized<unsigned short>(src->alpha);
795     }
796 
writeColorR16G16B16A16797     static void writeColor(R16G16B16A16 *dst, const gl::ColorUI *src)
798     {
799         dst->R = static_cast<unsigned short>(src->red);
800         dst->G = static_cast<unsigned short>(src->green);
801         dst->B = static_cast<unsigned short>(src->blue);
802         dst->A = static_cast<unsigned short>(src->alpha);
803     }
804 
averageR16G16B16A16805     static void average(R16G16B16A16 *dst, const R16G16B16A16 *src1, const R16G16B16A16 *src2)
806     {
807         dst->R = gl::average(src1->R, src2->R);
808         dst->G = gl::average(src1->G, src2->G);
809         dst->B = gl::average(src1->B, src2->B);
810         dst->A = gl::average(src1->A, src2->A);
811     }
812 };
813 
814 struct R32
815 {
816     unsigned int R;
817 
readColorR32818     static void readColor(gl::ColorF *dst, const R32 *src)
819     {
820         dst->red   = gl::normalizedToFloat(src->R);
821         dst->green = 0.0f;
822         dst->blue  = 0.0f;
823         dst->alpha = 1.0f;
824     }
825 
readColorR32826     static void readColor(gl::ColorUI *dst, const R32 *src)
827     {
828         dst->red   = src->R;
829         dst->green = 0;
830         dst->blue  = 0;
831         dst->alpha = 1;
832     }
833 
writeColorR32834     static void writeColor(R32 *dst, const gl::ColorF *src)
835     {
836         dst->R = gl::floatToNormalized<unsigned int>(src->red);
837     }
838 
writeColorR32839     static void writeColor(R32 *dst, const gl::ColorUI *src)
840     {
841         dst->R = static_cast<unsigned int>(src->red);
842     }
843 
averageR32844     static void average(R32 *dst, const R32 *src1, const R32 *src2)
845     {
846         dst->R = gl::average(src1->R, src2->R);
847     }
848 };
849 
850 struct R32G32
851 {
852     unsigned int R;
853     unsigned int G;
854 
readColorR32G32855     static void readColor(gl::ColorF *dst, const R32G32 *src)
856     {
857         dst->red   = gl::normalizedToFloat(src->R);
858         dst->green = gl::normalizedToFloat(src->G);
859         dst->blue  = 0.0f;
860         dst->alpha = 1.0f;
861     }
862 
readColorR32G32863     static void readColor(gl::ColorUI *dst, const R32G32 *src)
864     {
865         dst->red   = src->R;
866         dst->green = src->G;
867         dst->blue  = 0;
868         dst->alpha = 1;
869     }
870 
writeColorR32G32871     static void writeColor(R32G32 *dst, const gl::ColorF *src)
872     {
873         dst->R = gl::floatToNormalized<unsigned int>(src->red);
874         dst->G = gl::floatToNormalized<unsigned int>(src->green);
875     }
876 
writeColorR32G32877     static void writeColor(R32G32 *dst, const gl::ColorUI *src)
878     {
879         dst->R = static_cast<unsigned int>(src->red);
880         dst->G = static_cast<unsigned int>(src->green);
881     }
882 
averageR32G32883     static void average(R32G32 *dst, const R32G32 *src1, const R32G32 *src2)
884     {
885         dst->R = gl::average(src1->R, src2->R);
886         dst->G = gl::average(src1->G, src2->G);
887     }
888 };
889 
890 struct R32G32B32
891 {
892     unsigned int R;
893     unsigned int G;
894     unsigned int B;
895 
readColorR32G32B32896     static void readColor(gl::ColorF *dst, const R32G32B32 *src)
897     {
898         dst->red   = gl::normalizedToFloat(src->R);
899         dst->green = gl::normalizedToFloat(src->G);
900         dst->blue  = gl::normalizedToFloat(src->B);
901         dst->alpha = 1.0f;
902     }
903 
readColorR32G32B32904     static void readColor(gl::ColorUI *dst, const R32G32B32 *src)
905     {
906         dst->red   = src->R;
907         dst->green = src->G;
908         dst->blue  = src->B;
909         dst->alpha = 1;
910     }
911 
writeColorR32G32B32912     static void writeColor(R32G32B32 *dst, const gl::ColorF *src)
913     {
914         dst->R = gl::floatToNormalized<unsigned int>(src->red);
915         dst->G = gl::floatToNormalized<unsigned int>(src->green);
916         dst->B = gl::floatToNormalized<unsigned int>(src->blue);
917     }
918 
writeColorR32G32B32919     static void writeColor(R32G32B32 *dst, const gl::ColorUI *src)
920     {
921         dst->R = static_cast<unsigned int>(src->red);
922         dst->G = static_cast<unsigned int>(src->green);
923         dst->B = static_cast<unsigned int>(src->blue);
924     }
925 
averageR32G32B32926     static void average(R32G32B32 *dst, const R32G32B32 *src1, const R32G32B32 *src2)
927     {
928         dst->R = gl::average(src1->R, src2->R);
929         dst->G = gl::average(src1->G, src2->G);
930         dst->B = gl::average(src1->B, src2->B);
931     }
932 };
933 
934 struct R32G32B32A32
935 {
936     unsigned int R;
937     unsigned int G;
938     unsigned int B;
939     unsigned int A;
940 
readColorR32G32B32A32941     static void readColor(gl::ColorF *dst, const R32G32B32A32 *src)
942     {
943         dst->red   = gl::normalizedToFloat(src->R);
944         dst->green = gl::normalizedToFloat(src->G);
945         dst->blue  = gl::normalizedToFloat(src->B);
946         dst->alpha = gl::normalizedToFloat(src->A);
947     }
948 
readColorR32G32B32A32949     static void readColor(gl::ColorUI *dst, const R32G32B32A32 *src)
950     {
951         dst->red   = src->R;
952         dst->green = src->G;
953         dst->blue  = src->B;
954         dst->alpha = src->A;
955     }
956 
writeColorR32G32B32A32957     static void writeColor(R32G32B32A32 *dst, const gl::ColorF *src)
958     {
959         dst->R = gl::floatToNormalized<unsigned int>(src->red);
960         dst->G = gl::floatToNormalized<unsigned int>(src->green);
961         dst->B = gl::floatToNormalized<unsigned int>(src->blue);
962         dst->A = gl::floatToNormalized<unsigned int>(src->alpha);
963     }
964 
writeColorR32G32B32A32965     static void writeColor(R32G32B32A32 *dst, const gl::ColorUI *src)
966     {
967         dst->R = static_cast<unsigned int>(src->red);
968         dst->G = static_cast<unsigned int>(src->green);
969         dst->B = static_cast<unsigned int>(src->blue);
970         dst->A = static_cast<unsigned int>(src->alpha);
971     }
972 
averageR32G32B32A32973     static void average(R32G32B32A32 *dst, const R32G32B32A32 *src1, const R32G32B32A32 *src2)
974     {
975         dst->R = gl::average(src1->R, src2->R);
976         dst->G = gl::average(src1->G, src2->G);
977         dst->B = gl::average(src1->B, src2->B);
978         dst->A = gl::average(src1->A, src2->A);
979     }
980 };
981 
982 struct R8S
983 {
984     char R;
985 
readColorR8S986     static void readColor(gl::ColorF *dst, const R8S *src)
987     {
988         dst->red   = gl::normalizedToFloat(src->R);
989         dst->green = 0.0f;
990         dst->blue  = 0.0f;
991         dst->alpha = 1.0f;
992     }
993 
readColorR8S994     static void readColor(gl::ColorI *dst, const R8S *src)
995     {
996         dst->red   = src->R;
997         dst->green = 0;
998         dst->blue  = 0;
999         dst->alpha = 1;
1000     }
1001 
writeColorR8S1002     static void writeColor(R8S *dst, const gl::ColorF *src)
1003     {
1004         dst->R = gl::floatToNormalized<char>(src->red);
1005     }
1006 
writeColorR8S1007     static void writeColor(R8S *dst, const gl::ColorI *src)
1008     {
1009         dst->R = static_cast<char>(src->red);
1010     }
1011 
averageR8S1012     static void average(R8S *dst, const R8S *src1, const R8S *src2)
1013     {
1014         dst->R = gl::average(src1->R, src2->R);
1015     }
1016 };
1017 
1018 struct R8G8S
1019 {
1020     char R;
1021     char G;
1022 
readColorR8G8S1023     static void readColor(gl::ColorF *dst, const R8G8S *src)
1024     {
1025         dst->red   = gl::normalizedToFloat(src->R);
1026         dst->green = gl::normalizedToFloat(src->G);
1027         dst->blue  = 0.0f;
1028         dst->alpha = 1.0f;
1029     }
1030 
readColorR8G8S1031     static void readColor(gl::ColorI *dst, const R8G8S *src)
1032     {
1033         dst->red   = src->R;
1034         dst->green = src->G;
1035         dst->blue  = 0;
1036         dst->alpha = 1;
1037     }
1038 
writeColorR8G8S1039     static void writeColor(R8G8S *dst, const gl::ColorF *src)
1040     {
1041         dst->R = gl::floatToNormalized<char>(src->red);
1042         dst->G = gl::floatToNormalized<char>(src->green);
1043     }
1044 
writeColorR8G8S1045     static void writeColor(R8G8S *dst, const gl::ColorI *src)
1046     {
1047         dst->R = static_cast<char>(src->red);
1048         dst->G = static_cast<char>(src->green);
1049     }
1050 
averageR8G8S1051     static void average(R8G8S *dst, const R8G8S *src1, const R8G8S *src2)
1052     {
1053         dst->R = gl::average(src1->R, src2->R);
1054         dst->G = gl::average(src1->G, src2->G);
1055     }
1056 };
1057 
1058 struct R8G8B8S
1059 {
1060     char R;
1061     char G;
1062     char B;
1063 
readColorR8G8B8S1064     static void readColor(gl::ColorF *dst, const R8G8B8S *src)
1065     {
1066         dst->red   = gl::normalizedToFloat(src->R);
1067         dst->green = gl::normalizedToFloat(src->G);
1068         dst->blue  = gl::normalizedToFloat(src->B);
1069         dst->alpha = 1.0f;
1070     }
1071 
readColorR8G8B8S1072     static void readColor(gl::ColorI *dst, const R8G8B8S *src)
1073     {
1074         dst->red   = src->R;
1075         dst->green = src->G;
1076         dst->blue  = src->B;
1077         dst->alpha = 1;
1078     }
1079 
writeColorR8G8B8S1080     static void writeColor(R8G8B8S *dst, const gl::ColorF *src)
1081     {
1082         dst->R = gl::floatToNormalized<char>(src->red);
1083         dst->G = gl::floatToNormalized<char>(src->green);
1084         dst->B = gl::floatToNormalized<char>(src->blue);
1085     }
1086 
writeColorR8G8B8S1087     static void writeColor(R8G8B8S *dst, const gl::ColorI *src)
1088     {
1089         dst->R = static_cast<char>(src->red);
1090         dst->G = static_cast<char>(src->green);
1091         dst->B = static_cast<char>(src->blue);
1092     }
1093 
averageR8G8B8S1094     static void average(R8G8B8S *dst, const R8G8B8S *src1, const R8G8B8S *src2)
1095     {
1096         dst->R = gl::average(src1->R, src2->R);
1097         dst->G = gl::average(src1->G, src2->G);
1098         dst->B = gl::average(src1->B, src2->B);
1099     }
1100 };
1101 
1102 struct R8G8B8A8S
1103 {
1104     char R;
1105     char G;
1106     char B;
1107     char A;
1108 
readColorR8G8B8A8S1109     static void readColor(gl::ColorF *dst, const R8G8B8A8S *src)
1110     {
1111         dst->red   = gl::normalizedToFloat(src->R);
1112         dst->green = gl::normalizedToFloat(src->G);
1113         dst->blue  = gl::normalizedToFloat(src->B);
1114         dst->alpha = gl::normalizedToFloat(src->A);
1115     }
1116 
readColorR8G8B8A8S1117     static void readColor(gl::ColorI *dst, const R8G8B8A8S *src)
1118     {
1119         dst->red   = src->R;
1120         dst->green = src->G;
1121         dst->blue  = src->B;
1122         dst->alpha = src->A;
1123     }
1124 
writeColorR8G8B8A8S1125     static void writeColor(R8G8B8A8S *dst, const gl::ColorF *src)
1126     {
1127         dst->R = gl::floatToNormalized<char>(src->red);
1128         dst->G = gl::floatToNormalized<char>(src->green);
1129         dst->B = gl::floatToNormalized<char>(src->blue);
1130         dst->A = gl::floatToNormalized<char>(src->alpha);
1131     }
1132 
writeColorR8G8B8A8S1133     static void writeColor(R8G8B8A8S *dst, const gl::ColorI *src)
1134     {
1135         dst->R = static_cast<char>(src->red);
1136         dst->G = static_cast<char>(src->green);
1137         dst->B = static_cast<char>(src->blue);
1138         dst->A = static_cast<char>(src->alpha);
1139     }
1140 
averageR8G8B8A8S1141     static void average(R8G8B8A8S *dst, const R8G8B8A8S *src1, const R8G8B8A8S *src2)
1142     {
1143         dst->R = gl::average(src1->R, src2->R);
1144         dst->G = gl::average(src1->G, src2->G);
1145         dst->B = gl::average(src1->B, src2->B);
1146         dst->A = gl::average(src1->A, src2->A);
1147     }
1148 };
1149 
1150 struct R16S
1151 {
1152     short R;
1153 
readColorR16S1154     static void readColor(gl::ColorF *dst, const R16S *src)
1155     {
1156         dst->red   = gl::normalizedToFloat(src->R);
1157         dst->green = 0.0f;
1158         dst->blue  = 0.0f;
1159         dst->alpha = 1.0f;
1160     }
1161 
readColorR16S1162     static void readColor(gl::ColorI *dst, const R16S *src)
1163     {
1164         dst->red   = src->R;
1165         dst->green = 0;
1166         dst->blue  = 0;
1167         dst->alpha = 1;
1168     }
1169 
writeColorR16S1170     static void writeColor(R16S *dst, const gl::ColorF *src)
1171     {
1172         dst->R = gl::floatToNormalized<short>(src->red);
1173     }
1174 
writeColorR16S1175     static void writeColor(R16S *dst, const gl::ColorI *src)
1176     {
1177         dst->R = static_cast<short>(src->red);
1178     }
1179 
averageR16S1180     static void average(R16S *dst, const R16S *src1, const R16S *src2)
1181     {
1182         dst->R = gl::average(src1->R, src2->R);
1183     }
1184 };
1185 
1186 struct R16G16S
1187 {
1188     short R;
1189     short G;
1190 
readColorR16G16S1191     static void readColor(gl::ColorF *dst, const R16G16S *src)
1192     {
1193         dst->red   = gl::normalizedToFloat(src->R);
1194         dst->green = gl::normalizedToFloat(src->G);
1195         dst->blue  = 0.0f;
1196         dst->alpha = 1.0f;
1197     }
1198 
readColorR16G16S1199     static void readColor(gl::ColorI *dst, const R16G16S *src)
1200     {
1201         dst->red   = src->R;
1202         dst->green = src->G;
1203         dst->blue  = 0;
1204         dst->alpha = 1;
1205     }
1206 
writeColorR16G16S1207     static void writeColor(R16G16S *dst, const gl::ColorF *src)
1208     {
1209         dst->R = gl::floatToNormalized<short>(src->red);
1210         dst->G = gl::floatToNormalized<short>(src->green);
1211     }
1212 
writeColorR16G16S1213     static void writeColor(R16G16S *dst, const gl::ColorI *src)
1214     {
1215         dst->R = static_cast<short>(src->red);
1216         dst->G = static_cast<short>(src->green);
1217     }
1218 
averageR16G16S1219     static void average(R16G16S *dst, const R16G16S *src1, const R16G16S *src2)
1220     {
1221         dst->R = gl::average(src1->R, src2->R);
1222         dst->G = gl::average(src1->G, src2->G);
1223     }
1224 };
1225 
1226 struct R16G16B16S
1227 {
1228     short R;
1229     short G;
1230     short B;
1231 
readColorR16G16B16S1232     static void readColor(gl::ColorF *dst, const R16G16B16S *src)
1233     {
1234         dst->red   = gl::normalizedToFloat(src->R);
1235         dst->green = gl::normalizedToFloat(src->G);
1236         dst->blue  = gl::normalizedToFloat(src->B);
1237         dst->alpha = 1.0f;
1238     }
1239 
readColorR16G16B16S1240     static void readColor(gl::ColorI *dst, const R16G16B16S *src)
1241     {
1242         dst->red   = src->R;
1243         dst->green = src->G;
1244         dst->blue  = src->B;
1245         dst->alpha = 1;
1246     }
1247 
writeColorR16G16B16S1248     static void writeColor(R16G16B16S *dst, const gl::ColorF *src)
1249     {
1250         dst->R = gl::floatToNormalized<short>(src->red);
1251         dst->G = gl::floatToNormalized<short>(src->green);
1252         dst->B = gl::floatToNormalized<short>(src->blue);
1253     }
1254 
writeColorR16G16B16S1255     static void writeColor(R16G16B16S *dst, const gl::ColorI *src)
1256     {
1257         dst->R = static_cast<short>(src->red);
1258         dst->G = static_cast<short>(src->green);
1259         dst->B = static_cast<short>(src->blue);
1260     }
1261 
averageR16G16B16S1262     static void average(R16G16B16S *dst, const R16G16B16S *src1, const R16G16B16S *src2)
1263     {
1264         dst->R = gl::average(src1->R, src2->R);
1265         dst->G = gl::average(src1->G, src2->G);
1266         dst->B = gl::average(src1->B, src2->B);
1267     }
1268 };
1269 
1270 struct R16G16B16A16S
1271 {
1272     short R;
1273     short G;
1274     short B;
1275     short A;
1276 
readColorR16G16B16A16S1277     static void readColor(gl::ColorF *dst, const R16G16B16A16S *src)
1278     {
1279         dst->red   = gl::normalizedToFloat(src->R);
1280         dst->green = gl::normalizedToFloat(src->G);
1281         dst->blue  = gl::normalizedToFloat(src->B);
1282         dst->alpha = gl::normalizedToFloat(src->A);
1283     }
1284 
readColorR16G16B16A16S1285     static void readColor(gl::ColorI *dst, const R16G16B16A16S *src)
1286     {
1287         dst->red   = src->R;
1288         dst->green = src->G;
1289         dst->blue  = src->B;
1290         dst->alpha = src->A;
1291     }
1292 
writeColorR16G16B16A16S1293     static void writeColor(R16G16B16A16S *dst, const gl::ColorF *src)
1294     {
1295         dst->R = gl::floatToNormalized<short>(src->red);
1296         dst->G = gl::floatToNormalized<short>(src->green);
1297         dst->B = gl::floatToNormalized<short>(src->blue);
1298         dst->A = gl::floatToNormalized<short>(src->alpha);
1299     }
1300 
writeColorR16G16B16A16S1301     static void writeColor(R16G16B16A16S *dst, const gl::ColorI *src)
1302     {
1303         dst->R = static_cast<short>(src->red);
1304         dst->G = static_cast<short>(src->green);
1305         dst->B = static_cast<short>(src->blue);
1306         dst->A = static_cast<short>(src->alpha);
1307     }
1308 
averageR16G16B16A16S1309     static void average(R16G16B16A16S *dst, const R16G16B16A16S *src1, const R16G16B16A16S *src2)
1310     {
1311         dst->R = gl::average(src1->R, src2->R);
1312         dst->G = gl::average(src1->G, src2->G);
1313         dst->B = gl::average(src1->B, src2->B);
1314         dst->A = gl::average(src1->A, src2->A);
1315     }
1316 };
1317 
1318 struct R32S
1319 {
1320     int R;
1321 
readColorR32S1322     static void readColor(gl::ColorF *dst, const R32S *src)
1323     {
1324         dst->red   = gl::normalizedToFloat(src->R);
1325         dst->green = 0.0f;
1326         dst->blue  = 0.0f;
1327         dst->alpha = 1.0f;
1328     }
1329 
readColorR32S1330     static void readColor(gl::ColorI *dst, const R32S *src)
1331     {
1332         dst->red   = src->R;
1333         dst->green = 0;
1334         dst->blue  = 0;
1335         dst->alpha = 1;
1336     }
1337 
writeColorR32S1338     static void writeColor(R32S *dst, const gl::ColorF *src)
1339     {
1340         dst->R = gl::floatToNormalized<int>(src->red);
1341     }
1342 
writeColorR32S1343     static void writeColor(R32S *dst, const gl::ColorI *src)
1344     {
1345         dst->R = static_cast<int>(src->red);
1346     }
1347 
averageR32S1348     static void average(R32S *dst, const R32S *src1, const R32S *src2)
1349     {
1350         dst->R = gl::average(src1->R, src2->R);
1351     }
1352 };
1353 
1354 struct R32G32S
1355 {
1356     int R;
1357     int G;
1358 
readColorR32G32S1359     static void readColor(gl::ColorF *dst, const R32G32S *src)
1360     {
1361         dst->red   = gl::normalizedToFloat(src->R);
1362         dst->green = gl::normalizedToFloat(src->G);
1363         dst->blue  = 0.0f;
1364         dst->alpha = 1.0f;
1365     }
1366 
readColorR32G32S1367     static void readColor(gl::ColorI *dst, const R32G32S *src)
1368     {
1369         dst->red   = src->R;
1370         dst->green = src->G;
1371         dst->blue  = 0;
1372         dst->alpha = 1;
1373     }
1374 
writeColorR32G32S1375     static void writeColor(R32G32S *dst, const gl::ColorF *src)
1376     {
1377         dst->R = gl::floatToNormalized<int>(src->red);
1378         dst->G = gl::floatToNormalized<int>(src->green);
1379     }
1380 
writeColorR32G32S1381     static void writeColor(R32G32S *dst, const gl::ColorI *src)
1382     {
1383         dst->R = static_cast<int>(src->red);
1384         dst->G = static_cast<int>(src->green);
1385     }
1386 
averageR32G32S1387     static void average(R32G32S *dst, const R32G32S *src1, const R32G32S *src2)
1388     {
1389         dst->R = gl::average(src1->R, src2->R);
1390         dst->G = gl::average(src1->G, src2->G);
1391     }
1392 };
1393 
1394 struct R32G32B32S
1395 {
1396     int R;
1397     int G;
1398     int B;
1399 
readColorR32G32B32S1400     static void readColor(gl::ColorF *dst, const R32G32B32S *src)
1401     {
1402         dst->red   = gl::normalizedToFloat(src->R);
1403         dst->green = gl::normalizedToFloat(src->G);
1404         dst->blue  = gl::normalizedToFloat(src->B);
1405         dst->alpha = 1.0f;
1406     }
1407 
readColorR32G32B32S1408     static void readColor(gl::ColorI *dst, const R32G32B32S *src)
1409     {
1410         dst->red   = src->R;
1411         dst->green = src->G;
1412         dst->blue  = src->B;
1413         dst->alpha = 1;
1414     }
1415 
writeColorR32G32B32S1416     static void writeColor(R32G32B32S *dst, const gl::ColorF *src)
1417     {
1418         dst->R = gl::floatToNormalized<int>(src->red);
1419         dst->G = gl::floatToNormalized<int>(src->green);
1420         dst->B = gl::floatToNormalized<int>(src->blue);
1421     }
1422 
writeColorR32G32B32S1423     static void writeColor(R32G32B32S *dst, const gl::ColorI *src)
1424     {
1425         dst->R = static_cast<int>(src->red);
1426         dst->G = static_cast<int>(src->green);
1427         dst->B = static_cast<int>(src->blue);
1428     }
1429 
averageR32G32B32S1430     static void average(R32G32B32S *dst, const R32G32B32S *src1, const R32G32B32S *src2)
1431     {
1432         dst->R = gl::average(src1->R, src2->R);
1433         dst->G = gl::average(src1->G, src2->G);
1434         dst->B = gl::average(src1->B, src2->B);
1435     }
1436 };
1437 
1438 struct R32G32B32A32S
1439 {
1440     int R;
1441     int G;
1442     int B;
1443     int A;
1444 
readColorR32G32B32A32S1445     static void readColor(gl::ColorF *dst, const R32G32B32A32S *src)
1446     {
1447         dst->red   = gl::normalizedToFloat(src->R);
1448         dst->green = gl::normalizedToFloat(src->G);
1449         dst->blue  = gl::normalizedToFloat(src->B);
1450         dst->alpha = gl::normalizedToFloat(src->A);
1451     }
1452 
readColorR32G32B32A32S1453     static void readColor(gl::ColorI *dst, const R32G32B32A32S *src)
1454     {
1455         dst->red   = src->R;
1456         dst->green = src->G;
1457         dst->blue  = src->B;
1458         dst->alpha = src->A;
1459     }
1460 
writeColorR32G32B32A32S1461     static void writeColor(R32G32B32A32S *dst, const gl::ColorF *src)
1462     {
1463         dst->R = gl::floatToNormalized<int>(src->red);
1464         dst->G = gl::floatToNormalized<int>(src->green);
1465         dst->B = gl::floatToNormalized<int>(src->blue);
1466         dst->A = gl::floatToNormalized<int>(src->alpha);
1467     }
1468 
writeColorR32G32B32A32S1469     static void writeColor(R32G32B32A32S *dst, const gl::ColorI *src)
1470     {
1471         dst->R = static_cast<int>(src->red);
1472         dst->G = static_cast<int>(src->green);
1473         dst->B = static_cast<int>(src->blue);
1474         dst->A = static_cast<int>(src->alpha);
1475     }
1476 
averageR32G32B32A32S1477     static void average(R32G32B32A32S *dst, const R32G32B32A32S *src1, const R32G32B32A32S *src2)
1478     {
1479         dst->R = gl::average(src1->R, src2->R);
1480         dst->G = gl::average(src1->G, src2->G);
1481         dst->B = gl::average(src1->B, src2->B);
1482         dst->A = gl::average(src1->A, src2->A);
1483     }
1484 };
1485 
1486 struct A16B16G16R16F
1487 {
1488     unsigned short A;
1489     unsigned short R;
1490     unsigned short G;
1491     unsigned short B;
1492 
readColorA16B16G16R16F1493     static void readColor(gl::ColorF *dst, const A16B16G16R16F *src)
1494     {
1495         dst->red   = gl::float16ToFloat32(src->R);
1496         dst->green = gl::float16ToFloat32(src->G);
1497         dst->blue  = gl::float16ToFloat32(src->B);
1498         dst->alpha = gl::float16ToFloat32(src->A);
1499     }
1500 
writeColorA16B16G16R16F1501     static void writeColor(A16B16G16R16F *dst, const gl::ColorF *src)
1502     {
1503         dst->R = gl::float32ToFloat16(src->red);
1504         dst->G = gl::float32ToFloat16(src->green);
1505         dst->B = gl::float32ToFloat16(src->blue);
1506         dst->A = gl::float32ToFloat16(src->alpha);
1507     }
1508 
averageA16B16G16R16F1509     static void average(A16B16G16R16F *dst, const A16B16G16R16F *src1, const A16B16G16R16F *src2)
1510     {
1511         dst->R = gl::averageHalfFloat(src1->R, src2->R);
1512         dst->G = gl::averageHalfFloat(src1->G, src2->G);
1513         dst->B = gl::averageHalfFloat(src1->B, src2->B);
1514         dst->A = gl::averageHalfFloat(src1->A, src2->A);
1515     }
1516 };
1517 
1518 struct R16G16B16A16F
1519 {
1520     unsigned short R;
1521     unsigned short G;
1522     unsigned short B;
1523     unsigned short A;
1524 
readColorR16G16B16A16F1525     static void readColor(gl::ColorF *dst, const R16G16B16A16F *src)
1526     {
1527         dst->red   = gl::float16ToFloat32(src->R);
1528         dst->green = gl::float16ToFloat32(src->G);
1529         dst->blue  = gl::float16ToFloat32(src->B);
1530         dst->alpha = gl::float16ToFloat32(src->A);
1531     }
1532 
writeColorR16G16B16A16F1533     static void writeColor(R16G16B16A16F *dst, const gl::ColorF *src)
1534     {
1535         dst->R = gl::float32ToFloat16(src->red);
1536         dst->G = gl::float32ToFloat16(src->green);
1537         dst->B = gl::float32ToFloat16(src->blue);
1538         dst->A = gl::float32ToFloat16(src->alpha);
1539     }
1540 
averageR16G16B16A16F1541     static void average(R16G16B16A16F *dst, const R16G16B16A16F *src1, const R16G16B16A16F *src2)
1542     {
1543         dst->R = gl::averageHalfFloat(src1->R, src2->R);
1544         dst->G = gl::averageHalfFloat(src1->G, src2->G);
1545         dst->B = gl::averageHalfFloat(src1->B, src2->B);
1546         dst->A = gl::averageHalfFloat(src1->A, src2->A);
1547     }
1548 };
1549 
1550 struct R16F
1551 {
1552     unsigned short R;
1553 
readColorR16F1554     static void readColor(gl::ColorF *dst, const R16F *src)
1555     {
1556         dst->red   = gl::float16ToFloat32(src->R);
1557         dst->green = 0.0f;
1558         dst->blue  = 0.0f;
1559         dst->alpha = 1.0f;
1560     }
1561 
writeColorR16F1562     static void writeColor(R16F *dst, const gl::ColorF *src)
1563     {
1564         dst->R = gl::float32ToFloat16(src->red);
1565     }
1566 
averageR16F1567     static void average(R16F *dst, const R16F *src1, const R16F *src2)
1568     {
1569         dst->R = gl::averageHalfFloat(src1->R, src2->R);
1570     }
1571 };
1572 
1573 struct A16F
1574 {
1575     unsigned short A;
1576 
readColorA16F1577     static void readColor(gl::ColorF *dst, const A16F *src)
1578     {
1579         dst->red   = 0.0f;
1580         dst->green = 0.0f;
1581         dst->blue  = 0.0f;
1582         dst->alpha = gl::float16ToFloat32(src->A);
1583     }
1584 
writeColorA16F1585     static void writeColor(A16F *dst, const gl::ColorF *src)
1586     {
1587         dst->A = gl::float32ToFloat16(src->alpha);
1588     }
1589 
averageA16F1590     static void average(A16F *dst, const A16F *src1, const A16F *src2)
1591     {
1592         dst->A = gl::averageHalfFloat(src1->A, src2->A);
1593     }
1594 };
1595 
1596 struct L16F
1597 {
1598     unsigned short L;
1599 
readColorL16F1600     static void readColor(gl::ColorF *dst, const L16F *src)
1601     {
1602         float lum = gl::float16ToFloat32(src->L);
1603         dst->red   = lum;
1604         dst->green = lum;
1605         dst->blue  = lum;
1606         dst->alpha = 1.0f;
1607     }
1608 
writeColorL16F1609     static void writeColor(L16F *dst, const gl::ColorF *src)
1610     {
1611         dst->L = gl::float32ToFloat16((src->red + src->green + src->blue) / 3.0f);
1612     }
1613 
averageL16F1614     static void average(L16F *dst, const L16F *src1, const L16F *src2)
1615     {
1616         dst->L = gl::averageHalfFloat(src1->L, src2->L);
1617     }
1618 };
1619 
1620 struct L16A16F
1621 {
1622     unsigned short L;
1623     unsigned short A;
1624 
readColorL16A16F1625     static void readColor(gl::ColorF *dst, const L16A16F *src)
1626     {
1627         float lum = gl::float16ToFloat32(src->L);
1628         dst->red   = lum;
1629         dst->green = lum;
1630         dst->blue  = lum;
1631         dst->alpha = gl::float16ToFloat32(src->A);
1632     }
1633 
writeColorL16A16F1634     static void writeColor(L16A16F *dst, const gl::ColorF *src)
1635     {
1636         dst->L = gl::float32ToFloat16((src->red + src->green + src->blue) / 3.0f);
1637         dst->A = gl::float32ToFloat16(src->alpha);
1638     }
1639 
averageL16A16F1640     static void average(L16A16F *dst, const L16A16F *src1, const L16A16F *src2)
1641     {
1642         dst->L = gl::averageHalfFloat(src1->L, src2->L);
1643         dst->A = gl::averageHalfFloat(src1->A, src2->A);
1644     }
1645 };
1646 
1647 struct R16G16F
1648 {
1649     unsigned short R;
1650     unsigned short G;
1651 
readColorR16G16F1652     static void readColor(gl::ColorF *dst, const R16G16F *src)
1653     {
1654         dst->red   = gl::float16ToFloat32(src->R);
1655         dst->green = gl::float16ToFloat32(src->G);
1656         dst->blue  = 0.0f;
1657         dst->alpha = 1.0f;
1658     }
1659 
writeColorR16G16F1660     static void writeColor(R16G16F *dst, const gl::ColorF *src)
1661     {
1662         dst->R = gl::float32ToFloat16(src->red);
1663         dst->G = gl::float32ToFloat16(src->green);
1664     }
1665 
averageR16G16F1666     static void average(R16G16F *dst, const R16G16F *src1, const R16G16F *src2)
1667     {
1668         dst->R = gl::averageHalfFloat(src1->R, src2->R);
1669         dst->G = gl::averageHalfFloat(src1->G, src2->G);
1670     }
1671 };
1672 
1673 struct R16G16B16F
1674 {
1675     unsigned short R;
1676     unsigned short G;
1677     unsigned short B;
1678 
readColorR16G16B16F1679     static void readColor(gl::ColorF *dst, const R16G16B16F *src)
1680     {
1681         dst->red   = gl::float16ToFloat32(src->R);
1682         dst->green = gl::float16ToFloat32(src->G);
1683         dst->blue  = gl::float16ToFloat32(src->B);
1684         dst->alpha = 1.0f;
1685     }
1686 
writeColorR16G16B16F1687     static void writeColor(R16G16B16F *dst, const gl::ColorF *src)
1688     {
1689         dst->R = gl::float32ToFloat16(src->red);
1690         dst->G = gl::float32ToFloat16(src->green);
1691         dst->B = gl::float32ToFloat16(src->blue);
1692     }
1693 
averageR16G16B16F1694     static void average(R16G16B16F *dst, const R16G16B16F *src1, const R16G16B16F *src2)
1695     {
1696         dst->R = gl::averageHalfFloat(src1->R, src2->R);
1697         dst->G = gl::averageHalfFloat(src1->G, src2->G);
1698         dst->B = gl::averageHalfFloat(src1->B, src2->B);
1699     }
1700 };
1701 
1702 struct A32B32G32R32F
1703 {
1704     float A;
1705     float R;
1706     float G;
1707     float B;
1708 
readColorA32B32G32R32F1709     static void readColor(gl::ColorF *dst, const A32B32G32R32F *src)
1710     {
1711         dst->red   = src->R;
1712         dst->green = src->G;
1713         dst->blue  = src->B;
1714         dst->alpha = src->A;
1715     }
1716 
writeColorA32B32G32R32F1717     static void writeColor(A32B32G32R32F *dst, const gl::ColorF *src)
1718     {
1719         dst->R = src->red;
1720         dst->G = src->green;
1721         dst->B = src->blue;
1722         dst->A = src->alpha;
1723     }
1724 
averageA32B32G32R32F1725     static void average(A32B32G32R32F *dst, const A32B32G32R32F *src1, const A32B32G32R32F *src2)
1726     {
1727         dst->R = gl::average(src1->R, src2->R);
1728         dst->G = gl::average(src1->G, src2->G);
1729         dst->B = gl::average(src1->B, src2->B);
1730         dst->A = gl::average(src1->A, src2->A);
1731     }
1732 };
1733 
1734 struct R32G32B32A32F
1735 {
1736     float R;
1737     float G;
1738     float B;
1739     float A;
1740 
readColorR32G32B32A32F1741     static void readColor(gl::ColorF *dst, const R32G32B32A32F *src)
1742     {
1743         dst->red   = src->R;
1744         dst->green = src->G;
1745         dst->blue  = src->B;
1746         dst->alpha = src->A;
1747     }
1748 
writeColorR32G32B32A32F1749     static void writeColor(R32G32B32A32F *dst, const gl::ColorF *src)
1750     {
1751         dst->R = src->red;
1752         dst->G = src->green;
1753         dst->B = src->blue;
1754         dst->A = src->alpha;
1755     }
1756 
averageR32G32B32A32F1757     static void average(R32G32B32A32F *dst, const R32G32B32A32F *src1, const R32G32B32A32F *src2)
1758     {
1759         dst->R = gl::average(src1->R, src2->R);
1760         dst->G = gl::average(src1->G, src2->G);
1761         dst->B = gl::average(src1->B, src2->B);
1762         dst->A = gl::average(src1->A, src2->A);
1763     }
1764 };
1765 
1766 struct R32F
1767 {
1768     float R;
1769 
readColorR32F1770     static void readColor(gl::ColorF *dst, const R32F *src)
1771     {
1772         dst->red   = src->R;
1773         dst->green = 0.0f;
1774         dst->blue  = 0.0f;
1775         dst->alpha = 1.0f;
1776     }
1777 
writeColorR32F1778     static void writeColor(R32F *dst, const gl::ColorF *src)
1779     {
1780         dst->R = src->red;
1781     }
1782 
averageR32F1783     static void average(R32F *dst, const R32F *src1, const R32F *src2)
1784     {
1785         dst->R = gl::average(src1->R, src2->R);
1786     }
1787 };
1788 
1789 struct A32F
1790 {
1791     float A;
1792 
readColorA32F1793     static void readColor(gl::ColorF *dst, const A32F *src)
1794     {
1795         dst->red   = 0.0f;
1796         dst->green = 0.0f;
1797         dst->blue  = 0.0f;
1798         dst->alpha = src->A;
1799     }
1800 
writeColorA32F1801     static void writeColor(A32F *dst, const gl::ColorF *src)
1802     {
1803         dst->A = src->alpha;
1804     }
1805 
averageA32F1806     static void average(A32F *dst, const A32F *src1, const A32F *src2)
1807     {
1808         dst->A = gl::average(src1->A, src2->A);
1809     }
1810 };
1811 
1812 struct L32F
1813 {
1814     float L;
1815 
readColorL32F1816     static void readColor(gl::ColorF *dst, const L32F *src)
1817     {
1818         dst->red   = src->L;
1819         dst->green = src->L;
1820         dst->blue  = src->L;
1821         dst->alpha = 1.0f;
1822     }
1823 
writeColorL32F1824     static void writeColor(L32F *dst, const gl::ColorF *src)
1825     {
1826         dst->L = (src->red + src->green + src->blue) / 3.0f;
1827     }
1828 
averageL32F1829     static void average(L32F *dst, const L32F *src1, const L32F *src2)
1830     {
1831         dst->L = gl::average(src1->L, src2->L);
1832     }
1833 };
1834 
1835 struct L32A32F
1836 {
1837     float L;
1838     float A;
1839 
readColorL32A32F1840     static void readColor(gl::ColorF *dst, const L32A32F *src)
1841     {
1842         dst->red   = src->L;
1843         dst->green = src->L;
1844         dst->blue  = src->L;
1845         dst->alpha = src->A;
1846     }
1847 
writeColorL32A32F1848     static void writeColor(L32A32F *dst, const gl::ColorF *src)
1849     {
1850         dst->L = (src->red + src->green + src->blue) / 3.0f;
1851         dst->A = src->alpha;
1852     }
1853 
averageL32A32F1854     static void average(L32A32F *dst, const L32A32F *src1, const L32A32F *src2)
1855     {
1856         dst->L = gl::average(src1->L, src2->L);
1857         dst->A = gl::average(src1->A, src2->A);
1858     }
1859 };
1860 
1861 struct R32G32F
1862 {
1863     float R;
1864     float G;
1865 
readColorR32G32F1866     static void readColor(gl::ColorF *dst, const R32G32F *src)
1867     {
1868         dst->red   = src->R;
1869         dst->green = src->G;
1870         dst->blue  = 0.0f;
1871         dst->alpha = 1.0f;
1872     }
1873 
writeColorR32G32F1874     static void writeColor(R32G32F *dst, const gl::ColorF *src)
1875     {
1876         dst->R = src->red;
1877         dst->G = src->green;
1878     }
1879 
averageR32G32F1880     static void average(R32G32F *dst, const R32G32F *src1, const R32G32F *src2)
1881     {
1882         dst->R = gl::average(src1->R, src2->R);
1883         dst->G = gl::average(src1->G, src2->G);
1884     }
1885 };
1886 
1887 struct R32G32B32F
1888 {
1889     float R;
1890     float G;
1891     float B;
1892 
readColorR32G32B32F1893     static void readColor(gl::ColorF *dst, const R32G32B32F *src)
1894     {
1895         dst->red   = src->R;
1896         dst->green = src->G;
1897         dst->blue  = src->B;
1898         dst->alpha = 1.0f;
1899     }
1900 
writeColorR32G32B32F1901     static void writeColor(R32G32B32F *dst, const gl::ColorF *src)
1902     {
1903         dst->R = src->red;
1904         dst->G = src->green;
1905         dst->B = src->blue;
1906     }
1907 
averageR32G32B32F1908     static void average(R32G32B32F *dst, const R32G32B32F *src1, const R32G32B32F *src2)
1909     {
1910         dst->R = gl::average(src1->R, src2->R);
1911         dst->G = gl::average(src1->G, src2->G);
1912         dst->B = gl::average(src1->B, src2->B);
1913     }
1914 };
1915 
1916 struct R10G10B10A2
1917 {
1918     unsigned int R : 10;
1919     unsigned int G : 10;
1920     unsigned int B : 10;
1921     unsigned int A : 2;
1922 
readColorR10G10B10A21923     static void readColor(gl::ColorF *dst, const R10G10B10A2 *src)
1924     {
1925         dst->red   = gl::normalizedToFloat<10>(src->R);
1926         dst->green = gl::normalizedToFloat<10>(src->G);
1927         dst->blue  = gl::normalizedToFloat<10>(src->B);
1928         dst->alpha = gl::normalizedToFloat< 2>(src->A);
1929     }
1930 
readColorR10G10B10A21931     static void readColor(gl::ColorUI *dst, const R10G10B10A2 *src)
1932     {
1933         dst->red   = src->R;
1934         dst->green = src->G;
1935         dst->blue  = src->B;
1936         dst->alpha = src->A;
1937     }
1938 
writeColorR10G10B10A21939     static void writeColor(R10G10B10A2 *dst, const gl::ColorF *src)
1940     {
1941         dst->R = gl::floatToNormalized<10, unsigned int>(src->red);
1942         dst->G = gl::floatToNormalized<10, unsigned int>(src->green);
1943         dst->B = gl::floatToNormalized<10, unsigned int>(src->blue);
1944         dst->A = gl::floatToNormalized< 2, unsigned int>(src->alpha);
1945     }
1946 
writeColorR10G10B10A21947     static void writeColor(R10G10B10A2 *dst, const gl::ColorUI *src)
1948     {
1949         dst->R = static_cast<unsigned int>(src->red);
1950         dst->G = static_cast<unsigned int>(src->green);
1951         dst->B = static_cast<unsigned int>(src->blue);
1952         dst->A = static_cast<unsigned int>(src->alpha);
1953     }
1954 
averageR10G10B10A21955     static void average(R10G10B10A2 *dst, const R10G10B10A2 *src1, const R10G10B10A2 *src2)
1956     {
1957         dst->R = gl::average(src1->R, src2->R);
1958         dst->G = gl::average(src1->G, src2->G);
1959         dst->B = gl::average(src1->B, src2->B);
1960         dst->A = gl::average(src1->A, src2->A);
1961     }
1962 };
1963 
1964 struct R9G9B9E5
1965 {
1966     unsigned int R : 9;
1967     unsigned int G : 9;
1968     unsigned int B : 9;
1969     unsigned int E : 5;
1970 
readColorR9G9B9E51971     static void readColor(gl::ColorF *dst, const R9G9B9E5 *src)
1972     {
1973         gl::convert999E5toRGBFloats(gl::bitCast<unsigned int>(*src), &dst->red, &dst->green, &dst->blue);
1974         dst->alpha = 1.0f;
1975     }
1976 
writeColorR9G9B9E51977     static void writeColor(R9G9B9E5 *dst, const gl::ColorF *src)
1978     {
1979         *reinterpret_cast<unsigned int*>(dst) = gl::convertRGBFloatsTo999E5(src->red,
1980                                                                             src->green,
1981                                                                             src->blue);
1982     }
1983 
averageR9G9B9E51984     static void average(R9G9B9E5 *dst, const R9G9B9E5 *src1, const R9G9B9E5 *src2)
1985     {
1986         float r1, g1, b1;
1987         gl::convert999E5toRGBFloats(*reinterpret_cast<const unsigned int*>(src1), &r1, &g1, &b1);
1988 
1989         float r2, g2, b2;
1990         gl::convert999E5toRGBFloats(*reinterpret_cast<const unsigned int*>(src2), &r2, &g2, &b2);
1991 
1992         *reinterpret_cast<unsigned int*>(dst) = gl::convertRGBFloatsTo999E5(gl::average(r1, r2),
1993                                                                             gl::average(g1, g2),
1994                                                                             gl::average(b1, b2));
1995     }
1996 };
1997 
1998 struct R11G11B10F
1999 {
2000     unsigned int R : 11;
2001     unsigned int G : 11;
2002     unsigned int B : 10;
2003 
readColorR11G11B10F2004     static void readColor(gl::ColorF *dst, const R11G11B10F *src)
2005     {
2006         dst->red   = gl::float11ToFloat32(src->R);
2007         dst->green = gl::float11ToFloat32(src->G);
2008         dst->blue  = gl::float10ToFloat32(src->B);
2009         dst->alpha = 1.0f;
2010     }
2011 
writeColorR11G11B10F2012     static void writeColor(R11G11B10F *dst, const gl::ColorF *src)
2013     {
2014         dst->R = gl::float32ToFloat11(src->red);
2015         dst->G = gl::float32ToFloat11(src->green);
2016         dst->B = gl::float32ToFloat10(src->blue);
2017     }
2018 
averageR11G11B10F2019     static void average(R11G11B10F *dst, const R11G11B10F *src1, const R11G11B10F *src2)
2020     {
2021         dst->R = gl::averageFloat11(src1->R, src2->R);
2022         dst->G = gl::averageFloat11(src1->G, src2->G);
2023         dst->B = gl::averageFloat10(src1->B, src2->B);
2024     }
2025 };
2026 
2027 }
2028 
2029 #endif // LIBGLESV2_RENDERER_IMAGEFORMATS_H_
2030