api_masks.c revision 96c6637a1360f146bbf49ffb207ae943ecbbdf49
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 "VG/openvg.h"
28544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
29544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "mask.h"
3075143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu#include "api.h"
316b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu#include "renderer.h"
32544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
33544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "vg_context.h"
34544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_context.h"
3528486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
36544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
37544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_pack_color.h"
38544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_draw_quad.h"
39544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
40544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#define DISABLE_1_1_MASKING 1
41544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
4275143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaMask(VGHandle mask, VGMaskOperation operation,
4375143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu              VGint x, VGint y,
4475143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu              VGint width, VGint height)
45544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
46544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
47544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
48544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (width <=0 || height <= 0) {
49544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
50544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
51544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
52544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
53544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (operation < VG_CLEAR_MASK || operation > VG_SUBTRACT_MASK) {
54544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
55544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
56544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
57544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
58544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
59544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_validate_state(ctx);
60544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
61544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (operation == VG_CLEAR_MASK) {
62544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      mask_fill(x, y, width, height, 0.f);
63544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   } else if (operation == VG_FILL_MASK) {
64544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      mask_fill(x, y, width, height, 1.f);
65544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   } else if (vg_object_is_valid((void*)mask, VG_OBJECT_IMAGE)) {
66544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      struct vg_image *image = (struct vg_image *)mask;
67544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      mask_using_image(image, operation, x, y, width, height);
68544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   } else if (vg_object_is_valid((void*)mask, VG_OBJECT_MASK)) {
69544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#if DISABLE_1_1_MASKING
70544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
71544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#else
72544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      struct vg_mask_layer *layer = (struct vg_mask_layer *)mask;
73544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      mask_using_layer(layer, operation, x, y, width, height);
74544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif
75544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   } else {
76544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
77544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
78544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
79544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
8075143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaClear(VGint x, VGint y,
8175143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu               VGint width, VGint height)
82544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
83544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
8496c6637a1360f146bbf49ffb207ae943ecbbdf49Chia-I Wu   struct st_framebuffer *stfb = ctx->draw_buffer;
85544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
86544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (width <= 0 || height <= 0) {
87544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
88544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
89544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
90544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
91544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_validate_state(ctx);
92544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#if 0
93544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   debug_printf("Clear [%d, %d, %d, %d] with [%f, %f, %f, %f]\n",
94544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                x, y, width, height,
95544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                ctx->state.vg.clear_color[0],
96544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                ctx->state.vg.clear_color[1],
97544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                ctx->state.vg.clear_color[2],
98544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                ctx->state.vg.clear_color[3]);
99544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif
100544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
101544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* check for a whole surface clear */
102544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (!ctx->state.vg.scissoring &&
10396c6637a1360f146bbf49ffb207ae943ecbbdf49Chia-I Wu       (x == 0 && y == 0 && width == stfb->width && height == stfb->height)) {
104544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ctx->pipe->clear(ctx->pipe, PIPE_CLEAR_COLOR | PIPE_CLEAR_DEPTHSTENCIL,
105544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                       ctx->state.vg.clear_color, 1., 0);
1066b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   } else if (renderer_clear_begin(ctx->renderer)) {
1076b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu      /* XXX verify coord round-off */
1086b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu      renderer_clear(ctx->renderer, x, y, width, height, ctx->state.vg.clear_color);
1096b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu      renderer_clear_end(ctx->renderer);
110544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
111544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
112544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
113544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
114544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#ifdef OPENVG_VERSION_1_1
115544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
116544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
11775143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaRenderToMask(VGPath path,
11875143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                      VGbitfield paintModes,
11975143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                      VGMaskOperation operation)
120544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
121544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
122544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
123544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (path == VG_INVALID_HANDLE) {
124544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
125544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
126544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
127544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (!paintModes || (paintModes&(~(VG_STROKE_PATH|VG_FILL_PATH)))) {
128544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
129544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
130544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
131544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (operation < VG_CLEAR_MASK ||
132544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       operation > VG_SUBTRACT_MASK) {
133544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
134544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
135544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
136544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (!vg_object_is_valid((void*)path, VG_OBJECT_PATH)) {
137544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
138544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
139544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
140544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
141544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#if DISABLE_1_1_MASKING
142544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return;
143544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif
144544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
145544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_validate_state(ctx);
146544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
147544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   mask_render_to((struct path *)path, paintModes, operation);
148544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
149544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
15075143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I WuVGMaskLayer vegaCreateMaskLayer(VGint width, VGint height)
151544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
152544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
153544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
154544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (width <= 0 || height <= 0 ||
155544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       width > vgGeti(VG_MAX_IMAGE_WIDTH) ||
156544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       height > vgGeti(VG_MAX_IMAGE_HEIGHT)) {
157544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
158544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return VG_INVALID_HANDLE;
159544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
160544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
161544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return (VGMaskLayer)mask_layer_create(width, height);
162544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
163544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
16475143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaDestroyMaskLayer(VGMaskLayer maskLayer)
165544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
166544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_mask_layer *mask = 0;
167544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
168544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
169544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (maskLayer == VG_INVALID_HANDLE) {
170544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
171544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
172544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
173544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (!vg_object_is_valid((void*)maskLayer, VG_OBJECT_MASK)) {
174544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
175544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
176544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
177544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
178544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   mask = (struct vg_mask_layer *)maskLayer;
179544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   mask_layer_destroy(mask);
180544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
181544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
18275143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaFillMaskLayer(VGMaskLayer maskLayer,
18375143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                       VGint x, VGint y,
18475143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                       VGint width, VGint height,
18575143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                       VGfloat value)
186544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
187544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_mask_layer *mask = 0;
188544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
189544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
190544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (maskLayer == VG_INVALID_HANDLE) {
191544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
192544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
193544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
194544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
195544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (value < 0 || value > 1) {
196544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
197544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
198544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
199544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
200544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (width <= 0 || height <= 0) {
201544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
202544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
203544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
204544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (x < 0 || y < 0 || (x + width) < 0 || (y + height) < 0) {
205544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
206544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
207544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
208544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
209544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (!vg_object_is_valid((void*)maskLayer, VG_OBJECT_MASK)) {
210544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
211544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
212544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
213544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
214544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   mask = (struct vg_mask_layer*)maskLayer;
215544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
216544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (x + width > mask_layer_width(mask) ||
217544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       y + height > mask_layer_height(mask)) {
218544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
219544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
220544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
221544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
222544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#if DISABLE_1_1_MASKING
223544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return;
224544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif
225544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   mask_layer_fill(mask, x, y, width, height, value);
226544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
227544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
22875143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaCopyMask(VGMaskLayer maskLayer,
22975143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                  VGint sx, VGint sy,
23075143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                  VGint dx, VGint dy,
23175143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                  VGint width, VGint height)
232544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
233544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
234544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_mask_layer *mask = 0;
235544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
236544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (maskLayer == VG_INVALID_HANDLE) {
237544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
238544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
239544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
240544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (width <= 0 || height <= 0) {
241544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
242544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
243544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
244544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (!vg_object_is_valid((void*)maskLayer, VG_OBJECT_MASK)) {
245544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
246544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
247544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
248544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
249544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#if DISABLE_1_1_MASKING
250544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return;
251544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif
252544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
253544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   mask = (struct vg_mask_layer*)maskLayer;
254544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   mask_copy(mask, sx, sy, dx, dy, width, height);
255544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
256544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
257544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif
258