blob: a36ce58b3882e638d933ef0b0daa4aa0435a71f2 [file] [log] [blame]
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001#include "precompiled.h"
2//
3// Copyright (c) 0013 The ANGLE Project Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// loadimage.cpp: Defines image loading functions.
9
10#include "libGLESv2/renderer/loadimage.h"
11
12namespace rx
13{
14
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000015void loadAlphaDataToBGRA(int width, int height, int depth,
16 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
17 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
18{
19 const unsigned char *source = NULL;
20 unsigned char *dest = NULL;
21
22 for (int z = 0; z < depth; z++)
23 {
24 for (int y = 0; y < height; y++)
25 {
26 source = offsetDataPointer<unsigned char>(input, y, z, inputRowPitch, inputDepthPitch);
27 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
28 for (int x = 0; x < width; x++)
29 {
30 dest[4 * x + 0] = 0;
31 dest[4 * x + 1] = 0;
32 dest[4 * x + 2] = 0;
33 dest[4 * x + 3] = source[x];
34 }
35 }
36 }
37}
38
39void loadAlphaDataToNative(int width, int height, int depth,
40 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
41 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
42{
43 const unsigned char *source = NULL;
44 unsigned char *dest = NULL;
45
46 for (int z = 0; z < depth; z++)
47 {
48 for (int y = 0; y < height; y++)
49 {
50 source = offsetDataPointer<unsigned char>(input, y, z, inputRowPitch, inputDepthPitch);
51 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
52 memcpy(dest, source, width);
53 }
54 }
55}
56
57void loadAlphaFloatDataToRGBA(int width, int height, int depth,
58 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
59 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
60{
61 const float *source = NULL;
62 float *dest = NULL;
63
64 for (int z = 0; z < depth; z++)
65 {
66 for (int y = 0; y < height; y++)
67 {
68 source = offsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
69 dest = offsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
70 for (int x = 0; x < width; x++)
71 {
72 dest[4 * x + 0] = 0;
73 dest[4 * x + 1] = 0;
74 dest[4 * x + 2] = 0;
75 dest[4 * x + 3] = source[x];
76 }
77 }
78 }
79}
80
81void loadAlphaHalfFloatDataToRGBA(int width, int height, int depth,
82 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
83 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
84{
85 const unsigned short *source = NULL;
86 unsigned short *dest = NULL;
87
88 for (int z = 0; z < depth; z++)
89 {
90 for (int y = 0; y < height; y++)
91 {
92 source = offsetDataPointer<unsigned short>(input, y, z, inputRowPitch, inputDepthPitch);
93 dest = offsetDataPointer<unsigned short>(output, y, z, outputRowPitch, outputDepthPitch);
94 for (int x = 0; x < width; x++)
95 {
96 dest[4 * x + 0] = 0;
97 dest[4 * x + 1] = 0;
98 dest[4 * x + 2] = 0;
99 dest[4 * x + 3] = source[x];
100 }
101 }
102 }
103}
104
105void loadLuminanceDataToNative(int width, int height, int depth,
106 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
107 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
108{
109 const unsigned char *source = NULL;
110 unsigned char *dest = NULL;
111
112 for (int z = 0; z < depth; z++)
113 {
114 for (int y = 0; y < height; y++)
115 {
116 source = offsetDataPointer<unsigned char>(input, y, z, inputRowPitch, inputDepthPitch);
117 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
118 memcpy(dest, source, width);
119 }
120 }
121}
122
123void loadLuminanceDataToBGRA(int width, int height, int depth,
124 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
125 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
126{
127 const unsigned char *source = NULL;
128 unsigned char *dest = NULL;
129
130 for (int z = 0; z < depth; z++)
131 {
132 for (int y = 0; y < height; y++)
133 {
134 source = offsetDataPointer<unsigned char>(input, y, z, inputRowPitch, inputDepthPitch);
135 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
136 for (int x = 0; x < width; x++)
137 {
138 dest[4 * x + 0] = source[x];
139 dest[4 * x + 1] = source[x];
140 dest[4 * x + 2] = source[x];
141 dest[4 * x + 3] = 0xFF;
142 }
143 }
144 }
145}
146
147void loadLuminanceFloatDataToRGBA(int width, int height, int depth,
148 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
149 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
150{
151 const float *source = NULL;
152 float *dest = NULL;
153
154 for (int z = 0; z < depth; z++)
155 {
156 for (int y = 0; y < height; y++)
157 {
158 source = offsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
159 dest = offsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
160 for (int x = 0; x < width; x++)
161 {
162 dest[4 * x + 0] = source[x];
163 dest[4 * x + 1] = source[x];
164 dest[4 * x + 2] = source[x];
165 dest[4 * x + 3] = 1.0f;
166 }
167 }
168 }
169}
170
171void loadLuminanceFloatDataToRGB(int width, int height, int depth,
172 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
173 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
174{
175 const float *source = NULL;
176 float *dest = NULL;
177
178 for (int z = 0; z < depth; z++)
179 {
180 for (int y = 0; y < height; y++)
181 {
182 source = offsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
183 dest = offsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
184 for (int x = 0; x < width; x++)
185 {
186 dest[3 * x + 0] = source[x];
187 dest[3 * x + 1] = source[x];
188 dest[3 * x + 2] = source[x];
189 }
190 }
191 }
192}
193
194void loadLuminanceHalfFloatDataToRGBA(int width, int height, int depth,
195 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
196 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
197{
198 const unsigned short *source = NULL;
199 unsigned short *dest = NULL;
200
201 for (int z = 0; z < depth; z++)
202 {
203 for (int y = 0; y < height; y++)
204 {
205 source = offsetDataPointer<unsigned short>(input, y, z, inputRowPitch, inputDepthPitch);
206 dest = offsetDataPointer<unsigned short>(output, y, z, outputRowPitch, outputDepthPitch);
207 for (int x = 0; x < width; x++)
208 {
209 dest[4 * x + 0] = source[x];
210 dest[4 * x + 1] = source[x];
211 dest[4 * x + 2] = source[x];
212 dest[4 * x + 3] = 0x3C00; // SEEEEEMMMMMMMMMM, S = 0, E = 15, M = 0: 16bit flpt representation of 1
213 }
214 }
215 }
216}
217
218void loadLuminanceAlphaDataToNative(int width, int height, int depth,
219 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
220 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
221{
222 const unsigned char *source = NULL;
223 unsigned char *dest = NULL;
224
225 for (int z = 0; z < depth; z++)
226 {
227 for (int y = 0; y < height; y++)
228 {
229 source = offsetDataPointer<unsigned char>(input, y, z, inputRowPitch, inputDepthPitch);
230 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
231
232 memcpy(dest, source, width * 2);
233 }
234 }
235}
236
237void loadLuminanceAlphaDataToBGRA(int width, int height, int depth,
238 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
239 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
240{
241 const unsigned char *source = NULL;
242 unsigned char *dest = NULL;
243
244 for (int z = 0; z < depth; z++)
245 {
246 for (int y = 0; y < height; y++)
247 {
248 source = offsetDataPointer<unsigned char>(input, y, z, inputRowPitch, inputDepthPitch);
249 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
250
251 for (int x = 0; x < width; x++)
252 {
253 dest[4 * x + 0] = source[2*x+0];
254 dest[4 * x + 1] = source[2*x+0];
255 dest[4 * x + 2] = source[2*x+0];
256 dest[4 * x + 3] = source[2*x+1];
257 }
258 }
259 }
260}
261
262void loadLuminanceAlphaFloatDataToRGBA(int width, int height, int depth,
263 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
264 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
265{
266 const float *source = NULL;
267 float *dest = NULL;
268
269 for (int z = 0; z < depth; z++)
270 {
271 for (int y = 0; y < height; y++)
272 {
273 source = offsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
274 dest = offsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
275 for (int x = 0; x < width; x++)
276 {
277 dest[4 * x + 0] = source[2*x+0];
278 dest[4 * x + 1] = source[2*x+0];
279 dest[4 * x + 2] = source[2*x+0];
280 dest[4 * x + 3] = source[2*x+1];
281 }
282 }
283 }
284}
285
286void loadLuminanceAlphaHalfFloatDataToRGBA(int width, int height, int depth,
287 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
288 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
289{
290 const unsigned short *source = NULL;
291 unsigned short *dest = NULL;
292
293 for (int z = 0; z < depth; z++)
294 {
295 for (int y = 0; y < height; y++)
296 {
297 source = offsetDataPointer<unsigned short>(input, y, z, inputRowPitch, inputDepthPitch);
298 dest = offsetDataPointer<unsigned short>(output, y, z, outputRowPitch, outputDepthPitch);
299 for (int x = 0; x < width; x++)
300 {
301 dest[4 * x + 0] = source[2*x+0];
302 dest[4 * x + 1] = source[2*x+0];
303 dest[4 * x + 2] = source[2*x+0];
304 dest[4 * x + 3] = source[2*x+1];
305 }
306 }
307 }
308}
309
310void loadRGBUByteDataToBGRX(int width, int height, int depth,
311 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
312 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
313{
314 const unsigned char *source = NULL;
315 unsigned char *dest = NULL;
316
317 for (int z = 0; z < depth; z++)
318 {
319 for (int y = 0; y < height; y++)
320 {
321 source = offsetDataPointer<unsigned char>(input, y, z, inputRowPitch, inputDepthPitch);
322 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
323 for (int x = 0; x < width; x++)
324 {
325 dest[4 * x + 0] = source[x * 3 + 2];
326 dest[4 * x + 1] = source[x * 3 + 1];
327 dest[4 * x + 2] = source[x * 3 + 0];
328 dest[4 * x + 3] = 0xFF;
329 }
330 }
331 }
332}
333
Geoff Lang632192d2013-10-04 13:40:46 -0400334void loadRGUByteDataToBGRX(int width, int height, int depth,
335 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
336 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
337{
338 const unsigned char *source = NULL;
339 unsigned char *dest = NULL;
340
341 for (int z = 0; z < depth; z++)
342 {
343 for (int y = 0; y < height; y++)
344 {
345 source = offsetDataPointer<unsigned char>(input, y, z, inputRowPitch, inputDepthPitch);
346 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
347 for (int x = 0; x < width; x++)
348 {
349 dest[4 * x + 0] = 0x00;
350 dest[4 * x + 1] = source[x * 2 + 1];
351 dest[4 * x + 2] = source[x * 2 + 0];
352 dest[4 * x + 3] = 0xFF;
353 }
354 }
355 }
356}
357
358void loadRUByteDataToBGRX(int width, int height, int depth,
359 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
360 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
361{
362 const unsigned char *source = NULL;
363 unsigned char *dest = NULL;
364
365 for (int z = 0; z < depth; z++)
366 {
367 for (int y = 0; y < height; y++)
368 {
369 source = offsetDataPointer<unsigned char>(input, y, z, inputRowPitch, inputDepthPitch);
370 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
371 for (int x = 0; x < width; x++)
372 {
373 dest[4 * x + 0] = 0x00;
374 dest[4 * x + 1] = 0x00;
375 dest[4 * x + 2] = source[x];
376 dest[4 * x + 3] = 0xFF;
377 }
378 }
379 }
380}
381
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000382void loadRGBUByteDataToRGBA(int width, int height, int depth,
383 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
384 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
385{
386 const unsigned char *source = NULL;
387 unsigned char *dest = NULL;
388
389 for (int z = 0; z < depth; z++)
390 {
391 for (int y = 0; y < height; y++)
392 {
393 source = offsetDataPointer<unsigned char>(input, y, z, inputRowPitch, inputDepthPitch);
394 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
395 for (int x = 0; x < width; x++)
396 {
397 dest[4 * x + 0] = source[x * 3 + 0];
398 dest[4 * x + 1] = source[x * 3 + 1];
399 dest[4 * x + 2] = source[x * 3 + 2];
400 dest[4 * x + 3] = 0xFF;
401 }
402 }
403 }
404}
405
shannonwoods@chromium.org36d0be92013-05-30 00:15:59 +0000406void loadRGBSByteDataToRGBA(int width, int height, int depth,
407 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
408 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
409{
410 const char *source = NULL;
411 char *dest = NULL;
412
413 for (int z = 0; z < depth; z++)
414 {
415 for (int y = 0; y < height; y++)
416 {
417 source = offsetDataPointer<char>(input, y, z, inputRowPitch, inputDepthPitch);
418 dest = offsetDataPointer<char>(output, y, z, outputRowPitch, outputDepthPitch);
419 for (int x = 0; x < width; x++)
420 {
421 dest[4 * x + 0] = source[x * 3 + 0];
422 dest[4 * x + 1] = source[x * 3 + 1];
423 dest[4 * x + 2] = source[x * 3 + 2];
424 dest[4 * x + 3] = 0x7F;
425 }
426 }
427 }
428}
429
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000430void loadRGB565DataToBGRA(int width, int height, int depth,
431 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
432 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
433{
434 const unsigned short *source = NULL;
435 unsigned char *dest = NULL;
436
437 for (int z = 0; z < depth; z++)
438 {
439 for (int y = 0; y < height; y++)
440 {
441 source = offsetDataPointer<unsigned short>(input, y, z, inputRowPitch, inputDepthPitch);
442 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
443 for (int x = 0; x < width; x++)
444 {
445 unsigned short rgba = source[x];
446 dest[4 * x + 0] = ((rgba & 0x001F) << 3) | ((rgba & 0x001F) >> 2);
447 dest[4 * x + 1] = ((rgba & 0x07E0) >> 3) | ((rgba & 0x07E0) >> 9);
448 dest[4 * x + 2] = ((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13);
449 dest[4 * x + 3] = 0xFF;
450 }
451 }
452 }
453}
454
455void loadRGB565DataToRGBA(int width, int height, int depth,
456 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
457 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
458{
459 const unsigned short *source = NULL;
460 unsigned char *dest = NULL;
461
462 for (int z = 0; z < depth; z++)
463 {
464 for (int y = 0; y < height; y++)
465 {
466 source = offsetDataPointer<unsigned short>(input, y, z, inputRowPitch, inputDepthPitch);
467 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
468 for (int x = 0; x < width; x++)
469 {
470 unsigned short rgba = source[x];
471 dest[4 * x + 0] = ((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13);
472 dest[4 * x + 1] = ((rgba & 0x07E0) >> 3) | ((rgba & 0x07E0) >> 9);
473 dest[4 * x + 2] = ((rgba & 0x001F) << 3) | ((rgba & 0x001F) >> 2);
474 dest[4 * x + 3] = 0xFF;
475 }
476 }
477 }
478}
479
480void loadRGBFloatDataToRGBA(int width, int height, int depth,
481 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
482 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
483{
484 const float *source = NULL;
485 float *dest = NULL;
486
487 for (int z = 0; z < depth; z++)
488 {
489 for (int y = 0; y < height; y++)
490 {
491 source = offsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
492 dest = offsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
493 for (int x = 0; x < width; x++)
494 {
495 dest[4 * x + 0] = source[x * 3 + 0];
496 dest[4 * x + 1] = source[x * 3 + 1];
497 dest[4 * x + 2] = source[x * 3 + 2];
498 dest[4 * x + 3] = 1.0f;
499 }
500 }
501 }
502}
503
504void loadRGBFloatDataToNative(int width, int height, int depth,
505 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
506 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
507{
508 const float *source = NULL;
509 float *dest = NULL;
510
511 for (int z = 0; z < depth; z++)
512 {
513 for (int y = 0; y < height; y++)
514 {
515 source = offsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
516 dest = offsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
517 memcpy(dest, source, width * 12);
518 }
519 }
520}
521
522void loadRGBHalfFloatDataToRGBA(int width, int height, int depth,
523 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
524 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
525{
526 const unsigned short *source = NULL;
527 unsigned short *dest = NULL;
528
529 for (int z = 0; z < depth; z++)
530 {
531 for (int y = 0; y < height; y++)
532 {
533 source = offsetDataPointer<unsigned short>(input, y, z, inputRowPitch, inputDepthPitch);
534 dest = offsetDataPointer<unsigned short>(output, y, z, outputRowPitch, outputDepthPitch);
535 for (int x = 0; x < width; x++)
536 {
537 dest[4 * x + 0] = source[x * 3 + 0];
538 dest[4 * x + 1] = source[x * 3 + 1];
539 dest[4 * x + 2] = source[x * 3 + 2];
540 dest[4 * x + 3] = 0x3C00; // SEEEEEMMMMMMMMMM, S = 0, E = 15, M = 0: 16bit flpt representation of 1
541 }
542 }
543 }
544}
545
546void loadRGBAUByteDataToBGRA(int width, int height, int depth,
547 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
548 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
549{
550 const unsigned int *source = NULL;
551 unsigned int *dest = NULL;
552
553 for (int z = 0; z < depth; z++)
554 {
555 for (int y = 0; y < height; y++)
556 {
557 source = offsetDataPointer<unsigned int>(input, y, z, inputRowPitch, inputDepthPitch);
558 dest = offsetDataPointer<unsigned int>(output, y, z, outputRowPitch, outputDepthPitch);
559
560 for (int x = 0; x < width; x++)
561 {
562 unsigned int rgba = source[x];
563 dest[x] = (_rotl(rgba, 16) & 0x00ff00ff) | (rgba & 0xff00ff00);
564 }
565 }
566 }
567}
568
569void loadRGBAUByteDataToNative(int width, int height, int depth,
570 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
571 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
572{
573 const unsigned int *source = NULL;
574 unsigned int *dest = NULL;
575
576 for (int z = 0; z < depth; z++)
577 {
578 for (int y = 0; y < height; y++)
579 {
580 source = offsetDataPointer<unsigned int>(input, y, z, inputRowPitch, inputDepthPitch);
581 dest = offsetDataPointer<unsigned int>(output, y, z, outputRowPitch, outputDepthPitch);
582
583 memcpy(dest, source, width * 4);
584 }
585 }
586}
587
588void loadRGBA4444DataToBGRA(int width, int height, int depth,
589 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
590 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
591{
592 const unsigned short *source = NULL;
593 unsigned char *dest = NULL;
594
595 for (int z = 0; z < depth; z++)
596 {
597 for (int y = 0; y < height; y++)
598 {
599 source = offsetDataPointer<unsigned short>(input, y, z, inputRowPitch, inputDepthPitch);
600 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
601 for (int x = 0; x < width; x++)
602 {
603 unsigned short rgba = source[x];
604 dest[4 * x + 0] = ((rgba & 0x00F0) << 0) | ((rgba & 0x00F0) >> 4);
605 dest[4 * x + 1] = ((rgba & 0x0F00) >> 4) | ((rgba & 0x0F00) >> 8);
606 dest[4 * x + 2] = ((rgba & 0xF000) >> 8) | ((rgba & 0xF000) >> 12);
607 dest[4 * x + 3] = ((rgba & 0x000F) << 4) | ((rgba & 0x000F) >> 0);
608 }
609 }
610 }
611}
612
613void loadRGBA4444DataToRGBA(int width, int height, int depth,
614 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
615 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
616{
617 const unsigned short *source = NULL;
618 unsigned char *dest = NULL;
619
620 for (int z = 0; z < depth; z++)
621 {
622 for (int y = 0; y < height; y++)
623 {
624 source = offsetDataPointer<unsigned short>(input, y, z, inputRowPitch, inputDepthPitch);
625 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
626 for (int x = 0; x < width; x++)
627 {
628 unsigned short rgba = source[x];
629 dest[4 * x + 0] = ((rgba & 0xF000) >> 8) | ((rgba & 0xF000) >> 12);
630 dest[4 * x + 1] = ((rgba & 0x0F00) >> 4) | ((rgba & 0x0F00) >> 8);
631 dest[4 * x + 2] = ((rgba & 0x00F0) << 0) | ((rgba & 0x00F0) >> 4);
632 dest[4 * x + 3] = ((rgba & 0x000F) << 4) | ((rgba & 0x000F) >> 0);
633 }
634 }
635 }
636}
637
638void loadRGBA5551DataToBGRA(int width, int height, int depth,
639 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
640 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
641{
642 const unsigned short *source = NULL;
643 unsigned char *dest = NULL;
644
645 for (int z = 0; z < depth; z++)
646 {
647 for (int y = 0; y < height; y++)
648 {
649 source = offsetDataPointer<unsigned short>(input, y, z, inputRowPitch, inputDepthPitch);
650 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
651 for (int x = 0; x < width; x++)
652 {
653 unsigned short rgba = source[x];
654 dest[4 * x + 0] = ((rgba & 0x003E) << 2) | ((rgba & 0x003E) >> 3);
655 dest[4 * x + 1] = ((rgba & 0x07C0) >> 3) | ((rgba & 0x07C0) >> 8);
656 dest[4 * x + 2] = ((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13);
657 dest[4 * x + 3] = (rgba & 0x0001) ? 0xFF : 0;
658 }
659 }
660 }
661}
662void loadRGBA5551DataToRGBA(int width, int height, int depth,
663 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
664 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
665{
666 const unsigned short *source = NULL;
667 unsigned char *dest = NULL;
668
669 for (int z = 0; z < depth; z++)
670 {
671 for (int y = 0; y < height; y++)
672 {
673 source = offsetDataPointer<unsigned short>(input, y, z, inputRowPitch, inputDepthPitch);
674 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
675 for (int x = 0; x < width; x++)
676 {
677 unsigned short rgba = source[x];
678 dest[4 * x + 0] = ((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13);
679 dest[4 * x + 1] = ((rgba & 0x07C0) >> 3) | ((rgba & 0x07C0) >> 8);
680 dest[4 * x + 2] = ((rgba & 0x003E) << 2) | ((rgba & 0x003E) >> 3);
681 dest[4 * x + 3] = (rgba & 0x0001) ? 0xFF : 0;
682 }
683 }
684 }
685}
686
687void loadRGBAFloatDataToRGBA(int width, int height, int depth,
688 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
689 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
690{
691 const float *source = NULL;
692 float *dest = NULL;
693
694 for (int z = 0; z < depth; z++)
695 {
696 for (int y = 0; y < height; y++)
697 {
698 source = offsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
699 dest = offsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
700 memcpy(dest, source, width * 16);
701 }
702 }
703}
704
705void loadRGBAHalfFloatDataToRGBA(int width, int height, int depth,
706 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
707 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
708{
709 const unsigned char *source = NULL;
710 unsigned char *dest = NULL;
711
712 for (int z = 0; z < depth; z++)
713 {
714 for (int y = 0; y < height; y++)
715 {
716 source = offsetDataPointer<unsigned char>(input, y, z, inputRowPitch, inputDepthPitch);
717 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
718 memcpy(dest, source, width * 8);
719 }
720 }
721}
722
723void loadBGRADataToBGRA(int width, int height, int depth,
724 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
725 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
726{
727 const unsigned char *source = NULL;
728 unsigned char *dest = NULL;
729
730 for (int z = 0; z < depth; z++)
731 {
732 for (int y = 0; y < height; y++)
733 {
734 source = offsetDataPointer<unsigned char>(input, y, z, inputRowPitch, inputDepthPitch);
735 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
736 memcpy(dest, source, width*4);
737 }
738 }
739}
740
shannonwoods@chromium.org5d4468e2013-05-30 00:13:56 +0000741void loadRGBA2101010ToNative(int width, int height, int depth,
742 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
743 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
744{
745 const unsigned int *source = NULL;
746 unsigned int *dest = NULL;
747
748 for (int z = 0; z < depth; z++)
749 {
750 for (int y = 0; y < height; y++)
751 {
752 source = offsetDataPointer<unsigned int>(input, y, z, inputRowPitch, inputDepthPitch);
753 dest = offsetDataPointer<unsigned int>(output, y, z, outputRowPitch, outputDepthPitch);
754 memcpy(dest, source, width * sizeof(unsigned int));
755 }
756 }
757}
758
759void loadRGBA2101010ToRGBA(int width, int height, int depth,
760 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
761 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
762{
763 const unsigned int *source = NULL;
764 unsigned char *dest = NULL;
765
766 for (int z = 0; z < depth; z++)
767 {
768 for (int y = 0; y < height; y++)
769 {
770 source = offsetDataPointer<unsigned int>(input, y, z, inputRowPitch, inputDepthPitch);
771 dest = offsetDataPointer<unsigned char>(output, y, z, outputRowPitch, outputDepthPitch);
772
773 for (int x = 0; x < width; x++)
774 {
775 unsigned int rgba = source[x];
776 dest[4 * x + 0] = (rgba & 0x000003FF) >> 2;
777 dest[4 * x + 1] = (rgba & 0x000FFC00) >> 12;
778 dest[4 * x + 2] = (rgba & 0x3FF00000) >> 22;
779 dest[4 * x + 3] = ((rgba & 0xC0000000) >> 30) * 0x55;
780 }
781 }
782 }
783}
784
shannonwoods@chromium.org92b9cd52013-05-30 00:14:48 +0000785void loadRGBHalfFloatDataTo999E5(int width, int height, int depth,
786 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
787 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
788{
789 const unsigned short *source = NULL;
790 unsigned int *dest = NULL;
791
792 for (int z = 0; z < depth; z++)
793 {
794 for (int y = 0; y < height; y++)
795 {
796 source = offsetDataPointer<unsigned short>(input, y, z, inputRowPitch, inputDepthPitch);
797 dest = offsetDataPointer<unsigned int>(output, y, z, outputRowPitch, outputDepthPitch);
798
799 for (int x = 0; x < width; x++)
800 {
801 dest[x] = gl::convertRGBFloatsTo999E5(gl::float16ToFloat32(source[x * 3 + 0]),
802 gl::float16ToFloat32(source[x * 3 + 1]),
803 gl::float16ToFloat32(source[x * 3 + 2]));
804 }
805 }
806 }
807}
808
809void loadRGBFloatDataTo999E5(int width, int height, int depth,
810 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
811 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
812{
813 const float *source = NULL;
814 unsigned int *dest = NULL;
815
816 for (int z = 0; z < depth; z++)
817 {
818 for (int y = 0; y < height; y++)
819 {
820 source = offsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
821 dest = offsetDataPointer<unsigned int>(output, y, z, outputRowPitch, outputDepthPitch);
822
823 for (int x = 0; x < width; x++)
824 {
825 dest[x] = gl::convertRGBFloatsTo999E5(source[x * 3 + 0], source[x * 3 + 1], source[x * 3 + 2]);
826 }
827 }
828 }
829}
830
shannonwoods@chromium.orga43d8292013-05-30 00:15:50 +0000831void loadRGBHalfFloatDataTo111110Float(int width, int height, int depth,
832 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
833 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
834{
835 const unsigned short *source = NULL;
836 unsigned int *dest = NULL;
837
838 for (int z = 0; z < depth; z++)
839 {
840 for (int y = 0; y < height; y++)
841 {
842 source = offsetDataPointer<unsigned short>(input, y, z, inputRowPitch, inputDepthPitch);
843 dest = offsetDataPointer<unsigned int>(output, y, z, outputRowPitch, outputDepthPitch);
844
845 for (int x = 0; x < width; x++)
846 {
847 dest[x] = (gl::float32ToFloat11(gl::float16ToFloat32(source[x * 3 + 0])) << 0) |
848 (gl::float32ToFloat11(gl::float16ToFloat32(source[x * 3 + 1])) << 11) |
849 (gl::float32ToFloat10(gl::float16ToFloat32(source[x * 3 + 2])) << 22);
850 }
851 }
852 }
853}
854
855void loadRGBFloatDataTo111110Float(int width, int height, int depth,
856 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
857 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
858{
859 const float *source = NULL;
860 unsigned int *dest = NULL;
861
862 for (int z = 0; z < depth; z++)
863 {
864 for (int y = 0; y < height; y++)
865 {
866 source = offsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
867 dest = offsetDataPointer<unsigned int>(output, y, z, outputRowPitch, outputDepthPitch);
868
869 for (int x = 0; x < width; x++)
870 {
871 dest[x] = (gl::float32ToFloat11(source[x * 3 + 0]) << 0) |
872 (gl::float32ToFloat11(source[x * 3 + 1]) << 11) |
873 (gl::float32ToFloat10(source[x * 3 + 2]) << 22);
874 }
875 }
876 }
877}
878
Geoff Lang4133f5c2013-10-10 13:51:18 -0400879
880void loadG8R24DataToR24G8(int width, int height, int depth,
881 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
882 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
883{
884 const unsigned int *source = NULL;
885 unsigned int *dest = NULL;
886
887 for (int z = 0; z < depth; z++)
888 {
889 for (int y = 0; y < height; y++)
890 {
891 source = offsetDataPointer<const unsigned int>(input, y, z, inputRowPitch, inputDepthPitch);
892 dest = offsetDataPointer<unsigned int>(output, y, z, outputRowPitch, outputDepthPitch);
893
894 for (int x = 0; x < width; x++)
895 {
Geoff Lang5c9a29a2014-02-11 10:26:24 -0500896 unsigned int d = source[x] >> 8;
897 unsigned int s = source[x] & 0xFF;
898 dest[x] = d | (s << 24);
Geoff Lang4133f5c2013-10-10 13:51:18 -0400899 }
900 }
901 }
902}
903
shannonwoods@chromium.orgde7e6a22013-05-30 00:16:46 +0000904void loadFloatRGBDataToHalfFloatRGBA(int width, int height, int depth,
905 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
906 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
907{
908 const float *source = NULL;
909 unsigned short *dest = NULL;
910
911 for (int z = 0; z < depth; z++)
912 {
913 for (int y = 0; y < height; y++)
914 {
915 source = offsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
916 dest = offsetDataPointer<unsigned short>(output, y, z, outputRowPitch, outputDepthPitch);
917
918 for (int x = 0; x < width; x++)
919 {
920 dest[x * 4 + 0] = gl::float32ToFloat16(source[x * 3 + 0]);
921 dest[x * 4 + 1] = gl::float32ToFloat16(source[x * 3 + 1]);
922 dest[x * 4 + 2] = gl::float32ToFloat16(source[x * 3 + 2]);
923 dest[x * 4 + 3] = gl::Float16One;
924 }
925 }
926 }
927}
928
Geoff Lang87465462013-06-17 16:28:54 -0400929void loadUintDataToUshort(int width, int height, int depth,
930 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
931 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
932{
933 const unsigned int *source = NULL;
934 unsigned short *dest = NULL;
935
936 for (int z = 0; z < depth; z++)
937 {
938 for (int y = 0; y < height; y++)
939 {
940 source = offsetDataPointer<unsigned int>(input, y, z, inputRowPitch, inputDepthPitch);
941 dest = offsetDataPointer<unsigned short>(output, y, z, outputRowPitch, outputDepthPitch);
942
943 for (int x = 0; x < width; x++)
944 {
945 dest[x] = source[x] >> 16;
946 }
947 }
948 }
949}
950
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000951}