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