/************************************************************************** * * Copyright 2009 VMware, Inc. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sub license, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial portions * of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * **************************************************************************/ #include "vg_translate.h" #include "pipe/p_format.h" #include "util/u_pack_color.h" void _vega_pack_rgba_span_float(struct vg_context *ctx, VGuint n, VGfloat rgba[][4], VGImageFormat dstFormat, void *dstAddr) { VGint i; switch (dstFormat) { case VG_sRGBX_8888: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = 255; dst[i] = r << 24 | g << 16 | b << 8 | a; } return; } break; case VG_sRGBA_8888: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = r << 24 | g << 16 | b << 8 | a; } return; } break; case VG_sRGBA_8888_PRE: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = r << 24 | g << 16 | b << 8 | a; } return; } break; case VG_sRGB_565: { VGshort *dst = (VGshort *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); r = (r / 255.0) * 32; g = (g / 255.0) * 32; b = (b / 255.0) * 32; dst[i] = b | g << 5 | r << 11; } return; } break; case VG_sRGBA_5551: { VGshort *dst = (VGshort *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b, a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); r = (r / 255.0) * 32; g = (g / 255.0) * 32; b = (b / 255.0) * 32; a = (a / 255.0); dst[i] = a | b << 1 | g << 6 | r << 11; } return; } break; case VG_sRGBA_4444: { VGshort *dst = (VGshort *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b, a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); r = (r / 255.0) * 16; g = (g / 255.0) * 16; b = (b / 255.0) * 16; a = (a / 255.0) * 16; dst[i] = a | b << 4 | g << 8 | r << 12; } return; } break; case VG_sL_8: { VGubyte *dst = (VGubyte *)dstAddr; for (i = 0; i < n; ++i) { VGubyte a; a = float_to_ubyte(rgba[i][3]); dst[i] = a; } return; } break; case VG_lRGBX_8888: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = 255; dst[i] = r << 24 | g << 16 | b << 8 | a; } return; } break; case VG_lRGBA_8888: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = r << 24 | g << 16 | b << 8 | a; } return; } case VG_lRGBA_8888_PRE: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = r << 24 | g << 16 | b << 8 | a; } return; } break; case VG_lL_8: { VGubyte *dst = (VGubyte *)dstAddr; for (i = 0; i < n; ++i) { VGubyte a; a = float_to_ubyte(rgba[i][3]); dst[i] = a; } return; } break; case VG_A_8: { VGubyte *dst = (VGubyte *)dstAddr; for (i = 0; i < n; ++i) { VGubyte a; a = float_to_ubyte(rgba[i][3]); dst[i] = a; } return; } break; case VG_BW_1: { VGshort *dst = (VGshort *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b, a; VGubyte res; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); res = (r + g + b + a)/4; dst[i] = (res & (128)); } return; } break; #ifdef OPENVG_VERSION_1_1 case VG_A_1: { VGshort *dst = (VGshort *)dstAddr; for (i = 0; i < n; ++i) { VGubyte a; a = float_to_ubyte(rgba[i][3]); dst[i] = (a & (128)); } return; } break; case VG_A_4: { VGshort *dst = (VGshort *)dstAddr; for (i = 0; i < n; ++i) { VGubyte a; VGubyte res; a = float_to_ubyte(rgba[i][3]); res = a/4; dst[i] = (res & (128)); } return; } break; #endif case VG_sXRGB_8888: break; case VG_sARGB_8888: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = a << 24 | r << 16 | g << 8 | b; } return; } break; case VG_sARGB_8888_PRE: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = a << 24 | r << 16 | g << 8 | b; } return; } break; case VG_sARGB_1555: break; case VG_sARGB_4444: break; case VG_lXRGB_8888: break; case VG_lARGB_8888: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = a << 24 | r << 16 | g << 8 | b; } return; } break; case VG_lARGB_8888_PRE: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = a << 24 | r << 16 | g << 8 | b; } return; } break; case VG_sBGRX_8888: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = 0xff; dst[i] = b << 24 | g << 16 | r << 8 | a; } return; } break; case VG_sBGRA_8888: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = b << 24 | g << 16 | r << 8 | a; } return; } break; case VG_sBGRA_8888_PRE: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = b << 24 | g << 16 | r << 8 | a; } return; } break; case VG_sBGR_565: break; case VG_sBGRA_5551: break; case VG_sBGRA_4444: break; case VG_lBGRX_8888: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = 0xff; dst[i] = b << 24 | g << 16 | r << 8 | a; } return; } break; case VG_lBGRA_8888: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = b << 24 | g << 16 | r << 8 | a; } return; } break; case VG_lBGRA_8888_PRE: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = b << 24 | g << 16 | r << 8 | a; } return; } break; case VG_sXBGR_8888: break; case VG_sABGR_8888: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = a << 24 | b << 16 | g << 8 | r; } return; } break; case VG_sABGR_8888_PRE: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = a << 24 | b << 16 | g << 8 | r; } return; } break; case VG_sABGR_1555: break; case VG_sABGR_4444: break; case VG_lXBGR_8888: break; case VG_lABGR_8888: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = a << 24 | b << 16 | g << 8 | r; } return; } break; case VG_lABGR_8888_PRE: { VGint *dst = (VGint *)dstAddr; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = float_to_ubyte(rgba[i][0]); g = float_to_ubyte(rgba[i][1]); b = float_to_ubyte(rgba[i][2]); a = float_to_ubyte(rgba[i][3]); dst[i] = a << 24 | b << 16 | g << 8 | r; } return; } break; default: assert(!"Unknown ReadPixels format"); break; } assert(!"Not implemented ReadPixels format"); } void _vega_unpack_float_span_rgba(struct vg_context *ctx, VGuint n, VGuint offset, const void * data, VGImageFormat dataFormat, VGfloat rgba[][4]) { VGint i; union util_color uc; switch (dataFormat) { case VG_sRGBX_8888: { VGuint *src = (VGuint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = (*src >> 24) & 0xff; g = (*src >> 16) & 0xff; b = (*src >> 8) & 0xff; a = 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } } return; case VG_sRGBA_8888: { VGuint *src = (VGuint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = (*src >> 24) & 0xff; g = (*src >> 16) & 0xff; b = (*src >> 8) & 0xff; a = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; case VG_sRGBA_8888_PRE: { VGint *src = (VGint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = (*src >> 24) & 0xff; g = (*src >> 16) & 0xff; b = (*src >> 8) & 0xff; a = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; case VG_sRGB_565: { VGshort *src = (VGshort *)data; src += offset; for (i = 0; i < n; ++i) { VGfloat clr[4]; clr[0] = ((*src >> 11) & 31)/31.; clr[1] = ((*src >> 5) & 63)/63.; clr[2] = ((*src >> 0) & 31)/31.; clr[3] = 1.f; util_pack_color(clr, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } } return; case VG_sRGBA_5551: { VGshort *src = (VGshort *)data; src += offset; for (i = 0; i < n; ++i) { VGfloat clr[4]; clr[0] = ((*src >> 10) & 31)/31.; clr[1] = ((*src >> 5) & 31)/31.; clr[2] = ((*src >> 1) & 31)/31.; clr[3] = ((*src >> 0) & 1)/1.; util_pack_color(clr, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } } return; case VG_sRGBA_4444: { VGshort *src = (VGshort *)data; src += offset; for (i = 0; i < n; ++i) { VGfloat clr[4]; clr[0] = ((*src >> 12) & 15)/15.; clr[1] = ((*src >> 8) & 15)/15.; clr[2] = ((*src >> 4) & 15)/15.; clr[3] = ((*src >> 0) & 15)/15.; util_pack_color(clr, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } } return; case VG_sL_8: { VGubyte *src = (VGubyte *)data; src += offset; for (i = 0; i < n; ++i) { util_pack_color_ub(0xff, 0xff, 0xff, *src, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } } return; case VG_lRGBX_8888: { VGuint *src = (VGuint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = (*src >> 24) & 0xff; g = (*src >> 16) & 0xff; b = (*src >> 8) & 0xff; a = 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } } return; case VG_lRGBA_8888: { VGint *src = (VGint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = (*src >> 24) & 0xff; g = (*src >> 16) & 0xff; b = (*src >> 8) & 0xff; a = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; case VG_lRGBA_8888_PRE: { VGint *src = (VGint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; r = (*src >> 24) & 0xff; g = (*src >> 16) & 0xff; b = (*src >> 8) & 0xff; a = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; case VG_lL_8: { VGubyte *src = (VGubyte *)data; src += offset; for (i = 0; i < n; ++i) { util_pack_color_ub(0xff, 0xff, 0xff, *src, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } } return; case VG_A_8: { VGubyte *src = (VGubyte *)data; src += offset; for (i = 0; i < n; ++i) { util_pack_color_ub(0xff, 0xff, 0xff, *src, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } } return; case VG_BW_1: { VGubyte *src = (VGubyte *)data; src += offset; for (i = 0; i < n; i += 8) { VGfloat clr[4]; VGint j; for (j = 0; j < 8 && j < n ; ++j) { VGint shift = j; clr[0] = (((*src) & (1<<shift)) >> shift); clr[1] = clr[0]; clr[2] = clr[0]; clr[3] = 1.f; util_pack_color(clr, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i+j][0] = uc.f[0]; rgba[i+j][1] = uc.f[1]; rgba[i+j][2] = uc.f[2]; rgba[i+j][3] = uc.f[3]; } ++src; } } return; #ifdef OPENVG_VERSION_1_1 case VG_A_1: { VGubyte *src = (VGubyte *)data; src += offset; for (i = 0; i < n; i += 8) { VGfloat clr[4]; VGint j; for (j = 0; j < 8 && j < n ; ++j) { VGint shift = j; clr[0] = 0.f; clr[1] = 0.f; clr[2] = 0.f; clr[3] = (((*src) & (1<<shift)) >> shift); util_pack_color(clr, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i+j][0] = uc.f[0]; rgba[i+j][1] = uc.f[1]; rgba[i+j][2] = uc.f[2]; rgba[i+j][3] = uc.f[3]; } ++src; } } return; case VG_A_4: { VGubyte *src = (VGubyte *)data; src += offset/2; for (i = 0; i < n; i += 2) { VGfloat clr[4]; VGint j; for (j = 0; j < n && j < 2; ++j) { VGint bitter, shift; if (j == 0) { bitter = 0x0f; shift = 0; } else { bitter = 0xf0; shift = 4; } clr[0] = 0.f; clr[1] = 0.f; clr[2] = 0.f; clr[3] = ((*src) & (bitter)) >> shift; util_pack_color(clr, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i+j][0] = uc.f[0]; rgba[i+j][1] = uc.f[1]; rgba[i+j][2] = uc.f[2]; rgba[i+j][3] = uc.f[3]; } ++src; } } return; #endif case VG_sXRGB_8888: break; case VG_sARGB_8888: { VGuint *src = (VGuint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; a = (*src >> 24) & 0xff; r = (*src >> 16) & 0xff; g = (*src >> 8) & 0xff; b = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; case VG_sARGB_8888_PRE: { VGuint *src = (VGuint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; a = (*src >> 24) & 0xff; r = (*src >> 16) & 0xff; g = (*src >> 8) & 0xff; b = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; case VG_sARGB_1555: break; case VG_sARGB_4444: break; case VG_lXRGB_8888: break; case VG_lARGB_8888: { VGint *src = (VGint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; a = (*src >> 24) & 0xff; r = (*src >> 16) & 0xff; g = (*src >> 8) & 0xff; b = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; case VG_lARGB_8888_PRE: { VGint *src = (VGint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; a = (*src >> 24) & 0xff; r = (*src >> 16) & 0xff; g = (*src >> 8) & 0xff; b = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; case VG_sBGRX_8888: break; case VG_sBGRA_8888: { VGuint *src = (VGuint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; b = (*src >> 24) & 0xff; g = (*src >> 16) & 0xff; r = (*src >> 8) & 0xff; a = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; case VG_sBGRA_8888_PRE: { VGuint *src = (VGuint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; b = (*src >> 24) & 0xff; g = (*src >> 16) & 0xff; r = (*src >> 8) & 0xff; a = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; case VG_sBGR_565: break; case VG_sBGRA_5551: break; case VG_sBGRA_4444: break; case VG_lBGRX_8888: break; case VG_lBGRA_8888: { VGuint *src = (VGuint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; b = (*src >> 24) & 0xff; g = (*src >> 16) & 0xff; r = (*src >> 8) & 0xff; a = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; case VG_lBGRA_8888_PRE: { VGuint *src = (VGuint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; b = (*src >> 24) & 0xff; g = (*src >> 16) & 0xff; r = (*src >> 8) & 0xff; a = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; case VG_sXBGR_8888: break; case VG_sABGR_8888: { VGuint *src = (VGuint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; a = (*src >> 24) & 0xff; b = (*src >> 16) & 0xff; g = (*src >> 8) & 0xff; r = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; case VG_sABGR_8888_PRE: { VGuint *src = (VGuint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; a = (*src >> 24) & 0xff; b = (*src >> 16) & 0xff; g = (*src >> 8) & 0xff; r = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; case VG_sABGR_1555: break; case VG_sABGR_4444: break; case VG_lXBGR_8888: break; case VG_lABGR_8888: { VGuint *src = (VGuint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; a = (*src >> 24) & 0xff; b = (*src >> 16) & 0xff; g = (*src >> 8) & 0xff; r = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; case VG_lABGR_8888_PRE: { VGuint *src = (VGuint *)data; src += offset; for (i = 0; i < n; ++i) { VGubyte r, g, b ,a; a = (*src >> 24) & 0xff; b = (*src >> 16) & 0xff; g = (*src >> 8) & 0xff; r = (*src >> 0) & 0xff; util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc); rgba[i][0] = uc.f[0]; rgba[i][1] = uc.f[1]; rgba[i][2] = uc.f[2]; rgba[i][3] = uc.f[3]; ++src; } return; } break; default: assert(!"Unknown ReadPixels format"); break; } assert(!"Not implemented ReadPixels format"); } VGint _vega_size_for_format(VGImageFormat dataFormat) { switch (dataFormat) { case VG_sRGBX_8888: case VG_sRGBA_8888: case VG_sRGBA_8888_PRE: return 4; case VG_sRGB_565: case VG_sRGBA_5551: case VG_sRGBA_4444: return 2; case VG_sL_8: return 1; case VG_lRGBX_8888: case VG_lRGBA_8888: case VG_lRGBA_8888_PRE: return 4; case VG_lL_8: return 1; case VG_A_8: return 1; case VG_BW_1: return 1; #ifdef OPENVG_VERSION_1_1 case VG_A_1: break; case VG_A_4: break; #endif case VG_sXRGB_8888: case VG_sARGB_8888: case VG_sARGB_8888_PRE: return 4; case VG_sARGB_1555: case VG_sARGB_4444: return 2; case VG_lXRGB_8888: case VG_lARGB_8888: case VG_lARGB_8888_PRE: case VG_sBGRX_8888: case VG_sBGRA_8888: case VG_sBGRA_8888_PRE: return 4; case VG_sBGR_565: case VG_sBGRA_5551: case VG_sBGRA_4444: return 2; case VG_lBGRX_8888: case VG_lBGRA_8888: case VG_lBGRA_8888_PRE: case VG_sXBGR_8888: case VG_sABGR_8888: case VG_sABGR_8888_PRE: return 4; case VG_sABGR_1555: case VG_sABGR_4444: return 2; case VG_lXBGR_8888: case VG_lABGR_8888: case VG_lABGR_8888_PRE: return 4; default: assert(!"Unknown ReadPixels format"); break; } assert(!"Not implemented ReadPixels format"); return 0; }