api_images.c revision d35ecca5ee231c072687578642e0c22c6c0590b1
1544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin/************************************************************************** 2544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 3544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * Copyright 2009 VMware, Inc. All Rights Reserved. 4544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 5544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * Permission is hereby granted, free of charge, to any person obtaining a 6544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * copy of this software and associated documentation files (the 7544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * "Software"), to deal in the Software without restriction, including 8544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * without limitation the rights to use, copy, modify, merge, publish, 9544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * distribute, sub license, and/or sell copies of the Software, and to 10544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * permit persons to whom the Software is furnished to do so, subject to 11544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * the following conditions: 12544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 13544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * The above copyright notice and this permission notice (including the 14544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * next paragraph) shall be included in all copies or substantial portions 15544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * of the Software. 16544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 17544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 21544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 25544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin **************************************************************************/ 26544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 27544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "image.h" 28544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 29544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "VG/openvg.h" 30544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 31544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "vg_context.h" 32544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "vg_translate.h" 33544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "api_consts.h" 34544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "image.h" 35544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 36544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_context.h" 37544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_screen.h" 3828486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 39544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_blit.h" 40544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_tile.h" 41544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_memory.h" 42544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 43544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic INLINE VGboolean supported_image_format(VGImageFormat format) 44544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 45544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin switch(format) { 46544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sRGBX_8888: 47544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sRGBA_8888: 48544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sRGBA_8888_PRE: 49544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sRGB_565: 50544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sRGBA_5551: 51544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sRGBA_4444: 52544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sL_8: 53544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_lRGBX_8888: 54544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_lRGBA_8888: 55544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_lRGBA_8888_PRE: 56544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_lL_8: 57544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_A_8: 58544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_BW_1: 59544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#ifdef OPENVG_VERSION_1_1 60544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_A_1: 61544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_A_4: 62544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif 63544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sXRGB_8888: 64544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sARGB_8888: 65544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sARGB_8888_PRE: 66544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sARGB_1555: 67544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sARGB_4444: 68544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_lXRGB_8888: 69544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_lARGB_8888: 70544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_lARGB_8888_PRE: 71544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sBGRX_8888: 72544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sBGRA_8888: 73544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sBGRA_8888_PRE: 74544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sBGR_565: 75544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sBGRA_5551: 76544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sBGRA_4444: 77544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_lBGRX_8888: 78544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_lBGRA_8888: 79544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_lBGRA_8888_PRE: 80544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sXBGR_8888: 81544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sABGR_8888: 82544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sABGR_8888_PRE: 83544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sABGR_1555: 84544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_sABGR_4444: 85544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_lXBGR_8888: 86544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_lABGR_8888: 87544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin case VG_lABGR_8888_PRE: 88544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return VG_TRUE; 89544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin default: 90544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return VG_FALSE; 91544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 92544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return VG_FALSE; 93544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 94544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 95544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack RusinVGImage vgCreateImage(VGImageFormat format, 96544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint width, VGint height, 97544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGbitfield allowedQuality) 98544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 99544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *ctx = vg_current_context(); 100544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 101544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (!supported_image_format(format)) { 102544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_UNSUPPORTED_IMAGE_FORMAT_ERROR); 103544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return VG_INVALID_HANDLE; 104544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 105544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (width <= 0 || height <= 0) { 106544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 107544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return VG_INVALID_HANDLE; 108544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 109544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (width > vgGeti(VG_MAX_IMAGE_WIDTH) || 110544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin height > vgGeti(VG_MAX_IMAGE_HEIGHT)) { 111544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 112544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return VG_INVALID_HANDLE; 113544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 114544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (width * height > vgGeti(VG_MAX_IMAGE_PIXELS)) { 115544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 116544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return VG_INVALID_HANDLE; 117544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 118544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 119544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (!(allowedQuality & ((VG_IMAGE_QUALITY_NONANTIALIASED | 120544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VG_IMAGE_QUALITY_FASTER | 121544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VG_IMAGE_QUALITY_BETTER)))) { 122544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 123544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return VG_INVALID_HANDLE; 124544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 125544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 126544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return (VGImage)image_create(format, width, height); 127544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 128544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 129544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vgDestroyImage(VGImage image) 130544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 131544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *ctx = vg_current_context(); 132544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_image *img = (struct vg_image *)image; 133544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 134544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (image == VG_INVALID_HANDLE) { 135544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_BAD_HANDLE_ERROR); 136544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 137544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 138544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (!vg_object_is_valid((void*)image, VG_OBJECT_IMAGE)) { 139544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_BAD_HANDLE_ERROR); 140544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 141544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 142544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin image_destroy(img); 143544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 144544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 145544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vgClearImage(VGImage image, 146544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint x, VGint y, 147544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint width, VGint height) 148544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 149544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *ctx = vg_current_context(); 150544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_image *img; 151544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 152544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (image == VG_INVALID_HANDLE) { 153544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_BAD_HANDLE_ERROR); 154544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 155544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 156544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (width <= 0 || height <= 0) { 157544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 158544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 159544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 160544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 161544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin img = (struct vg_image*)image; 162544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 163544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (x + width < 0 || y + height < 0) 164544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 165544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 166544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin image_clear(img, x, y, width, height); 167544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 168544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 169544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 170544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vgImageSubData(VGImage image, 171544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin const void * data, 172544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint dataStride, 173544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGImageFormat dataFormat, 174544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint x, VGint y, 175544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint width, VGint height) 176544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 177544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *ctx = vg_current_context(); 178544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_image *img; 179544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 180544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (image == VG_INVALID_HANDLE) { 181544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_BAD_HANDLE_ERROR); 182544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 183544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 184544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (!supported_image_format(dataFormat)) { 185544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_UNSUPPORTED_IMAGE_FORMAT_ERROR); 186544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 187544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 188544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (width <= 0 || height <= 0 || !data || !is_aligned(data)) { 189544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 190544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 191544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 192544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 193544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin img = (struct vg_image*)(image); 194544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin image_sub_data(img, data, dataStride, dataFormat, 195544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin x, y, width, height); 196544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 197544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 198544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vgGetImageSubData(VGImage image, 199544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin void * data, 200544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint dataStride, 201544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGImageFormat dataFormat, 202544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint x, VGint y, 203544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint width, VGint height) 204544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 205544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *ctx = vg_current_context(); 206544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_image *img; 207544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 208544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (image == VG_INVALID_HANDLE) { 209544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_BAD_HANDLE_ERROR); 210544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 211544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 212544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (!supported_image_format(dataFormat)) { 213544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_UNSUPPORTED_IMAGE_FORMAT_ERROR); 214544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 215544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 216544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (width <= 0 || height <= 0 || !data || !is_aligned(data)) { 217544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 218544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 219544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 220544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin img = (struct vg_image*)image; 221544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin image_get_sub_data(img, data, dataStride, dataFormat, 222544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin x, y, width, height); 223544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 224544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 225544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack RusinVGImage vgChildImage(VGImage parent, 226544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint x, VGint y, 227544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint width, VGint height) 228544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 229544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *ctx = vg_current_context(); 230544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_image *p; 231544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 232544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (parent == VG_INVALID_HANDLE || 233544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin !vg_context_is_object_valid(ctx, VG_OBJECT_IMAGE, (void*)parent) || 234544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin !vg_object_is_valid((void*)parent, VG_OBJECT_IMAGE)) { 235544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_BAD_HANDLE_ERROR); 236544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return VG_INVALID_HANDLE; 237544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 238544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (width <= 0 || height <= 0 || x < 0 || y < 0) { 239544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 240544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return VG_INVALID_HANDLE; 241544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 242544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin p = (struct vg_image *)parent; 243544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (x > p->width || y > p->height) { 244544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 245544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return VG_INVALID_HANDLE; 246544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 247544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (x + width > p->width || y + height > p->height) { 248544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 249544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return VG_INVALID_HANDLE; 250544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 251544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 252544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return (VGImage)image_child_image(p, x, y, width, height); 253544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 254544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 255544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack RusinVGImage vgGetParent(VGImage image) 256544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 257544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *ctx = vg_current_context(); 258544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_image *img; 259544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 260544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (image == VG_INVALID_HANDLE) { 261544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_BAD_HANDLE_ERROR); 262544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return VG_INVALID_HANDLE; 263544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 264544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 265544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin img = (struct vg_image*)image; 266544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (img->parent) 267544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return (VGImage)img->parent; 268544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin else 269544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return image; 270544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 271544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 272544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vgCopyImage(VGImage dst, VGint dx, VGint dy, 273544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGImage src, VGint sx, VGint sy, 274544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint width, VGint height, 275544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGboolean dither) 276544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 277544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *ctx = vg_current_context(); 278544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 279544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (src == VG_INVALID_HANDLE || dst == VG_INVALID_HANDLE) { 280544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_BAD_HANDLE_ERROR); 281544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 282544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 283544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 284544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (width <= 0 || height <= 0) { 285544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 286544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 287544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 288544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_validate_state(ctx); 289544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin image_copy((struct vg_image*)dst, dx, dy, 290544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin (struct vg_image*)src, sx, sy, 291544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin width, height, dither); 292544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 293544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 294544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vgDrawImage(VGImage image) 295544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 296544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *ctx = vg_current_context(); 297544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 298544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (!ctx) 299544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 300544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 301544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (image == VG_INVALID_HANDLE) { 302544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_BAD_HANDLE_ERROR); 303544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 304544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 305544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 306544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_validate_state(ctx); 307544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin image_draw((struct vg_image*)image); 308544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 309544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 310544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vgSetPixels(VGint dx, VGint dy, 311544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGImage src, VGint sx, VGint sy, 312544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint width, VGint height) 313544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 314544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *ctx = vg_current_context(); 315544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 316544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_validate_state(ctx); 317544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 318544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (src == VG_INVALID_HANDLE) { 319544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_BAD_HANDLE_ERROR); 320544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 321544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 322544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (width <= 0 || height <= 0) { 323544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 324544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 325544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 326544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin image_set_pixels(dx, dy, (struct vg_image*)src, sx, sy, width, 327544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin height); 328544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 329544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 330544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vgGetPixels(VGImage dst, VGint dx, VGint dy, 331544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint sx, VGint sy, 332544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint width, VGint height) 333544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 334544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *ctx = vg_current_context(); 335544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_image *img; 336544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 337544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (dst == VG_INVALID_HANDLE) { 338544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_BAD_HANDLE_ERROR); 339544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 340544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 341544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (width <= 0 || height <= 0) { 342544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 343544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 344544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 345544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 346544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin img = (struct vg_image*)dst; 347544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 348544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin image_get_pixels(img, dx, dy, 349544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin sx, sy, width, height); 350544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 351544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 352544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vgWritePixels(const void * data, VGint dataStride, 353544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGImageFormat dataFormat, 354544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint dx, VGint dy, 355544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint width, VGint height) 356544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 357544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *ctx = vg_current_context(); 358544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct pipe_context *pipe = ctx->pipe; 359544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 360544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (!supported_image_format(dataFormat)) { 361544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_UNSUPPORTED_IMAGE_FORMAT_ERROR); 362544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 363544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 364544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (!data || !is_aligned(data)) { 365544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 366544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 367544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 368544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (width <= 0 || height <= 0) { 369544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 370544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 371544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 372544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 373544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_validate_state(ctx); 374544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin { 375544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_image *img = image_create(dataFormat, width, height); 376544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin image_sub_data(img, data, dataStride, dataFormat, 0, 0, 377544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin width, height); 378544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#if 0 379544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct matrix *matrix = &ctx->state.vg.image_user_to_surface_matrix; 380544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin matrix_translate(matrix, dx, dy); 381544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin image_draw(img); 382544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin matrix_translate(matrix, -dx, -dy); 383544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#else 384544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* this looks like a better approach */ 385544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin image_set_pixels(dx, dy, img, 0, 0, width, height); 386544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif 387544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin image_destroy(img); 388544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 389544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* make sure rendering has completed */ 390544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE, NULL); 391544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 392544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 393544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vgReadPixels(void * data, VGint dataStride, 394544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGImageFormat dataFormat, 395544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint sx, VGint sy, 396544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint width, VGint height) 397544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 398544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *ctx = vg_current_context(); 399544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct pipe_context *pipe = ctx->pipe; 400544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 401544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct st_framebuffer *stfb = ctx->draw_buffer; 402544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct st_renderbuffer *strb = stfb->strb; 403544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct pipe_framebuffer_state *fb = &ctx->state.g3d.fb; 404544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 405544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGfloat temp[VEGA_MAX_IMAGE_WIDTH][4]; 406544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGfloat *df = (VGfloat*)temp; 407544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint y = (fb->height - sy) - 1, yStep = -1; 408544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint i; 409544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGubyte *dst = (VGubyte *)data; 410544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint xoffset = 0, yoffset = 0; 411544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 412544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (!supported_image_format(dataFormat)) { 413544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_UNSUPPORTED_IMAGE_FORMAT_ERROR); 414544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 415544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 416544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (!data || !is_aligned(data)) { 417544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 418544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 419544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 420544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (width <= 0 || height <= 0) { 421544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 422544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 423544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 424544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 425544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* make sure rendering has completed */ 426544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE, NULL); 427544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (sx < 0) { 428544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin xoffset = -sx; 429544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin xoffset *= _vega_size_for_format(dataFormat); 430544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin width += sx; 431544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin sx = 0; 432544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 433544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (sy < 0) { 434544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin yoffset = -sy; 435544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin height += sy; 436544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin sy = 0; 437544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin y = (fb->height - sy) - 1; 438544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin yoffset *= dataStride; 439544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 440544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 441544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin { 442544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct pipe_transfer *transfer; 443544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 444b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell transfer = pipe->get_tex_transfer(pipe, strb->texture, 0, 0, 0, 445544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin PIPE_TRANSFER_READ, 446544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 0, 0, width, height); 447544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 448544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* Do a row at a time to flip image data vertically */ 449544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin for (i = 0; i < height; i++) { 450544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#if 0 451544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_printf("%d-%d == %d\n", sy, height, y); 452544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif 453d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_get_tile_rgba(pipe, transfer, sx, y, width, 1, df); 454544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin y += yStep; 455544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin _vega_pack_rgba_span_float(ctx, width, temp, dataFormat, 456544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin dst + yoffset + xoffset); 457544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin dst += dataStride; 458544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 459544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 460d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe->tex_transfer_destroy(pipe, transfer); 461544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 462544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 463544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 464544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vgCopyPixels(VGint dx, VGint dy, 465544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint sx, VGint sy, 466544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint width, VGint height) 467544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 468544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *ctx = vg_current_context(); 469544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct pipe_framebuffer_state *fb = &ctx->state.g3d.fb; 470544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct st_renderbuffer *strb = ctx->draw_buffer->strb; 471544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 472544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (width <= 0 || height <= 0) { 473544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 474544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 475544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 476544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 477544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* do nothing if we copy from outside the fb */ 478544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (dx >= (VGint)fb->width || dy >= (VGint)fb->height || 479544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin sx >= (VGint)fb->width || sy >= (VGint)fb->height) 480544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 481544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 482544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_validate_state(ctx); 483544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* make sure rendering has completed */ 484544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vgFinish(); 485544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 486544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin vg_copy_surface(ctx, strb->surface, dx, dy, 487544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin strb->surface, sx, sy, width, height); 488544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 489