1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2013 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Worker // angle_loadimage.cpp: Defines image loading functions.
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker #include "image_util/loadimage.h"
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Worker #include "common/mathutil.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "common/platform.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "image_util/imageformats.h"
14*8975f5c5SAndroid Build Coastguard Worker
15*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_WINDOWS) && !defined(_M_ARM) && !defined(_M_ARM64)
16*8975f5c5SAndroid Build Coastguard Worker # if defined(_MSC_VER)
17*8975f5c5SAndroid Build Coastguard Worker # include <intrin.h>
18*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_LOADIMAGE_USE_SSE
19*8975f5c5SAndroid Build Coastguard Worker # elif defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
20*8975f5c5SAndroid Build Coastguard Worker # include <x86intrin.h>
21*8975f5c5SAndroid Build Coastguard Worker # if __SSE__
22*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_LOADIMAGE_USE_SSE
23*8975f5c5SAndroid Build Coastguard Worker # endif
24*8975f5c5SAndroid Build Coastguard Worker # endif
25*8975f5c5SAndroid Build Coastguard Worker #endif
26*8975f5c5SAndroid Build Coastguard Worker
27*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_LOADIMAGE_USE_SSE)
supportsSSE2()28*8975f5c5SAndroid Build Coastguard Worker inline bool supportsSSE2()
29*8975f5c5SAndroid Build Coastguard Worker {
30*8975f5c5SAndroid Build Coastguard Worker static bool checked = false;
31*8975f5c5SAndroid Build Coastguard Worker static bool supports = false;
32*8975f5c5SAndroid Build Coastguard Worker
33*8975f5c5SAndroid Build Coastguard Worker if (checked)
34*8975f5c5SAndroid Build Coastguard Worker {
35*8975f5c5SAndroid Build Coastguard Worker return supports;
36*8975f5c5SAndroid Build Coastguard Worker }
37*8975f5c5SAndroid Build Coastguard Worker
38*8975f5c5SAndroid Build Coastguard Worker int info[4];
39*8975f5c5SAndroid Build Coastguard Worker __cpuid(info, 0);
40*8975f5c5SAndroid Build Coastguard Worker
41*8975f5c5SAndroid Build Coastguard Worker if (info[0] >= 1)
42*8975f5c5SAndroid Build Coastguard Worker {
43*8975f5c5SAndroid Build Coastguard Worker __cpuid(info, 1);
44*8975f5c5SAndroid Build Coastguard Worker
45*8975f5c5SAndroid Build Coastguard Worker supports = (info[3] >> 26) & 1;
46*8975f5c5SAndroid Build Coastguard Worker }
47*8975f5c5SAndroid Build Coastguard Worker
48*8975f5c5SAndroid Build Coastguard Worker checked = true;
49*8975f5c5SAndroid Build Coastguard Worker return supports;
50*8975f5c5SAndroid Build Coastguard Worker }
51*8975f5c5SAndroid Build Coastguard Worker #endif
52*8975f5c5SAndroid Build Coastguard Worker
53*8975f5c5SAndroid Build Coastguard Worker namespace angle
54*8975f5c5SAndroid Build Coastguard Worker {
55*8975f5c5SAndroid Build Coastguard Worker ImageLoadContext::ImageLoadContext() = default;
56*8975f5c5SAndroid Build Coastguard Worker ImageLoadContext::~ImageLoadContext() = default;
57*8975f5c5SAndroid Build Coastguard Worker ImageLoadContext::ImageLoadContext(const ImageLoadContext &other) = default;
58*8975f5c5SAndroid Build Coastguard Worker
LoadA8ToRGBA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)59*8975f5c5SAndroid Build Coastguard Worker void LoadA8ToRGBA8(const ImageLoadContext &context,
60*8975f5c5SAndroid Build Coastguard Worker size_t width,
61*8975f5c5SAndroid Build Coastguard Worker size_t height,
62*8975f5c5SAndroid Build Coastguard Worker size_t depth,
63*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
64*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
65*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
66*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
67*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
68*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
69*8975f5c5SAndroid Build Coastguard Worker {
70*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_LOADIMAGE_USE_SSE)
71*8975f5c5SAndroid Build Coastguard Worker if (supportsSSE2())
72*8975f5c5SAndroid Build Coastguard Worker {
73*8975f5c5SAndroid Build Coastguard Worker __m128i zeroWide = _mm_setzero_si128();
74*8975f5c5SAndroid Build Coastguard Worker
75*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
76*8975f5c5SAndroid Build Coastguard Worker {
77*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
78*8975f5c5SAndroid Build Coastguard Worker {
79*8975f5c5SAndroid Build Coastguard Worker const uint8_t *source =
80*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
81*8975f5c5SAndroid Build Coastguard Worker uint32_t *dest = priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch,
82*8975f5c5SAndroid Build Coastguard Worker outputDepthPitch);
83*8975f5c5SAndroid Build Coastguard Worker
84*8975f5c5SAndroid Build Coastguard Worker size_t x = 0;
85*8975f5c5SAndroid Build Coastguard Worker
86*8975f5c5SAndroid Build Coastguard Worker // Make output writes aligned
87*8975f5c5SAndroid Build Coastguard Worker for (; ((reinterpret_cast<intptr_t>(&dest[x]) & 0xF) != 0 && x < width); x++)
88*8975f5c5SAndroid Build Coastguard Worker {
89*8975f5c5SAndroid Build Coastguard Worker dest[x] = static_cast<uint32_t>(source[x]) << 24;
90*8975f5c5SAndroid Build Coastguard Worker }
91*8975f5c5SAndroid Build Coastguard Worker
92*8975f5c5SAndroid Build Coastguard Worker for (; x + 7 < width; x += 8)
93*8975f5c5SAndroid Build Coastguard Worker {
94*8975f5c5SAndroid Build Coastguard Worker __m128i sourceData =
95*8975f5c5SAndroid Build Coastguard Worker _mm_loadl_epi64(reinterpret_cast<const __m128i *>(&source[x]));
96*8975f5c5SAndroid Build Coastguard Worker // Interleave each byte to 16bit, make the lower byte to zero
97*8975f5c5SAndroid Build Coastguard Worker sourceData = _mm_unpacklo_epi8(zeroWide, sourceData);
98*8975f5c5SAndroid Build Coastguard Worker // Interleave each 16bit to 32bit, make the lower 16bit to zero
99*8975f5c5SAndroid Build Coastguard Worker __m128i lo = _mm_unpacklo_epi16(zeroWide, sourceData);
100*8975f5c5SAndroid Build Coastguard Worker __m128i hi = _mm_unpackhi_epi16(zeroWide, sourceData);
101*8975f5c5SAndroid Build Coastguard Worker
102*8975f5c5SAndroid Build Coastguard Worker _mm_store_si128(reinterpret_cast<__m128i *>(&dest[x]), lo);
103*8975f5c5SAndroid Build Coastguard Worker _mm_store_si128(reinterpret_cast<__m128i *>(&dest[x + 4]), hi);
104*8975f5c5SAndroid Build Coastguard Worker }
105*8975f5c5SAndroid Build Coastguard Worker
106*8975f5c5SAndroid Build Coastguard Worker // Handle the remainder
107*8975f5c5SAndroid Build Coastguard Worker for (; x < width; x++)
108*8975f5c5SAndroid Build Coastguard Worker {
109*8975f5c5SAndroid Build Coastguard Worker dest[x] = static_cast<uint32_t>(source[x]) << 24;
110*8975f5c5SAndroid Build Coastguard Worker }
111*8975f5c5SAndroid Build Coastguard Worker }
112*8975f5c5SAndroid Build Coastguard Worker }
113*8975f5c5SAndroid Build Coastguard Worker
114*8975f5c5SAndroid Build Coastguard Worker return;
115*8975f5c5SAndroid Build Coastguard Worker }
116*8975f5c5SAndroid Build Coastguard Worker #endif
117*8975f5c5SAndroid Build Coastguard Worker
118*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
119*8975f5c5SAndroid Build Coastguard Worker {
120*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
121*8975f5c5SAndroid Build Coastguard Worker {
122*8975f5c5SAndroid Build Coastguard Worker const uint8_t *source =
123*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
124*8975f5c5SAndroid Build Coastguard Worker uint32_t *dest =
125*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
126*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
127*8975f5c5SAndroid Build Coastguard Worker {
128*8975f5c5SAndroid Build Coastguard Worker dest[x] = static_cast<uint32_t>(source[x]) << 24;
129*8975f5c5SAndroid Build Coastguard Worker }
130*8975f5c5SAndroid Build Coastguard Worker }
131*8975f5c5SAndroid Build Coastguard Worker }
132*8975f5c5SAndroid Build Coastguard Worker }
133*8975f5c5SAndroid Build Coastguard Worker
LoadA8ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)134*8975f5c5SAndroid Build Coastguard Worker void LoadA8ToBGRA8(const ImageLoadContext &context,
135*8975f5c5SAndroid Build Coastguard Worker size_t width,
136*8975f5c5SAndroid Build Coastguard Worker size_t height,
137*8975f5c5SAndroid Build Coastguard Worker size_t depth,
138*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
139*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
140*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
141*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
142*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
143*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
144*8975f5c5SAndroid Build Coastguard Worker {
145*8975f5c5SAndroid Build Coastguard Worker // Same as loading to RGBA
146*8975f5c5SAndroid Build Coastguard Worker LoadA8ToRGBA8(context, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
147*8975f5c5SAndroid Build Coastguard Worker outputRowPitch, outputDepthPitch);
148*8975f5c5SAndroid Build Coastguard Worker }
149*8975f5c5SAndroid Build Coastguard Worker
LoadA32FToRGBA32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)150*8975f5c5SAndroid Build Coastguard Worker void LoadA32FToRGBA32F(const ImageLoadContext &context,
151*8975f5c5SAndroid Build Coastguard Worker size_t width,
152*8975f5c5SAndroid Build Coastguard Worker size_t height,
153*8975f5c5SAndroid Build Coastguard Worker size_t depth,
154*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
155*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
156*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
157*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
158*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
159*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
160*8975f5c5SAndroid Build Coastguard Worker {
161*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
162*8975f5c5SAndroid Build Coastguard Worker {
163*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
164*8975f5c5SAndroid Build Coastguard Worker {
165*8975f5c5SAndroid Build Coastguard Worker const float *source =
166*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
167*8975f5c5SAndroid Build Coastguard Worker float *dest =
168*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
169*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
170*8975f5c5SAndroid Build Coastguard Worker {
171*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] = 0.0f;
172*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] = 0.0f;
173*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] = 0.0f;
174*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = source[x];
175*8975f5c5SAndroid Build Coastguard Worker }
176*8975f5c5SAndroid Build Coastguard Worker }
177*8975f5c5SAndroid Build Coastguard Worker }
178*8975f5c5SAndroid Build Coastguard Worker }
179*8975f5c5SAndroid Build Coastguard Worker
LoadA16FToRGBA16F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)180*8975f5c5SAndroid Build Coastguard Worker void LoadA16FToRGBA16F(const ImageLoadContext &context,
181*8975f5c5SAndroid Build Coastguard Worker size_t width,
182*8975f5c5SAndroid Build Coastguard Worker size_t height,
183*8975f5c5SAndroid Build Coastguard Worker size_t depth,
184*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
185*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
186*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
187*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
188*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
189*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
190*8975f5c5SAndroid Build Coastguard Worker {
191*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
192*8975f5c5SAndroid Build Coastguard Worker {
193*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
194*8975f5c5SAndroid Build Coastguard Worker {
195*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
196*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
197*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
198*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
199*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
200*8975f5c5SAndroid Build Coastguard Worker {
201*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] = 0;
202*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] = 0;
203*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] = 0;
204*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = source[x];
205*8975f5c5SAndroid Build Coastguard Worker }
206*8975f5c5SAndroid Build Coastguard Worker }
207*8975f5c5SAndroid Build Coastguard Worker }
208*8975f5c5SAndroid Build Coastguard Worker }
209*8975f5c5SAndroid Build Coastguard Worker
LoadL8ToRGBA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)210*8975f5c5SAndroid Build Coastguard Worker void LoadL8ToRGBA8(const ImageLoadContext &context,
211*8975f5c5SAndroid Build Coastguard Worker size_t width,
212*8975f5c5SAndroid Build Coastguard Worker size_t height,
213*8975f5c5SAndroid Build Coastguard Worker size_t depth,
214*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
215*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
216*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
217*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
218*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
219*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
220*8975f5c5SAndroid Build Coastguard Worker {
221*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
222*8975f5c5SAndroid Build Coastguard Worker {
223*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
224*8975f5c5SAndroid Build Coastguard Worker {
225*8975f5c5SAndroid Build Coastguard Worker const uint8_t *source =
226*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
227*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
228*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
229*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
230*8975f5c5SAndroid Build Coastguard Worker {
231*8975f5c5SAndroid Build Coastguard Worker uint8_t sourceVal = source[x];
232*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] = sourceVal;
233*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] = sourceVal;
234*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] = sourceVal;
235*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = 0xFF;
236*8975f5c5SAndroid Build Coastguard Worker }
237*8975f5c5SAndroid Build Coastguard Worker }
238*8975f5c5SAndroid Build Coastguard Worker }
239*8975f5c5SAndroid Build Coastguard Worker }
240*8975f5c5SAndroid Build Coastguard Worker
LoadL8ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)241*8975f5c5SAndroid Build Coastguard Worker void LoadL8ToBGRA8(const ImageLoadContext &context,
242*8975f5c5SAndroid Build Coastguard Worker size_t width,
243*8975f5c5SAndroid Build Coastguard Worker size_t height,
244*8975f5c5SAndroid Build Coastguard Worker size_t depth,
245*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
246*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
247*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
248*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
249*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
250*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
251*8975f5c5SAndroid Build Coastguard Worker {
252*8975f5c5SAndroid Build Coastguard Worker // Same as loading to RGBA
253*8975f5c5SAndroid Build Coastguard Worker LoadL8ToRGBA8(context, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
254*8975f5c5SAndroid Build Coastguard Worker outputRowPitch, outputDepthPitch);
255*8975f5c5SAndroid Build Coastguard Worker }
256*8975f5c5SAndroid Build Coastguard Worker
LoadL32FToRGBA32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)257*8975f5c5SAndroid Build Coastguard Worker void LoadL32FToRGBA32F(const ImageLoadContext &context,
258*8975f5c5SAndroid Build Coastguard Worker size_t width,
259*8975f5c5SAndroid Build Coastguard Worker size_t height,
260*8975f5c5SAndroid Build Coastguard Worker size_t depth,
261*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
262*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
263*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
264*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
265*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
266*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
267*8975f5c5SAndroid Build Coastguard Worker {
268*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
269*8975f5c5SAndroid Build Coastguard Worker {
270*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
271*8975f5c5SAndroid Build Coastguard Worker {
272*8975f5c5SAndroid Build Coastguard Worker const float *source =
273*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
274*8975f5c5SAndroid Build Coastguard Worker float *dest =
275*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
276*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
277*8975f5c5SAndroid Build Coastguard Worker {
278*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] = source[x];
279*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] = source[x];
280*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] = source[x];
281*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = 1.0f;
282*8975f5c5SAndroid Build Coastguard Worker }
283*8975f5c5SAndroid Build Coastguard Worker }
284*8975f5c5SAndroid Build Coastguard Worker }
285*8975f5c5SAndroid Build Coastguard Worker }
286*8975f5c5SAndroid Build Coastguard Worker
LoadL16FToRGBA16F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)287*8975f5c5SAndroid Build Coastguard Worker void LoadL16FToRGBA16F(const ImageLoadContext &context,
288*8975f5c5SAndroid Build Coastguard Worker size_t width,
289*8975f5c5SAndroid Build Coastguard Worker size_t height,
290*8975f5c5SAndroid Build Coastguard Worker size_t depth,
291*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
292*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
293*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
294*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
295*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
296*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
297*8975f5c5SAndroid Build Coastguard Worker {
298*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
299*8975f5c5SAndroid Build Coastguard Worker {
300*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
301*8975f5c5SAndroid Build Coastguard Worker {
302*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
303*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
304*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
305*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
306*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
307*8975f5c5SAndroid Build Coastguard Worker {
308*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] = source[x];
309*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] = source[x];
310*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] = source[x];
311*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = gl::Float16One;
312*8975f5c5SAndroid Build Coastguard Worker }
313*8975f5c5SAndroid Build Coastguard Worker }
314*8975f5c5SAndroid Build Coastguard Worker }
315*8975f5c5SAndroid Build Coastguard Worker }
316*8975f5c5SAndroid Build Coastguard Worker
LoadLA8ToRGBA4(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)317*8975f5c5SAndroid Build Coastguard Worker void LoadLA8ToRGBA4(const ImageLoadContext &context,
318*8975f5c5SAndroid Build Coastguard Worker size_t width,
319*8975f5c5SAndroid Build Coastguard Worker size_t height,
320*8975f5c5SAndroid Build Coastguard Worker size_t depth,
321*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
322*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
323*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
324*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
325*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
326*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
327*8975f5c5SAndroid Build Coastguard Worker {
328*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
329*8975f5c5SAndroid Build Coastguard Worker {
330*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
331*8975f5c5SAndroid Build Coastguard Worker {
332*8975f5c5SAndroid Build Coastguard Worker const uint8_t *source =
333*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
334*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
335*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
336*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
337*8975f5c5SAndroid Build Coastguard Worker {
338*8975f5c5SAndroid Build Coastguard Worker uint8_t l = source[2 * x + 0] >> 4;
339*8975f5c5SAndroid Build Coastguard Worker uint8_t a = source[2 * x + 1] >> 4;
340*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] = l | l << 4;
341*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] = l | a << 4;
342*8975f5c5SAndroid Build Coastguard Worker }
343*8975f5c5SAndroid Build Coastguard Worker }
344*8975f5c5SAndroid Build Coastguard Worker }
345*8975f5c5SAndroid Build Coastguard Worker }
346*8975f5c5SAndroid Build Coastguard Worker
LoadLA8ToRGBA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)347*8975f5c5SAndroid Build Coastguard Worker void LoadLA8ToRGBA8(const ImageLoadContext &context,
348*8975f5c5SAndroid Build Coastguard Worker size_t width,
349*8975f5c5SAndroid Build Coastguard Worker size_t height,
350*8975f5c5SAndroid Build Coastguard Worker size_t depth,
351*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
352*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
353*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
354*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
355*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
356*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
357*8975f5c5SAndroid Build Coastguard Worker {
358*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
359*8975f5c5SAndroid Build Coastguard Worker {
360*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
361*8975f5c5SAndroid Build Coastguard Worker {
362*8975f5c5SAndroid Build Coastguard Worker const uint8_t *source =
363*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
364*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
365*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
366*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
367*8975f5c5SAndroid Build Coastguard Worker {
368*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] = source[2 * x + 0];
369*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] = source[2 * x + 0];
370*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] = source[2 * x + 0];
371*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = source[2 * x + 1];
372*8975f5c5SAndroid Build Coastguard Worker }
373*8975f5c5SAndroid Build Coastguard Worker }
374*8975f5c5SAndroid Build Coastguard Worker }
375*8975f5c5SAndroid Build Coastguard Worker }
376*8975f5c5SAndroid Build Coastguard Worker
LoadLA8ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)377*8975f5c5SAndroid Build Coastguard Worker void LoadLA8ToBGRA8(const ImageLoadContext &context,
378*8975f5c5SAndroid Build Coastguard Worker size_t width,
379*8975f5c5SAndroid Build Coastguard Worker size_t height,
380*8975f5c5SAndroid Build Coastguard Worker size_t depth,
381*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
382*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
383*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
384*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
385*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
386*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
387*8975f5c5SAndroid Build Coastguard Worker {
388*8975f5c5SAndroid Build Coastguard Worker // Same as loading to RGBA
389*8975f5c5SAndroid Build Coastguard Worker LoadLA8ToRGBA8(context, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
390*8975f5c5SAndroid Build Coastguard Worker outputRowPitch, outputDepthPitch);
391*8975f5c5SAndroid Build Coastguard Worker }
392*8975f5c5SAndroid Build Coastguard Worker
LoadLA32FToRGBA32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)393*8975f5c5SAndroid Build Coastguard Worker void LoadLA32FToRGBA32F(const ImageLoadContext &context,
394*8975f5c5SAndroid Build Coastguard Worker size_t width,
395*8975f5c5SAndroid Build Coastguard Worker size_t height,
396*8975f5c5SAndroid Build Coastguard Worker size_t depth,
397*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
398*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
399*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
400*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
401*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
402*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
403*8975f5c5SAndroid Build Coastguard Worker {
404*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
405*8975f5c5SAndroid Build Coastguard Worker {
406*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
407*8975f5c5SAndroid Build Coastguard Worker {
408*8975f5c5SAndroid Build Coastguard Worker const float *source =
409*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
410*8975f5c5SAndroid Build Coastguard Worker float *dest =
411*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
412*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
413*8975f5c5SAndroid Build Coastguard Worker {
414*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] = source[2 * x + 0];
415*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] = source[2 * x + 0];
416*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] = source[2 * x + 0];
417*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = source[2 * x + 1];
418*8975f5c5SAndroid Build Coastguard Worker }
419*8975f5c5SAndroid Build Coastguard Worker }
420*8975f5c5SAndroid Build Coastguard Worker }
421*8975f5c5SAndroid Build Coastguard Worker }
422*8975f5c5SAndroid Build Coastguard Worker
LoadLA16FToRGBA16F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)423*8975f5c5SAndroid Build Coastguard Worker void LoadLA16FToRGBA16F(const ImageLoadContext &context,
424*8975f5c5SAndroid Build Coastguard Worker size_t width,
425*8975f5c5SAndroid Build Coastguard Worker size_t height,
426*8975f5c5SAndroid Build Coastguard Worker size_t depth,
427*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
428*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
429*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
430*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
431*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
432*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
433*8975f5c5SAndroid Build Coastguard Worker {
434*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
435*8975f5c5SAndroid Build Coastguard Worker {
436*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
437*8975f5c5SAndroid Build Coastguard Worker {
438*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
439*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
440*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
441*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
442*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
443*8975f5c5SAndroid Build Coastguard Worker {
444*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] = source[2 * x + 0];
445*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] = source[2 * x + 0];
446*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] = source[2 * x + 0];
447*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = source[2 * x + 1];
448*8975f5c5SAndroid Build Coastguard Worker }
449*8975f5c5SAndroid Build Coastguard Worker }
450*8975f5c5SAndroid Build Coastguard Worker }
451*8975f5c5SAndroid Build Coastguard Worker }
452*8975f5c5SAndroid Build Coastguard Worker
LoadRGB8ToBGR565(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)453*8975f5c5SAndroid Build Coastguard Worker void LoadRGB8ToBGR565(const ImageLoadContext &context,
454*8975f5c5SAndroid Build Coastguard Worker size_t width,
455*8975f5c5SAndroid Build Coastguard Worker size_t height,
456*8975f5c5SAndroid Build Coastguard Worker size_t depth,
457*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
458*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
459*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
460*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
461*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
462*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
463*8975f5c5SAndroid Build Coastguard Worker {
464*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
465*8975f5c5SAndroid Build Coastguard Worker {
466*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
467*8975f5c5SAndroid Build Coastguard Worker {
468*8975f5c5SAndroid Build Coastguard Worker const uint8_t *source =
469*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
470*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
471*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
472*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
473*8975f5c5SAndroid Build Coastguard Worker {
474*8975f5c5SAndroid Build Coastguard Worker uint8_t r8 = source[x * 3 + 0];
475*8975f5c5SAndroid Build Coastguard Worker uint8_t g8 = source[x * 3 + 1];
476*8975f5c5SAndroid Build Coastguard Worker uint8_t b8 = source[x * 3 + 2];
477*8975f5c5SAndroid Build Coastguard Worker auto r5 = static_cast<uint16_t>(r8 >> 3);
478*8975f5c5SAndroid Build Coastguard Worker auto g6 = static_cast<uint16_t>(g8 >> 2);
479*8975f5c5SAndroid Build Coastguard Worker auto b5 = static_cast<uint16_t>(b8 >> 3);
480*8975f5c5SAndroid Build Coastguard Worker dest[x] = (r5 << 11) | (g6 << 5) | b5;
481*8975f5c5SAndroid Build Coastguard Worker }
482*8975f5c5SAndroid Build Coastguard Worker }
483*8975f5c5SAndroid Build Coastguard Worker }
484*8975f5c5SAndroid Build Coastguard Worker }
485*8975f5c5SAndroid Build Coastguard Worker
LoadRGB565ToBGR565(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)486*8975f5c5SAndroid Build Coastguard Worker void LoadRGB565ToBGR565(const ImageLoadContext &context,
487*8975f5c5SAndroid Build Coastguard Worker size_t width,
488*8975f5c5SAndroid Build Coastguard Worker size_t height,
489*8975f5c5SAndroid Build Coastguard Worker size_t depth,
490*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
491*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
492*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
493*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
494*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
495*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
496*8975f5c5SAndroid Build Coastguard Worker {
497*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
498*8975f5c5SAndroid Build Coastguard Worker {
499*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
500*8975f5c5SAndroid Build Coastguard Worker {
501*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
502*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
503*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
504*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
505*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
506*8975f5c5SAndroid Build Coastguard Worker {
507*8975f5c5SAndroid Build Coastguard Worker // The GL type RGB is packed with with red in the MSB, while the D3D11 type BGR
508*8975f5c5SAndroid Build Coastguard Worker // is packed with red in the LSB
509*8975f5c5SAndroid Build Coastguard Worker auto rgb = source[x];
510*8975f5c5SAndroid Build Coastguard Worker uint16_t r5 = gl::getShiftedData<5, 11>(rgb);
511*8975f5c5SAndroid Build Coastguard Worker uint16_t g6 = gl::getShiftedData<6, 5>(rgb);
512*8975f5c5SAndroid Build Coastguard Worker uint16_t b5 = gl::getShiftedData<5, 0>(rgb);
513*8975f5c5SAndroid Build Coastguard Worker dest[x] = (r5 << 11) | (g6 << 5) | b5;
514*8975f5c5SAndroid Build Coastguard Worker }
515*8975f5c5SAndroid Build Coastguard Worker }
516*8975f5c5SAndroid Build Coastguard Worker }
517*8975f5c5SAndroid Build Coastguard Worker }
518*8975f5c5SAndroid Build Coastguard Worker
LoadRGB8ToBGRX8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)519*8975f5c5SAndroid Build Coastguard Worker void LoadRGB8ToBGRX8(const ImageLoadContext &context,
520*8975f5c5SAndroid Build Coastguard Worker size_t width,
521*8975f5c5SAndroid Build Coastguard Worker size_t height,
522*8975f5c5SAndroid Build Coastguard Worker size_t depth,
523*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
524*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
525*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
526*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
527*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
528*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
529*8975f5c5SAndroid Build Coastguard Worker {
530*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
531*8975f5c5SAndroid Build Coastguard Worker {
532*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
533*8975f5c5SAndroid Build Coastguard Worker {
534*8975f5c5SAndroid Build Coastguard Worker const uint8_t *source =
535*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
536*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
537*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
538*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
539*8975f5c5SAndroid Build Coastguard Worker {
540*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] = source[x * 3 + 2];
541*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] = source[x * 3 + 1];
542*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] = source[x * 3 + 0];
543*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = 0xFF;
544*8975f5c5SAndroid Build Coastguard Worker }
545*8975f5c5SAndroid Build Coastguard Worker }
546*8975f5c5SAndroid Build Coastguard Worker }
547*8975f5c5SAndroid Build Coastguard Worker }
548*8975f5c5SAndroid Build Coastguard Worker
LoadRG8ToBGRX8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)549*8975f5c5SAndroid Build Coastguard Worker void LoadRG8ToBGRX8(const ImageLoadContext &context,
550*8975f5c5SAndroid Build Coastguard Worker size_t width,
551*8975f5c5SAndroid Build Coastguard Worker size_t height,
552*8975f5c5SAndroid Build Coastguard Worker size_t depth,
553*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
554*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
555*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
556*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
557*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
558*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
559*8975f5c5SAndroid Build Coastguard Worker {
560*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
561*8975f5c5SAndroid Build Coastguard Worker {
562*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
563*8975f5c5SAndroid Build Coastguard Worker {
564*8975f5c5SAndroid Build Coastguard Worker const uint8_t *source =
565*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
566*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
567*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
568*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
569*8975f5c5SAndroid Build Coastguard Worker {
570*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] = 0x00;
571*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] = source[x * 2 + 1];
572*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] = source[x * 2 + 0];
573*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = 0xFF;
574*8975f5c5SAndroid Build Coastguard Worker }
575*8975f5c5SAndroid Build Coastguard Worker }
576*8975f5c5SAndroid Build Coastguard Worker }
577*8975f5c5SAndroid Build Coastguard Worker }
578*8975f5c5SAndroid Build Coastguard Worker
LoadR8ToBGRX8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)579*8975f5c5SAndroid Build Coastguard Worker void LoadR8ToBGRX8(const ImageLoadContext &context,
580*8975f5c5SAndroid Build Coastguard Worker size_t width,
581*8975f5c5SAndroid Build Coastguard Worker size_t height,
582*8975f5c5SAndroid Build Coastguard Worker size_t depth,
583*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
584*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
585*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
586*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
587*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
588*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
589*8975f5c5SAndroid Build Coastguard Worker {
590*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
591*8975f5c5SAndroid Build Coastguard Worker {
592*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
593*8975f5c5SAndroid Build Coastguard Worker {
594*8975f5c5SAndroid Build Coastguard Worker const uint8_t *source =
595*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
596*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
597*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
598*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
599*8975f5c5SAndroid Build Coastguard Worker {
600*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] = 0x00;
601*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] = 0x00;
602*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] = source[x];
603*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = 0xFF;
604*8975f5c5SAndroid Build Coastguard Worker }
605*8975f5c5SAndroid Build Coastguard Worker }
606*8975f5c5SAndroid Build Coastguard Worker }
607*8975f5c5SAndroid Build Coastguard Worker }
608*8975f5c5SAndroid Build Coastguard Worker
LoadR5G6B5ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)609*8975f5c5SAndroid Build Coastguard Worker void LoadR5G6B5ToBGRA8(const ImageLoadContext &context,
610*8975f5c5SAndroid Build Coastguard Worker size_t width,
611*8975f5c5SAndroid Build Coastguard Worker size_t height,
612*8975f5c5SAndroid Build Coastguard Worker size_t depth,
613*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
614*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
615*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
616*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
617*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
618*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
619*8975f5c5SAndroid Build Coastguard Worker {
620*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
621*8975f5c5SAndroid Build Coastguard Worker {
622*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
623*8975f5c5SAndroid Build Coastguard Worker {
624*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
625*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
626*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
627*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
628*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
629*8975f5c5SAndroid Build Coastguard Worker {
630*8975f5c5SAndroid Build Coastguard Worker uint16_t rgb = source[x];
631*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] =
632*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgb & 0x001F) << 3) | ((rgb & 0x001F) >> 2));
633*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] =
634*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgb & 0x07E0) >> 3) | ((rgb & 0x07E0) >> 9));
635*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] =
636*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgb & 0xF800) >> 8) | ((rgb & 0xF800) >> 13));
637*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = 0xFF;
638*8975f5c5SAndroid Build Coastguard Worker }
639*8975f5c5SAndroid Build Coastguard Worker }
640*8975f5c5SAndroid Build Coastguard Worker }
641*8975f5c5SAndroid Build Coastguard Worker }
642*8975f5c5SAndroid Build Coastguard Worker
LoadR5G6B5ToRGBA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)643*8975f5c5SAndroid Build Coastguard Worker void LoadR5G6B5ToRGBA8(const ImageLoadContext &context,
644*8975f5c5SAndroid Build Coastguard Worker size_t width,
645*8975f5c5SAndroid Build Coastguard Worker size_t height,
646*8975f5c5SAndroid Build Coastguard Worker size_t depth,
647*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
648*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
649*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
650*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
651*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
652*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
653*8975f5c5SAndroid Build Coastguard Worker {
654*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
655*8975f5c5SAndroid Build Coastguard Worker {
656*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
657*8975f5c5SAndroid Build Coastguard Worker {
658*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
659*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
660*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
661*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
662*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
663*8975f5c5SAndroid Build Coastguard Worker {
664*8975f5c5SAndroid Build Coastguard Worker uint16_t rgb = source[x];
665*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] =
666*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgb & 0xF800) >> 8) | ((rgb & 0xF800) >> 13));
667*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] =
668*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgb & 0x07E0) >> 3) | ((rgb & 0x07E0) >> 9));
669*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] =
670*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgb & 0x001F) << 3) | ((rgb & 0x001F) >> 2));
671*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = 0xFF;
672*8975f5c5SAndroid Build Coastguard Worker }
673*8975f5c5SAndroid Build Coastguard Worker }
674*8975f5c5SAndroid Build Coastguard Worker }
675*8975f5c5SAndroid Build Coastguard Worker }
676*8975f5c5SAndroid Build Coastguard Worker
LoadRGBA8ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)677*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA8ToBGRA8(const ImageLoadContext &context,
678*8975f5c5SAndroid Build Coastguard Worker size_t width,
679*8975f5c5SAndroid Build Coastguard Worker size_t height,
680*8975f5c5SAndroid Build Coastguard Worker size_t depth,
681*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
682*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
683*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
684*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
685*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
686*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
687*8975f5c5SAndroid Build Coastguard Worker {
688*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_LOADIMAGE_USE_SSE)
689*8975f5c5SAndroid Build Coastguard Worker if (supportsSSE2())
690*8975f5c5SAndroid Build Coastguard Worker {
691*8975f5c5SAndroid Build Coastguard Worker __m128i brMask = _mm_set1_epi32(0x00ff00ff);
692*8975f5c5SAndroid Build Coastguard Worker
693*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
694*8975f5c5SAndroid Build Coastguard Worker {
695*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
696*8975f5c5SAndroid Build Coastguard Worker {
697*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
698*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
699*8975f5c5SAndroid Build Coastguard Worker uint32_t *dest = priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch,
700*8975f5c5SAndroid Build Coastguard Worker outputDepthPitch);
701*8975f5c5SAndroid Build Coastguard Worker
702*8975f5c5SAndroid Build Coastguard Worker size_t x = 0;
703*8975f5c5SAndroid Build Coastguard Worker
704*8975f5c5SAndroid Build Coastguard Worker // Make output writes aligned
705*8975f5c5SAndroid Build Coastguard Worker for (; ((reinterpret_cast<intptr_t>(&dest[x]) & 15) != 0) && x < width; x++)
706*8975f5c5SAndroid Build Coastguard Worker {
707*8975f5c5SAndroid Build Coastguard Worker uint32_t rgba = source[x];
708*8975f5c5SAndroid Build Coastguard Worker dest[x] = (ANGLE_ROTL(rgba, 16) & 0x00ff00ff) | (rgba & 0xff00ff00);
709*8975f5c5SAndroid Build Coastguard Worker }
710*8975f5c5SAndroid Build Coastguard Worker
711*8975f5c5SAndroid Build Coastguard Worker for (; x + 3 < width; x += 4)
712*8975f5c5SAndroid Build Coastguard Worker {
713*8975f5c5SAndroid Build Coastguard Worker __m128i sourceData =
714*8975f5c5SAndroid Build Coastguard Worker _mm_loadu_si128(reinterpret_cast<const __m128i *>(&source[x]));
715*8975f5c5SAndroid Build Coastguard Worker // Mask out g and a, which don't change
716*8975f5c5SAndroid Build Coastguard Worker __m128i gaComponents = _mm_andnot_si128(brMask, sourceData);
717*8975f5c5SAndroid Build Coastguard Worker // Mask out b and r
718*8975f5c5SAndroid Build Coastguard Worker __m128i brComponents = _mm_and_si128(sourceData, brMask);
719*8975f5c5SAndroid Build Coastguard Worker // Swap b and r
720*8975f5c5SAndroid Build Coastguard Worker __m128i brSwapped = _mm_shufflehi_epi16(
721*8975f5c5SAndroid Build Coastguard Worker _mm_shufflelo_epi16(brComponents, _MM_SHUFFLE(2, 3, 0, 1)),
722*8975f5c5SAndroid Build Coastguard Worker _MM_SHUFFLE(2, 3, 0, 1));
723*8975f5c5SAndroid Build Coastguard Worker __m128i result = _mm_or_si128(gaComponents, brSwapped);
724*8975f5c5SAndroid Build Coastguard Worker _mm_store_si128(reinterpret_cast<__m128i *>(&dest[x]), result);
725*8975f5c5SAndroid Build Coastguard Worker }
726*8975f5c5SAndroid Build Coastguard Worker
727*8975f5c5SAndroid Build Coastguard Worker // Perform leftover writes
728*8975f5c5SAndroid Build Coastguard Worker for (; x < width; x++)
729*8975f5c5SAndroid Build Coastguard Worker {
730*8975f5c5SAndroid Build Coastguard Worker uint32_t rgba = source[x];
731*8975f5c5SAndroid Build Coastguard Worker dest[x] = (ANGLE_ROTL(rgba, 16) & 0x00ff00ff) | (rgba & 0xff00ff00);
732*8975f5c5SAndroid Build Coastguard Worker }
733*8975f5c5SAndroid Build Coastguard Worker }
734*8975f5c5SAndroid Build Coastguard Worker }
735*8975f5c5SAndroid Build Coastguard Worker
736*8975f5c5SAndroid Build Coastguard Worker return;
737*8975f5c5SAndroid Build Coastguard Worker }
738*8975f5c5SAndroid Build Coastguard Worker #endif
739*8975f5c5SAndroid Build Coastguard Worker
740*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
741*8975f5c5SAndroid Build Coastguard Worker {
742*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
743*8975f5c5SAndroid Build Coastguard Worker {
744*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
745*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
746*8975f5c5SAndroid Build Coastguard Worker uint32_t *dest =
747*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
748*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
749*8975f5c5SAndroid Build Coastguard Worker {
750*8975f5c5SAndroid Build Coastguard Worker uint32_t rgba = source[x];
751*8975f5c5SAndroid Build Coastguard Worker dest[x] = (ANGLE_ROTL(rgba, 16) & 0x00ff00ff) | (rgba & 0xff00ff00);
752*8975f5c5SAndroid Build Coastguard Worker }
753*8975f5c5SAndroid Build Coastguard Worker }
754*8975f5c5SAndroid Build Coastguard Worker }
755*8975f5c5SAndroid Build Coastguard Worker }
756*8975f5c5SAndroid Build Coastguard Worker
LoadRGBA8ToBGRA4(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)757*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA8ToBGRA4(const ImageLoadContext &context,
758*8975f5c5SAndroid Build Coastguard Worker size_t width,
759*8975f5c5SAndroid Build Coastguard Worker size_t height,
760*8975f5c5SAndroid Build Coastguard Worker size_t depth,
761*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
762*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
763*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
764*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
765*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
766*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
767*8975f5c5SAndroid Build Coastguard Worker {
768*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
769*8975f5c5SAndroid Build Coastguard Worker {
770*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
771*8975f5c5SAndroid Build Coastguard Worker {
772*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
773*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
774*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
775*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
776*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
777*8975f5c5SAndroid Build Coastguard Worker {
778*8975f5c5SAndroid Build Coastguard Worker uint32_t rgba8 = source[x];
779*8975f5c5SAndroid Build Coastguard Worker auto r4 = static_cast<uint16_t>((rgba8 & 0x000000FF) >> 4);
780*8975f5c5SAndroid Build Coastguard Worker auto g4 = static_cast<uint16_t>((rgba8 & 0x0000FF00) >> 12);
781*8975f5c5SAndroid Build Coastguard Worker auto b4 = static_cast<uint16_t>((rgba8 & 0x00FF0000) >> 20);
782*8975f5c5SAndroid Build Coastguard Worker auto a4 = static_cast<uint16_t>((rgba8 & 0xFF000000) >> 28);
783*8975f5c5SAndroid Build Coastguard Worker dest[x] = (a4 << 12) | (r4 << 8) | (g4 << 4) | b4;
784*8975f5c5SAndroid Build Coastguard Worker }
785*8975f5c5SAndroid Build Coastguard Worker }
786*8975f5c5SAndroid Build Coastguard Worker }
787*8975f5c5SAndroid Build Coastguard Worker }
788*8975f5c5SAndroid Build Coastguard Worker
LoadRGBA8ToRGBA4(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)789*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA8ToRGBA4(const ImageLoadContext &context,
790*8975f5c5SAndroid Build Coastguard Worker size_t width,
791*8975f5c5SAndroid Build Coastguard Worker size_t height,
792*8975f5c5SAndroid Build Coastguard Worker size_t depth,
793*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
794*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
795*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
796*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
797*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
798*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
799*8975f5c5SAndroid Build Coastguard Worker {
800*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
801*8975f5c5SAndroid Build Coastguard Worker {
802*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
803*8975f5c5SAndroid Build Coastguard Worker {
804*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
805*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
806*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
807*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
808*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
809*8975f5c5SAndroid Build Coastguard Worker {
810*8975f5c5SAndroid Build Coastguard Worker uint32_t rgba8 = source[x];
811*8975f5c5SAndroid Build Coastguard Worker auto r4 = static_cast<uint16_t>((rgba8 & 0x000000FF) >> 4);
812*8975f5c5SAndroid Build Coastguard Worker auto g4 = static_cast<uint16_t>((rgba8 & 0x0000FF00) >> 12);
813*8975f5c5SAndroid Build Coastguard Worker auto b4 = static_cast<uint16_t>((rgba8 & 0x00FF0000) >> 20);
814*8975f5c5SAndroid Build Coastguard Worker auto a4 = static_cast<uint16_t>((rgba8 & 0xFF000000) >> 28);
815*8975f5c5SAndroid Build Coastguard Worker dest[x] = (r4 << 12) | (g4 << 8) | (b4 << 4) | a4;
816*8975f5c5SAndroid Build Coastguard Worker }
817*8975f5c5SAndroid Build Coastguard Worker }
818*8975f5c5SAndroid Build Coastguard Worker }
819*8975f5c5SAndroid Build Coastguard Worker }
820*8975f5c5SAndroid Build Coastguard Worker
LoadRGBA4ToARGB4(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)821*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA4ToARGB4(const ImageLoadContext &context,
822*8975f5c5SAndroid Build Coastguard Worker size_t width,
823*8975f5c5SAndroid Build Coastguard Worker size_t height,
824*8975f5c5SAndroid Build Coastguard Worker size_t depth,
825*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
826*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
827*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
828*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
829*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
830*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
831*8975f5c5SAndroid Build Coastguard Worker {
832*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
833*8975f5c5SAndroid Build Coastguard Worker {
834*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
835*8975f5c5SAndroid Build Coastguard Worker {
836*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
837*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
838*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
839*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
840*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
841*8975f5c5SAndroid Build Coastguard Worker {
842*8975f5c5SAndroid Build Coastguard Worker dest[x] = ANGLE_ROTR16(source[x], 4);
843*8975f5c5SAndroid Build Coastguard Worker }
844*8975f5c5SAndroid Build Coastguard Worker }
845*8975f5c5SAndroid Build Coastguard Worker }
846*8975f5c5SAndroid Build Coastguard Worker }
847*8975f5c5SAndroid Build Coastguard Worker
LoadRGBA4ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)848*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA4ToBGRA8(const ImageLoadContext &context,
849*8975f5c5SAndroid Build Coastguard Worker size_t width,
850*8975f5c5SAndroid Build Coastguard Worker size_t height,
851*8975f5c5SAndroid Build Coastguard Worker size_t depth,
852*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
853*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
854*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
855*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
856*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
857*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
858*8975f5c5SAndroid Build Coastguard Worker {
859*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
860*8975f5c5SAndroid Build Coastguard Worker {
861*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
862*8975f5c5SAndroid Build Coastguard Worker {
863*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
864*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
865*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
866*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
867*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
868*8975f5c5SAndroid Build Coastguard Worker {
869*8975f5c5SAndroid Build Coastguard Worker uint16_t rgba = source[x];
870*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] =
871*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgba & 0x00F0) << 0) | ((rgba & 0x00F0) >> 4));
872*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] =
873*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgba & 0x0F00) >> 4) | ((rgba & 0x0F00) >> 8));
874*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] =
875*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgba & 0xF000) >> 8) | ((rgba & 0xF000) >> 12));
876*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] =
877*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgba & 0x000F) << 4) | ((rgba & 0x000F) >> 0));
878*8975f5c5SAndroid Build Coastguard Worker }
879*8975f5c5SAndroid Build Coastguard Worker }
880*8975f5c5SAndroid Build Coastguard Worker }
881*8975f5c5SAndroid Build Coastguard Worker }
882*8975f5c5SAndroid Build Coastguard Worker
LoadRGBA4ToRGBA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)883*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA4ToRGBA8(const ImageLoadContext &context,
884*8975f5c5SAndroid Build Coastguard Worker size_t width,
885*8975f5c5SAndroid Build Coastguard Worker size_t height,
886*8975f5c5SAndroid Build Coastguard Worker size_t depth,
887*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
888*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
889*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
890*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
891*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
892*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
893*8975f5c5SAndroid Build Coastguard Worker {
894*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
895*8975f5c5SAndroid Build Coastguard Worker {
896*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
897*8975f5c5SAndroid Build Coastguard Worker {
898*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
899*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
900*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
901*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
902*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
903*8975f5c5SAndroid Build Coastguard Worker {
904*8975f5c5SAndroid Build Coastguard Worker uint16_t rgba = source[x];
905*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] =
906*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgba & 0xF000) >> 8) | ((rgba & 0xF000) >> 12));
907*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] =
908*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgba & 0x0F00) >> 4) | ((rgba & 0x0F00) >> 8));
909*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] =
910*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgba & 0x00F0) << 0) | ((rgba & 0x00F0) >> 4));
911*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] =
912*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgba & 0x000F) << 4) | ((rgba & 0x000F) >> 0));
913*8975f5c5SAndroid Build Coastguard Worker }
914*8975f5c5SAndroid Build Coastguard Worker }
915*8975f5c5SAndroid Build Coastguard Worker }
916*8975f5c5SAndroid Build Coastguard Worker }
917*8975f5c5SAndroid Build Coastguard Worker
LoadBGRA4ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)918*8975f5c5SAndroid Build Coastguard Worker void LoadBGRA4ToBGRA8(const ImageLoadContext &context,
919*8975f5c5SAndroid Build Coastguard Worker size_t width,
920*8975f5c5SAndroid Build Coastguard Worker size_t height,
921*8975f5c5SAndroid Build Coastguard Worker size_t depth,
922*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
923*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
924*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
925*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
926*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
927*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
928*8975f5c5SAndroid Build Coastguard Worker {
929*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
930*8975f5c5SAndroid Build Coastguard Worker {
931*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
932*8975f5c5SAndroid Build Coastguard Worker {
933*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
934*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
935*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
936*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
937*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
938*8975f5c5SAndroid Build Coastguard Worker {
939*8975f5c5SAndroid Build Coastguard Worker uint16_t bgra = source[x];
940*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] =
941*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((bgra & 0xF000) >> 8) | ((bgra & 0xF000) >> 12));
942*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] =
943*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((bgra & 0x0F00) >> 4) | ((bgra & 0x0F00) >> 8));
944*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] =
945*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((bgra & 0x00F0) << 0) | ((bgra & 0x00F0) >> 4));
946*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] =
947*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((bgra & 0x000F) << 4) | ((bgra & 0x000F) >> 0));
948*8975f5c5SAndroid Build Coastguard Worker }
949*8975f5c5SAndroid Build Coastguard Worker }
950*8975f5c5SAndroid Build Coastguard Worker }
951*8975f5c5SAndroid Build Coastguard Worker }
952*8975f5c5SAndroid Build Coastguard Worker
LoadRGBA8ToBGR5A1(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)953*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA8ToBGR5A1(const ImageLoadContext &context,
954*8975f5c5SAndroid Build Coastguard Worker size_t width,
955*8975f5c5SAndroid Build Coastguard Worker size_t height,
956*8975f5c5SAndroid Build Coastguard Worker size_t depth,
957*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
958*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
959*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
960*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
961*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
962*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
963*8975f5c5SAndroid Build Coastguard Worker {
964*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
965*8975f5c5SAndroid Build Coastguard Worker {
966*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
967*8975f5c5SAndroid Build Coastguard Worker {
968*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
969*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
970*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
971*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
972*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
973*8975f5c5SAndroid Build Coastguard Worker {
974*8975f5c5SAndroid Build Coastguard Worker uint32_t rgba8 = source[x];
975*8975f5c5SAndroid Build Coastguard Worker auto r5 = static_cast<uint16_t>((rgba8 & 0x000000FF) >> 3);
976*8975f5c5SAndroid Build Coastguard Worker auto g5 = static_cast<uint16_t>((rgba8 & 0x0000FF00) >> 11);
977*8975f5c5SAndroid Build Coastguard Worker auto b5 = static_cast<uint16_t>((rgba8 & 0x00FF0000) >> 19);
978*8975f5c5SAndroid Build Coastguard Worker auto a1 = static_cast<uint16_t>((rgba8 & 0xFF000000) >> 31);
979*8975f5c5SAndroid Build Coastguard Worker dest[x] = (a1 << 15) | (r5 << 10) | (g5 << 5) | b5;
980*8975f5c5SAndroid Build Coastguard Worker }
981*8975f5c5SAndroid Build Coastguard Worker }
982*8975f5c5SAndroid Build Coastguard Worker }
983*8975f5c5SAndroid Build Coastguard Worker }
984*8975f5c5SAndroid Build Coastguard Worker
LoadRGBA8ToRGB5A1(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)985*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA8ToRGB5A1(const ImageLoadContext &context,
986*8975f5c5SAndroid Build Coastguard Worker size_t width,
987*8975f5c5SAndroid Build Coastguard Worker size_t height,
988*8975f5c5SAndroid Build Coastguard Worker size_t depth,
989*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
990*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
991*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
992*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
993*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
994*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
995*8975f5c5SAndroid Build Coastguard Worker {
996*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
997*8975f5c5SAndroid Build Coastguard Worker {
998*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
999*8975f5c5SAndroid Build Coastguard Worker {
1000*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
1001*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1002*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
1003*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1004*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1005*8975f5c5SAndroid Build Coastguard Worker {
1006*8975f5c5SAndroid Build Coastguard Worker uint32_t rgba8 = source[x];
1007*8975f5c5SAndroid Build Coastguard Worker auto r5 = static_cast<uint16_t>((rgba8 & 0x000000FF) >> 3);
1008*8975f5c5SAndroid Build Coastguard Worker auto g5 = static_cast<uint16_t>((rgba8 & 0x0000FF00) >> 11);
1009*8975f5c5SAndroid Build Coastguard Worker auto b5 = static_cast<uint16_t>((rgba8 & 0x00FF0000) >> 19);
1010*8975f5c5SAndroid Build Coastguard Worker auto a1 = static_cast<uint16_t>((rgba8 & 0xFF000000) >> 31);
1011*8975f5c5SAndroid Build Coastguard Worker dest[x] = (r5 << 11) | (g5 << 6) | (b5 << 1) | a1;
1012*8975f5c5SAndroid Build Coastguard Worker }
1013*8975f5c5SAndroid Build Coastguard Worker }
1014*8975f5c5SAndroid Build Coastguard Worker }
1015*8975f5c5SAndroid Build Coastguard Worker }
1016*8975f5c5SAndroid Build Coastguard Worker
LoadRGB10A2ToBGR5A1(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1017*8975f5c5SAndroid Build Coastguard Worker void LoadRGB10A2ToBGR5A1(const ImageLoadContext &context,
1018*8975f5c5SAndroid Build Coastguard Worker size_t width,
1019*8975f5c5SAndroid Build Coastguard Worker size_t height,
1020*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1021*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1022*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1023*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1024*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1025*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1026*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1027*8975f5c5SAndroid Build Coastguard Worker {
1028*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1029*8975f5c5SAndroid Build Coastguard Worker {
1030*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1031*8975f5c5SAndroid Build Coastguard Worker {
1032*8975f5c5SAndroid Build Coastguard Worker const R10G10B10A2 *source =
1033*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<R10G10B10A2>(input, y, z, inputRowPitch, inputDepthPitch);
1034*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
1035*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1036*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1037*8975f5c5SAndroid Build Coastguard Worker {
1038*8975f5c5SAndroid Build Coastguard Worker R10G10B10A2 rgb10a2 = source[x];
1039*8975f5c5SAndroid Build Coastguard Worker
1040*8975f5c5SAndroid Build Coastguard Worker uint16_t r5 = static_cast<uint16_t>(rgb10a2.R >> 5u);
1041*8975f5c5SAndroid Build Coastguard Worker uint16_t g5 = static_cast<uint16_t>(rgb10a2.G >> 5u);
1042*8975f5c5SAndroid Build Coastguard Worker uint16_t b5 = static_cast<uint16_t>(rgb10a2.B >> 5u);
1043*8975f5c5SAndroid Build Coastguard Worker uint16_t a1 = static_cast<uint16_t>(rgb10a2.A >> 1u);
1044*8975f5c5SAndroid Build Coastguard Worker
1045*8975f5c5SAndroid Build Coastguard Worker dest[x] = (a1 << 15) | (r5 << 10) | (g5 << 5) | b5;
1046*8975f5c5SAndroid Build Coastguard Worker }
1047*8975f5c5SAndroid Build Coastguard Worker }
1048*8975f5c5SAndroid Build Coastguard Worker }
1049*8975f5c5SAndroid Build Coastguard Worker }
1050*8975f5c5SAndroid Build Coastguard Worker
LoadRGB10A2ToRGB5A1(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1051*8975f5c5SAndroid Build Coastguard Worker void LoadRGB10A2ToRGB5A1(const ImageLoadContext &context,
1052*8975f5c5SAndroid Build Coastguard Worker size_t width,
1053*8975f5c5SAndroid Build Coastguard Worker size_t height,
1054*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1055*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1056*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1057*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1058*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1059*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1060*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1061*8975f5c5SAndroid Build Coastguard Worker {
1062*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1063*8975f5c5SAndroid Build Coastguard Worker {
1064*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1065*8975f5c5SAndroid Build Coastguard Worker {
1066*8975f5c5SAndroid Build Coastguard Worker const R10G10B10A2 *source =
1067*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<R10G10B10A2>(input, y, z, inputRowPitch, inputDepthPitch);
1068*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
1069*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1070*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1071*8975f5c5SAndroid Build Coastguard Worker {
1072*8975f5c5SAndroid Build Coastguard Worker R10G10B10A2 rgb10a2 = source[x];
1073*8975f5c5SAndroid Build Coastguard Worker
1074*8975f5c5SAndroid Build Coastguard Worker uint16_t r5 = static_cast<uint16_t>(rgb10a2.R >> 5u);
1075*8975f5c5SAndroid Build Coastguard Worker uint16_t g5 = static_cast<uint16_t>(rgb10a2.G >> 5u);
1076*8975f5c5SAndroid Build Coastguard Worker uint16_t b5 = static_cast<uint16_t>(rgb10a2.B >> 5u);
1077*8975f5c5SAndroid Build Coastguard Worker uint16_t a1 = static_cast<uint16_t>(rgb10a2.A >> 1u);
1078*8975f5c5SAndroid Build Coastguard Worker
1079*8975f5c5SAndroid Build Coastguard Worker dest[x] = (r5 << 11) | (g5 << 6) | (b5 << 1) | a1;
1080*8975f5c5SAndroid Build Coastguard Worker }
1081*8975f5c5SAndroid Build Coastguard Worker }
1082*8975f5c5SAndroid Build Coastguard Worker }
1083*8975f5c5SAndroid Build Coastguard Worker }
1084*8975f5c5SAndroid Build Coastguard Worker
LoadRGB10A2ToRGB565(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1085*8975f5c5SAndroid Build Coastguard Worker void LoadRGB10A2ToRGB565(const ImageLoadContext &context,
1086*8975f5c5SAndroid Build Coastguard Worker size_t width,
1087*8975f5c5SAndroid Build Coastguard Worker size_t height,
1088*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1089*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1090*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1091*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1092*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1093*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1094*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1095*8975f5c5SAndroid Build Coastguard Worker {
1096*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1097*8975f5c5SAndroid Build Coastguard Worker {
1098*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1099*8975f5c5SAndroid Build Coastguard Worker {
1100*8975f5c5SAndroid Build Coastguard Worker const R10G10B10A2 *source =
1101*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<R10G10B10A2>(input, y, z, inputRowPitch, inputDepthPitch);
1102*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
1103*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1104*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1105*8975f5c5SAndroid Build Coastguard Worker {
1106*8975f5c5SAndroid Build Coastguard Worker R10G10B10A2 rgb10a2 = source[x];
1107*8975f5c5SAndroid Build Coastguard Worker
1108*8975f5c5SAndroid Build Coastguard Worker uint16_t r5 = static_cast<uint16_t>(rgb10a2.R >> 5u);
1109*8975f5c5SAndroid Build Coastguard Worker uint16_t g6 = static_cast<uint16_t>(rgb10a2.G >> 4u);
1110*8975f5c5SAndroid Build Coastguard Worker uint16_t b5 = static_cast<uint16_t>(rgb10a2.B >> 5u);
1111*8975f5c5SAndroid Build Coastguard Worker
1112*8975f5c5SAndroid Build Coastguard Worker dest[x] = (r5 << 11) | (g6 << 5) | b5;
1113*8975f5c5SAndroid Build Coastguard Worker }
1114*8975f5c5SAndroid Build Coastguard Worker }
1115*8975f5c5SAndroid Build Coastguard Worker }
1116*8975f5c5SAndroid Build Coastguard Worker }
1117*8975f5c5SAndroid Build Coastguard Worker
LoadRGB5A1ToA1RGB5(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1118*8975f5c5SAndroid Build Coastguard Worker void LoadRGB5A1ToA1RGB5(const ImageLoadContext &context,
1119*8975f5c5SAndroid Build Coastguard Worker size_t width,
1120*8975f5c5SAndroid Build Coastguard Worker size_t height,
1121*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1122*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1123*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1124*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1125*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1126*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1127*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1128*8975f5c5SAndroid Build Coastguard Worker {
1129*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1130*8975f5c5SAndroid Build Coastguard Worker {
1131*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1132*8975f5c5SAndroid Build Coastguard Worker {
1133*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
1134*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1135*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
1136*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1137*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1138*8975f5c5SAndroid Build Coastguard Worker {
1139*8975f5c5SAndroid Build Coastguard Worker dest[x] = ANGLE_ROTR16(source[x], 1);
1140*8975f5c5SAndroid Build Coastguard Worker }
1141*8975f5c5SAndroid Build Coastguard Worker }
1142*8975f5c5SAndroid Build Coastguard Worker }
1143*8975f5c5SAndroid Build Coastguard Worker }
1144*8975f5c5SAndroid Build Coastguard Worker
LoadRGB5A1ToBGR5A1(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1145*8975f5c5SAndroid Build Coastguard Worker void LoadRGB5A1ToBGR5A1(const ImageLoadContext &context,
1146*8975f5c5SAndroid Build Coastguard Worker size_t width,
1147*8975f5c5SAndroid Build Coastguard Worker size_t height,
1148*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1149*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1150*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1151*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1152*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1153*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1154*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1155*8975f5c5SAndroid Build Coastguard Worker {
1156*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1157*8975f5c5SAndroid Build Coastguard Worker {
1158*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1159*8975f5c5SAndroid Build Coastguard Worker {
1160*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
1161*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1162*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
1163*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1164*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1165*8975f5c5SAndroid Build Coastguard Worker {
1166*8975f5c5SAndroid Build Coastguard Worker uint16_t rgba = source[x];
1167*8975f5c5SAndroid Build Coastguard Worker auto r5 = static_cast<uint16_t>((rgba & 0xF800) >> 11);
1168*8975f5c5SAndroid Build Coastguard Worker auto g5 = static_cast<uint16_t>((rgba & 0x07c0) >> 6);
1169*8975f5c5SAndroid Build Coastguard Worker auto b5 = static_cast<uint16_t>((rgba & 0x003e) >> 1);
1170*8975f5c5SAndroid Build Coastguard Worker auto a1 = static_cast<uint16_t>((rgba & 0x0001));
1171*8975f5c5SAndroid Build Coastguard Worker dest[x] = (b5 << 11) | (g5 << 6) | (r5 << 1) | a1;
1172*8975f5c5SAndroid Build Coastguard Worker }
1173*8975f5c5SAndroid Build Coastguard Worker }
1174*8975f5c5SAndroid Build Coastguard Worker }
1175*8975f5c5SAndroid Build Coastguard Worker }
1176*8975f5c5SAndroid Build Coastguard Worker
LoadRGB5A1ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1177*8975f5c5SAndroid Build Coastguard Worker void LoadRGB5A1ToBGRA8(const ImageLoadContext &context,
1178*8975f5c5SAndroid Build Coastguard Worker size_t width,
1179*8975f5c5SAndroid Build Coastguard Worker size_t height,
1180*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1181*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1182*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1183*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1184*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1185*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1186*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1187*8975f5c5SAndroid Build Coastguard Worker {
1188*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1189*8975f5c5SAndroid Build Coastguard Worker {
1190*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1191*8975f5c5SAndroid Build Coastguard Worker {
1192*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
1193*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1194*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
1195*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
1196*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1197*8975f5c5SAndroid Build Coastguard Worker {
1198*8975f5c5SAndroid Build Coastguard Worker uint16_t rgba = source[x];
1199*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] =
1200*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgba & 0x003E) << 2) | ((rgba & 0x003E) >> 3));
1201*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] =
1202*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgba & 0x07C0) >> 3) | ((rgba & 0x07C0) >> 8));
1203*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] =
1204*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13));
1205*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = static_cast<uint8_t>((rgba & 0x0001) ? 0xFF : 0);
1206*8975f5c5SAndroid Build Coastguard Worker }
1207*8975f5c5SAndroid Build Coastguard Worker }
1208*8975f5c5SAndroid Build Coastguard Worker }
1209*8975f5c5SAndroid Build Coastguard Worker }
1210*8975f5c5SAndroid Build Coastguard Worker
LoadRGB5A1ToRGBA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1211*8975f5c5SAndroid Build Coastguard Worker void LoadRGB5A1ToRGBA8(const ImageLoadContext &context,
1212*8975f5c5SAndroid Build Coastguard Worker size_t width,
1213*8975f5c5SAndroid Build Coastguard Worker size_t height,
1214*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1215*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1216*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1217*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1218*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1219*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1220*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1221*8975f5c5SAndroid Build Coastguard Worker {
1222*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1223*8975f5c5SAndroid Build Coastguard Worker {
1224*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1225*8975f5c5SAndroid Build Coastguard Worker {
1226*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
1227*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1228*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
1229*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
1230*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1231*8975f5c5SAndroid Build Coastguard Worker {
1232*8975f5c5SAndroid Build Coastguard Worker uint16_t rgba = source[x];
1233*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] =
1234*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13));
1235*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] =
1236*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgba & 0x07C0) >> 3) | ((rgba & 0x07C0) >> 8));
1237*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] =
1238*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((rgba & 0x003E) << 2) | ((rgba & 0x003E) >> 3));
1239*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = static_cast<uint8_t>((rgba & 0x0001) ? 0xFF : 0);
1240*8975f5c5SAndroid Build Coastguard Worker }
1241*8975f5c5SAndroid Build Coastguard Worker }
1242*8975f5c5SAndroid Build Coastguard Worker }
1243*8975f5c5SAndroid Build Coastguard Worker }
1244*8975f5c5SAndroid Build Coastguard Worker
LoadBGR5A1ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1245*8975f5c5SAndroid Build Coastguard Worker void LoadBGR5A1ToBGRA8(const ImageLoadContext &context,
1246*8975f5c5SAndroid Build Coastguard Worker size_t width,
1247*8975f5c5SAndroid Build Coastguard Worker size_t height,
1248*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1249*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1250*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1251*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1252*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1253*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1254*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1255*8975f5c5SAndroid Build Coastguard Worker {
1256*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1257*8975f5c5SAndroid Build Coastguard Worker {
1258*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1259*8975f5c5SAndroid Build Coastguard Worker {
1260*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
1261*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1262*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
1263*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
1264*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1265*8975f5c5SAndroid Build Coastguard Worker {
1266*8975f5c5SAndroid Build Coastguard Worker uint16_t bgra = source[x];
1267*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] =
1268*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((bgra & 0xF800) >> 8) | ((bgra & 0xF800) >> 13));
1269*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] =
1270*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((bgra & 0x07C0) >> 3) | ((bgra & 0x07C0) >> 8));
1271*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] =
1272*8975f5c5SAndroid Build Coastguard Worker static_cast<uint8_t>(((bgra & 0x003E) << 2) | ((bgra & 0x003E) >> 3));
1273*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = static_cast<uint8_t>((bgra & 0x0001) ? 0xFF : 0);
1274*8975f5c5SAndroid Build Coastguard Worker }
1275*8975f5c5SAndroid Build Coastguard Worker }
1276*8975f5c5SAndroid Build Coastguard Worker }
1277*8975f5c5SAndroid Build Coastguard Worker }
1278*8975f5c5SAndroid Build Coastguard Worker
LoadRGB10A2ToRGBA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1279*8975f5c5SAndroid Build Coastguard Worker void LoadRGB10A2ToRGBA8(const ImageLoadContext &context,
1280*8975f5c5SAndroid Build Coastguard Worker size_t width,
1281*8975f5c5SAndroid Build Coastguard Worker size_t height,
1282*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1283*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1284*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1285*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1286*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1287*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1288*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1289*8975f5c5SAndroid Build Coastguard Worker {
1290*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1291*8975f5c5SAndroid Build Coastguard Worker {
1292*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1293*8975f5c5SAndroid Build Coastguard Worker {
1294*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
1295*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1296*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
1297*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
1298*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1299*8975f5c5SAndroid Build Coastguard Worker {
1300*8975f5c5SAndroid Build Coastguard Worker uint32_t rgba = source[x];
1301*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 0] = static_cast<uint8_t>((rgba & 0x000003FF) >> 2);
1302*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 1] = static_cast<uint8_t>((rgba & 0x000FFC00) >> 12);
1303*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 2] = static_cast<uint8_t>((rgba & 0x3FF00000) >> 22);
1304*8975f5c5SAndroid Build Coastguard Worker dest[4 * x + 3] = static_cast<uint8_t>(((rgba & 0xC0000000) >> 30) * 0x55);
1305*8975f5c5SAndroid Build Coastguard Worker }
1306*8975f5c5SAndroid Build Coastguard Worker }
1307*8975f5c5SAndroid Build Coastguard Worker }
1308*8975f5c5SAndroid Build Coastguard Worker }
1309*8975f5c5SAndroid Build Coastguard Worker
LoadRGB10A2ToRGB8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1310*8975f5c5SAndroid Build Coastguard Worker void LoadRGB10A2ToRGB8(const ImageLoadContext &context,
1311*8975f5c5SAndroid Build Coastguard Worker size_t width,
1312*8975f5c5SAndroid Build Coastguard Worker size_t height,
1313*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1314*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1315*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1316*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1317*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1318*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1319*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1320*8975f5c5SAndroid Build Coastguard Worker {
1321*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1322*8975f5c5SAndroid Build Coastguard Worker {
1323*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1324*8975f5c5SAndroid Build Coastguard Worker {
1325*8975f5c5SAndroid Build Coastguard Worker
1326*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
1327*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1328*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest =
1329*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
1330*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1331*8975f5c5SAndroid Build Coastguard Worker {
1332*8975f5c5SAndroid Build Coastguard Worker uint32_t rgba = source[x];
1333*8975f5c5SAndroid Build Coastguard Worker dest[3 * x + 0] = static_cast<uint8_t>((rgba & 0x000003FF) >> 2);
1334*8975f5c5SAndroid Build Coastguard Worker dest[3 * x + 1] = static_cast<uint8_t>((rgba & 0x000FFC00) >> 12);
1335*8975f5c5SAndroid Build Coastguard Worker dest[3 * x + 2] = static_cast<uint8_t>((rgba & 0x3FF00000) >> 22);
1336*8975f5c5SAndroid Build Coastguard Worker }
1337*8975f5c5SAndroid Build Coastguard Worker }
1338*8975f5c5SAndroid Build Coastguard Worker }
1339*8975f5c5SAndroid Build Coastguard Worker }
1340*8975f5c5SAndroid Build Coastguard Worker
LoadRGB10A2ToRGB10X2(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1341*8975f5c5SAndroid Build Coastguard Worker void LoadRGB10A2ToRGB10X2(const ImageLoadContext &context,
1342*8975f5c5SAndroid Build Coastguard Worker size_t width,
1343*8975f5c5SAndroid Build Coastguard Worker size_t height,
1344*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1345*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1346*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1347*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1348*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1349*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1350*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1351*8975f5c5SAndroid Build Coastguard Worker {
1352*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1353*8975f5c5SAndroid Build Coastguard Worker {
1354*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1355*8975f5c5SAndroid Build Coastguard Worker {
1356*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
1357*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1358*8975f5c5SAndroid Build Coastguard Worker uint32_t *dest =
1359*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1360*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1361*8975f5c5SAndroid Build Coastguard Worker {
1362*8975f5c5SAndroid Build Coastguard Worker dest[x] = source[x] | 0xC0000000;
1363*8975f5c5SAndroid Build Coastguard Worker }
1364*8975f5c5SAndroid Build Coastguard Worker }
1365*8975f5c5SAndroid Build Coastguard Worker }
1366*8975f5c5SAndroid Build Coastguard Worker }
1367*8975f5c5SAndroid Build Coastguard Worker
LoadBGR10A2ToRGB10A2(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1368*8975f5c5SAndroid Build Coastguard Worker void LoadBGR10A2ToRGB10A2(const ImageLoadContext &context,
1369*8975f5c5SAndroid Build Coastguard Worker size_t width,
1370*8975f5c5SAndroid Build Coastguard Worker size_t height,
1371*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1372*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1373*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1374*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1375*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1376*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1377*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1378*8975f5c5SAndroid Build Coastguard Worker {
1379*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1380*8975f5c5SAndroid Build Coastguard Worker {
1381*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1382*8975f5c5SAndroid Build Coastguard Worker {
1383*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
1384*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1385*8975f5c5SAndroid Build Coastguard Worker uint32_t *dest =
1386*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1387*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1388*8975f5c5SAndroid Build Coastguard Worker {
1389*8975f5c5SAndroid Build Coastguard Worker const uint32_t src = source[x];
1390*8975f5c5SAndroid Build Coastguard Worker const uint32_t srcB = src & 0x3FF;
1391*8975f5c5SAndroid Build Coastguard Worker const uint32_t srcG = src >> 10 & 0x3FF;
1392*8975f5c5SAndroid Build Coastguard Worker const uint32_t srcR = src >> 20 & 0x3FF;
1393*8975f5c5SAndroid Build Coastguard Worker const uint32_t srcA = src >> 30 & 0x3;
1394*8975f5c5SAndroid Build Coastguard Worker dest[x] = srcR | srcG << 10 | srcB << 20 | srcA << 30;
1395*8975f5c5SAndroid Build Coastguard Worker }
1396*8975f5c5SAndroid Build Coastguard Worker }
1397*8975f5c5SAndroid Build Coastguard Worker }
1398*8975f5c5SAndroid Build Coastguard Worker }
1399*8975f5c5SAndroid Build Coastguard Worker
LoadRGB16FToRGB9E5(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1400*8975f5c5SAndroid Build Coastguard Worker void LoadRGB16FToRGB9E5(const ImageLoadContext &context,
1401*8975f5c5SAndroid Build Coastguard Worker size_t width,
1402*8975f5c5SAndroid Build Coastguard Worker size_t height,
1403*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1404*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1405*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1406*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1407*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1408*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1409*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1410*8975f5c5SAndroid Build Coastguard Worker {
1411*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1412*8975f5c5SAndroid Build Coastguard Worker {
1413*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1414*8975f5c5SAndroid Build Coastguard Worker {
1415*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
1416*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1417*8975f5c5SAndroid Build Coastguard Worker uint32_t *dest =
1418*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1419*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1420*8975f5c5SAndroid Build Coastguard Worker {
1421*8975f5c5SAndroid Build Coastguard Worker dest[x] = gl::convertRGBFloatsTo999E5(gl::float16ToFloat32(source[x * 3 + 0]),
1422*8975f5c5SAndroid Build Coastguard Worker gl::float16ToFloat32(source[x * 3 + 1]),
1423*8975f5c5SAndroid Build Coastguard Worker gl::float16ToFloat32(source[x * 3 + 2]));
1424*8975f5c5SAndroid Build Coastguard Worker }
1425*8975f5c5SAndroid Build Coastguard Worker }
1426*8975f5c5SAndroid Build Coastguard Worker }
1427*8975f5c5SAndroid Build Coastguard Worker }
1428*8975f5c5SAndroid Build Coastguard Worker
LoadRGB32FToRGB9E5(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1429*8975f5c5SAndroid Build Coastguard Worker void LoadRGB32FToRGB9E5(const ImageLoadContext &context,
1430*8975f5c5SAndroid Build Coastguard Worker size_t width,
1431*8975f5c5SAndroid Build Coastguard Worker size_t height,
1432*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1433*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1434*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1435*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1436*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1437*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1438*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1439*8975f5c5SAndroid Build Coastguard Worker {
1440*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1441*8975f5c5SAndroid Build Coastguard Worker {
1442*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1443*8975f5c5SAndroid Build Coastguard Worker {
1444*8975f5c5SAndroid Build Coastguard Worker const float *source =
1445*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1446*8975f5c5SAndroid Build Coastguard Worker uint32_t *dest =
1447*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1448*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1449*8975f5c5SAndroid Build Coastguard Worker {
1450*8975f5c5SAndroid Build Coastguard Worker dest[x] = gl::convertRGBFloatsTo999E5(source[x * 3 + 0], source[x * 3 + 1],
1451*8975f5c5SAndroid Build Coastguard Worker source[x * 3 + 2]);
1452*8975f5c5SAndroid Build Coastguard Worker }
1453*8975f5c5SAndroid Build Coastguard Worker }
1454*8975f5c5SAndroid Build Coastguard Worker }
1455*8975f5c5SAndroid Build Coastguard Worker }
1456*8975f5c5SAndroid Build Coastguard Worker
LoadRGB16FToRG11B10F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1457*8975f5c5SAndroid Build Coastguard Worker void LoadRGB16FToRG11B10F(const ImageLoadContext &context,
1458*8975f5c5SAndroid Build Coastguard Worker size_t width,
1459*8975f5c5SAndroid Build Coastguard Worker size_t height,
1460*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1461*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1462*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1463*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1464*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1465*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1466*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1467*8975f5c5SAndroid Build Coastguard Worker {
1468*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1469*8975f5c5SAndroid Build Coastguard Worker {
1470*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1471*8975f5c5SAndroid Build Coastguard Worker {
1472*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
1473*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1474*8975f5c5SAndroid Build Coastguard Worker uint32_t *dest =
1475*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1476*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1477*8975f5c5SAndroid Build Coastguard Worker {
1478*8975f5c5SAndroid Build Coastguard Worker dest[x] = (gl::float32ToFloat11(gl::float16ToFloat32(source[x * 3 + 0])) << 0) |
1479*8975f5c5SAndroid Build Coastguard Worker (gl::float32ToFloat11(gl::float16ToFloat32(source[x * 3 + 1])) << 11) |
1480*8975f5c5SAndroid Build Coastguard Worker (gl::float32ToFloat10(gl::float16ToFloat32(source[x * 3 + 2])) << 22);
1481*8975f5c5SAndroid Build Coastguard Worker }
1482*8975f5c5SAndroid Build Coastguard Worker }
1483*8975f5c5SAndroid Build Coastguard Worker }
1484*8975f5c5SAndroid Build Coastguard Worker }
1485*8975f5c5SAndroid Build Coastguard Worker
LoadRGB32FToRG11B10F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1486*8975f5c5SAndroid Build Coastguard Worker void LoadRGB32FToRG11B10F(const ImageLoadContext &context,
1487*8975f5c5SAndroid Build Coastguard Worker size_t width,
1488*8975f5c5SAndroid Build Coastguard Worker size_t height,
1489*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1490*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1491*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1492*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1493*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1494*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1495*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1496*8975f5c5SAndroid Build Coastguard Worker {
1497*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1498*8975f5c5SAndroid Build Coastguard Worker {
1499*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1500*8975f5c5SAndroid Build Coastguard Worker {
1501*8975f5c5SAndroid Build Coastguard Worker const float *source =
1502*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1503*8975f5c5SAndroid Build Coastguard Worker uint32_t *dest =
1504*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1505*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1506*8975f5c5SAndroid Build Coastguard Worker {
1507*8975f5c5SAndroid Build Coastguard Worker dest[x] = (gl::float32ToFloat11(source[x * 3 + 0]) << 0) |
1508*8975f5c5SAndroid Build Coastguard Worker (gl::float32ToFloat11(source[x * 3 + 1]) << 11) |
1509*8975f5c5SAndroid Build Coastguard Worker (gl::float32ToFloat10(source[x * 3 + 2]) << 22);
1510*8975f5c5SAndroid Build Coastguard Worker }
1511*8975f5c5SAndroid Build Coastguard Worker }
1512*8975f5c5SAndroid Build Coastguard Worker }
1513*8975f5c5SAndroid Build Coastguard Worker }
1514*8975f5c5SAndroid Build Coastguard Worker
LoadD24S8ToS8D24(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1515*8975f5c5SAndroid Build Coastguard Worker void LoadD24S8ToS8D24(const ImageLoadContext &context,
1516*8975f5c5SAndroid Build Coastguard Worker size_t width,
1517*8975f5c5SAndroid Build Coastguard Worker size_t height,
1518*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1519*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1520*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1521*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1522*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1523*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1524*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1525*8975f5c5SAndroid Build Coastguard Worker {
1526*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1527*8975f5c5SAndroid Build Coastguard Worker {
1528*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1529*8975f5c5SAndroid Build Coastguard Worker {
1530*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
1531*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1532*8975f5c5SAndroid Build Coastguard Worker uint32_t *dest =
1533*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1534*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1535*8975f5c5SAndroid Build Coastguard Worker {
1536*8975f5c5SAndroid Build Coastguard Worker dest[x] = ANGLE_ROTL(source[x], 24);
1537*8975f5c5SAndroid Build Coastguard Worker }
1538*8975f5c5SAndroid Build Coastguard Worker }
1539*8975f5c5SAndroid Build Coastguard Worker }
1540*8975f5c5SAndroid Build Coastguard Worker }
1541*8975f5c5SAndroid Build Coastguard Worker
LoadD24S8ToD32FS8X24(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1542*8975f5c5SAndroid Build Coastguard Worker void LoadD24S8ToD32FS8X24(const ImageLoadContext &context,
1543*8975f5c5SAndroid Build Coastguard Worker size_t width,
1544*8975f5c5SAndroid Build Coastguard Worker size_t height,
1545*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1546*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1547*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1548*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1549*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1550*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1551*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1552*8975f5c5SAndroid Build Coastguard Worker {
1553*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1554*8975f5c5SAndroid Build Coastguard Worker {
1555*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1556*8975f5c5SAndroid Build Coastguard Worker {
1557*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
1558*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1559*8975f5c5SAndroid Build Coastguard Worker float *destDepth =
1560*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1561*8975f5c5SAndroid Build Coastguard Worker uint32_t *destStencil =
1562*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch) +
1563*8975f5c5SAndroid Build Coastguard Worker 1;
1564*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1565*8975f5c5SAndroid Build Coastguard Worker {
1566*8975f5c5SAndroid Build Coastguard Worker destDepth[x * 2] = (source[x] >> 8) / static_cast<float>(0xFFFFFF);
1567*8975f5c5SAndroid Build Coastguard Worker destStencil[x * 2] = source[x] & 0xFF;
1568*8975f5c5SAndroid Build Coastguard Worker }
1569*8975f5c5SAndroid Build Coastguard Worker }
1570*8975f5c5SAndroid Build Coastguard Worker }
1571*8975f5c5SAndroid Build Coastguard Worker }
1572*8975f5c5SAndroid Build Coastguard Worker
LoadD24S8ToD32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1573*8975f5c5SAndroid Build Coastguard Worker void LoadD24S8ToD32F(const ImageLoadContext &context,
1574*8975f5c5SAndroid Build Coastguard Worker size_t width,
1575*8975f5c5SAndroid Build Coastguard Worker size_t height,
1576*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1577*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1578*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1579*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1580*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1581*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1582*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1583*8975f5c5SAndroid Build Coastguard Worker {
1584*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1585*8975f5c5SAndroid Build Coastguard Worker {
1586*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1587*8975f5c5SAndroid Build Coastguard Worker {
1588*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
1589*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1590*8975f5c5SAndroid Build Coastguard Worker float *destDepth =
1591*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1592*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1593*8975f5c5SAndroid Build Coastguard Worker {
1594*8975f5c5SAndroid Build Coastguard Worker destDepth[x] = (source[x] >> 8) / static_cast<float>(0xFFFFFF);
1595*8975f5c5SAndroid Build Coastguard Worker }
1596*8975f5c5SAndroid Build Coastguard Worker }
1597*8975f5c5SAndroid Build Coastguard Worker }
1598*8975f5c5SAndroid Build Coastguard Worker }
1599*8975f5c5SAndroid Build Coastguard Worker
LoadD32ToD32FX32(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1600*8975f5c5SAndroid Build Coastguard Worker void LoadD32ToD32FX32(const ImageLoadContext &context,
1601*8975f5c5SAndroid Build Coastguard Worker size_t width,
1602*8975f5c5SAndroid Build Coastguard Worker size_t height,
1603*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1604*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1605*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1606*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1607*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1608*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1609*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1610*8975f5c5SAndroid Build Coastguard Worker {
1611*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1612*8975f5c5SAndroid Build Coastguard Worker {
1613*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1614*8975f5c5SAndroid Build Coastguard Worker {
1615*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
1616*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1617*8975f5c5SAndroid Build Coastguard Worker float *destDepth =
1618*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1619*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1620*8975f5c5SAndroid Build Coastguard Worker {
1621*8975f5c5SAndroid Build Coastguard Worker destDepth[x * 2] = source[x] / static_cast<float>(0xFFFFFFFF);
1622*8975f5c5SAndroid Build Coastguard Worker }
1623*8975f5c5SAndroid Build Coastguard Worker }
1624*8975f5c5SAndroid Build Coastguard Worker }
1625*8975f5c5SAndroid Build Coastguard Worker }
1626*8975f5c5SAndroid Build Coastguard Worker
LoadD32ToD32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1627*8975f5c5SAndroid Build Coastguard Worker void LoadD32ToD32F(const ImageLoadContext &context,
1628*8975f5c5SAndroid Build Coastguard Worker size_t width,
1629*8975f5c5SAndroid Build Coastguard Worker size_t height,
1630*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1631*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1632*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1633*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1634*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1635*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1636*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1637*8975f5c5SAndroid Build Coastguard Worker {
1638*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1639*8975f5c5SAndroid Build Coastguard Worker {
1640*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1641*8975f5c5SAndroid Build Coastguard Worker {
1642*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
1643*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1644*8975f5c5SAndroid Build Coastguard Worker float *destDepth =
1645*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1646*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1647*8975f5c5SAndroid Build Coastguard Worker {
1648*8975f5c5SAndroid Build Coastguard Worker uint32_t sourcePixel = source[x];
1649*8975f5c5SAndroid Build Coastguard Worker destDepth[x] = sourcePixel / static_cast<float>(0xFFFFFFFF);
1650*8975f5c5SAndroid Build Coastguard Worker }
1651*8975f5c5SAndroid Build Coastguard Worker }
1652*8975f5c5SAndroid Build Coastguard Worker }
1653*8975f5c5SAndroid Build Coastguard Worker }
1654*8975f5c5SAndroid Build Coastguard Worker
LoadD32FToD32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1655*8975f5c5SAndroid Build Coastguard Worker void LoadD32FToD32F(const ImageLoadContext &context,
1656*8975f5c5SAndroid Build Coastguard Worker size_t width,
1657*8975f5c5SAndroid Build Coastguard Worker size_t height,
1658*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1659*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1660*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1661*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1662*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1663*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1664*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1665*8975f5c5SAndroid Build Coastguard Worker {
1666*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1667*8975f5c5SAndroid Build Coastguard Worker {
1668*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1669*8975f5c5SAndroid Build Coastguard Worker {
1670*8975f5c5SAndroid Build Coastguard Worker const float *source =
1671*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1672*8975f5c5SAndroid Build Coastguard Worker float *dest =
1673*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1674*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1675*8975f5c5SAndroid Build Coastguard Worker {
1676*8975f5c5SAndroid Build Coastguard Worker dest[x] = gl::clamp01(source[x]);
1677*8975f5c5SAndroid Build Coastguard Worker }
1678*8975f5c5SAndroid Build Coastguard Worker }
1679*8975f5c5SAndroid Build Coastguard Worker }
1680*8975f5c5SAndroid Build Coastguard Worker }
1681*8975f5c5SAndroid Build Coastguard Worker
LoadD32FS8X24ToS8D24(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1682*8975f5c5SAndroid Build Coastguard Worker void LoadD32FS8X24ToS8D24(const ImageLoadContext &context,
1683*8975f5c5SAndroid Build Coastguard Worker size_t width,
1684*8975f5c5SAndroid Build Coastguard Worker size_t height,
1685*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1686*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1687*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1688*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1689*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1690*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1691*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1692*8975f5c5SAndroid Build Coastguard Worker {
1693*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1694*8975f5c5SAndroid Build Coastguard Worker {
1695*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1696*8975f5c5SAndroid Build Coastguard Worker {
1697*8975f5c5SAndroid Build Coastguard Worker const float *sourceDepth =
1698*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1699*8975f5c5SAndroid Build Coastguard Worker const uint32_t *sourceStencil =
1700*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch) + 1;
1701*8975f5c5SAndroid Build Coastguard Worker uint32_t *dest =
1702*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1703*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1704*8975f5c5SAndroid Build Coastguard Worker {
1705*8975f5c5SAndroid Build Coastguard Worker uint32_t d = static_cast<uint32_t>(gl::clamp01(sourceDepth[x * 2]) * 0xFFFFFF);
1706*8975f5c5SAndroid Build Coastguard Worker uint32_t s = sourceStencil[x * 2] << 24;
1707*8975f5c5SAndroid Build Coastguard Worker dest[x] = d | s;
1708*8975f5c5SAndroid Build Coastguard Worker }
1709*8975f5c5SAndroid Build Coastguard Worker }
1710*8975f5c5SAndroid Build Coastguard Worker }
1711*8975f5c5SAndroid Build Coastguard Worker }
1712*8975f5c5SAndroid Build Coastguard Worker
LoadX24S8ToS8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1713*8975f5c5SAndroid Build Coastguard Worker void LoadX24S8ToS8(const ImageLoadContext &context,
1714*8975f5c5SAndroid Build Coastguard Worker size_t width,
1715*8975f5c5SAndroid Build Coastguard Worker size_t height,
1716*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1717*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1718*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1719*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1720*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1721*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1722*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1723*8975f5c5SAndroid Build Coastguard Worker {
1724*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1725*8975f5c5SAndroid Build Coastguard Worker {
1726*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1727*8975f5c5SAndroid Build Coastguard Worker {
1728*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source = reinterpret_cast<const uint32_t *>(
1729*8975f5c5SAndroid Build Coastguard Worker input + (y * inputRowPitch) + (z * inputDepthPitch));
1730*8975f5c5SAndroid Build Coastguard Worker uint8_t *destStencil =
1731*8975f5c5SAndroid Build Coastguard Worker reinterpret_cast<uint8_t *>(output + (y * outputRowPitch) + (z * outputDepthPitch));
1732*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1733*8975f5c5SAndroid Build Coastguard Worker {
1734*8975f5c5SAndroid Build Coastguard Worker destStencil[x] = (source[x] & 0xFF);
1735*8975f5c5SAndroid Build Coastguard Worker }
1736*8975f5c5SAndroid Build Coastguard Worker }
1737*8975f5c5SAndroid Build Coastguard Worker }
1738*8975f5c5SAndroid Build Coastguard Worker }
1739*8975f5c5SAndroid Build Coastguard Worker
LoadX32S8ToS8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1740*8975f5c5SAndroid Build Coastguard Worker void LoadX32S8ToS8(const ImageLoadContext &context,
1741*8975f5c5SAndroid Build Coastguard Worker size_t width,
1742*8975f5c5SAndroid Build Coastguard Worker size_t height,
1743*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1744*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1745*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1746*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1747*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1748*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1749*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1750*8975f5c5SAndroid Build Coastguard Worker {
1751*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1752*8975f5c5SAndroid Build Coastguard Worker {
1753*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1754*8975f5c5SAndroid Build Coastguard Worker {
1755*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source = reinterpret_cast<const uint32_t *>(
1756*8975f5c5SAndroid Build Coastguard Worker input + (y * inputRowPitch) + (z * inputDepthPitch));
1757*8975f5c5SAndroid Build Coastguard Worker uint8_t *destStencil =
1758*8975f5c5SAndroid Build Coastguard Worker reinterpret_cast<uint8_t *>(output + (y * outputRowPitch) + (z * outputDepthPitch));
1759*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1760*8975f5c5SAndroid Build Coastguard Worker {
1761*8975f5c5SAndroid Build Coastguard Worker destStencil[x] = (source[(x * 2) + 1] & 0xFF);
1762*8975f5c5SAndroid Build Coastguard Worker }
1763*8975f5c5SAndroid Build Coastguard Worker }
1764*8975f5c5SAndroid Build Coastguard Worker }
1765*8975f5c5SAndroid Build Coastguard Worker }
1766*8975f5c5SAndroid Build Coastguard Worker
LoadD32FS8X24ToD32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1767*8975f5c5SAndroid Build Coastguard Worker void LoadD32FS8X24ToD32F(const ImageLoadContext &context,
1768*8975f5c5SAndroid Build Coastguard Worker size_t width,
1769*8975f5c5SAndroid Build Coastguard Worker size_t height,
1770*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1771*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1772*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1773*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1774*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1775*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1776*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1777*8975f5c5SAndroid Build Coastguard Worker {
1778*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1779*8975f5c5SAndroid Build Coastguard Worker {
1780*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1781*8975f5c5SAndroid Build Coastguard Worker {
1782*8975f5c5SAndroid Build Coastguard Worker const float *sourceDepth =
1783*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1784*8975f5c5SAndroid Build Coastguard Worker float *destDepth =
1785*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1786*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1787*8975f5c5SAndroid Build Coastguard Worker {
1788*8975f5c5SAndroid Build Coastguard Worker destDepth[x] = gl::clamp01(sourceDepth[x * 2]);
1789*8975f5c5SAndroid Build Coastguard Worker }
1790*8975f5c5SAndroid Build Coastguard Worker }
1791*8975f5c5SAndroid Build Coastguard Worker }
1792*8975f5c5SAndroid Build Coastguard Worker }
1793*8975f5c5SAndroid Build Coastguard Worker
LoadD32FS8X24ToD32FS8X24(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1794*8975f5c5SAndroid Build Coastguard Worker void LoadD32FS8X24ToD32FS8X24(const ImageLoadContext &context,
1795*8975f5c5SAndroid Build Coastguard Worker size_t width,
1796*8975f5c5SAndroid Build Coastguard Worker size_t height,
1797*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1798*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1799*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1800*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1801*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1802*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1803*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1804*8975f5c5SAndroid Build Coastguard Worker {
1805*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1806*8975f5c5SAndroid Build Coastguard Worker {
1807*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1808*8975f5c5SAndroid Build Coastguard Worker {
1809*8975f5c5SAndroid Build Coastguard Worker const float *sourceDepth =
1810*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1811*8975f5c5SAndroid Build Coastguard Worker const uint32_t *sourceStencil =
1812*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch) + 1;
1813*8975f5c5SAndroid Build Coastguard Worker float *destDepth =
1814*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1815*8975f5c5SAndroid Build Coastguard Worker uint32_t *destStencil =
1816*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch) +
1817*8975f5c5SAndroid Build Coastguard Worker 1;
1818*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1819*8975f5c5SAndroid Build Coastguard Worker {
1820*8975f5c5SAndroid Build Coastguard Worker destDepth[x * 2] = gl::clamp01(sourceDepth[x * 2]);
1821*8975f5c5SAndroid Build Coastguard Worker destStencil[x * 2] = sourceStencil[x * 2] & 0xFF;
1822*8975f5c5SAndroid Build Coastguard Worker }
1823*8975f5c5SAndroid Build Coastguard Worker }
1824*8975f5c5SAndroid Build Coastguard Worker }
1825*8975f5c5SAndroid Build Coastguard Worker }
1826*8975f5c5SAndroid Build Coastguard Worker
LoadRGB32FToRGBA16F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1827*8975f5c5SAndroid Build Coastguard Worker void LoadRGB32FToRGBA16F(const ImageLoadContext &context,
1828*8975f5c5SAndroid Build Coastguard Worker size_t width,
1829*8975f5c5SAndroid Build Coastguard Worker size_t height,
1830*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1831*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1832*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1833*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1834*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1835*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1836*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1837*8975f5c5SAndroid Build Coastguard Worker {
1838*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1839*8975f5c5SAndroid Build Coastguard Worker {
1840*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1841*8975f5c5SAndroid Build Coastguard Worker {
1842*8975f5c5SAndroid Build Coastguard Worker const float *source =
1843*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1844*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
1845*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1846*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1847*8975f5c5SAndroid Build Coastguard Worker {
1848*8975f5c5SAndroid Build Coastguard Worker dest[x * 4 + 0] = gl::float32ToFloat16(source[x * 3 + 0]);
1849*8975f5c5SAndroid Build Coastguard Worker dest[x * 4 + 1] = gl::float32ToFloat16(source[x * 3 + 1]);
1850*8975f5c5SAndroid Build Coastguard Worker dest[x * 4 + 2] = gl::float32ToFloat16(source[x * 3 + 2]);
1851*8975f5c5SAndroid Build Coastguard Worker dest[x * 4 + 3] = gl::Float16One;
1852*8975f5c5SAndroid Build Coastguard Worker }
1853*8975f5c5SAndroid Build Coastguard Worker }
1854*8975f5c5SAndroid Build Coastguard Worker }
1855*8975f5c5SAndroid Build Coastguard Worker }
1856*8975f5c5SAndroid Build Coastguard Worker
LoadRGB32FToRGB16F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1857*8975f5c5SAndroid Build Coastguard Worker void LoadRGB32FToRGB16F(const ImageLoadContext &context,
1858*8975f5c5SAndroid Build Coastguard Worker size_t width,
1859*8975f5c5SAndroid Build Coastguard Worker size_t height,
1860*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1861*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1862*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1863*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1864*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1865*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1866*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1867*8975f5c5SAndroid Build Coastguard Worker {
1868*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1869*8975f5c5SAndroid Build Coastguard Worker {
1870*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1871*8975f5c5SAndroid Build Coastguard Worker {
1872*8975f5c5SAndroid Build Coastguard Worker const float *source =
1873*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1874*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
1875*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1876*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1877*8975f5c5SAndroid Build Coastguard Worker {
1878*8975f5c5SAndroid Build Coastguard Worker dest[x * 3 + 0] = gl::float32ToFloat16(source[x * 3 + 0]);
1879*8975f5c5SAndroid Build Coastguard Worker dest[x * 3 + 1] = gl::float32ToFloat16(source[x * 3 + 1]);
1880*8975f5c5SAndroid Build Coastguard Worker dest[x * 3 + 2] = gl::float32ToFloat16(source[x * 3 + 2]);
1881*8975f5c5SAndroid Build Coastguard Worker }
1882*8975f5c5SAndroid Build Coastguard Worker }
1883*8975f5c5SAndroid Build Coastguard Worker }
1884*8975f5c5SAndroid Build Coastguard Worker }
1885*8975f5c5SAndroid Build Coastguard Worker
LoadR32ToR16(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1886*8975f5c5SAndroid Build Coastguard Worker void LoadR32ToR16(const ImageLoadContext &context,
1887*8975f5c5SAndroid Build Coastguard Worker size_t width,
1888*8975f5c5SAndroid Build Coastguard Worker size_t height,
1889*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1890*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1891*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1892*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1893*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1894*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1895*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1896*8975f5c5SAndroid Build Coastguard Worker {
1897*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1898*8975f5c5SAndroid Build Coastguard Worker {
1899*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1900*8975f5c5SAndroid Build Coastguard Worker {
1901*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
1902*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1903*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest =
1904*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1905*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1906*8975f5c5SAndroid Build Coastguard Worker {
1907*8975f5c5SAndroid Build Coastguard Worker dest[x] = source[x] >> 16;
1908*8975f5c5SAndroid Build Coastguard Worker }
1909*8975f5c5SAndroid Build Coastguard Worker }
1910*8975f5c5SAndroid Build Coastguard Worker }
1911*8975f5c5SAndroid Build Coastguard Worker }
1912*8975f5c5SAndroid Build Coastguard Worker
LoadD32ToX8D24(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1913*8975f5c5SAndroid Build Coastguard Worker void LoadD32ToX8D24(const ImageLoadContext &context,
1914*8975f5c5SAndroid Build Coastguard Worker size_t width,
1915*8975f5c5SAndroid Build Coastguard Worker size_t height,
1916*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1917*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1918*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1919*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1920*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1921*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1922*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1923*8975f5c5SAndroid Build Coastguard Worker {
1924*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1925*8975f5c5SAndroid Build Coastguard Worker {
1926*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1927*8975f5c5SAndroid Build Coastguard Worker {
1928*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source =
1929*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1930*8975f5c5SAndroid Build Coastguard Worker uint32_t *dest =
1931*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1932*8975f5c5SAndroid Build Coastguard Worker
1933*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1934*8975f5c5SAndroid Build Coastguard Worker {
1935*8975f5c5SAndroid Build Coastguard Worker dest[x] = source[x] >> 8;
1936*8975f5c5SAndroid Build Coastguard Worker }
1937*8975f5c5SAndroid Build Coastguard Worker }
1938*8975f5c5SAndroid Build Coastguard Worker }
1939*8975f5c5SAndroid Build Coastguard Worker }
1940*8975f5c5SAndroid Build Coastguard Worker
1941*8975f5c5SAndroid Build Coastguard Worker // This conversion was added to support using a 32F depth buffer
1942*8975f5c5SAndroid Build Coastguard Worker // as emulation for 16unorm depth buffer in Metal.
1943*8975f5c5SAndroid Build Coastguard Worker // See https://anglebug.com/42265093
LoadD16ToD32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1944*8975f5c5SAndroid Build Coastguard Worker void LoadD16ToD32F(const ImageLoadContext &context,
1945*8975f5c5SAndroid Build Coastguard Worker size_t width,
1946*8975f5c5SAndroid Build Coastguard Worker size_t height,
1947*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1948*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1949*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1950*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1951*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1952*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1953*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1954*8975f5c5SAndroid Build Coastguard Worker {
1955*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1956*8975f5c5SAndroid Build Coastguard Worker {
1957*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1958*8975f5c5SAndroid Build Coastguard Worker {
1959*8975f5c5SAndroid Build Coastguard Worker const uint16_t *source =
1960*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1961*8975f5c5SAndroid Build Coastguard Worker float *dest =
1962*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1963*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1964*8975f5c5SAndroid Build Coastguard Worker {
1965*8975f5c5SAndroid Build Coastguard Worker dest[x] = static_cast<float>(source[x]) / 0xFFFF;
1966*8975f5c5SAndroid Build Coastguard Worker }
1967*8975f5c5SAndroid Build Coastguard Worker }
1968*8975f5c5SAndroid Build Coastguard Worker }
1969*8975f5c5SAndroid Build Coastguard Worker }
1970*8975f5c5SAndroid Build Coastguard Worker
LoadS8ToS8X24(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1971*8975f5c5SAndroid Build Coastguard Worker void LoadS8ToS8X24(const ImageLoadContext &context,
1972*8975f5c5SAndroid Build Coastguard Worker size_t width,
1973*8975f5c5SAndroid Build Coastguard Worker size_t height,
1974*8975f5c5SAndroid Build Coastguard Worker size_t depth,
1975*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
1976*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
1977*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
1978*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
1979*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
1980*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
1981*8975f5c5SAndroid Build Coastguard Worker {
1982*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++)
1983*8975f5c5SAndroid Build Coastguard Worker {
1984*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
1985*8975f5c5SAndroid Build Coastguard Worker {
1986*8975f5c5SAndroid Build Coastguard Worker const uint8_t *source =
1987*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
1988*8975f5c5SAndroid Build Coastguard Worker uint32_t *destStencil =
1989*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1990*8975f5c5SAndroid Build Coastguard Worker
1991*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
1992*8975f5c5SAndroid Build Coastguard Worker {
1993*8975f5c5SAndroid Build Coastguard Worker destStencil[x] = source[x] << 24;
1994*8975f5c5SAndroid Build Coastguard Worker }
1995*8975f5c5SAndroid Build Coastguard Worker }
1996*8975f5c5SAndroid Build Coastguard Worker }
1997*8975f5c5SAndroid Build Coastguard Worker }
1998*8975f5c5SAndroid Build Coastguard Worker
LoadYuvToNative(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1999*8975f5c5SAndroid Build Coastguard Worker void LoadYuvToNative(const ImageLoadContext &context,
2000*8975f5c5SAndroid Build Coastguard Worker size_t width,
2001*8975f5c5SAndroid Build Coastguard Worker size_t height,
2002*8975f5c5SAndroid Build Coastguard Worker size_t depth,
2003*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
2004*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
2005*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
2006*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
2007*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
2008*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch)
2009*8975f5c5SAndroid Build Coastguard Worker {
2010*8975f5c5SAndroid Build Coastguard Worker // For YUV formats it is assumed that source has tightly packed data.
2011*8975f5c5SAndroid Build Coastguard Worker memcpy(output, input, inputDepthPitch);
2012*8975f5c5SAndroid Build Coastguard Worker }
2013*8975f5c5SAndroid Build Coastguard Worker
2014*8975f5c5SAndroid Build Coastguard Worker } // namespace angle
2015