xref: /aosp_15_r20/external/angle/src/image_util/imageformats.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 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 IMAGEUTIL_IMAGEFORMATS_H_
11 #define IMAGEUTIL_IMAGEFORMATS_H_
12 
13 #include "common/Color.h"
14 
15 #include <cstdint>
16 
17 namespace angle
18 {
19 
20 // Several structures share functionality for reading, writing or mipmapping but the layout
21 // must match the texture format which the structure represents. If collapsing or typedefing
22 // structs in this header, make sure the functionality and memory layout is exactly the same.
23 
24 struct L8
25 {
26     uint8_t L;
27 
28     static void readColor(gl::ColorF *dst, const L8 *src);
29     static void writeColor(L8 *dst, const gl::ColorF *src);
30     static void average(L8 *dst, const L8 *src1, const L8 *src2);
31 };
32 
33 struct R8
34 {
35     uint8_t R;
36 
37     static void readColor(gl::ColorF *dst, const R8 *src);
38     static void readColor(gl::ColorUI *dst, const R8 *src);
39     static void writeColor(R8 *dst, const gl::ColorF *src);
40     static void writeColor(R8 *dst, const gl::ColorUI *src);
41     static void average(R8 *dst, const R8 *src1, const R8 *src2);
42 };
43 
44 struct A8
45 {
46     uint8_t A;
47 
48     static void readColor(gl::ColorF *dst, const A8 *src);
49     static void writeColor(A8 *dst, const gl::ColorF *src);
50     static void average(A8 *dst, const A8 *src1, const A8 *src2);
51 };
52 
53 struct L8A8
54 {
55     uint8_t L;
56     uint8_t A;
57 
58     static void readColor(gl::ColorF *dst, const L8A8 *src);
59     static void writeColor(L8A8 *dst, const gl::ColorF *src);
60     static void average(L8A8 *dst, const L8A8 *src1, const L8A8 *src2);
61 };
62 
63 struct A8L8
64 {
65     uint8_t A;
66     uint8_t L;
67 
68     static void readColor(gl::ColorF *dst, const A8L8 *src);
69     static void writeColor(A8L8 *dst, const gl::ColorF *src);
70     static void average(A8L8 *dst, const A8L8 *src1, const A8L8 *src2);
71 };
72 
73 struct L4A4
74 {
75     uint8_t L : 4;
76     uint8_t A : 4;
77 
78     static void readColor(gl::ColorF *dst, const L4A4 *src);
79     static void writeColor(L4A4 *dst, const gl::ColorF *src);
80     static void average(L4A4 *dst, const L4A4 *src1, const L4A4 *src2);
81 };
82 
83 struct R8G8
84 {
85     uint8_t R;
86     uint8_t G;
87 
88     static void readColor(gl::ColorF *dst, const R8G8 *src);
89     static void readColor(gl::ColorUI *dst, const R8G8 *src);
90     static void writeColor(R8G8 *dst, const gl::ColorF *src);
91     static void writeColor(R8G8 *dst, const gl::ColorUI *src);
92     static void average(R8G8 *dst, const R8G8 *src1, const R8G8 *src2);
93 };
94 
95 struct R8G8B8
96 {
97     uint8_t R;
98     uint8_t G;
99     uint8_t B;
100 
101     static void readColor(gl::ColorF *dst, const R8G8B8 *src);
102     static void readColor(gl::ColorUI *dst, const R8G8B8 *src);
103     static void writeColor(R8G8B8 *dst, const gl::ColorF *src);
104     static void writeColor(R8G8B8 *dst, const gl::ColorUI *src);
105     static void average(R8G8B8 *dst, const R8G8B8 *src1, const R8G8B8 *src2);
106 };
107 
108 struct B8G8R8
109 {
110     uint8_t B;
111     uint8_t G;
112     uint8_t R;
113 
114     static void readColor(gl::ColorF *dst, const B8G8R8 *src);
115     static void readColor(gl::ColorUI *dst, const B8G8R8 *src);
116     static void writeColor(B8G8R8 *dst, const gl::ColorF *src);
117     static void writeColor(B8G8R8 *dst, const gl::ColorUI *src);
118     static void average(B8G8R8 *dst, const B8G8R8 *src1, const B8G8R8 *src2);
119 };
120 
121 struct R5G6B5
122 {
123     // OpenGL ES 2.0.25 spec Section 3.6.2: "Components are packed with the first component in the
124     // most significant bits of the bitfield, and successive component occupying progressively less
125     // significant locations"
126     uint16_t RGB;
127 
128     static void readColor(gl::ColorF *dst, const R5G6B5 *src);
129     static void writeColor(R5G6B5 *dst, const gl::ColorF *src);
130     static void average(R5G6B5 *dst, const R5G6B5 *src1, const R5G6B5 *src2);
131 };
132 
133 struct B5G6R5
134 {
135     uint16_t BGR;
136 
137     static void readColor(gl::ColorF *dst, const B5G6R5 *src);
138     static void writeColor(B5G6R5 *dst, const gl::ColorF *src);
139     static void average(B5G6R5 *dst, const B5G6R5 *src1, const B5G6R5 *src2);
140 };
141 
142 struct A8R8G8B8
143 {
144     uint8_t A;
145     uint8_t R;
146     uint8_t G;
147     uint8_t B;
148 
149     static void readColor(gl::ColorF *dst, const A8R8G8B8 *src);
150     static void readColor(gl::ColorUI *dst, const A8R8G8B8 *src);
151     static void writeColor(A8R8G8B8 *dst, const gl::ColorF *src);
152     static void writeColor(A8R8G8B8 *dst, const gl::ColorUI *src);
153     static void average(A8R8G8B8 *dst, const A8R8G8B8 *src1, const A8R8G8B8 *src2);
154 };
155 
156 struct R8G8B8A8
157 {
158     uint8_t R;
159     uint8_t G;
160     uint8_t B;
161     uint8_t A;
162 
163     static void readColor(gl::ColorF *dst, const R8G8B8A8 *src);
164     static void readColor(gl::ColorUI *dst, const R8G8B8A8 *src);
165     static void writeColor(R8G8B8A8 *dst, const gl::ColorF *src);
166     static void writeColor(R8G8B8A8 *dst, const gl::ColorUI *src);
167     static void average(R8G8B8A8 *dst, const R8G8B8A8 *src1, const R8G8B8A8 *src2);
168 };
169 
170 struct R8G8B8A8SRGB
171 {
172     uint8_t R;
173     uint8_t G;
174     uint8_t B;
175     uint8_t A;
176 
177     static void readColor(gl::ColorF *dst, const R8G8B8A8SRGB *src);
178     static void writeColor(R8G8B8A8SRGB *dst, const gl::ColorF *src);
179     static void average(R8G8B8A8SRGB *dst, const R8G8B8A8SRGB *src1, const R8G8B8A8SRGB *src2);
180 };
181 
182 struct B8G8R8A8
183 {
184     uint8_t B;
185     uint8_t G;
186     uint8_t R;
187     uint8_t A;
188 
189     static void readColor(gl::ColorF *dst, const B8G8R8A8 *src);
190     static void readColor(gl::ColorUI *dst, const B8G8R8A8 *src);
191     static void writeColor(B8G8R8A8 *dst, const gl::ColorF *src);
192     static void writeColor(B8G8R8A8 *dst, const gl::ColorUI *src);
193     static void average(B8G8R8A8 *dst, const B8G8R8A8 *src1, const B8G8R8A8 *src2);
194 };
195 
196 struct B8G8R8X8
197 {
198     uint8_t B;
199     uint8_t G;
200     uint8_t R;
201     uint8_t X;
202 
203     static void readColor(gl::ColorF *dst, const B8G8R8X8 *src);
204     static void readColor(gl::ColorUI *dst, const B8G8R8X8 *src);
205     static void writeColor(B8G8R8X8 *dst, const gl::ColorF *src);
206     static void writeColor(B8G8R8X8 *dst, const gl::ColorUI *src);
207     static void average(B8G8R8X8 *dst, const B8G8R8X8 *src1, const B8G8R8X8 *src2);
208 };
209 
210 struct R8G8B8X8
211 {
212     uint8_t R;
213     uint8_t G;
214     uint8_t B;
215     uint8_t X;
216 
217     static void readColor(gl::ColorF *dst, const R8G8B8X8 *src);
218     static void readColor(gl::ColorUI *dst, const R8G8B8X8 *src);
219     static void writeColor(R8G8B8X8 *dst, const gl::ColorF *src);
220     static void writeColor(R8G8B8X8 *dst, const gl::ColorUI *src);
221     static void average(R8G8B8X8 *dst, const R8G8B8X8 *src1, const R8G8B8X8 *src2);
222 };
223 
224 struct A1R5G5B5
225 {
226     uint16_t ARGB;
227 
228     static void readColor(gl::ColorF *dst, const A1R5G5B5 *src);
229     static void writeColor(A1R5G5B5 *dst, const gl::ColorF *src);
230     static void average(A1R5G5B5 *dst, const A1R5G5B5 *src1, const A1R5G5B5 *src2);
231 };
232 
233 struct R5G5B5A1
234 {
235     // OpenGL ES 2.0.25 spec Section 3.6.2: "Components are packed with the first component in the
236     // most significant
237     // bits of the bitfield, and successive component occupying progressively less significant
238     // locations"
239     uint16_t RGBA;
240 
241     static void readColor(gl::ColorF *dst, const R5G5B5A1 *src);
242     static void writeColor(R5G5B5A1 *dst, const gl::ColorF *src);
243     static void average(R5G5B5A1 *dst, const R5G5B5A1 *src1, const R5G5B5A1 *src2);
244 };
245 
246 struct R4G4B4A4
247 {
248     // OpenGL ES 2.0.25 spec Section 3.6.2: "Components are packed with the first component in the
249     // most significant
250     // bits of the bitfield, and successive component occupying progressively less significant
251     // locations"
252     uint16_t RGBA;
253 
254     static void readColor(gl::ColorF *dst, const R4G4B4A4 *src);
255     static void writeColor(R4G4B4A4 *dst, const gl::ColorF *src);
256     static void average(R4G4B4A4 *dst, const R4G4B4A4 *src1, const R4G4B4A4 *src2);
257 };
258 
259 struct A4R4G4B4
260 {
261     uint16_t ARGB;
262 
263     static void readColor(gl::ColorF *dst, const A4R4G4B4 *src);
264     static void writeColor(A4R4G4B4 *dst, const gl::ColorF *src);
265     static void average(A4R4G4B4 *dst, const A4R4G4B4 *src1, const A4R4G4B4 *src2);
266 };
267 
268 struct R16
269 {
270     uint16_t R;
271 
272     static void readColor(gl::ColorF *dst, const R16 *src);
273     static void readColor(gl::ColorUI *dst, const R16 *src);
274     static void writeColor(R16 *dst, const gl::ColorF *src);
275     static void writeColor(R16 *dst, const gl::ColorUI *src);
276     static void average(R16 *dst, const R16 *src1, const R16 *src2);
277 };
278 
279 struct R16G16
280 {
281     uint16_t R;
282     uint16_t G;
283 
284     static void readColor(gl::ColorF *dst, const R16G16 *src);
285     static void readColor(gl::ColorUI *dst, const R16G16 *src);
286     static void writeColor(R16G16 *dst, const gl::ColorF *src);
287     static void writeColor(R16G16 *dst, const gl::ColorUI *src);
288     static void average(R16G16 *dst, const R16G16 *src1, const R16G16 *src2);
289 };
290 
291 struct R16G16B16
292 {
293     uint16_t R;
294     uint16_t G;
295     uint16_t B;
296 
297     static void readColor(gl::ColorF *dst, const R16G16B16 *src);
298     static void readColor(gl::ColorUI *dst, const R16G16B16 *src);
299     static void writeColor(R16G16B16 *dst, const gl::ColorF *src);
300     static void writeColor(R16G16B16 *dst, const gl::ColorUI *src);
301     static void average(R16G16B16 *dst, const R16G16B16 *src1, const R16G16B16 *src2);
302 };
303 
304 struct R16G16B16A16
305 {
306     uint16_t R;
307     uint16_t G;
308     uint16_t B;
309     uint16_t A;
310 
311     static void readColor(gl::ColorF *dst, const R16G16B16A16 *src);
312     static void readColor(gl::ColorUI *dst, const R16G16B16A16 *src);
313     static void writeColor(R16G16B16A16 *dst, const gl::ColorF *src);
314     static void writeColor(R16G16B16A16 *dst, const gl::ColorUI *src);
315     static void average(R16G16B16A16 *dst, const R16G16B16A16 *src1, const R16G16B16A16 *src2);
316 };
317 
318 struct R32
319 {
320     uint32_t R;
321 
322     static void readColor(gl::ColorF *dst, const R32 *src);
323     static void readColor(gl::ColorUI *dst, const R32 *src);
324     static void writeColor(R32 *dst, const gl::ColorF *src);
325     static void writeColor(R32 *dst, const gl::ColorUI *src);
326     static void average(R32 *dst, const R32 *src1, const R32 *src2);
327 };
328 
329 struct R32G32
330 {
331     uint32_t R;
332     uint32_t G;
333 
334     static void readColor(gl::ColorF *dst, const R32G32 *src);
335     static void readColor(gl::ColorUI *dst, const R32G32 *src);
336     static void writeColor(R32G32 *dst, const gl::ColorF *src);
337     static void writeColor(R32G32 *dst, const gl::ColorUI *src);
338     static void average(R32G32 *dst, const R32G32 *src1, const R32G32 *src2);
339 };
340 
341 struct R32G32B32
342 {
343     uint32_t R;
344     uint32_t G;
345     uint32_t B;
346 
347     static void readColor(gl::ColorF *dst, const R32G32B32 *src);
348     static void readColor(gl::ColorUI *dst, const R32G32B32 *src);
349     static void writeColor(R32G32B32 *dst, const gl::ColorF *src);
350     static void writeColor(R32G32B32 *dst, const gl::ColorUI *src);
351     static void average(R32G32B32 *dst, const R32G32B32 *src1, const R32G32B32 *src2);
352 };
353 
354 struct R32G32B32A32
355 {
356     uint32_t R;
357     uint32_t G;
358     uint32_t B;
359     uint32_t A;
360 
361     static void readColor(gl::ColorF *dst, const R32G32B32A32 *src);
362     static void readColor(gl::ColorUI *dst, const R32G32B32A32 *src);
363     static void writeColor(R32G32B32A32 *dst, const gl::ColorF *src);
364     static void writeColor(R32G32B32A32 *dst, const gl::ColorUI *src);
365     static void average(R32G32B32A32 *dst, const R32G32B32A32 *src1, const R32G32B32A32 *src2);
366 };
367 
368 struct R8S
369 {
370     int8_t R;
371 
372     static void readColor(gl::ColorF *dst, const R8S *src);
373     static void readColor(gl::ColorI *dst, const R8S *src);
374     static void writeColor(R8S *dst, const gl::ColorF *src);
375     static void writeColor(R8S *dst, const gl::ColorI *src);
376     static void average(R8S *dst, const R8S *src1, const R8S *src2);
377 };
378 
379 struct R8G8S
380 {
381     int8_t R;
382     int8_t G;
383 
384     static void readColor(gl::ColorF *dst, const R8G8S *src);
385     static void readColor(gl::ColorI *dst, const R8G8S *src);
386     static void writeColor(R8G8S *dst, const gl::ColorF *src);
387     static void writeColor(R8G8S *dst, const gl::ColorI *src);
388     static void average(R8G8S *dst, const R8G8S *src1, const R8G8S *src2);
389 };
390 
391 struct R8G8B8S
392 {
393     int8_t R;
394     int8_t G;
395     int8_t B;
396 
397     static void readColor(gl::ColorF *dst, const R8G8B8S *src);
398     static void readColor(gl::ColorI *dst, const R8G8B8S *src);
399     static void writeColor(R8G8B8S *dst, const gl::ColorF *src);
400     static void writeColor(R8G8B8S *dst, const gl::ColorI *src);
401     static void average(R8G8B8S *dst, const R8G8B8S *src1, const R8G8B8S *src2);
402 };
403 
404 struct R8G8B8A8S
405 {
406     int8_t R;
407     int8_t G;
408     int8_t B;
409     int8_t A;
410 
411     static void readColor(gl::ColorF *dst, const R8G8B8A8S *src);
412     static void readColor(gl::ColorI *dst, const R8G8B8A8S *src);
413     static void writeColor(R8G8B8A8S *dst, const gl::ColorF *src);
414     static void writeColor(R8G8B8A8S *dst, const gl::ColorI *src);
415     static void average(R8G8B8A8S *dst, const R8G8B8A8S *src1, const R8G8B8A8S *src2);
416 };
417 
418 struct R16S
419 {
420     int16_t R;
421 
422     static void readColor(gl::ColorF *dst, const R16S *src);
423     static void readColor(gl::ColorI *dst, const R16S *src);
424     static void writeColor(R16S *dst, const gl::ColorF *src);
425     static void writeColor(R16S *dst, const gl::ColorI *src);
426     static void average(R16S *dst, const R16S *src1, const R16S *src2);
427 };
428 
429 struct R16G16S
430 {
431     int16_t R;
432     int16_t G;
433 
434     static void readColor(gl::ColorF *dst, const R16G16S *src);
435     static void readColor(gl::ColorI *dst, const R16G16S *src);
436     static void writeColor(R16G16S *dst, const gl::ColorF *src);
437     static void writeColor(R16G16S *dst, const gl::ColorI *src);
438     static void average(R16G16S *dst, const R16G16S *src1, const R16G16S *src2);
439 };
440 
441 struct R16G16B16S
442 {
443     int16_t R;
444     int16_t G;
445     int16_t B;
446 
447     static void readColor(gl::ColorF *dst, const R16G16B16S *src);
448     static void readColor(gl::ColorI *dst, const R16G16B16S *src);
449     static void writeColor(R16G16B16S *dst, const gl::ColorF *src);
450     static void writeColor(R16G16B16S *dst, const gl::ColorI *src);
451     static void average(R16G16B16S *dst, const R16G16B16S *src1, const R16G16B16S *src2);
452 };
453 
454 struct R16G16B16A16S
455 {
456     int16_t R;
457     int16_t G;
458     int16_t B;
459     int16_t A;
460 
461     static void readColor(gl::ColorF *dst, const R16G16B16A16S *src);
462     static void readColor(gl::ColorI *dst, const R16G16B16A16S *src);
463     static void writeColor(R16G16B16A16S *dst, const gl::ColorF *src);
464     static void writeColor(R16G16B16A16S *dst, const gl::ColorI *src);
465     static void average(R16G16B16A16S *dst, const R16G16B16A16S *src1, const R16G16B16A16S *src2);
466 };
467 
468 struct R32S
469 {
470     int32_t R;
471 
472     static void readColor(gl::ColorF *dst, const R32S *src);
473     static void readColor(gl::ColorI *dst, const R32S *src);
474     static void writeColor(R32S *dst, const gl::ColorF *src);
475     static void writeColor(R32S *dst, const gl::ColorI *src);
476     static void average(R32S *dst, const R32S *src1, const R32S *src2);
477 };
478 
479 struct R32G32S
480 {
481     int32_t R;
482     int32_t G;
483 
484     static void readColor(gl::ColorF *dst, const R32G32S *src);
485     static void readColor(gl::ColorI *dst, const R32G32S *src);
486     static void writeColor(R32G32S *dst, const gl::ColorF *src);
487     static void writeColor(R32G32S *dst, const gl::ColorI *src);
488     static void average(R32G32S *dst, const R32G32S *src1, const R32G32S *src2);
489 };
490 
491 struct R32G32B32S
492 {
493     int32_t R;
494     int32_t G;
495     int32_t B;
496 
497     static void readColor(gl::ColorF *dst, const R32G32B32S *src);
498     static void readColor(gl::ColorI *dst, const R32G32B32S *src);
499     static void writeColor(R32G32B32S *dst, const gl::ColorF *src);
500     static void writeColor(R32G32B32S *dst, const gl::ColorI *src);
501     static void average(R32G32B32S *dst, const R32G32B32S *src1, const R32G32B32S *src2);
502 };
503 
504 struct R32G32B32A32S
505 {
506     int32_t R;
507     int32_t G;
508     int32_t B;
509     int32_t A;
510 
511     static void readColor(gl::ColorF *dst, const R32G32B32A32S *src);
512     static void readColor(gl::ColorI *dst, const R32G32B32A32S *src);
513     static void writeColor(R32G32B32A32S *dst, const gl::ColorF *src);
514     static void writeColor(R32G32B32A32S *dst, const gl::ColorI *src);
515     static void average(R32G32B32A32S *dst, const R32G32B32A32S *src1, const R32G32B32A32S *src2);
516 };
517 
518 struct A16B16G16R16F
519 {
520     uint16_t A;
521     uint16_t R;
522     uint16_t G;
523     uint16_t B;
524 
525     static void readColor(gl::ColorF *dst, const A16B16G16R16F *src);
526     static void writeColor(A16B16G16R16F *dst, const gl::ColorF *src);
527     static void average(A16B16G16R16F *dst, const A16B16G16R16F *src1, const A16B16G16R16F *src2);
528 };
529 
530 struct R16G16B16A16F
531 {
532     uint16_t R;
533     uint16_t G;
534     uint16_t B;
535     uint16_t A;
536 
537     static void readColor(gl::ColorF *dst, const R16G16B16A16F *src);
538     static void writeColor(R16G16B16A16F *dst, const gl::ColorF *src);
539     static void average(R16G16B16A16F *dst, const R16G16B16A16F *src1, const R16G16B16A16F *src2);
540 };
541 
542 struct R16F
543 {
544     uint16_t R;
545 
546     static void readColor(gl::ColorF *dst, const R16F *src);
547     static void writeColor(R16F *dst, const gl::ColorF *src);
548     static void average(R16F *dst, const R16F *src1, const R16F *src2);
549 };
550 
551 struct A16F
552 {
553     uint16_t A;
554 
555     static void readColor(gl::ColorF *dst, const A16F *src);
556     static void writeColor(A16F *dst, const gl::ColorF *src);
557     static void average(A16F *dst, const A16F *src1, const A16F *src2);
558 };
559 
560 struct L16F
561 {
562     uint16_t L;
563 
564     static void readColor(gl::ColorF *dst, const L16F *src);
565     static void writeColor(L16F *dst, const gl::ColorF *src);
566     static void average(L16F *dst, const L16F *src1, const L16F *src2);
567 };
568 
569 struct L16A16F
570 {
571     uint16_t L;
572     uint16_t A;
573 
574     static void readColor(gl::ColorF *dst, const L16A16F *src);
575     static void writeColor(L16A16F *dst, const gl::ColorF *src);
576     static void average(L16A16F *dst, const L16A16F *src1, const L16A16F *src2);
577 };
578 
579 struct R16G16F
580 {
581     uint16_t R;
582     uint16_t G;
583 
584     static void readColor(gl::ColorF *dst, const R16G16F *src);
585     static void writeColor(R16G16F *dst, const gl::ColorF *src);
586     static void average(R16G16F *dst, const R16G16F *src1, const R16G16F *src2);
587 };
588 
589 struct R16G16B16F
590 {
591     uint16_t R;
592     uint16_t G;
593     uint16_t B;
594 
595     static void readColor(gl::ColorF *dst, const R16G16B16F *src);
596     static void writeColor(R16G16B16F *dst, const gl::ColorF *src);
597     static void average(R16G16B16F *dst, const R16G16B16F *src1, const R16G16B16F *src2);
598 };
599 
600 struct A32B32G32R32F
601 {
602     float A;
603     float R;
604     float G;
605     float B;
606 
607     static void readColor(gl::ColorF *dst, const A32B32G32R32F *src);
608     static void writeColor(A32B32G32R32F *dst, const gl::ColorF *src);
609     static void average(A32B32G32R32F *dst, const A32B32G32R32F *src1, const A32B32G32R32F *src2);
610 };
611 
612 struct R32G32B32A32F
613 {
614     float R;
615     float G;
616     float B;
617     float A;
618 
619     static void readColor(gl::ColorF *dst, const R32G32B32A32F *src);
620     static void writeColor(R32G32B32A32F *dst, const gl::ColorF *src);
621     static void average(R32G32B32A32F *dst, const R32G32B32A32F *src1, const R32G32B32A32F *src2);
622 };
623 
624 struct R32F
625 {
626     float R;
627 
628     static void readColor(gl::ColorF *dst, const R32F *src);
629     static void writeColor(R32F *dst, const gl::ColorF *src);
630     static void average(R32F *dst, const R32F *src1, const R32F *src2);
631 };
632 
633 struct A32F
634 {
635     float A;
636 
637     static void readColor(gl::ColorF *dst, const A32F *src);
638     static void writeColor(A32F *dst, const gl::ColorF *src);
639     static void average(A32F *dst, const A32F *src1, const A32F *src2);
640 };
641 
642 struct L32F
643 {
644     float L;
645 
646     static void readColor(gl::ColorF *dst, const L32F *src);
647     static void writeColor(L32F *dst, const gl::ColorF *src);
648     static void average(L32F *dst, const L32F *src1, const L32F *src2);
649 };
650 
651 struct L32A32F
652 {
653     float L;
654     float A;
655 
656     static void readColor(gl::ColorF *dst, const L32A32F *src);
657     static void writeColor(L32A32F *dst, const gl::ColorF *src);
658     static void average(L32A32F *dst, const L32A32F *src1, const L32A32F *src2);
659 };
660 
661 struct R32G32F
662 {
663     float R;
664     float G;
665 
666     static void readColor(gl::ColorF *dst, const R32G32F *src);
667     static void writeColor(R32G32F *dst, const gl::ColorF *src);
668     static void average(R32G32F *dst, const R32G32F *src1, const R32G32F *src2);
669 };
670 
671 struct R32G32B32F
672 {
673     float R;
674     float G;
675     float B;
676 
677     static void readColor(gl::ColorF *dst, const R32G32B32F *src);
678     static void writeColor(R32G32B32F *dst, const gl::ColorF *src);
679     static void average(R32G32B32F *dst, const R32G32B32F *src1, const R32G32B32F *src2);
680 };
681 
682 struct R10G10B10A2
683 {
684     uint32_t R : 10;
685     uint32_t G : 10;
686     uint32_t B : 10;
687     uint32_t A : 2;
688 
689     static void readColor(gl::ColorF *dst, const R10G10B10A2 *src);
690     static void readColor(gl::ColorUI *dst, const R10G10B10A2 *src);
691     static void writeColor(R10G10B10A2 *dst, const gl::ColorF *src);
692     static void writeColor(R10G10B10A2 *dst, const gl::ColorUI *src);
693     static void average(R10G10B10A2 *dst, const R10G10B10A2 *src1, const R10G10B10A2 *src2);
694 };
695 static_assert(sizeof(R10G10B10A2) == 4, "R10G10B10A2 struct not 32-bits.");
696 
697 struct R10G10B10A2S
698 {
699     int32_t R : 10;
700     int32_t G : 10;
701     int32_t B : 10;
702     int32_t A : 2;
703 
704     static void readColor(gl::ColorF *dst, const R10G10B10A2S *src);
705     static void readColor(gl::ColorI *dst, const R10G10B10A2S *src);
706     static void writeColor(R10G10B10A2S *dst, const gl::ColorF *src);
707     static void writeColor(R10G10B10A2S *dst, const gl::ColorI *src);
708     static void average(R10G10B10A2S *dst, const R10G10B10A2S *src1, const R10G10B10A2S *src2);
709 };
710 static_assert(sizeof(R10G10B10A2S) == 4, "R10G10B10A2S struct not 32-bits.");
711 
712 struct R10G10B10X2
713 {
714     uint32_t R : 10;
715     uint32_t G : 10;
716     uint32_t B : 10;
717 
718     static void readColor(gl::ColorF *dst, const R10G10B10X2 *src);
719     static void readColor(gl::ColorUI *dst, const R10G10B10X2 *src);
720     static void writeColor(R10G10B10X2 *dst, const gl::ColorF *src);
721     static void writeColor(R10G10B10X2 *dst, const gl::ColorUI *src);
722     static void average(R10G10B10X2 *dst, const R10G10B10X2 *src1, const R10G10B10X2 *src2);
723 };
724 static_assert(sizeof(R10G10B10X2) == 4, "R10G10B10X2 struct not 32-bits.");
725 
726 struct B10G10R10A2
727 {
728     uint32_t B : 10;
729     uint32_t G : 10;
730     uint32_t R : 10;
731     uint32_t A : 2;
732 
733     static void readColor(gl::ColorF *dst, const B10G10R10A2 *src);
734     static void readColor(gl::ColorUI *dst, const B10G10R10A2 *src);
735     static void writeColor(B10G10R10A2 *dst, const gl::ColorF *src);
736     static void writeColor(B10G10R10A2 *dst, const gl::ColorUI *src);
737     static void average(B10G10R10A2 *dst, const B10G10R10A2 *src1, const B10G10R10A2 *src2);
738 };
739 static_assert(sizeof(B10G10R10A2) == 4, "B10G10R10A2 struct not 32-bits.");
740 
741 struct R9G9B9E5
742 {
743     uint32_t R : 9;
744     uint32_t G : 9;
745     uint32_t B : 9;
746     uint32_t E : 5;
747 
748     static void readColor(gl::ColorF *dst, const R9G9B9E5 *src);
749     static void writeColor(R9G9B9E5 *dst, const gl::ColorF *src);
750     static void average(R9G9B9E5 *dst, const R9G9B9E5 *src1, const R9G9B9E5 *src2);
751 };
752 static_assert(sizeof(R9G9B9E5) == 4, "R9G9B9E5 struct not 32-bits.");
753 
754 struct R11G11B10F
755 {
756     uint32_t R : 11;
757     uint32_t G : 11;
758     uint32_t B : 10;
759 
760     static void readColor(gl::ColorF *dst, const R11G11B10F *src);
761     static void writeColor(R11G11B10F *dst, const gl::ColorF *src);
762     static void average(R11G11B10F *dst, const R11G11B10F *src1, const R11G11B10F *src2);
763 };
764 static_assert(sizeof(R11G11B10F) == 4, "R11G11B10F struct not 32-bits.");
765 
766 struct D24S8
767 {
768     uint32_t S : 8;
769     uint32_t D : 24;
770 
771     static void ReadDepthStencil(DepthStencil *dst, const D24S8 *src);
772     static void WriteDepthStencil(D24S8 *dst, const DepthStencil *src);
773 };
774 
775 struct S8
776 {
777     uint8_t S;
778 
779     static void ReadDepthStencil(DepthStencil *dst, const S8 *src);
780     static void WriteDepthStencil(S8 *dst, const DepthStencil *src);
781 };
782 
783 struct D16
784 {
785     uint16_t D;
786 
787     static void ReadDepthStencil(DepthStencil *dst, const D16 *src);
788     static void WriteDepthStencil(D16 *dst, const DepthStencil *src);
789 };
790 
791 struct D24X8
792 {
793     uint32_t D : 24;
794     uint32_t X : 8;
795 
796     static void ReadDepthStencil(DepthStencil *dst, const D24X8 *src);
797     static void WriteDepthStencil(D24X8 *dst, const DepthStencil *src);
798 };
799 
800 struct D32F
801 {
802     float D;
803 
804     static void ReadDepthStencil(DepthStencil *dst, const D32F *src);
805     static void WriteDepthStencil(D32F *dst, const DepthStencil *src);
806 };
807 
808 struct D32
809 {
810     uint32_t D;
811 
812     static void ReadDepthStencil(DepthStencil *dst, const D32 *src);
813     static void WriteDepthStencil(D32 *dst, const DepthStencil *src);
814 };
815 
816 struct D32FS8X24
817 {
818     float D;
819     uint32_t S;
820 
821     static void ReadDepthStencil(DepthStencil *dst, const D32FS8X24 *src);
822     static void WriteDepthStencil(D32FS8X24 *dst, const DepthStencil *src);
823 };
824 }  // namespace angle
825 
826 #endif  // IMAGEUTIL_IMAGEFORMATS_H_
827