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