Upstream version 8.37.180.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / src / libGLESv2 / renderer / loadimage.cpp
1 #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
12 namespace rx
13 {
14
15 void 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
39 void 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
57 void 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
81 void 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
105 void 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
123 void 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
147 void 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
171 void 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
194 void 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] = gl::Float16One;
213             }
214         }
215     }
216 }
217
218 void 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
237 void 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
262 void 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
286 void 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
310 void 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
334 void 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
358 void 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
382 void 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
406 void 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
430 void 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
455 void 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
480 void 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
504 void 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
522 void 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
546 void 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
569 void 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
588 void 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
613 void 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
638 void 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 }
662 void 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
687 void 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
705 void 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
723 void 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
741 void 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
759 void 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
785 void 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
809 void 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
831 void 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
855 void 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
879
880 void 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             {
896                 unsigned int d = source[x] >> 8;
897                 unsigned int s = source[x] & 0xFF;
898                 dest[x] = d | (s << 24);
899             }
900         }
901     }
902 }
903
904 void 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
929 void 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
951 }