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"
31d41e694cf78ada8c9258f96995115c9da8437894Brian Paul#include "handle.h"
326b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu#include "renderer.h"
33544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
34544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "vg_context.h"
35544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_context.h"
36544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
3775143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaMask(VGHandle mask, VGMaskOperation operation,
3875143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu              VGint x, VGint y,
3975143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu              VGint width, VGint height)
40544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
41544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
42544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
43544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (width <=0 || height <= 0) {
44544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
45544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
46544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
47544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
48544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (operation < VG_CLEAR_MASK || operation > VG_SUBTRACT_MASK) {
49544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
50544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
51544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
52544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
53544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
54544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_validate_state(ctx);
55544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
56544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (operation == VG_CLEAR_MASK) {
57544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      mask_fill(x, y, width, height, 0.f);
58544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   } else if (operation == VG_FILL_MASK) {
59544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      mask_fill(x, y, width, height, 1.f);
60d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   } else if (vg_object_is_valid(mask, VG_OBJECT_IMAGE)) {
61d41e694cf78ada8c9258f96995115c9da8437894Brian Paul      struct vg_image *image = handle_to_image(mask);
62544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      mask_using_image(image, operation, x, y, width, height);
63d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   } else if (vg_object_is_valid(mask, VG_OBJECT_MASK)) {
64d41e694cf78ada8c9258f96995115c9da8437894Brian Paul      struct vg_mask_layer *layer = handle_to_masklayer(mask);
65544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      mask_using_layer(layer, operation, x, y, width, height);
66544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   } else {
67544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
68544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
69544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
70544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
7175143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaClear(VGint x, VGint y,
7275143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu               VGint width, VGint height)
73544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
74544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
7596c6637a1360f146bbf49ffb207ae943ecbbdf49Chia-I Wu   struct st_framebuffer *stfb = ctx->draw_buffer;
76544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
77544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (width <= 0 || height <= 0) {
78544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
79544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
80544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
81544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
82544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_validate_state(ctx);
83544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#if 0
84544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   debug_printf("Clear [%d, %d, %d, %d] with [%f, %f, %f, %f]\n",
85544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                x, y, width, height,
86544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                ctx->state.vg.clear_color[0],
87544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                ctx->state.vg.clear_color[1],
88544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                ctx->state.vg.clear_color[2],
89544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                ctx->state.vg.clear_color[3]);
90544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif
91544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
92544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* check for a whole surface clear */
93544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (!ctx->state.vg.scissoring &&
9496c6637a1360f146bbf49ffb207ae943ecbbdf49Chia-I Wu       (x == 0 && y == 0 && width == stfb->width && height == stfb->height)) {
956dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie      union pipe_color_union clear_color;
966dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie      clear_color.f[0] = ctx->state.vg.clear_color[0];
976dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie      clear_color.f[1] = ctx->state.vg.clear_color[1];
986dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie      clear_color.f[2] = ctx->state.vg.clear_color[2];
996dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie      clear_color.f[3] = ctx->state.vg.clear_color[3];
100544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ctx->pipe->clear(ctx->pipe, PIPE_CLEAR_COLOR | PIPE_CLEAR_DEPTHSTENCIL,
1016dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                       &clear_color, 1., 0);
1026b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   } else if (renderer_clear_begin(ctx->renderer)) {
1036b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu      /* XXX verify coord round-off */
1046b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu      renderer_clear(ctx->renderer, x, y, width, height, ctx->state.vg.clear_color);
1056b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu      renderer_clear_end(ctx->renderer);
106544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
107544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
108544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
109544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
110544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#ifdef OPENVG_VERSION_1_1
111544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
112544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
11375143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaRenderToMask(VGPath path,
11475143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                      VGbitfield paintModes,
11575143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                      VGMaskOperation operation)
116544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
117544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
118544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
119544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (path == VG_INVALID_HANDLE) {
120544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
121544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
122544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
123544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (!paintModes || (paintModes&(~(VG_STROKE_PATH|VG_FILL_PATH)))) {
124544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
125544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
126544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
127544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (operation < VG_CLEAR_MASK ||
128544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       operation > VG_SUBTRACT_MASK) {
129544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
130544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
131544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
132d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   if (!vg_object_is_valid(path, VG_OBJECT_PATH)) {
133544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
134544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
135544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
136544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
137544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_validate_state(ctx);
138544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
139d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   mask_render_to(handle_to_path(path), paintModes, operation);
140544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
141544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
14275143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I WuVGMaskLayer vegaCreateMaskLayer(VGint width, VGint height)
143544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
144544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
145544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
146544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (width <= 0 || height <= 0 ||
14705e5b53128fc4dc25769fecace671cdaa7004630Chia-I Wu       width > vegaGeti(VG_MAX_IMAGE_WIDTH) ||
14805e5b53128fc4dc25769fecace671cdaa7004630Chia-I Wu       height > vegaGeti(VG_MAX_IMAGE_HEIGHT)) {
149544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
150544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return VG_INVALID_HANDLE;
151544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
152544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
153d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   return masklayer_to_handle(mask_layer_create(width, height));
154544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
155544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
15675143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaDestroyMaskLayer(VGMaskLayer maskLayer)
157544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
158544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_mask_layer *mask = 0;
159544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
160544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
161544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (maskLayer == VG_INVALID_HANDLE) {
162544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
163544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
164544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
165d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   if (!vg_object_is_valid(maskLayer, VG_OBJECT_MASK)) {
166544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
167544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
168544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
169544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
170d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   mask = handle_to_masklayer(maskLayer);
171544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   mask_layer_destroy(mask);
172544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
173544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
17475143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaFillMaskLayer(VGMaskLayer maskLayer,
17575143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                       VGint x, VGint y,
17675143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                       VGint width, VGint height,
17775143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                       VGfloat value)
178544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
179544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_mask_layer *mask = 0;
180544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
181544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
182544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (maskLayer == VG_INVALID_HANDLE) {
183544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
184544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
185544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
186544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
187544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (value < 0 || value > 1) {
188544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
189544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
190544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
191544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
192544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (width <= 0 || height <= 0) {
193544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
194544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
195544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
196544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (x < 0 || y < 0 || (x + width) < 0 || (y + height) < 0) {
197544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
198544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
199544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
200544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
201d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   if (!vg_object_is_valid(maskLayer, VG_OBJECT_MASK)) {
202544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
203544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
204544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
205544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
206d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   mask = handle_to_masklayer(maskLayer);
207544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
208544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (x + width > mask_layer_width(mask) ||
209544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       y + height > mask_layer_height(mask)) {
210544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
211544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
212544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
213544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
21430cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   vg_validate_state(ctx);
21530cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu
216544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   mask_layer_fill(mask, x, y, width, height, value);
217544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
218544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
21975143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaCopyMask(VGMaskLayer maskLayer,
22075143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                  VGint sx, VGint sy,
22175143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                  VGint dx, VGint dy,
22275143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu                  VGint width, VGint height)
223544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
224544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
225544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_mask_layer *mask = 0;
226544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
227544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (maskLayer == VG_INVALID_HANDLE) {
228544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
229544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
230544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
231544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (width <= 0 || height <= 0) {
232544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
233544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
234544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
235d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   if (!vg_object_is_valid(maskLayer, VG_OBJECT_MASK)) {
236544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
237544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
238544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
239544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
24030cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   vg_validate_state(ctx);
241544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
242d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   mask = handle_to_masklayer(maskLayer);
243544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   mask_copy(mask, sx, sy, dx, dy, width, height);
244544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
245544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
246544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif
247