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