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 "vg_context.h"
30544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "paint.h"
3175143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu#include "api.h"
32d41e694cf78ada8c9258f96995115c9da8437894Brian Paul#include "handle.h"
33d41e694cf78ada8c9258f96995115c9da8437894Brian Paul
34544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
3575143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I WuVGPaint vegaCreatePaint(void)
36544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
37d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   return paint_to_handle(paint_create(vg_current_context()));
38544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
39544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
4075143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaDestroyPaint(VGPaint p)
41544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
42544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
43544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
44544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (p == VG_INVALID_HANDLE) {
45544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
46544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
47544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
48544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
49d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   paint_destroy(handle_to_paint(p));
50544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
51544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
5275143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaSetPaint(VGPaint paint, VGbitfield paintModes)
53544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
54544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
55544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
56544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (paint == VG_INVALID_HANDLE) {
57544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      /* restore the default */
58d41e694cf78ada8c9258f96995115c9da8437894Brian Paul      paint = paint_to_handle(ctx->default_paint);
59d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   } else if (!vg_object_is_valid(paint, VG_OBJECT_PAINT)) {
60544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
61544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
62544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
63544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
64544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (!(paintModes & ((VG_FILL_PATH|VG_STROKE_PATH)))) {
65544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
66544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
67544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
68544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
69544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (paintModes & VG_FILL_PATH) {
70d41e694cf78ada8c9258f96995115c9da8437894Brian Paul      ctx->state.vg.fill_paint = handle_to_paint(paint);
71544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
72544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (paintModes & VG_STROKE_PATH) {
73d41e694cf78ada8c9258f96995115c9da8437894Brian Paul      ctx->state.vg.stroke_paint = handle_to_paint(paint);
74544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
753f0a966807f03a364edea0272ddf45f08ab7ce4fChia-I Wu
763f0a966807f03a364edea0272ddf45f08ab7ce4fChia-I Wu   ctx->state.dirty |= PAINT_DIRTY;
77544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
78544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
7975143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I WuVGPaint vegaGetPaint(VGPaintMode paintMode)
80544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
81544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
82544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGPaint paint = VG_INVALID_HANDLE;
83544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
84544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (paintMode < VG_STROKE_PATH || paintMode > VG_FILL_PATH) {
85544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
86544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return VG_INVALID_HANDLE;
87544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
88544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
89544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (paintMode == VG_FILL_PATH)
90d41e694cf78ada8c9258f96995115c9da8437894Brian Paul      paint = paint_to_handle(ctx->state.vg.fill_paint);
91544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   else if (paintMode == VG_STROKE_PATH)
92d41e694cf78ada8c9258f96995115c9da8437894Brian Paul      paint = paint_to_handle(ctx->state.vg.stroke_paint);
93544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
94d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   if (paint == paint_to_handle(ctx->default_paint))
95544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      paint = VG_INVALID_HANDLE;
96544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
97544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return paint;
98544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
99544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
10075143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaSetColor(VGPaint paint, VGuint rgba)
101544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
102544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
1033f0a966807f03a364edea0272ddf45f08ab7ce4fChia-I Wu   struct vg_paint *p;
104544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
105544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (paint == VG_INVALID_HANDLE) {
106544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
107544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
108544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
109544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
110d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   if (!vg_object_is_valid(paint, VG_OBJECT_PAINT)) {
111544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
112544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
113544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
114d41e694cf78ada8c9258f96995115c9da8437894Brian Paul
1153f0a966807f03a364edea0272ddf45f08ab7ce4fChia-I Wu   p = handle_to_paint(paint);
1163f0a966807f03a364edea0272ddf45f08ab7ce4fChia-I Wu   paint_set_colori(p, rgba);
1173f0a966807f03a364edea0272ddf45f08ab7ce4fChia-I Wu
1183f0a966807f03a364edea0272ddf45f08ab7ce4fChia-I Wu   if (ctx->state.vg.fill_paint == p ||
1193f0a966807f03a364edea0272ddf45f08ab7ce4fChia-I Wu       ctx->state.vg.stroke_paint == p)
1203f0a966807f03a364edea0272ddf45f08ab7ce4fChia-I Wu      ctx->state.dirty |= PAINT_DIRTY;
121544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
122544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
12375143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I WuVGuint vegaGetColor(VGPaint paint)
124544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
125544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
126544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_paint *p;
127544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGuint rgba = 0;
128544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
129544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (paint == VG_INVALID_HANDLE) {
130544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
131544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return rgba;
132544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
133544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
134d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   if (!vg_object_is_valid(paint, VG_OBJECT_PAINT)) {
135544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
136544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return rgba;
137544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
138d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   p = handle_to_paint(paint);
139544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
140544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return paint_colori(p);
141544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
142544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
14375143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wuvoid vegaPaintPattern(VGPaint paint, VGImage pattern)
144544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
145544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
146544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
147544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (paint == VG_INVALID_HANDLE ||
148d41e694cf78ada8c9258f96995115c9da8437894Brian Paul       !vg_context_is_object_valid(ctx, VG_OBJECT_PAINT, paint)) {
149544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
150544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
151544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
152544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
153544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (pattern == VG_INVALID_HANDLE) {
154d41e694cf78ada8c9258f96995115c9da8437894Brian Paul      paint_set_type(handle_to_paint(paint), VG_PAINT_TYPE_COLOR);
155544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
156544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
157544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
158d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   if (!vg_context_is_object_valid(ctx, VG_OBJECT_IMAGE, pattern)) {
159544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
160544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
161544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
162544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
163544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
164d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   if (!vg_object_is_valid(paint, VG_OBJECT_PAINT) ||
165d41e694cf78ada8c9258f96995115c9da8437894Brian Paul       !vg_object_is_valid(pattern, VG_OBJECT_IMAGE)) {
166544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
167544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
168544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
169d41e694cf78ada8c9258f96995115c9da8437894Brian Paul   paint_set_pattern(handle_to_paint(paint),
170d41e694cf78ada8c9258f96995115c9da8437894Brian Paul                     handle_to_image(pattern));
171544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
172544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
173