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