175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang//
275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang// Use of this source code is governed by a BSD-style license that can be
475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang// found in the LICENSE file.
575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang//
675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang// imageformats.h: Defines image format types with functions for mip generation
875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang// and copying.
975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang#ifndef LIBGLESV2_RENDERER_IMAGEFORMATS_H_
1175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang#define LIBGLESV2_RENDERER_IMAGEFORMATS_H_
1275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1357f9b6d56bec5e2040909b9dc0c68ddb7ac4a978Geoff Lang#include "common/mathutil.h"
14446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Langnamespace rx
1675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
1775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
18446a4477761d2f410041501118b0ae5a4a660311Geoff Lang// Several structures share functionality for reading, writing or mipmapping but the layout
19446a4477761d2f410041501118b0ae5a4a660311Geoff Lang// must match the texture format which the structure represents. If collapsing or typedefing
20446a4477761d2f410041501118b0ae5a4a660311Geoff Lang// structs in this header, make sure the functionality and memory layout is exactly the same.
21446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
2275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Langstruct L8
2375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
2475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned char L;
2575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
26446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const L8 *src)
27446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
28446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        const float lum = gl::normalizedToFloat(src->L);
29446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = lum;
30446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = lum;
31446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = lum;
32446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
33446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
34446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
35446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(L8 *dst, const gl::ColorF *src)
36446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
37446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->L = gl::floatToNormalized<unsigned char>((src->red + src->green + src->blue) / 3.0f);
38446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
39446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
4075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    static void average(L8 *dst, const L8 *src1, const L8 *src2)
4175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
42446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->L = gl::average(src1->L, src2->L);
4375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
4475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
4575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
4675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Langstruct R8
4775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
4875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned char R;
4975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
50446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R8 *src)
51446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
52446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
53446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0.0f;
54446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
55446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
56446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
57446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
58446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const R8 *src)
59446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
60446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
61446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0;
62446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0;
63d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
64446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
65446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
66446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8 *dst, const gl::ColorF *src)
67446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
68446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<unsigned char>(src->red);
69446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
70446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
71446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8 *dst, const gl::ColorUI *src)
72446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
73446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned char>(src->red);
74446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
75446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
7675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    static void average(R8 *dst, const R8 *src1, const R8 *src2)
7775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
78446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
7975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
8075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
8175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
8275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Langstruct A8
8375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
8475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned char A;
8575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
86446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const A8 *src)
87446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
88446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = 0.0f;
89446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0.0f;
90446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
91446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat(src->A);
92446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
93446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
94446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(A8 *dst, const gl::ColorF *src)
95446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
96446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::floatToNormalized<unsigned char>(src->alpha);
97446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
98446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
9975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    static void average(A8 *dst, const A8 *src1, const A8 *src2)
10075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
101446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::average(src1->A, src2->A);
10275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
10375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
10475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
105446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct L8A8
10675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
10775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned char L;
10875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned char A;
10975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
110446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const L8A8 *src)
111446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
112446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        const float lum = gl::normalizedToFloat(src->L);
113446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = lum;
114446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = lum;
115446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = lum;
116446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat(src->A);
117446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
118446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
119446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(L8A8 *dst, const gl::ColorF *src)
120446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
121446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->L = gl::floatToNormalized<unsigned char>((src->red + src->green + src->blue) / 3.0f);
122446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::floatToNormalized<unsigned char>(src->alpha);
123446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
124446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
125446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(L8A8 *dst, const L8A8 *src1, const L8A8 *src2)
126446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
127446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        *(unsigned short*)dst = (((*(unsigned short*)src1 ^ *(unsigned short*)src2) & 0xFEFE) >> 1) + (*(unsigned short*)src1 & *(unsigned short*)src2);
128446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
129446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
130446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
131446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct A8L8
132446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
133446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char A;
134446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char L;
135446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
136446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const A8L8 *src)
137446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
138446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        const float lum = gl::normalizedToFloat(src->L);
139446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = lum;
140446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = lum;
141446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = lum;
142446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat(src->A);
143446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
144446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
145446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(A8L8 *dst, const gl::ColorF *src)
146446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
147446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->L = gl::floatToNormalized<unsigned char>((src->red + src->green + src->blue) / 3.0f);
148446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::floatToNormalized<unsigned char>(src->alpha);
149446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
150446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
15175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    static void average(A8L8 *dst, const A8L8 *src1, const A8L8 *src2)
15275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
15375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang        *(unsigned short*)dst = (((*(unsigned short*)src1 ^ *(unsigned short*)src2) & 0xFEFE) >> 1) + (*(unsigned short*)src1 & *(unsigned short*)src2);
15475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
15575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
15675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
15775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Langstruct R8G8
15875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
15975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned char R;
16075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned char G;
16175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
162446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R8G8 *src)
163446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
164446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
165446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
166446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
167446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
168446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
169446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
170446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const R8G8 *src)
171446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
172446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
173446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
174446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0;
175d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
176446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
177446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
178446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8G8 *dst, const gl::ColorF *src)
179446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
180446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<unsigned char>(src->red);
181446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<unsigned char>(src->green);
182446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
183446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
184446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8G8 *dst, const gl::ColorUI *src)
185446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
186446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned char>(src->red);
187446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<unsigned char>(src->green);
188446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
189446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
19075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    static void average(R8G8 *dst, const R8G8 *src1, const R8G8 *src2)
19175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
19275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang        *(unsigned short*)dst = (((*(unsigned short*)src1 ^ *(unsigned short*)src2) & 0xFEFE) >> 1) + (*(unsigned short*)src1 & *(unsigned short*)src2);
19375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
19475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
19575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
196446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R8G8B8
197446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
198446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char R;
199446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char G;
200446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char B;
201446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
202446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R8G8B8 *src)
203446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
204446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
205446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
206446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat(src->B);
207446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
208446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
209446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
210446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const R8G8B8 *src)
211446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
212446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
213446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
214446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->G;
215d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
216446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
217446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
218446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8G8B8 *dst, const gl::ColorF *src)
219446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
220446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<unsigned char>(src->red);
221446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<unsigned char>(src->green);
222446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<unsigned char>(src->blue);
223446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
224446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
225446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8G8B8 *dst, const gl::ColorUI *src)
226446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
227446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned char>(src->red);
228446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<unsigned char>(src->green);
229446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<unsigned char>(src->blue);
230446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
231446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
232446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R8G8B8 *dst, const R8G8B8 *src1, const R8G8B8 *src2)
233446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
234446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
235446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
236446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
237446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
238446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
239446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
240446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct B8G8R8
241446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
242446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char B;
243446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char G;
244446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char R;
245446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
246446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const B8G8R8 *src)
247446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
248446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
249446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
250446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat(src->B);
251446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
252446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
253446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
254446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const B8G8R8 *src)
255446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
256446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
257446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
258446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->G;
259d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
260446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
261446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
262446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(B8G8R8 *dst, const gl::ColorF *src)
263446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
264446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<unsigned char>(src->red);
265446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<unsigned char>(src->green);
266446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<unsigned char>(src->blue);
267446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
268446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
269446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(B8G8R8 *dst, const gl::ColorUI *src)
270446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
271446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned char>(src->red);
272446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<unsigned char>(src->green);
273446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<unsigned char>(src->blue);
274446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
275446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
276446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(B8G8R8 *dst, const B8G8R8 *src1, const B8G8R8 *src2)
277446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
278446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
279446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
280446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
281446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
282446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
283446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
284446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R5G6B5
285446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
286446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short RGB;
287446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
288446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R5G6B5 *src)
289446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
290446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat<5>(gl::getShiftedData<5, 11>(src->RGB));
291446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat<6>(gl::getShiftedData<6,  5>(src->RGB));
292446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat<5>(gl::getShiftedData<5,  0>(src->RGB));
293446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
294446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
295446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
296446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R5G6B5 *dst, const gl::ColorF *src)
297446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
298446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->RGB = gl::shiftData<5, 11>(gl::floatToNormalized<5, unsigned short>(src->red))   |
299446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                   gl::shiftData<6,  5>(gl::floatToNormalized<6, unsigned short>(src->green)) |
300446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                   gl::shiftData<5,  0>(gl::floatToNormalized<5, unsigned short>(src->blue));
301446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
302446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
303446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R5G6B5 *dst, const R5G6B5 *src1, const R5G6B5 *src2)
304446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
305446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->RGB = gl::shiftData<5, 11>(gl::average(gl::getShiftedData<5, 11>(src1->RGB), gl::getShiftedData<5, 11>(src2->RGB))) |
306446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                   gl::shiftData<6,  5>(gl::average(gl::getShiftedData<6,  5>(src1->RGB), gl::getShiftedData<6,  5>(src2->RGB))) |
307446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                   gl::shiftData<5,  0>(gl::average(gl::getShiftedData<5,  0>(src1->RGB), gl::getShiftedData<5,  0>(src2->RGB)));
308446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
309446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
310446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
31175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Langstruct A8R8G8B8
31275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
313446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char A;
314446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char R;
315446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char G;
316446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char B;
317446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
318446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const A8R8G8B8 *src)
319446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
320446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
321446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
322446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat(src->B);
323446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat(src->A);
324446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
325446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
326446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const A8R8G8B8 *src)
327446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
328446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
329446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
330446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
331446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = src->A;
332446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
333446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
334446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(A8R8G8B8 *dst, const gl::ColorF *src)
335446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
336446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<unsigned char>(src->red);
337446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<unsigned char>(src->green);
338446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<unsigned char>(src->blue);
339446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::floatToNormalized<unsigned char>(src->alpha);
340446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
341446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
342446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(A8R8G8B8 *dst, const gl::ColorUI *src)
343446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
344446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned char>(src->red);
345446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<unsigned char>(src->green);
346446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<unsigned char>(src->blue);
347446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = static_cast<unsigned char>(src->alpha);
348446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
349446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
350446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(A8R8G8B8 *dst, const A8R8G8B8 *src1, const A8R8G8B8 *src2)
351446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
352446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        *(unsigned int*)dst = (((*(unsigned int*)src1 ^ *(unsigned int*)src2) & 0xFEFEFEFE) >> 1) + (*(unsigned int*)src1 & *(unsigned int*)src2);
353446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
354446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
355446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
356446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R8G8B8A8
357446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
358446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char R;
359446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char G;
360446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char B;
361446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char A;
362446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
363446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R8G8B8A8 *src)
364446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
365446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
366446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
367446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat(src->B);
368446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat(src->A);
369446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
370446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
371446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const R8G8B8A8 *src)
372446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
373446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
374446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
375446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
376446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = src->A;
377446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
378446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
379446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8G8B8A8 *dst, const gl::ColorF *src)
380446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
381446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<unsigned char>(src->red);
382446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<unsigned char>(src->green);
383446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<unsigned char>(src->blue);
384446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::floatToNormalized<unsigned char>(src->alpha);
385446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
386446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
387446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8G8B8A8 *dst, const gl::ColorUI *src)
388446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
389446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned char>(src->red);
390446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<unsigned char>(src->green);
391446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<unsigned char>(src->blue);
392446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = static_cast<unsigned char>(src->alpha);
393446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
394446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
395446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R8G8B8A8 *dst, const R8G8B8A8 *src1, const R8G8B8A8 *src2)
396446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
397446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        *(unsigned int*)dst = (((*(unsigned int*)src1 ^ *(unsigned int*)src2) & 0xFEFEFEFE) >> 1) + (*(unsigned int*)src1 & *(unsigned int*)src2);
398446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
399446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
400446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
401446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct B8G8R8A8
402446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
40375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned char B;
40475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned char G;
40575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned char R;
40675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned char A;
40775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
408446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const B8G8R8A8 *src)
409446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
410446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
411446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
412446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat(src->B);
413446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat(src->A);
414446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
415446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
416446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const B8G8R8A8 *src)
417446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
418446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
419446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
420446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
421446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = src->A;
422446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
423446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
424446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(B8G8R8A8 *dst, const gl::ColorF *src)
425446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
426446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<unsigned char>(src->red);
427446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<unsigned char>(src->green);
428446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<unsigned char>(src->blue);
429446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::floatToNormalized<unsigned char>(src->alpha);
430446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
431446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
432446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(B8G8R8A8 *dst, const gl::ColorUI *src)
433446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
434446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned char>(src->red);
435446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<unsigned char>(src->green);
436446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<unsigned char>(src->blue);
437446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = static_cast<unsigned char>(src->alpha);
438446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
439446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
440446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(B8G8R8A8 *dst, const B8G8R8A8 *src1, const B8G8R8A8 *src2)
441446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
442446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        *(unsigned int*)dst = (((*(unsigned int*)src1 ^ *(unsigned int*)src2) & 0xFEFEFEFE) >> 1) + (*(unsigned int*)src1 & *(unsigned int*)src2);
443446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
444446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
445446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
446ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Langstruct B8G8R8X8
447ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang{
448ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    unsigned char B;
449ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    unsigned char G;
450ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    unsigned char R;
451ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    unsigned char X;
452ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang
453ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    static void readColor(gl::ColorF *dst, const B8G8R8X8 *src)
454ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    {
455ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->red = gl::normalizedToFloat(src->R);
456ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
457ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->blue = gl::normalizedToFloat(src->B);
458ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->alpha = 1.0f;
459ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    }
460ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang
461ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    static void readColor(gl::ColorUI *dst, const B8G8R8X8 *src)
462ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    {
463ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->red = src->R;
464ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->green = src->G;
465ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->blue = src->B;
466ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->alpha = 1;
467ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    }
468ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang
469ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    static void writeColor(B8G8R8X8 *dst, const gl::ColorF *src)
470ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    {
471ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->R = gl::floatToNormalized<unsigned char>(src->red);
472ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->G = gl::floatToNormalized<unsigned char>(src->green);
473ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->B = gl::floatToNormalized<unsigned char>(src->blue);
474ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->X = 255;
475ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    }
476ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang
477ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    static void writeColor(B8G8R8X8 *dst, const gl::ColorUI *src)
478ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    {
479ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->R = static_cast<unsigned char>(src->red);
480ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->G = static_cast<unsigned char>(src->green);
481ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->B = static_cast<unsigned char>(src->blue);
482ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->X = 255;
483ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    }
484ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang
485ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    static void average(B8G8R8X8 *dst, const B8G8R8X8 *src1, const B8G8R8X8 *src2)
486ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    {
487ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        *(unsigned int*)dst = (((*(unsigned int*)src1 ^ *(unsigned int*)src2) & 0xFEFEFEFE) >> 1) + (*(unsigned int*)src1 & *(unsigned int*)src2);
488ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang        dst->X = 255;
489ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang    }
490ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang};
491ca623f3f44cb1c2a8bbfb0e91b52f0b541552754Geoff Lang
492446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct B5G5R5A1
493446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
494446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short BGRA;
495446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
496446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const B5G5R5A1 *src)
497446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
498446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat<1>(gl::getShiftedData<1, 15>(src->BGRA));
499446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat<5>(gl::getShiftedData<5, 10>(src->BGRA));
500446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat<5>(gl::getShiftedData<5,  5>(src->BGRA));
501446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat<5>(gl::getShiftedData<5,  0>(src->BGRA));
502446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
503446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
504446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(B5G5R5A1 *dst, const gl::ColorF *src)
505446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
506446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->BGRA = gl::shiftData<1, 15>(gl::floatToNormalized<1, unsigned short>(src->alpha)) |
507446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                    gl::shiftData<5, 10>(gl::floatToNormalized<5, unsigned short>(src->red))   |
508446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                    gl::shiftData<5,  5>(gl::floatToNormalized<5, unsigned short>(src->green)) |
509446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                    gl::shiftData<5,  0>(gl::floatToNormalized<5, unsigned short>(src->blue));
510446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
511446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
512446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(B5G5R5A1 *dst, const B5G5R5A1 *src1, const B5G5R5A1 *src2)
513446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
514446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->BGRA = gl::shiftData<1, 15>(gl::average(gl::getShiftedData<1, 15>(src1->BGRA), gl::getShiftedData<1, 15>(src2->BGRA))) |
515446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                    gl::shiftData<5, 10>(gl::average(gl::getShiftedData<5, 10>(src1->BGRA), gl::getShiftedData<5, 10>(src2->BGRA))) |
516446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                    gl::shiftData<5,  5>(gl::average(gl::getShiftedData<5,  5>(src1->BGRA), gl::getShiftedData<5,  5>(src2->BGRA))) |
517446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                    gl::shiftData<5,  0>(gl::average(gl::getShiftedData<5,  0>(src1->BGRA), gl::getShiftedData<5,  0>(src2->BGRA)));
518446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
519446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
520446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
521446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R5G5B5A1
522446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
523446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short RGBA;
524446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
525446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R5G5B5A1 *src)
526446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
527446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat<1>(gl::getShiftedData<1, 15>(src->RGBA));
528446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat<5>(gl::getShiftedData<5, 10>(src->RGBA));
529446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat<5>(gl::getShiftedData<5,  5>(src->RGBA));
530446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat<5>(gl::getShiftedData<5,  0>(src->RGBA));
531446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
532446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
533446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R5G5B5A1 *dst, const gl::ColorF *src)
534446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
535446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->RGBA = gl::shiftData<1, 15>(gl::floatToNormalized<1, unsigned short>(src->alpha)) |
536446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                    gl::shiftData<5, 10>(gl::floatToNormalized<5, unsigned short>(src->blue))  |
537446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                    gl::shiftData<5,  5>(gl::floatToNormalized<5, unsigned short>(src->green)) |
538446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                    gl::shiftData<5,  0>(gl::floatToNormalized<5, unsigned short>(src->red));
539446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
540446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
541446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R5G5B5A1 *dst, const R5G5B5A1 *src1, const R5G5B5A1 *src2)
542446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
543446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->RGBA = gl::shiftData<1, 15>(gl::average(gl::getShiftedData<1, 15>(src1->RGBA), gl::getShiftedData<1, 15>(src2->RGBA))) |
544446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                    gl::shiftData<5, 10>(gl::average(gl::getShiftedData<5, 10>(src1->RGBA), gl::getShiftedData<5, 10>(src2->RGBA))) |
545446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                    gl::shiftData<5,  5>(gl::average(gl::getShiftedData<5,  5>(src1->RGBA), gl::getShiftedData<5,  5>(src2->RGBA))) |
546446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                    gl::shiftData<5,  0>(gl::average(gl::getShiftedData<5,  0>(src1->RGBA), gl::getShiftedData<5,  0>(src2->RGBA)));
547446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
548446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
549446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
550446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R4G4B4A4
551446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
552446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char R : 4;
553446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char G : 4;
554446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char B : 4;
555446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char A : 4;
556446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
557446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R4G4B4A4 *src)
558446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
559446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat<4>(src->R);
560446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat<4>(src->G);
561446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat<4>(src->B);
562446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat<4>(src->A);
563446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
564446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
565446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R4G4B4A4 *dst, const gl::ColorF *src)
566446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
567446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<4, unsigned char>(src->red);
568446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<4, unsigned char>(src->green);
569446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<4, unsigned char>(src->blue);
570446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::floatToNormalized<4, unsigned char>(src->alpha);
571446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
572446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
573446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R4G4B4A4 *dst, const R4G4B4A4 *src1, const R4G4B4A4 *src2)
574446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
575446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
576446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
577446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
578446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::average(src1->A, src2->A);
579446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
580446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
581446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
582446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct A4R4G4B4
583446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
584446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char A : 4;
585446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char R : 4;
586446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char G : 4;
587446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char B : 4;
588446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
589446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const A4R4G4B4 *src)
590446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
591446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat<4>(src->R);
592446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat<4>(src->G);
593446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat<4>(src->B);
594446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat<4>(src->A);
595446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
596446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
597446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(A4R4G4B4 *dst, const gl::ColorF *src)
598446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
599446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<4, unsigned char>(src->red);
600446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<4, unsigned char>(src->green);
601446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<4, unsigned char>(src->blue);
602446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::floatToNormalized<4, unsigned char>(src->alpha);
603446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
604446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
605446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(A4R4G4B4 *dst, const A4R4G4B4 *src1, const A4R4G4B4 *src2)
606446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
607446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
608446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
609446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
610446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::average(src1->A, src2->A);
611446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
612446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
613446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
614446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct B4G4R4A4
615446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
616446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char B : 4;
617446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char G : 4;
618446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char R : 4;
619446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned char A : 4;
620446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
621446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const B4G4R4A4 *src)
622446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
623446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat<4>(src->R);
624446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat<4>(src->G);
625446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat<4>(src->B);
626446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat<4>(src->A);
627446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
628446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
629446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(B4G4R4A4 *dst, const gl::ColorF *src)
630446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
631446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<4, unsigned char>(src->red);
632446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<4, unsigned char>(src->green);
633446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<4, unsigned char>(src->blue);
634446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::floatToNormalized<4, unsigned char>(src->alpha);
635446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
636446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
637446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(B4G4R4A4 *dst, const B4G4R4A4 *src1, const B4G4R4A4 *src2)
638446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
639446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
640446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
641446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
642446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::average(src1->A, src2->A);
643446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
644446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
645446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
646446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R16
647446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
648446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short R;
649446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
650446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R16 *src)
651446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
652446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
653446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0.0f;
654446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
655446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
656446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
657446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
658446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const R16 *src)
659446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
660446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
661446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0;
662446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0;
663d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
664446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
665446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
666446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16 *dst, const gl::ColorF *src)
667446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
668446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<unsigned short>(src->red);
669446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
670446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
671446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16 *dst, const gl::ColorUI *src)
672446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
673446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned short>(src->red);
674446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
675446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
676446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R16 *dst, const R16 *src1, const R16 *src2)
677446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
678446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
679446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
680446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
681446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
682446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R16G16
683446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
684446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short R;
685446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short G;
686446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
687446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R16G16 *src)
688446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
689446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
690446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
691446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
692446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
693446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
694446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
695446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const R16G16 *src)
696446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
697446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red = src->R;
698446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
699446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0;
700d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
701446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
702446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
703446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16G16 *dst, const gl::ColorF *src)
704446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
705446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<unsigned short>(src->red);
706446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<unsigned short>(src->green);
707446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
708446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
709446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16G16 *dst, const gl::ColorUI *src)
710446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
711446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned short>(src->red);
712446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<unsigned short>(src->green);
713446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
714446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
715446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R16G16 *dst, const R16G16 *src1, const R16G16 *src2)
716446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
717446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
718446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
719446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
720446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
721446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
722446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R16G16B16
723446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
724446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short R;
725446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short G;
726446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short B;
727446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
728446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R16G16B16 *src)
729446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
730446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
731446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
732446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat(src->B);
733446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
734446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
735446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
736446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const R16G16B16 *src)
737446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
738446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
739446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
740446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
741d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
742446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
743446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
744446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16G16B16 *dst, const gl::ColorF *src)
745446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
746446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<unsigned short>(src->red);
747446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<unsigned short>(src->green);
748446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<unsigned short>(src->blue);
749446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
750446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
751446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16G16B16 *dst, const gl::ColorUI *src)
752446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
753446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned short>(src->red);
754446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<unsigned short>(src->green);
755446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<unsigned short>(src->blue);
756446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
757446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
758446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R16G16B16 *dst, const R16G16B16 *src1, const R16G16B16 *src2)
759446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
760446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
761446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
762446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
763446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
764446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
765446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
766446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R16G16B16A16
767446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
768446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short R;
769446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short G;
770446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short B;
771446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short A;
772446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
773446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R16G16B16A16 *src)
774446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
775446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
776446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
777446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat(src->B);
778446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat(src->A);
779446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
780446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
781446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const R16G16B16A16 *src)
782446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
783446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
784446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
785446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
786446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = src->A;
787446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
788446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
789446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16G16B16A16 *dst, const gl::ColorF *src)
790446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
791446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<unsigned short>(src->red);
792446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<unsigned short>(src->green);
793446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<unsigned short>(src->blue);
794446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::floatToNormalized<unsigned short>(src->alpha);
795446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
796446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
797446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16G16B16A16 *dst, const gl::ColorUI *src)
798446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
799446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned short>(src->red);
800446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<unsigned short>(src->green);
801446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<unsigned short>(src->blue);
802446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = static_cast<unsigned short>(src->alpha);
803446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
804446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
805446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R16G16B16A16 *dst, const R16G16B16A16 *src1, const R16G16B16A16 *src2)
806446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
807446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
808446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
809446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
810446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::average(src1->A, src2->A);
811446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
812446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
813446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
814446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R32
815446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
816446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned int R;
817446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
818446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R32 *src)
819446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
820446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
821446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0.0f;
822446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
823446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
824446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
825446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
826446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const R32 *src)
827446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
828446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
829446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0;
830446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0;
831d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
832446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
833446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
834446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32 *dst, const gl::ColorF *src)
835446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
836446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<unsigned int>(src->red);
837446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
838446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
839446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32 *dst, const gl::ColorUI *src)
840446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
841446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned int>(src->red);
842446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
843446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
844446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R32 *dst, const R32 *src1, const R32 *src2)
845446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
846446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
847446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
848446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
849446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
850446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R32G32
851446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
852446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned int R;
853446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned int G;
854446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
855446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R32G32 *src)
856446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
857446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
858446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
859446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
860446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
861446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
862446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
863446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const R32G32 *src)
864446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
865446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
866446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
867446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0;
868d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
869446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
870446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
871446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32G32 *dst, const gl::ColorF *src)
872446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
873446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<unsigned int>(src->red);
874446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<unsigned int>(src->green);
875446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
876446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
877446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32G32 *dst, const gl::ColorUI *src)
878446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
879446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned int>(src->red);
880446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<unsigned int>(src->green);
881446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
882446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
883446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R32G32 *dst, const R32G32 *src1, const R32G32 *src2)
884446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
885446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
886446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
887446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
888446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
889446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
890446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R32G32B32
891446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
892446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned int R;
893446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned int G;
894446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned int B;
895446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
896446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R32G32B32 *src)
897446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
898446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
899446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
900446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat(src->B);
901446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
902446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
903446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
904446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const R32G32B32 *src)
905446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
906446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
907446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
908446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
909d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
910446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
911446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
912446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32G32B32 *dst, const gl::ColorF *src)
913446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
914446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<unsigned int>(src->red);
915446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<unsigned int>(src->green);
916446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<unsigned int>(src->blue);
917446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
918446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
919446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32G32B32 *dst, const gl::ColorUI *src)
920446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
921446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned int>(src->red);
922446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<unsigned int>(src->green);
923446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<unsigned int>(src->blue);
924446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
925446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
926446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R32G32B32 *dst, const R32G32B32 *src1, const R32G32B32 *src2)
927446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
928446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
929446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
930446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
931446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
932446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
933446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
934446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R32G32B32A32
935446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
936446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned int R;
937446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned int G;
938446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned int B;
939446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned int A;
940446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
941446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R32G32B32A32 *src)
942446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
943446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
944446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
945446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat(src->B);
946446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat(src->A);
947446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
948446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
949446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const R32G32B32A32 *src)
950446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
951446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
952446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
953446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
954446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = src->A;
955446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
956446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
957446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32G32B32A32 *dst, const gl::ColorF *src)
958446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
959446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<unsigned int>(src->red);
960446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<unsigned int>(src->green);
961446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<unsigned int>(src->blue);
962446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::floatToNormalized<unsigned int>(src->alpha);
963446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
964446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
965446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32G32B32A32 *dst, const gl::ColorUI *src)
966446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
967446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned int>(src->red);
968446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<unsigned int>(src->green);
969446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<unsigned int>(src->blue);
970446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = static_cast<unsigned int>(src->alpha);
971446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
972446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
973446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R32G32B32A32 *dst, const R32G32B32A32 *src1, const R32G32B32A32 *src2)
974446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
975446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
976446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
977446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
978446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::average(src1->A, src2->A);
979446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
980446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
981446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
982446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R8S
983446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
984446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    char R;
985446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
986446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R8S *src)
987446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
988446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
989446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0.0f;
990446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
991446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
992446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
993446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
994446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorI *dst, const R8S *src)
995446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
996446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
997446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0;
998446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0;
999d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
1000446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1001446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1002446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8S *dst, const gl::ColorF *src)
1003446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1004446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<char>(src->red);
1005446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1006446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1007446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8S *dst, const gl::ColorI *src)
1008446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1009446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<char>(src->red);
1010446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1011446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1012446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R8S *dst, const R8S *src1, const R8S *src2)
1013446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1014446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1015446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1016446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
1017446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1018446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R8G8S
1019446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
1020446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    char R;
1021446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    char G;
1022446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1023446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R8G8S *src)
1024446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1025446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
1026446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
1027446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
1028446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
1029446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1030446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1031446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorI *dst, const R8G8S *src)
1032446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1033446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1034446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
1035446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0;
1036d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
1037446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1038446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1039446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8G8S *dst, const gl::ColorF *src)
1040446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1041446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<char>(src->red);
1042446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<char>(src->green);
1043446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1044446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1045446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8G8S *dst, const gl::ColorI *src)
1046446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1047446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<char>(src->red);
1048446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<char>(src->green);
1049446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1050446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1051446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R8G8S *dst, const R8G8S *src1, const R8G8S *src2)
1052446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1053446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1054446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
1055446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1056446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
1057446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1058446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R8G8B8S
1059446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
1060446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    char R;
1061446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    char G;
1062446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    char B;
1063446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1064446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R8G8B8S *src)
1065446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1066446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
1067446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
1068446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat(src->B);
1069446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
1070446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1071446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1072446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorI *dst, const R8G8B8S *src)
1073446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1074446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1075446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
1076446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
1077d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
1078446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1079446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1080446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8G8B8S *dst, const gl::ColorF *src)
1081446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1082446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<char>(src->red);
1083446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<char>(src->green);
1084446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<char>(src->blue);
1085446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1086446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1087446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8G8B8S *dst, const gl::ColorI *src)
1088446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1089446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<char>(src->red);
1090446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<char>(src->green);
1091446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<char>(src->blue);
1092446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1093446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1094446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R8G8B8S *dst, const R8G8B8S *src1, const R8G8B8S *src2)
1095446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1096446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1097446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
1098446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
1099446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1100446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
1101446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1102446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R8G8B8A8S
1103446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
1104446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    char R;
1105446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    char G;
1106446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    char B;
1107446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    char A;
1108446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1109446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R8G8B8A8S *src)
1110446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1111446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
1112446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
1113446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat(src->B);
1114446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat(src->A);
1115446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1116446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1117446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorI *dst, const R8G8B8A8S *src)
1118446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1119446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1120446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
1121446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
1122446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = src->A;
1123446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1124446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1125446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8G8B8A8S *dst, const gl::ColorF *src)
1126446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1127446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<char>(src->red);
1128446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<char>(src->green);
1129446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<char>(src->blue);
1130446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::floatToNormalized<char>(src->alpha);
1131446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1132446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1133446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R8G8B8A8S *dst, const gl::ColorI *src)
1134446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1135446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<char>(src->red);
1136446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<char>(src->green);
1137446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<char>(src->blue);
1138446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = static_cast<char>(src->alpha);
1139446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1140446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1141446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R8G8B8A8S *dst, const R8G8B8A8S *src1, const R8G8B8A8S *src2)
1142446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1143446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1144446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
1145446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
1146446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::average(src1->A, src2->A);
1147446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1148446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
1149446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1150446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R16S
1151446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
1152446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    short R;
1153446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1154446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R16S *src)
1155446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1156446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
1157446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0.0f;
1158446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
1159446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
1160446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1161446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1162446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorI *dst, const R16S *src)
1163446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1164446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1165446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0;
1166446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0;
1167d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
1168446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1169446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1170446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16S *dst, const gl::ColorF *src)
1171446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1172446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<short>(src->red);
1173446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1174446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1175446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16S *dst, const gl::ColorI *src)
1176446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1177446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<short>(src->red);
1178446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1179446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1180446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R16S *dst, const R16S *src1, const R16S *src2)
1181446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1182446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1183446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1184446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
1185446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1186446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R16G16S
1187446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
1188446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    short R;
1189446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    short G;
1190446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1191446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R16G16S *src)
1192446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1193446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
1194446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
1195446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
1196446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
1197446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1198446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1199446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorI *dst, const R16G16S *src)
1200446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1201446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1202446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
1203446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0;
1204d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
1205446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1206446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1207446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16G16S *dst, const gl::ColorF *src)
1208446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1209446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<short>(src->red);
1210446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<short>(src->green);
1211446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1212446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1213446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16G16S *dst, const gl::ColorI *src)
1214446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1215446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<short>(src->red);
1216446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<short>(src->green);
1217446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1218446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1219446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R16G16S *dst, const R16G16S *src1, const R16G16S *src2)
1220446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1221446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1222446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
1223446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1224446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
1225446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1226446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R16G16B16S
1227446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
1228446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    short R;
1229446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    short G;
1230446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    short B;
1231446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1232446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R16G16B16S *src)
1233446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1234446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
1235446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
1236446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat(src->B);
1237446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
1238446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1239446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1240446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorI *dst, const R16G16B16S *src)
1241446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1242446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1243446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
1244446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
1245d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
1246446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1247446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1248446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16G16B16S *dst, const gl::ColorF *src)
1249446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1250446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<short>(src->red);
1251446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<short>(src->green);
1252446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<short>(src->blue);
1253446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1254446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1255446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16G16B16S *dst, const gl::ColorI *src)
1256446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1257446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<short>(src->red);
1258446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<short>(src->green);
1259446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<short>(src->blue);
1260446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1261446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1262446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R16G16B16S *dst, const R16G16B16S *src1, const R16G16B16S *src2)
1263446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1264446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1265446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
1266446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
1267446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1268446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
1269446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1270446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R16G16B16A16S
1271446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
1272446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    short R;
1273446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    short G;
1274446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    short B;
1275446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    short A;
1276446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1277446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R16G16B16A16S *src)
1278446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1279446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
1280446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
1281446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat(src->B);
1282446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat(src->A);
1283446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1284446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1285446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorI *dst, const R16G16B16A16S *src)
1286446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1287446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1288446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
1289446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
1290446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = src->A;
1291446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1292446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1293446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16G16B16A16S *dst, const gl::ColorF *src)
1294446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1295446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<short>(src->red);
1296446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<short>(src->green);
1297446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<short>(src->blue);
1298446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::floatToNormalized<short>(src->alpha);
1299446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1300446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1301446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16G16B16A16S *dst, const gl::ColorI *src)
1302446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1303446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<short>(src->red);
1304446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<short>(src->green);
1305446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<short>(src->blue);
1306446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = static_cast<short>(src->alpha);
1307446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1308446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1309446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R16G16B16A16S *dst, const R16G16B16A16S *src1, const R16G16B16A16S *src2)
1310446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1311446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1312446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
1313446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
1314446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::average(src1->A, src2->A);
1315446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1316446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
1317446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1318446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R32S
1319446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
1320446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    int R;
1321446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1322446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R32S *src)
1323446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1324446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
1325446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0.0f;
1326446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
1327446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
1328446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1329446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1330446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorI *dst, const R32S *src)
1331446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1332446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1333446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0;
1334446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0;
1335d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
1336446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1337446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1338446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32S *dst, const gl::ColorF *src)
1339446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1340446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<int>(src->red);
1341446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1342446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1343446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32S *dst, const gl::ColorI *src)
1344446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1345446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<int>(src->red);
1346446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1347446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1348446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R32S *dst, const R32S *src1, const R32S *src2)
1349446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1350446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1351446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1352446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
1353446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1354446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R32G32S
1355446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
1356446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    int R;
1357446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    int G;
1358446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1359446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R32G32S *src)
1360446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1361446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
1362446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
1363446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
1364446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
1365446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1366446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1367446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorI *dst, const R32G32S *src)
1368446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1369446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1370446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
1371446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0;
1372d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
1373446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1374446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1375446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32G32S *dst, const gl::ColorF *src)
1376446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1377446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<int>(src->red);
1378446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<int>(src->green);
1379446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1380446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1381446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32G32S *dst, const gl::ColorI *src)
1382446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1383446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<int>(src->red);
1384446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<int>(src->green);
1385446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1386446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1387446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R32G32S *dst, const R32G32S *src1, const R32G32S *src2)
1388446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1389446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1390446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
1391446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1392446a4477761d2f410041501118b0ae5a4a660311Geoff Lang};
1393446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1394446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R32G32B32S
1395446a4477761d2f410041501118b0ae5a4a660311Geoff Lang{
1396446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    int R;
1397446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    int G;
1398446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    int B;
1399446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1400446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R32G32B32S *src)
1401446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1402446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
1403446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
1404446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat(src->B);
1405446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
1406446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1407446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1408446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorI *dst, const R32G32B32S *src)
1409446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1410446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1411446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
1412446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
1413d1e9a9a69193fc375646319c51b01fab82b340e0Geoff Lang        dst->alpha = 1;
1414446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1415446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1416446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32G32B32S *dst, const gl::ColorF *src)
1417446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1418446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<int>(src->red);
1419446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<int>(src->green);
1420446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<int>(src->blue);
1421446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1422446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1423446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32G32B32S *dst, const gl::ColorI *src)
1424446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1425446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<int>(src->red);
1426446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<int>(src->green);
1427446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<int>(src->blue);
1428446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1429446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1430446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R32G32B32S *dst, const R32G32B32S *src1, const R32G32B32S *src2)
143175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1432446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1433446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
1434446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
143575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
143675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
143775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1438446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R32G32B32A32S
143975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
1440446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    int R;
1441446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    int G;
1442446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    int B;
1443446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    int A;
144475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1445446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R32G32B32A32S *src)
144675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1447446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat(src->R);
1448446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat(src->G);
1449446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat(src->B);
1450446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat(src->A);
145175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
145275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1453446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorI *dst, const R32G32B32A32S *src)
1454446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1455446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1456446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
1457446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
1458446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = src->A;
1459446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
146075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1461446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32G32B32A32S *dst, const gl::ColorF *src)
146275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1463446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<int>(src->red);
1464446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<int>(src->green);
1465446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<int>(src->blue);
1466446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::floatToNormalized<int>(src->alpha);
146775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
146875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1469446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32G32B32A32S *dst, const gl::ColorI *src)
1470446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1471446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<int>(src->red);
1472446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<int>(src->green);
1473446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<int>(src->blue);
1474446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = static_cast<int>(src->alpha);
1475446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
147675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1477446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R32G32B32A32S *dst, const R32G32B32A32S *src1, const R32G32B32A32S *src2)
147875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1479446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1480446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
1481446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
1482446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::average(src1->A, src2->A);
148375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
148475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
148575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1486446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct A16B16G16R16F
148775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
1488446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short A;
148975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned short R;
149075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned short G;
1491446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short B;
149275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1493446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const A16B16G16R16F *src)
1494446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1495446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::float16ToFloat32(src->R);
1496446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::float16ToFloat32(src->G);
1497446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::float16ToFloat32(src->B);
1498446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::float16ToFloat32(src->A);
1499446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1500446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1501446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(A16B16G16R16F *dst, const gl::ColorF *src)
150275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1503446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::float32ToFloat16(src->red);
1504446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::float32ToFloat16(src->green);
1505446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::float32ToFloat16(src->blue);
1506446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::float32ToFloat16(src->alpha);
1507446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1508446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1509446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(A16B16G16R16F *dst, const A16B16G16R16F *src1, const A16B16G16R16F *src2)
1510446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1511446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::averageHalfFloat(src1->R, src2->R);
1512446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::averageHalfFloat(src1->G, src2->G);
1513446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::averageHalfFloat(src1->B, src2->B);
1514446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::averageHalfFloat(src1->A, src2->A);
151575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
151675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
151775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1518446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R16G16B16A16F
151975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
152075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned short R;
152175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned short G;
152275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned short B;
152375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned short A;
152475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1525446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R16G16B16A16F *src)
152675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1527446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::float16ToFloat32(src->R);
1528446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::float16ToFloat32(src->G);
1529446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::float16ToFloat32(src->B);
1530446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::float16ToFloat32(src->A);
153175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
153275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1533446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16G16B16A16F *dst, const gl::ColorF *src)
1534446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1535446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::float32ToFloat16(src->red);
1536446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::float32ToFloat16(src->green);
1537446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::float32ToFloat16(src->blue);
1538446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::float32ToFloat16(src->alpha);
1539446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
154075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1541446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R16G16B16A16F *dst, const R16G16B16A16F *src1, const R16G16B16A16F *src2)
154275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1543446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::averageHalfFloat(src1->R, src2->R);
1544446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::averageHalfFloat(src1->G, src2->G);
1545446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::averageHalfFloat(src1->B, src2->B);
1546446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::averageHalfFloat(src1->A, src2->A);
154775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
154875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
154975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1550446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R16F
155175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
1552446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short R;
155375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1554446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R16F *src)
1555446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1556446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::float16ToFloat32(src->R);
1557446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0.0f;
1558446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
1559446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
1560446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1561446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1562446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16F *dst, const gl::ColorF *src)
156375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1564446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::float32ToFloat16(src->red);
1565446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1566446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1567446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R16F *dst, const R16F *src1, const R16F *src2)
1568446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1569446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::averageHalfFloat(src1->R, src2->R);
157075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
157175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
157275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1573446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct A16F
157475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
1575446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short A;
157675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1577446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const A16F *src)
157875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1579446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = 0.0f;
1580446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0.0f;
1581446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
1582446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::float16ToFloat32(src->A);
158375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
158475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1585446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(A16F *dst, const gl::ColorF *src)
1586446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1587446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::float32ToFloat16(src->alpha);
1588446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
158975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1590446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(A16F *dst, const A16F *src1, const A16F *src2)
159175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1592446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::averageHalfFloat(src1->A, src2->A);
159375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
159475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
159575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1596446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct L16F
159775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
1598446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short L;
159975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1600446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const L16F *src)
160175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1602446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        float lum = gl::float16ToFloat32(src->L);
1603446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = lum;
1604446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = lum;
1605446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = lum;
1606446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
160775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
160875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1609446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(L16F *dst, const gl::ColorF *src)
1610446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1611446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->L = gl::float32ToFloat16((src->red + src->green + src->blue) / 3.0f);
1612446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
161375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1614446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(L16F *dst, const L16F *src1, const L16F *src2)
161575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1616446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->L = gl::averageHalfFloat(src1->L, src2->L);
161775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
161875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
161975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1620446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct L16A16F
162175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
1622446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short L;
1623446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    unsigned short A;
162475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1625446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const L16A16F *src)
162675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1627446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        float lum = gl::float16ToFloat32(src->L);
1628446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = lum;
1629446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = lum;
1630446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = lum;
1631446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::float16ToFloat32(src->A);
163275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
163375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1634446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(L16A16F *dst, const gl::ColorF *src)
1635446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1636446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->L = gl::float32ToFloat16((src->red + src->green + src->blue) / 3.0f);
1637446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::float32ToFloat16(src->alpha);
1638446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
163975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1640446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(L16A16F *dst, const L16A16F *src1, const L16A16F *src2)
164175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1642446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->L = gl::averageHalfFloat(src1->L, src2->L);
1643446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::averageHalfFloat(src1->A, src2->A);
164475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
164575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
164675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1647446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R16G16F
164875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
164975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned short R;
165075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned short G;
165175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1652446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R16G16F *src)
1653446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1654446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::float16ToFloat32(src->R);
1655446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::float16ToFloat32(src->G);
1656446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
1657446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
1658446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1659446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1660446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16G16F *dst, const gl::ColorF *src)
1661446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1662446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::float32ToFloat16(src->red);
1663446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::float32ToFloat16(src->green);
1664446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1665446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1666446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R16G16F *dst, const R16G16F *src1, const R16G16F *src2)
166775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1668446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::averageHalfFloat(src1->R, src2->R);
1669446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::averageHalfFloat(src1->G, src2->G);
167075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
167175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
167275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1673446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R16G16B16F
167475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
167575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned short R;
167675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned short G;
167775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned short B;
167875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1679446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R16G16B16F *src)
168075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1681446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::float16ToFloat32(src->R);
1682446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::float16ToFloat32(src->G);
1683446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::float16ToFloat32(src->B);
1684446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
168575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
168675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1687446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R16G16B16F *dst, const gl::ColorF *src)
1688446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1689446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::float32ToFloat16(src->red);
1690446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::float32ToFloat16(src->green);
1691446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::float32ToFloat16(src->blue);
1692446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
169375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1694446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R16G16B16F *dst, const R16G16B16F *src1, const R16G16B16F *src2)
169575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1696446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::averageHalfFloat(src1->R, src2->R);
1697446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::averageHalfFloat(src1->G, src2->G);
1698446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::averageHalfFloat(src1->B, src2->B);
169975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
170075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
170175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1702446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct A32B32G32R32F
170375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
1704446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    float A;
1705446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    float R;
1706446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    float G;
1707446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    float B;
170875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1709446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const A32B32G32R32F *src)
171075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1711446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1712446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
1713446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
1714446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = src->A;
171575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
171675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1717446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(A32B32G32R32F *dst, const gl::ColorF *src)
1718446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1719446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = src->red;
1720446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = src->green;
1721446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = src->blue;
1722446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = src->alpha;
1723446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
172475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1725446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(A32B32G32R32F *dst, const A32B32G32R32F *src1, const A32B32G32R32F *src2)
172675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1727446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1728446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
1729446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
1730446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::average(src1->A, src2->A);
173175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
173275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
173375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1734446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R32G32B32A32F
173575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
1736446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    float R;
1737446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    float G;
1738446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    float B;
1739446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    float A;
174075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1741446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R32G32B32A32F *src)
174275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1743446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1744446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
1745446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
1746446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = src->A;
174775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
174875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1749446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32G32B32A32F *dst, const gl::ColorF *src)
1750446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1751446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = src->red;
1752446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = src->green;
1753446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = src->blue;
1754446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = src->alpha;
1755446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
175675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1757446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R32G32B32A32F *dst, const R32G32B32A32F *src1, const R32G32B32A32F *src2)
175875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1759446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1760446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
1761446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
1762446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::average(src1->A, src2->A);
176375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
176475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
176575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1766446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct R32F
176775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
1768446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    float R;
176975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1770446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R32F *src)
177175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1772446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1773446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0.0f;
1774446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
1775446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
177675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
177775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1778446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32F *dst, const gl::ColorF *src)
1779446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1780446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = src->red;
1781446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
178275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1783446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(R32F *dst, const R32F *src1, const R32F *src2)
178475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1785446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
178675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
178775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
178875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1789446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct A32F
179075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
1791446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    float A;
179275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1793446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const A32F *src)
1794446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1795446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = 0.0f;
1796446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = 0.0f;
1797446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
1798446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = src->A;
1799446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1800446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1801446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(A32F *dst, const gl::ColorF *src)
1802446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1803446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = src->alpha;
1804446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1805446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1806446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(A32F *dst, const A32F *src1, const A32F *src2)
180775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1808446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::average(src1->A, src2->A);
180975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
181075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
181175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1812446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct L32F
181375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
1814446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    float L;
181575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1816446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const L32F *src)
1817446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1818446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->L;
1819446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->L;
1820446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->L;
1821446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
1822446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1823446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1824446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(L32F *dst, const gl::ColorF *src)
1825446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1826446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->L = (src->red + src->green + src->blue) / 3.0f;
1827446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1828446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1829446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(L32F *dst, const L32F *src1, const L32F *src2)
183075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1831446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->L = gl::average(src1->L, src2->L);
183275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
183375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
183475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1835446a4477761d2f410041501118b0ae5a4a660311Geoff Langstruct L32A32F
183675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
1837446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    float L;
183875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    float A;
183975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1840446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const L32A32F *src)
184175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1842446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->L;
1843446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->L;
1844446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->L;
1845446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = src->A;
184675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
184775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1848446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(L32A32F *dst, const gl::ColorF *src)
1849446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1850446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->L = (src->red + src->green + src->blue) / 3.0f;
1851446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = src->alpha;
1852446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
185375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1854446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void average(L32A32F *dst, const L32A32F *src1, const L32A32F *src2)
185575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1856446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->L = gl::average(src1->L, src2->L);
1857446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::average(src1->A, src2->A);
185875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
185975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
186075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
186175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Langstruct R32G32F
186275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
186375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    float R;
186475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    float G;
186575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1866446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R32G32F *src)
1867446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1868446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1869446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
1870446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = 0.0f;
1871446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
1872446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1873446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1874446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32G32F *dst, const gl::ColorF *src)
1875446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1876446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = src->red;
1877446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = src->green;
1878446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1879446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
188075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    static void average(R32G32F *dst, const R32G32F *src1, const R32G32F *src2)
188175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1882446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1883446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
188475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
188575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
188675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
188775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Langstruct R32G32B32F
188875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
188975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    float R;
189075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    float G;
189175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    float B;
189275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1893446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R32G32B32F *src)
1894446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1895446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1896446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
1897446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
1898446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
1899446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1900446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1901446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R32G32B32F *dst, const gl::ColorF *src)
1902446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1903446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = src->red;
1904446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = src->green;
1905446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = src->blue;
1906446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1907446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
190875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    static void average(R32G32B32F *dst, const R32G32B32F *src1, const R32G32B32F *src2)
190975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1910446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1911446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
1912446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
191375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
191475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
191575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
191675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Langstruct R10G10B10A2
191775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
191875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned int R : 10;
191975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned int G : 10;
192075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned int B : 10;
192175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned int A : 2;
192275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1923446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R10G10B10A2 *src)
1924446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1925446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::normalizedToFloat<10>(src->R);
1926446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::normalizedToFloat<10>(src->G);
1927446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::normalizedToFloat<10>(src->B);
1928446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = gl::normalizedToFloat< 2>(src->A);
1929446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1930446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1931446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorUI *dst, const R10G10B10A2 *src)
1932446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1933446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = src->R;
1934446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = src->G;
1935446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = src->B;
1936446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = src->A;
1937446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1938446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1939446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R10G10B10A2 *dst, const gl::ColorF *src)
1940446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1941446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::floatToNormalized<10, unsigned int>(src->red);
1942446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::floatToNormalized<10, unsigned int>(src->green);
1943446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::floatToNormalized<10, unsigned int>(src->blue);
1944446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::floatToNormalized< 2, unsigned int>(src->alpha);
1945446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1946446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1947446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R10G10B10A2 *dst, const gl::ColorUI *src)
1948446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1949446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = static_cast<unsigned int>(src->red);
1950446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = static_cast<unsigned int>(src->green);
1951446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = static_cast<unsigned int>(src->blue);
1952446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = static_cast<unsigned int>(src->alpha);
1953446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1954446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
195575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    static void average(R10G10B10A2 *dst, const R10G10B10A2 *src1, const R10G10B10A2 *src2)
195675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
1957446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::average(src1->R, src2->R);
1958446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::average(src1->G, src2->G);
1959446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::average(src1->B, src2->B);
1960446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->A = gl::average(src1->A, src2->A);
196175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
196275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
196375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
196475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Langstruct R9G9B9E5
196575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
196675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned int R : 9;
196775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned int G : 9;
196875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned int B : 9;
196975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned int E : 5;
197075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1971446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R9G9B9E5 *src)
1972446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1973446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        gl::convert999E5toRGBFloats(gl::bitCast<unsigned int>(*src), &dst->red, &dst->green, &dst->blue);
1974446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
1975446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1976446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
1977446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R9G9B9E5 *dst, const gl::ColorF *src)
1978446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
1979446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        *reinterpret_cast<unsigned int*>(dst) = gl::convertRGBFloatsTo999E5(src->red,
1980446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                                                                            src->green,
1981446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                                                                            src->blue);
1982446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
1983446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
198475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    static void average(R9G9B9E5 *dst, const R9G9B9E5 *src1, const R9G9B9E5 *src2)
198575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
198675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang        float r1, g1, b1;
198775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang        gl::convert999E5toRGBFloats(*reinterpret_cast<const unsigned int*>(src1), &r1, &g1, &b1);
198875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
198975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang        float r2, g2, b2;
199075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang        gl::convert999E5toRGBFloats(*reinterpret_cast<const unsigned int*>(src2), &r2, &g2, &b2);
199175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
1992446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        *reinterpret_cast<unsigned int*>(dst) = gl::convertRGBFloatsTo999E5(gl::average(r1, r2),
1993446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                                                                            gl::average(g1, g2),
1994446a4477761d2f410041501118b0ae5a4a660311Geoff Lang                                                                            gl::average(b1, b2));
199575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
199675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
199775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
199875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Langstruct R11G11B10F
199975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang{
200075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned int R : 11;
200175ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned int G : 11;
200275ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    unsigned int B : 10;
200375ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
2004446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void readColor(gl::ColorF *dst, const R11G11B10F *src)
2005446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
2006446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->red   = gl::float11ToFloat32(src->R);
2007446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->green = gl::float11ToFloat32(src->G);
2008446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->blue  = gl::float10ToFloat32(src->B);
2009446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->alpha = 1.0f;
2010446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
2011446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
2012446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    static void writeColor(R11G11B10F *dst, const gl::ColorF *src)
2013446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    {
2014446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::float32ToFloat11(src->red);
2015446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::float32ToFloat11(src->green);
2016446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::float32ToFloat10(src->blue);
2017446a4477761d2f410041501118b0ae5a4a660311Geoff Lang    }
2018446a4477761d2f410041501118b0ae5a4a660311Geoff Lang
201975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    static void average(R11G11B10F *dst, const R11G11B10F *src1, const R11G11B10F *src2)
202075ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    {
2021446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->R = gl::averageFloat11(src1->R, src2->R);
2022446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->G = gl::averageFloat11(src1->G, src2->G);
2023446a4477761d2f410041501118b0ae5a4a660311Geoff Lang        dst->B = gl::averageFloat10(src1->B, src2->B);
202475ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang    }
202575ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang};
202675ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
202775ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang}
202875ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang
202975ce3f21886637461bb7c47b82c24dcd6934bccaGeoff Lang#endif // LIBGLESV2_RENDERER_IMAGEFORMATS_H_
2030