1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 VMware, Inc.  All Rights Reserved.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "polygon.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "matrix.h" /*for floatsEqual*/
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vg_context.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vg_state.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "renderer.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util_array.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "VG/openvg.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_draw_quad.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <string.h>
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdlib.h>
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEBUG_POLYGON 0
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define COMPONENTS 2
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct polygon
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat *data;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint    size;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint    num_verts;
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGboolean dirty;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *user_vbuf;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_screen *screen;
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic float *ptr_to_vertex(float *data, int idx)
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return data + (idx * COMPONENTS);
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void polygon_print(struct polygon *poly)
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float *vert;
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   debug_printf("Polygon %p, size = %d\n", poly, poly->num_verts);
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < poly->num_verts; ++i) {
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vert = ptr_to_vertex(poly->data, i);
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      debug_printf("%f, %f,  ", vert[0], vert[1]);
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   debug_printf("\nend\n");
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct polygon * polygon_create(int size)
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct polygon *poly = (struct polygon*)malloc(sizeof(struct polygon));
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   poly->data = malloc(sizeof(float) * COMPONENTS * size);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   poly->size = size;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   poly->num_verts = 0;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   poly->dirty = VG_TRUE;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   poly->user_vbuf = NULL;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return poly;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct polygon * polygon_create_from_data(float *data, int size)
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct polygon *poly = polygon_create(size);
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy(poly->data, data, sizeof(float) * COMPONENTS * size);
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   poly->num_verts = size;
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   poly->dirty = VG_TRUE;
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   poly->user_vbuf = NULL;
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return poly;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid polygon_destroy(struct polygon *poly)
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(poly->data);
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(poly);
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid polygon_resize(struct polygon *poly, int new_size)
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float *data = (float*)malloc(sizeof(float) * COMPONENTS * new_size);
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int size = MIN2(sizeof(float) * COMPONENTS * new_size,
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   sizeof(float) * COMPONENTS * poly->size);
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy(data, poly->data, size);
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(poly->data);
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   poly->data = data;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   poly->size = new_size;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   poly->dirty = VG_TRUE;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint polygon_size(struct polygon *poly)
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return poly->size;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint polygon_vertex_count(struct polygon *poly)
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return poly->num_verts;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfloat * polygon_data(struct polygon *poly)
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return poly->data;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid polygon_vertex_append(struct polygon *p,
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           float x, float y)
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float *vert;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DEBUG_POLYGON
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   debug_printf("Append vertex [%f, %f]\n", x, y);
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (p->num_verts >= p->size) {
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      polygon_resize(p, p->size * 2);
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vert = ptr_to_vertex(p->data, p->num_verts);
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vert[0] = x;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vert[1] = y;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ++p->num_verts;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->dirty = VG_TRUE;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid polygon_set_vertex(struct polygon *p, int idx,
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        float x, float y)
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float *vert;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (idx >= p->num_verts) {
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*fixme: error reporting*/
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      abort();
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vert = ptr_to_vertex(p->data, idx);
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vert[0] = x;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vert[1] = y;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->dirty = VG_TRUE;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid polygon_vertex(struct polygon *p, int idx,
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    float *vertex)
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float *vert;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (idx >= p->num_verts) {
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*fixme: error reporting*/
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      abort();
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vert = ptr_to_vertex(p->data, idx);
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vertex[0] = vert[0];
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vertex[1] = vert[1];
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid polygon_bounding_rect(struct polygon *p,
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           float *rect)
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float minx, miny, maxx, maxy;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float *vert = ptr_to_vertex(p->data, 0);
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   minx = vert[0];
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   maxx = vert[0];
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   miny = vert[1];
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   maxy = vert[1];
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 1; i < p->num_verts; ++i) {
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vert = ptr_to_vertex(p->data, i);
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      minx = MIN2(vert[0], minx);
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      miny = MIN2(vert[1], miny);
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxx = MAX2(vert[0], maxx);
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxy = MAX2(vert[1], maxy);
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rect[0] = minx;
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rect[1] = miny;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rect[2] = maxx - minx;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rect[3] = maxy - miny;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint polygon_contains_point(struct polygon *p,
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           float x, float y)
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid polygon_append_polygon(struct polygon *dst,
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct polygon *src)
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dst->num_verts + src->num_verts >= dst->size) {
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      polygon_resize(dst, dst->num_verts + src->num_verts * 1.5);
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy(ptr_to_vertex(dst->data, dst->num_verts),
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          src->data, src->num_verts * COMPONENTS * sizeof(VGfloat));
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->num_verts += src->num_verts;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean polygon_is_closed(struct polygon *p)
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat start[2], end[2];
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   polygon_vertex(p, 0, start);
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   polygon_vertex(p, p->num_verts - 1, end);
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return floatsEqual(start[0], end[0]) && floatsEqual(start[1], end[1]);
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void polygon_prepare_buffer(struct vg_context *ctx,
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   struct polygon *poly)
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_context *pipe;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*polygon_print(poly);*/
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe = ctx->pipe;
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (poly->user_vbuf == NULL || poly->dirty) {
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      poly->screen = pipe->screen;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      poly->user_vbuf = poly->data;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      poly->dirty = VG_FALSE;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid polygon_fill(struct polygon *poly, struct vg_context *ctx)
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_vertex_element velement;
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_vertex_buffer vbuffer;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat bounds[4];
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat min_x, min_y, max_x, max_y;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(poly);
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   polygon_bounding_rect(poly, bounds);
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   min_x = bounds[0];
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   min_y = bounds[1];
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   max_x = bounds[0] + bounds[2];
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   max_y = bounds[1] + bounds[3];
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DEBUG_POLYGON
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   debug_printf("Poly bounds are [%f, %f], [%f, %f]\n",
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                min_x, min_y, max_x, max_y);
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   polygon_prepare_buffer(ctx, poly);
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* tell renderer about the vertex attributes */
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&velement, 0, sizeof(velement));
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   velement.src_offset = 0;
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   velement.instance_divisor = 0;
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   velement.vertex_buffer_index = 0;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   velement.src_format = PIPE_FORMAT_R32G32_FLOAT;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* tell renderer about the vertex buffer */
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&vbuffer, 0, sizeof(vbuffer));
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbuffer.user_buffer = poly->user_vbuf;
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbuffer.stride = COMPONENTS * sizeof(float);  /* vertex size */
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_polygon_stencil_begin(ctx->renderer,
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         &velement, ctx->state.vg.fill_rule, VG_FALSE);
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_polygon_stencil(ctx->renderer, &vbuffer,
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PIPE_PRIM_TRIANGLE_FAN, 0, (VGuint) poly->num_verts);
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_polygon_stencil_end(ctx->renderer);
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_polygon_fill_begin(ctx->renderer, VG_FALSE);
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_polygon_fill(ctx->renderer, min_x, min_y, max_x, max_y);
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_polygon_fill_end(ctx->renderer);
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid polygon_array_fill(struct polygon_array *polyarray, struct vg_context *ctx)
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct array *polys = polyarray->array;
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat min_x = polyarray->min_x;
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat min_y = polyarray->min_y;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat max_x = polyarray->max_x;
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat max_y = polyarray->max_y;
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_vertex_element velement;
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_vertex_buffer vbuffer;
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint i;
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DEBUG_POLYGON
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   debug_printf("%s: Poly bounds are [%f, %f], [%f, %f]\n",
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                __FUNCTION__,
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                min_x, min_y, max_x, max_y);
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* tell renderer about the vertex attributes */
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&velement, 0, sizeof(velement));
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   velement.src_offset = 0;
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   velement.instance_divisor = 0;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   velement.vertex_buffer_index = 0;
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   velement.src_format = PIPE_FORMAT_R32G32_FLOAT;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* tell renderer about the vertex buffer */
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&vbuffer, 0, sizeof(vbuffer));
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbuffer.stride = COMPONENTS * sizeof(float);  /* vertex size */
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* prepare the stencil buffer */
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_polygon_stencil_begin(ctx->renderer,
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         &velement, ctx->state.vg.fill_rule, VG_FALSE);
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < polys->num_elements; ++i) {
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct polygon *poly = (((struct polygon**)polys->data)[i]);
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      polygon_prepare_buffer(ctx, poly);
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbuffer.user_buffer = poly->user_vbuf;
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer_polygon_stencil(ctx->renderer, &vbuffer,
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            PIPE_PRIM_TRIANGLE_FAN, 0, (VGuint) poly->num_verts);
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_polygon_stencil_end(ctx->renderer);
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* fill it */
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_polygon_fill_begin(ctx->renderer, VG_FALSE);
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_polygon_fill(ctx->renderer, min_x, min_y, max_x, max_y);
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_polygon_fill_end(ctx->renderer);
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
352