1 //
2 // Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 // loadimage.cpp: Defines image loading functions.
8
9 #include "libGLESv2/renderer/loadimage.h"
10
11 namespace rx
12 {
13
LoadA8ToRGBA8(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)14 void LoadA8ToRGBA8(size_t width, size_t height, size_t depth,
15 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
16 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
17 {
18 for (size_t z = 0; z < depth; z++)
19 {
20 for (size_t y = 0; y < height; y++)
21 {
22 const uint8_t *source = OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
23 uint32_t *dest = OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
24 for (size_t x = 0; x < width; x++)
25 {
26 dest[x] = static_cast<uint32_t>(source[x]) << 24;
27 }
28 }
29 }
30 }
31
LoadA8ToBGRA8(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)32 void LoadA8ToBGRA8(size_t width, size_t height, size_t depth,
33 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
34 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
35 {
36 // Same as loading to RGBA
37 LoadA8ToRGBA8(width, height, depth, input, inputRowPitch, inputDepthPitch, output, outputRowPitch, outputDepthPitch);
38 }
39
LoadA32FToRGBA32F(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)40 void LoadA32FToRGBA32F(size_t width, size_t height, size_t depth,
41 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
42 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
43 {
44 for (size_t z = 0; z < depth; z++)
45 {
46 for (size_t y = 0; y < height; y++)
47 {
48 const float *source = OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
49 float *dest = OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
50 for (size_t x = 0; x < width; x++)
51 {
52 dest[4 * x + 0] = 0.0f;
53 dest[4 * x + 1] = 0.0f;
54 dest[4 * x + 2] = 0.0f;
55 dest[4 * x + 3] = source[x];
56 }
57 }
58 }
59 }
60
LoadA16FToRGBA16F(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)61 void LoadA16FToRGBA16F(size_t width, size_t height, size_t depth,
62 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
63 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
64 {
65 for (size_t z = 0; z < depth; z++)
66 {
67 for (size_t y = 0; y < height; y++)
68 {
69 const uint16_t *source = OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
70 uint16_t *dest = OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
71 for (size_t x = 0; x < width; x++)
72 {
73 dest[4 * x + 0] = 0;
74 dest[4 * x + 1] = 0;
75 dest[4 * x + 2] = 0;
76 dest[4 * x + 3] = source[x];
77 }
78 }
79 }
80 }
81
LoadL8ToRGBA8(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)82 void LoadL8ToRGBA8(size_t width, size_t height, size_t depth,
83 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
84 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
85 {
86 for (size_t z = 0; z < depth; z++)
87 {
88 for (size_t y = 0; y < height; y++)
89 {
90 const uint8_t *source = OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
91 uint8_t *dest = OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
92 for (size_t x = 0; x < width; x++)
93 {
94 dest[4 * x + 0] = source[x];
95 dest[4 * x + 1] = source[x];
96 dest[4 * x + 2] = source[x];
97 dest[4 * x + 3] = 0xFF;
98 }
99 }
100 }
101 }
102
LoadL8ToBGRA8(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)103 void LoadL8ToBGRA8(size_t width, size_t height, size_t depth,
104 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
105 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
106 {
107 // Same as loading to RGBA
108 LoadL8ToRGBA8(width, height, depth, input, inputRowPitch, inputDepthPitch, output, outputRowPitch, outputDepthPitch);
109 }
110
LoadL32FToRGBA32F(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)111 void LoadL32FToRGBA32F(size_t width, size_t height, size_t depth,
112 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
113 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
114 {
115 for (size_t z = 0; z < depth; z++)
116 {
117 for (size_t y = 0; y < height; y++)
118 {
119 const float *source = OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
120 float *dest = OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
121 for (size_t x = 0; x < width; x++)
122 {
123 dest[4 * x + 0] = source[x];
124 dest[4 * x + 1] = source[x];
125 dest[4 * x + 2] = source[x];
126 dest[4 * x + 3] = 1.0f;
127 }
128 }
129 }
130 }
131
LoadL16FToRGBA16F(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)132 void LoadL16FToRGBA16F(size_t width, size_t height, size_t depth,
133 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
134 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
135 {
136 for (size_t z = 0; z < depth; z++)
137 {
138 for (size_t y = 0; y < height; y++)
139 {
140 const uint16_t *source = OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
141 uint16_t *dest = OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
142 for (size_t x = 0; x < width; x++)
143 {
144 dest[4 * x + 0] = source[x];
145 dest[4 * x + 1] = source[x];
146 dest[4 * x + 2] = source[x];
147 dest[4 * x + 3] = gl::Float16One;
148 }
149 }
150 }
151 }
152
LoadLA8ToRGBA8(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)153 void LoadLA8ToRGBA8(size_t width, size_t height, size_t depth,
154 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
155 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
156 {
157 for (size_t z = 0; z < depth; z++)
158 {
159 for (size_t y = 0; y < height; y++)
160 {
161 const uint8_t *source = OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
162 uint8_t *dest = OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
163 for (size_t x = 0; x < width; x++)
164 {
165 dest[4 * x + 0] = source[2 * x + 0];
166 dest[4 * x + 1] = source[2 * x + 0];
167 dest[4 * x + 2] = source[2 * x + 0];
168 dest[4 * x + 3] = source[2 * x + 1];
169 }
170 }
171 }
172 }
173
LoadLA8ToBGRA8(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)174 void LoadLA8ToBGRA8(size_t width, size_t height, size_t depth,
175 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
176 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
177 {
178 // Same as loading to RGBA
179 LoadLA8ToRGBA8(width, height, depth, input, inputRowPitch, inputDepthPitch, output, outputRowPitch, outputDepthPitch);
180 }
181
LoadLA32FToRGBA32F(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)182 void LoadLA32FToRGBA32F(size_t width, size_t height, size_t depth,
183 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
184 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
185 {
186 for (size_t z = 0; z < depth; z++)
187 {
188 for (size_t y = 0; y < height; y++)
189 {
190 const float *source = OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
191 float *dest = OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
192 for (size_t x = 0; x < width; x++)
193 {
194 dest[4 * x + 0] = source[2 * x + 0];
195 dest[4 * x + 1] = source[2 * x + 0];
196 dest[4 * x + 2] = source[2 * x + 0];
197 dest[4 * x + 3] = source[2 * x + 1];
198 }
199 }
200 }
201 }
202
LoadLA16FToRGBA16F(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)203 void LoadLA16FToRGBA16F(size_t width, size_t height, size_t depth,
204 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
205 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
206 {
207 for (size_t z = 0; z < depth; z++)
208 {
209 for (size_t y = 0; y < height; y++)
210 {
211 const uint16_t *source = OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
212 uint16_t *dest = OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
213 for (size_t x = 0; x < width; x++)
214 {
215 dest[4 * x + 0] = source[2 * x + 0];
216 dest[4 * x + 1] = source[2 * x + 0];
217 dest[4 * x + 2] = source[2 * x + 0];
218 dest[4 * x + 3] = source[2 * x + 1];
219 }
220 }
221 }
222 }
223
LoadRGB8ToBGRX8(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)224 void LoadRGB8ToBGRX8(size_t width, size_t height, size_t depth,
225 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
226 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
227 {
228 for (size_t z = 0; z < depth; z++)
229 {
230 for (size_t y = 0; y < height; y++)
231 {
232 const uint8_t *source = OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
233 uint8_t *dest = OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
234 for (size_t x = 0; x < width; x++)
235 {
236 dest[4 * x + 0] = source[x * 3 + 2];
237 dest[4 * x + 1] = source[x * 3 + 1];
238 dest[4 * x + 2] = source[x * 3 + 0];
239 dest[4 * x + 3] = 0xFF;
240 }
241 }
242 }
243 }
244
LoadRG8ToBGRX8(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)245 void LoadRG8ToBGRX8(size_t width, size_t height, size_t depth,
246 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
247 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
248 {
249 for (size_t z = 0; z < depth; z++)
250 {
251 for (size_t y = 0; y < height; y++)
252 {
253 const uint8_t *source = OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
254 uint8_t *dest = OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
255 for (size_t x = 0; x < width; x++)
256 {
257 dest[4 * x + 0] = 0x00;
258 dest[4 * x + 1] = source[x * 2 + 1];
259 dest[4 * x + 2] = source[x * 2 + 0];
260 dest[4 * x + 3] = 0xFF;
261 }
262 }
263 }
264 }
265
LoadR8ToBGRX8(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)266 void LoadR8ToBGRX8(size_t width, size_t height, size_t depth,
267 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
268 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
269 {
270 for (size_t z = 0; z < depth; z++)
271 {
272 for (size_t y = 0; y < height; y++)
273 {
274 const uint8_t *source = OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
275 uint8_t *dest = OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
276 for (size_t x = 0; x < width; x++)
277 {
278 dest[4 * x + 0] = 0x00;
279 dest[4 * x + 1] = 0x00;
280 dest[4 * x + 2] = source[x];
281 dest[4 * x + 3] = 0xFF;
282 }
283 }
284 }
285 }
286
LoadR5G6B5ToBGRA8(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 void LoadR5G6B5ToBGRA8(size_t width, size_t height, size_t depth,
288 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
289 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
290 {
291 for (size_t z = 0; z < depth; z++)
292 {
293 for (size_t y = 0; y < height; y++)
294 {
295 const uint16_t *source = OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
296 uint8_t *dest = OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
297 for (size_t x = 0; x < width; x++)
298 {
299 uint16_t rgb = source[x];
300 dest[4 * x + 0] = ((rgb & 0x001F) << 3) | ((rgb & 0x001F) >> 2);
301 dest[4 * x + 1] = ((rgb & 0x07E0) >> 3) | ((rgb & 0x07E0) >> 9);
302 dest[4 * x + 2] = ((rgb & 0xF800) >> 8) | ((rgb & 0xF800) >> 13);
303 dest[4 * x + 3] = 0xFF;
304 }
305 }
306 }
307 }
308
LoadR5G6B5ToRGBA8(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)309 void LoadR5G6B5ToRGBA8(size_t width, size_t height, size_t depth,
310 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
311 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
312 {
313 for (size_t z = 0; z < depth; z++)
314 {
315 for (size_t y = 0; y < height; y++)
316 {
317 const uint16_t *source = OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
318 uint8_t *dest = OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
319 for (size_t x = 0; x < width; x++)
320 {
321 uint16_t rgb = source[x];
322 dest[4 * x + 0] = ((rgb & 0xF800) >> 8) | ((rgb & 0xF800) >> 13);
323 dest[4 * x + 1] = ((rgb & 0x07E0) >> 3) | ((rgb & 0x07E0) >> 9);
324 dest[4 * x + 2] = ((rgb & 0x001F) << 3) | ((rgb & 0x001F) >> 2);
325 dest[4 * x + 3] = 0xFF;
326 }
327 }
328 }
329 }
330
LoadRGBA8ToBGRA8(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)331 void LoadRGBA8ToBGRA8(size_t width, size_t height, size_t depth,
332 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
333 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
334 {
335 for (size_t z = 0; z < depth; z++)
336 {
337 for (size_t y = 0; y < height; y++)
338 {
339 const uint32_t *source = OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
340 uint32_t *dest = OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
341 for (size_t x = 0; x < width; x++)
342 {
343 uint32_t rgba = source[x];
344 dest[x] = (_rotl(rgba, 16) & 0x00ff00ff) | (rgba & 0xff00ff00);
345 }
346 }
347 }
348 }
349
LoadRGBA4ToBGRA8(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)350 void LoadRGBA4ToBGRA8(size_t width, size_t height, size_t depth,
351 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
352 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
353 {
354 for (size_t z = 0; z < depth; z++)
355 {
356 for (size_t y = 0; y < height; y++)
357 {
358 const uint16_t *source = OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
359 uint8_t *dest = OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
360 for (size_t x = 0; x < width; x++)
361 {
362 uint16_t rgba = source[x];
363 dest[4 * x + 0] = ((rgba & 0x00F0) << 0) | ((rgba & 0x00F0) >> 4);
364 dest[4 * x + 1] = ((rgba & 0x0F00) >> 4) | ((rgba & 0x0F00) >> 8);
365 dest[4 * x + 2] = ((rgba & 0xF000) >> 8) | ((rgba & 0xF000) >> 12);
366 dest[4 * x + 3] = ((rgba & 0x000F) << 4) | ((rgba & 0x000F) >> 0);
367 }
368 }
369 }
370 }
371
LoadRGBA4ToRGBA8(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)372 void LoadRGBA4ToRGBA8(size_t width, size_t height, size_t depth,
373 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
374 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
375 {
376 for (size_t z = 0; z < depth; z++)
377 {
378 for (size_t y = 0; y < height; y++)
379 {
380 const uint16_t *source = OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
381 uint8_t *dest = OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
382 for (size_t x = 0; x < width; x++)
383 {
384 uint16_t rgba = source[x];
385 dest[4 * x + 0] = ((rgba & 0xF000) >> 8) | ((rgba & 0xF000) >> 12);
386 dest[4 * x + 1] = ((rgba & 0x0F00) >> 4) | ((rgba & 0x0F00) >> 8);
387 dest[4 * x + 2] = ((rgba & 0x00F0) << 0) | ((rgba & 0x00F0) >> 4);
388 dest[4 * x + 3] = ((rgba & 0x000F) << 4) | ((rgba & 0x000F) >> 0);
389 }
390 }
391 }
392 }
393
LoadBGRA4ToBGRA8(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)394 void LoadBGRA4ToBGRA8(size_t width, size_t height, size_t depth,
395 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
396 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
397 {
398 for (size_t z = 0; z < depth; z++)
399 {
400 for (size_t y = 0; y < height; y++)
401 {
402 const uint16_t *source = OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
403 uint8_t *dest = OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
404 for (size_t x = 0; x < width; x++)
405 {
406 uint16_t bgra = source[x];
407 dest[4 * x + 0] = ((bgra & 0xF000) >> 8) | ((bgra & 0xF000) >> 12);
408 dest[4 * x + 1] = ((bgra & 0x0F00) >> 4) | ((bgra & 0x0F00) >> 8);
409 dest[4 * x + 2] = ((bgra & 0x00F0) << 0) | ((bgra & 0x00F0) >> 4);
410 dest[4 * x + 3] = ((bgra & 0x000F) << 4) | ((bgra & 0x000F) >> 0);
411 }
412 }
413 }
414 }
415
LoadRGB5A1ToBGRA8(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)416 void LoadRGB5A1ToBGRA8(size_t width, size_t height, size_t depth,
417 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
418 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
419 {
420 for (size_t z = 0; z < depth; z++)
421 {
422 for (size_t y = 0; y < height; y++)
423 {
424 const uint16_t *source = OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
425 uint8_t *dest = OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
426 for (size_t x = 0; x < width; x++)
427 {
428 uint16_t rgba = source[x];
429 dest[4 * x + 0] = ((rgba & 0x003E) << 2) | ((rgba & 0x003E) >> 3);
430 dest[4 * x + 1] = ((rgba & 0x07C0) >> 3) | ((rgba & 0x07C0) >> 8);
431 dest[4 * x + 2] = ((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13);
432 dest[4 * x + 3] = (rgba & 0x0001) ? 0xFF : 0;
433 }
434 }
435 }
436 }
437
LoadRGB5A1ToRGBA8(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)438 void LoadRGB5A1ToRGBA8(size_t width, size_t height, size_t depth,
439 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
440 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
441 {
442 for (size_t z = 0; z < depth; z++)
443 {
444 for (size_t y = 0; y < height; y++)
445 {
446 const uint16_t *source = OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
447 uint8_t *dest = OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
448 for (size_t x = 0; x < width; x++)
449 {
450 uint16_t rgba = source[x];
451 dest[4 * x + 0] = ((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13);
452 dest[4 * x + 1] = ((rgba & 0x07C0) >> 3) | ((rgba & 0x07C0) >> 8);
453 dest[4 * x + 2] = ((rgba & 0x003E) << 2) | ((rgba & 0x003E) >> 3);
454 dest[4 * x + 3] = (rgba & 0x0001) ? 0xFF : 0;
455 }
456 }
457 }
458 }
459
460
LoadBGR5A1ToBGRA8(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)461 void LoadBGR5A1ToBGRA8(size_t width, size_t height, size_t depth,
462 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
463 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
464 {
465 for (size_t z = 0; z < depth; z++)
466 {
467 for (size_t y = 0; y < height; y++)
468 {
469 const uint16_t *source = OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
470 uint8_t *dest = OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
471 for (size_t x = 0; x < width; x++)
472 {
473 uint16_t bgra = source[x];
474 dest[4 * x + 0] = ((bgra & 0xF800) >> 8) | ((bgra & 0xF800) >> 13);
475 dest[4 * x + 1] = ((bgra & 0x07C0) >> 3) | ((bgra & 0x07C0) >> 8);
476 dest[4 * x + 2] = ((bgra & 0x003E) << 2) | ((bgra & 0x003E) >> 3);
477 dest[4 * x + 3] = (bgra & 0x0001) ? 0xFF : 0;
478 }
479 }
480 }
481 }
482
LoadRGB10A2ToRGBA8(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)483 void LoadRGB10A2ToRGBA8(size_t width, size_t height, size_t depth,
484 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
485 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
486 {
487 for (size_t z = 0; z < depth; z++)
488 {
489 for (size_t y = 0; y < height; y++)
490 {
491 const uint32_t *source = OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
492 uint8_t *dest = OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
493 for (size_t x = 0; x < width; x++)
494 {
495 uint32_t rgba = source[x];
496 dest[4 * x + 0] = (rgba & 0x000003FF) >> 2;
497 dest[4 * x + 1] = (rgba & 0x000FFC00) >> 12;
498 dest[4 * x + 2] = (rgba & 0x3FF00000) >> 22;
499 dest[4 * x + 3] = ((rgba & 0xC0000000) >> 30) * 0x55;
500 }
501 }
502 }
503 }
504
LoadRGB16FToRGB9E5(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)505 void LoadRGB16FToRGB9E5(size_t width, size_t height, size_t depth,
506 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
507 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
508 {
509 for (size_t z = 0; z < depth; z++)
510 {
511 for (size_t y = 0; y < height; y++)
512 {
513 const uint16_t *source = OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
514 uint32_t *dest = OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
515 for (size_t x = 0; x < width; x++)
516 {
517 dest[x] = gl::convertRGBFloatsTo999E5(gl::float16ToFloat32(source[x * 3 + 0]),
518 gl::float16ToFloat32(source[x * 3 + 1]),
519 gl::float16ToFloat32(source[x * 3 + 2]));
520 }
521 }
522 }
523 }
524
LoadRGB32FToRGB9E5(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)525 void LoadRGB32FToRGB9E5(size_t width, size_t height, size_t depth,
526 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
527 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
528 {
529 for (size_t z = 0; z < depth; z++)
530 {
531 for (size_t y = 0; y < height; y++)
532 {
533 const float *source = OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
534 uint32_t *dest = OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
535 for (size_t x = 0; x < width; x++)
536 {
537 dest[x] = gl::convertRGBFloatsTo999E5(source[x * 3 + 0], source[x * 3 + 1], source[x * 3 + 2]);
538 }
539 }
540 }
541 }
542
LoadRGB16FToRG11B10F(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)543 void LoadRGB16FToRG11B10F(size_t width, size_t height, size_t depth,
544 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
545 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
546 {
547 for (size_t z = 0; z < depth; z++)
548 {
549 for (size_t y = 0; y < height; y++)
550 {
551 const uint16_t *source = OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
552 uint32_t *dest = OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
553 for (size_t x = 0; x < width; x++)
554 {
555 dest[x] = (gl::float32ToFloat11(gl::float16ToFloat32(source[x * 3 + 0])) << 0) |
556 (gl::float32ToFloat11(gl::float16ToFloat32(source[x * 3 + 1])) << 11) |
557 (gl::float32ToFloat10(gl::float16ToFloat32(source[x * 3 + 2])) << 22);
558 }
559 }
560 }
561 }
562
LoadRGB32FToRG11B10F(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)563 void LoadRGB32FToRG11B10F(size_t width, size_t height, size_t depth,
564 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
565 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
566 {
567 for (size_t z = 0; z < depth; z++)
568 {
569 for (size_t y = 0; y < height; y++)
570 {
571 const float *source = OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
572 uint32_t *dest = OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
573 for (size_t x = 0; x < width; x++)
574 {
575 dest[x] = (gl::float32ToFloat11(source[x * 3 + 0]) << 0) |
576 (gl::float32ToFloat11(source[x * 3 + 1]) << 11) |
577 (gl::float32ToFloat10(source[x * 3 + 2]) << 22);
578 }
579 }
580 }
581 }
582
LoadG8R24ToR24G8(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)583 void LoadG8R24ToR24G8(size_t width, size_t height, size_t depth,
584 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
585 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
586 {
587 for (size_t z = 0; z < depth; z++)
588 {
589 for (size_t y = 0; y < height; y++)
590 {
591 const uint32_t *source = OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
592 uint32_t *dest = OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
593 for (size_t x = 0; x < width; x++)
594 {
595 uint32_t d = source[x] >> 8;
596 uint8_t s = source[x] & 0xFF;
597 dest[x] = d | (s << 24);
598 }
599 }
600 }
601 }
602
LoadRGB32FToRGBA16F(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)603 void LoadRGB32FToRGBA16F(size_t width, size_t height, size_t depth,
604 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
605 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
606 {
607 for (size_t z = 0; z < depth; z++)
608 {
609 for (size_t y = 0; y < height; y++)
610 {
611 const float *source = OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
612 uint16_t *dest = OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
613 for (size_t x = 0; x < width; x++)
614 {
615 dest[x * 4 + 0] = gl::float32ToFloat16(source[x * 3 + 0]);
616 dest[x * 4 + 1] = gl::float32ToFloat16(source[x * 3 + 1]);
617 dest[x * 4 + 2] = gl::float32ToFloat16(source[x * 3 + 2]);
618 dest[x * 4 + 3] = gl::Float16One;
619 }
620 }
621 }
622 }
623
LoadR32ToR16(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)624 void LoadR32ToR16(size_t width, size_t height, size_t depth,
625 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
626 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
627 {
628 for (size_t z = 0; z < depth; z++)
629 {
630 for (size_t y = 0; y < height; y++)
631 {
632 const uint32_t *source = OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
633 uint16_t *dest = OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
634 for (size_t x = 0; x < width; x++)
635 {
636 dest[x] = source[x] >> 16;
637 }
638 }
639 }
640 }
641
LoadR32ToR24G8(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)642 void LoadR32ToR24G8(size_t width, size_t height, size_t depth,
643 const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
644 uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
645 {
646 for (size_t z = 0; z < depth; z++)
647 {
648 for (size_t y = 0; y < height; y++)
649 {
650 const uint32_t *source = OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
651 uint32_t *dest = OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
652
653 for (size_t x = 0; x < width; x++)
654 {
655 dest[x] = source[x] >> 8;
656 }
657 }
658 }
659 }
660
661 }
662