4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
7 * Stanislav Vorobiov <s.vorobiov@samsung.com>
8 * Jinhyung Jo <jinhyung.jo@samsung.com>
9 * YeongKyoon Lee <yeongkyoon.lee@samsung.com>
11 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this software and associated documentation files (the "Software"), to deal
13 * in the Software without restriction, including without limitation the rights
14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 * copies of the Software, and to permit persons to whom the Software is
16 * furnished to do so, subject to the following conditions:
18 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
36 #include "yagl_gles_pixel_formats.h"
39 * We can't include GLES2/gl2ext.h here
41 #define GL_HALF_FLOAT_OES 0x8D61
46 #define YAGL_HALF_FLOAT_1_0 0x3C00
48 static void yagl_convert_alpha_ub_bgra_ub(const GLvoid *src,
57 for (i = 0; i < height; ++i) {
58 for (j = 0; j < width; ++j) {
59 *(uint32_t*)(dst + j * 4) = ((uint32_t)(*(uint8_t*)(src + j)) << 24);
66 static void yagl_convert_bgra_ub_alpha_ub(const GLvoid *src,
75 for (i = 0; i < height; ++i) {
76 for (j = 0; j < width; ++j) {
77 *(uint8_t*)(dst + j) = *(uint32_t*)(src + j * 4) >> 24;
84 static void yagl_convert_alpha_f_bgra_f(const GLvoid *src,
93 for (i = 0; i < height; ++i) {
94 for (j = 0; j < width; ++j) {
95 *(GLfloat*)(dst + j * 16 + 0) = 0.0f;
96 *(GLfloat*)(dst + j * 16 + 4) = 0.0f;
97 *(GLfloat*)(dst + j * 16 + 8) = 0.0f;
98 *(uint32_t*)(dst + j * 16 + 12) = *(uint32_t*)(src + j * 4);
105 static void yagl_convert_bgra_f_alpha_f(const GLvoid *src,
114 for (i = 0; i < height; ++i) {
115 for (j = 0; j < width; ++j) {
116 *(uint32_t*)(dst + j * 4) = *(uint32_t*)(src + j * 16 + 12);
123 static void yagl_convert_alpha_hf_bgra_hf(const GLvoid *src,
132 for (i = 0; i < height; ++i) {
133 for (j = 0; j < width; ++j) {
134 *(uint16_t*)(dst + j * 8 + 0) = 0;
135 *(uint16_t*)(dst + j * 8 + 2) = 0;
136 *(uint16_t*)(dst + j * 8 + 4) = 0;
137 *(uint16_t*)(dst + j * 8 + 6) = *(uint16_t*)(src + j * 2);
144 static void yagl_convert_bgra_hf_alpha_hf(const GLvoid *src,
153 for (i = 0; i < height; ++i) {
154 for (j = 0; j < width; ++j) {
155 *(uint16_t*)(dst + j * 2) = *(uint16_t*)(src + j * 8 + 6);
162 static void yagl_convert_luminance_ub_bgra_ub(const GLvoid *src,
171 for (i = 0; i < height; ++i) {
172 for (j = 0; j < width; ++j) {
173 uint32_t l = *(uint8_t*)(src + j);
174 *(uint32_t*)(dst + j * 4) = (l << 0) |
184 static void yagl_convert_bgra_ub_luminance_ub(const GLvoid *src,
193 for (i = 0; i < height; ++i) {
194 for (j = 0; j < width; ++j) {
195 *(uint8_t*)(dst + j) = *(uint32_t*)(src + j * 4) & 0xFF;
202 static void yagl_convert_luminance_f_bgra_f(const GLvoid *src,
211 for (i = 0; i < height; ++i) {
212 for (j = 0; j < width; ++j) {
213 uint32_t l = *(uint32_t*)(src + j * 4);
214 *(uint32_t*)(dst + j * 16 + 0) = l;
215 *(uint32_t*)(dst + j * 16 + 4) = l;
216 *(uint32_t*)(dst + j * 16 + 8) = l;
217 *(GLfloat*)(dst + j * 16 + 12) = 1.0f;
224 static void yagl_convert_bgra_f_luminance_f(const GLvoid *src,
233 for (i = 0; i < height; ++i) {
234 for (j = 0; j < width; ++j) {
235 *(uint32_t*)(dst + j * 4) = *(uint32_t*)(src + j * 16);
242 static void yagl_convert_luminance_hf_bgra_hf(const GLvoid *src,
251 for (i = 0; i < height; ++i) {
252 for (j = 0; j < width; ++j) {
253 uint16_t l = *(uint16_t*)(src + j * 2);
254 *(uint16_t*)(dst + j * 8 + 0) = l;
255 *(uint16_t*)(dst + j * 8 + 2) = l;
256 *(uint16_t*)(dst + j * 8 + 4) = l;
257 *(uint16_t*)(dst + j * 8 + 6) = YAGL_HALF_FLOAT_1_0;
264 static void yagl_convert_bgra_hf_luminance_hf(const GLvoid *src,
273 for (i = 0; i < height; ++i) {
274 for (j = 0; j < width; ++j) {
275 *(uint16_t*)(dst + j * 2) = *(uint16_t*)(src + j * 8);
282 static void yagl_convert_luminance_alpha_ub_bgra_ub(const GLvoid *src,
291 for (i = 0; i < height; ++i) {
292 for (j = 0; j < width; ++j) {
293 uint32_t l = *(uint8_t*)(src + j * 2 + 0);
294 uint32_t a = *(uint8_t*)(src + j * 2 + 1);
295 *(uint32_t*)(dst + j * 4) = (l << 0) |
305 static void yagl_convert_bgra_ub_luminance_alpha_ub(const GLvoid *src,
314 for (i = 0; i < height; ++i) {
315 for (j = 0; j < width; ++j) {
316 *(uint8_t*)(dst + j * 2 + 0) = *(uint32_t*)(src + j * 4) & 0xFF;
317 *(uint8_t*)(dst + j * 2 + 1) = *(uint32_t*)(src + j * 4) >> 24;
324 static void yagl_convert_luminance_alpha_f_bgra_f(const GLvoid *src,
333 for (i = 0; i < height; ++i) {
334 for (j = 0; j < width; ++j) {
335 uint32_t l = *(uint32_t*)(src + j * 8 + 0);
336 uint32_t a = *(uint32_t*)(src + j * 8 + 4);
337 *(uint32_t*)(dst + j * 16 + 0) = l;
338 *(uint32_t*)(dst + j * 16 + 4) = l;
339 *(uint32_t*)(dst + j * 16 + 8) = l;
340 *(uint32_t*)(dst + j * 16 + 12) = a;
347 static void yagl_convert_bgra_f_luminance_alpha_f(const GLvoid *src,
356 for (i = 0; i < height; ++i) {
357 for (j = 0; j < width; ++j) {
358 *(uint32_t*)(dst + j * 8 + 0) = *(uint32_t*)(src + j * 16);
359 *(uint32_t*)(dst + j * 8 + 4) = *(uint32_t*)(src + j * 16 + 12);
366 static void yagl_convert_luminance_alpha_hf_bgra_hf(const GLvoid *src,
375 for (i = 0; i < height; ++i) {
376 for (j = 0; j < width; ++j) {
377 uint16_t l = *(uint16_t*)(src + j * 4 + 0);
378 uint16_t a = *(uint16_t*)(src + j * 4 + 2);
379 *(uint16_t*)(dst + j * 8 + 0) = l;
380 *(uint16_t*)(dst + j * 8 + 2) = l;
381 *(uint16_t*)(dst + j * 8 + 4) = l;
382 *(uint16_t*)(dst + j * 8 + 6) = a;
389 static void yagl_convert_bgra_hf_luminance_alpha_hf(const GLvoid *src,
398 for (i = 0; i < height; ++i) {
399 for (j = 0; j < width; ++j) {
400 *(uint16_t*)(dst + j * 4 + 0) = *(uint16_t*)(src + j * 8);
401 *(uint16_t*)(dst + j * 4 + 2) = *(uint16_t*)(src + j * 8 + 6);
408 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles_gl2, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GL_ALPHA, GL_UNSIGNED_BYTE, 1);
409 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles_gl2, GL_ALPHA, GL_ALPHA, GL_FLOAT, GL_ALPHA32F_ARB, GL_FLOAT, 4);
410 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles_gl2, GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT, GL_ALPHA, GL_HALF_FLOAT, 2);
411 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles_gl2, GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES, GL_ALPHA, GL_HALF_FLOAT, 2);
413 YAGL_PIXEL_FORMAT_IMPL_BEGIN(gles_gl3, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE)
415 .dst_internalformat = GL_RGBA,
416 .dst_format = GL_BGRA,
417 .dst_type = GL_UNSIGNED_BYTE,
419 .unpack = &yagl_convert_alpha_ub_bgra_ub,
420 .pack = &yagl_convert_bgra_ub_alpha_ub
421 YAGL_PIXEL_FORMAT_IMPL_END()
423 YAGL_PIXEL_FORMAT_IMPL_BEGIN(gles_gl3, GL_ALPHA, GL_ALPHA, GL_FLOAT)
425 .dst_internalformat = GL_RGBA,
426 .dst_format = GL_BGRA,
427 .dst_type = GL_FLOAT,
429 .unpack = &yagl_convert_alpha_f_bgra_f,
430 .pack = &yagl_convert_bgra_f_alpha_f
431 YAGL_PIXEL_FORMAT_IMPL_END()
433 YAGL_PIXEL_FORMAT_IMPL_BEGIN(gles_gl3, GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT)
435 .dst_internalformat = GL_RGBA,
436 .dst_format = GL_BGRA,
437 .dst_type = GL_HALF_FLOAT,
439 .unpack = &yagl_convert_alpha_hf_bgra_hf,
440 .pack = &yagl_convert_bgra_hf_alpha_hf
441 YAGL_PIXEL_FORMAT_IMPL_END()
443 YAGL_PIXEL_FORMAT_IMPL_BEGIN(gles_gl3, GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES)
445 .dst_internalformat = GL_RGBA,
446 .dst_format = GL_BGRA,
447 .dst_type = GL_HALF_FLOAT,
449 .unpack = &yagl_convert_alpha_hf_bgra_hf,
450 .pack = &yagl_convert_bgra_hf_alpha_hf
451 YAGL_PIXEL_FORMAT_IMPL_END()
453 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_RGB, GL_RGB, GL_UNSIGNED_BYTE, GL_RGB, GL_UNSIGNED_BYTE, 3);
454 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 2);
455 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_RGB, GL_RGB, GL_FLOAT, GL_RGB32F, GL_FLOAT, 12);
456 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_RGB, GL_RGB, GL_HALF_FLOAT, GL_RGB, GL_HALF_FLOAT, 6);
457 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_RGB, GL_RGB, GL_HALF_FLOAT_OES, GL_RGB, GL_HALF_FLOAT, 6);
458 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA, GL_UNSIGNED_BYTE, 4);
459 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 2);
460 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, 2);
461 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_RGBA, GL_RGBA, GL_FLOAT, GL_RGBA32F, GL_FLOAT, 16);
462 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_RGBA, GL_RGBA, GL_HALF_FLOAT, GL_RGBA, GL_HALF_FLOAT, 8);
463 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_RGBA, GL_RGBA, GL_HALF_FLOAT_OES, GL_RGBA, GL_HALF_FLOAT, 8);
464 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_BGRA, GL_BGRA, GL_UNSIGNED_BYTE, GL_RGBA, GL_UNSIGNED_BYTE, 4);
465 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_BGRA, GL_BGRA, GL_FLOAT, GL_RGBA32F, GL_FLOAT, 16);
466 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_BGRA, GL_BGRA, GL_HALF_FLOAT, GL_RGBA, GL_HALF_FLOAT, 8);
467 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_BGRA, GL_BGRA, GL_HALF_FLOAT_OES, GL_RGBA, GL_HALF_FLOAT, 8);
468 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles_gl2, GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_LUMINANCE, GL_UNSIGNED_BYTE, 1);
469 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles_gl2, GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT, GL_LUMINANCE32F_ARB, GL_FLOAT, 4);
470 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles_gl2, GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT, GL_LUMINANCE, GL_HALF_FLOAT, 2);
471 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles_gl2, GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES, GL_LUMINANCE, GL_HALF_FLOAT, 2);
472 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles_gl2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 2);
473 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles_gl2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT, GL_LUMINANCE_ALPHA32F_ARB, GL_FLOAT, 8);
474 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles_gl2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT, 4);
475 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles_gl2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT, 4);
477 YAGL_PIXEL_FORMAT_IMPL_BEGIN(gles_gl3, GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE)
479 .dst_internalformat = GL_RGBA,
480 .dst_format = GL_BGRA,
481 .dst_type = GL_UNSIGNED_BYTE,
483 .unpack = &yagl_convert_luminance_ub_bgra_ub,
484 .pack = &yagl_convert_bgra_ub_luminance_ub
485 YAGL_PIXEL_FORMAT_IMPL_END()
487 YAGL_PIXEL_FORMAT_IMPL_BEGIN(gles_gl3, GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT)
489 .dst_internalformat = GL_RGBA,
490 .dst_format = GL_BGRA,
491 .dst_type = GL_FLOAT,
493 .unpack = &yagl_convert_luminance_f_bgra_f,
494 .pack = &yagl_convert_bgra_f_luminance_f
495 YAGL_PIXEL_FORMAT_IMPL_END()
497 YAGL_PIXEL_FORMAT_IMPL_BEGIN(gles_gl3, GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT)
499 .dst_internalformat = GL_RGBA,
500 .dst_format = GL_BGRA,
501 .dst_type = GL_HALF_FLOAT,
503 .unpack = &yagl_convert_luminance_hf_bgra_hf,
504 .pack = &yagl_convert_bgra_hf_luminance_hf
505 YAGL_PIXEL_FORMAT_IMPL_END()
507 YAGL_PIXEL_FORMAT_IMPL_BEGIN(gles_gl3, GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES)
509 .dst_internalformat = GL_RGBA,
510 .dst_format = GL_BGRA,
511 .dst_type = GL_HALF_FLOAT,
513 .unpack = &yagl_convert_luminance_hf_bgra_hf,
514 .pack = &yagl_convert_bgra_hf_luminance_hf
515 YAGL_PIXEL_FORMAT_IMPL_END()
517 YAGL_PIXEL_FORMAT_IMPL_BEGIN(gles_gl3, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE)
519 .dst_internalformat = GL_RGBA,
520 .dst_format = GL_BGRA,
521 .dst_type = GL_UNSIGNED_BYTE,
523 .unpack = &yagl_convert_luminance_alpha_ub_bgra_ub,
524 .pack = &yagl_convert_bgra_ub_luminance_alpha_ub
525 YAGL_PIXEL_FORMAT_IMPL_END()
527 YAGL_PIXEL_FORMAT_IMPL_BEGIN(gles_gl3, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT)
529 .dst_internalformat = GL_RGBA,
530 .dst_format = GL_BGRA,
531 .dst_type = GL_FLOAT,
533 .unpack = &yagl_convert_luminance_alpha_f_bgra_f,
534 .pack = &yagl_convert_bgra_f_luminance_alpha_f
535 YAGL_PIXEL_FORMAT_IMPL_END()
537 YAGL_PIXEL_FORMAT_IMPL_BEGIN(gles_gl3, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT)
539 .dst_internalformat = GL_RGBA,
540 .dst_format = GL_BGRA,
541 .dst_type = GL_HALF_FLOAT,
543 .unpack = &yagl_convert_luminance_alpha_hf_bgra_hf,
544 .pack = &yagl_convert_bgra_hf_luminance_alpha_hf
545 YAGL_PIXEL_FORMAT_IMPL_END()
547 YAGL_PIXEL_FORMAT_IMPL_BEGIN(gles_gl3, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES)
549 .dst_internalformat = GL_RGBA,
550 .dst_format = GL_BGRA,
551 .dst_type = GL_HALF_FLOAT,
553 .unpack = &yagl_convert_luminance_alpha_hf_bgra_hf,
554 .pack = &yagl_convert_bgra_hf_luminance_alpha_hf
555 YAGL_PIXEL_FORMAT_IMPL_END()
557 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 2);
558 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 4);
559 YAGL_PIXEL_FORMAT_IMPL_NOCONV(gles, GL_DEPTH_STENCIL, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 4);