blob: 7b3df277c3b93cf78a816740be75e914e095e2d6 [file] [log] [blame]
/**************************************************************************
*
* 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;
}