diff options
Diffstat (limited to 'src/gallium/state_trackers/vega/polygon.c')
-rw-r--r-- | src/gallium/state_trackers/vega/polygon.c | 351 |
1 files changed, 0 insertions, 351 deletions
diff --git a/src/gallium/state_trackers/vega/polygon.c b/src/gallium/state_trackers/vega/polygon.c deleted file mode 100644 index 37f96d4..0000000 --- a/src/gallium/state_trackers/vega/polygon.c +++ /dev/null @@ -1,351 +0,0 @@ -/************************************************************************** - * - * Copyright 2009 VMware, Inc. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - **************************************************************************/ - -#include "polygon.h" - -#include "matrix.h" /*for floatsEqual*/ -#include "vg_context.h" -#include "vg_state.h" -#include "renderer.h" -#include "util_array.h" -#include "VG/openvg.h" - -#include "pipe/p_context.h" -#include "pipe/p_defines.h" -#include "pipe/p_state.h" -#include "util/u_inlines.h" -#include "pipe/p_screen.h" - -#include "util/u_draw_quad.h" -#include "util/u_math.h" - -#include <string.h> -#include <stdlib.h> - -#define DEBUG_POLYGON 0 - -#define COMPONENTS 2 - -struct polygon -{ - VGfloat *data; - VGint size; - - VGint num_verts; - - VGboolean dirty; - void *user_vbuf; - struct pipe_screen *screen; -}; - -static float *ptr_to_vertex(float *data, int idx) -{ - return data + (idx * COMPONENTS); -} - -#if 0 -static void polygon_print(struct polygon *poly) -{ - int i; - float *vert; - debug_printf("Polygon %p, size = %d\n", poly, poly->num_verts); - for (i = 0; i < poly->num_verts; ++i) { - vert = ptr_to_vertex(poly->data, i); - debug_printf("%f, %f, ", vert[0], vert[1]); - } - debug_printf("\nend\n"); -} -#endif - - -struct polygon * polygon_create(int size) -{ - struct polygon *poly = malloc(sizeof(struct polygon)); - - poly->data = malloc(sizeof(float) * COMPONENTS * size); - poly->size = size; - poly->num_verts = 0; - poly->dirty = VG_TRUE; - poly->user_vbuf = NULL; - - return poly; -} - -struct polygon * polygon_create_from_data(float *data, int size) -{ - struct polygon *poly = polygon_create(size); - - memcpy(poly->data, data, sizeof(float) * COMPONENTS * size); - poly->num_verts = size; - poly->dirty = VG_TRUE; - poly->user_vbuf = NULL; - - return poly; -} - -void polygon_destroy(struct polygon *poly) -{ - free(poly->data); - free(poly); -} - -void polygon_resize(struct polygon *poly, int new_size) -{ - float *data = malloc(sizeof(float) * COMPONENTS * new_size); - int size = MIN2(sizeof(float) * COMPONENTS * new_size, - sizeof(float) * COMPONENTS * poly->size); - memcpy(data, poly->data, size); - free(poly->data); - poly->data = data; - poly->size = new_size; - poly->dirty = VG_TRUE; -} - -int polygon_size(struct polygon *poly) -{ - return poly->size; -} - -int polygon_vertex_count(struct polygon *poly) -{ - return poly->num_verts; -} - -float * polygon_data(struct polygon *poly) -{ - return poly->data; -} - -void polygon_vertex_append(struct polygon *p, - float x, float y) -{ - float *vert; -#if DEBUG_POLYGON - debug_printf("Append vertex [%f, %f]\n", x, y); -#endif - if (p->num_verts >= p->size) { - polygon_resize(p, p->size * 2); - } - - vert = ptr_to_vertex(p->data, p->num_verts); - vert[0] = x; - vert[1] = y; - ++p->num_verts; - p->dirty = VG_TRUE; -} - -void polygon_set_vertex(struct polygon *p, int idx, - float x, float y) -{ - float *vert; - if (idx >= p->num_verts) { - /*fixme: error reporting*/ - abort(); - return; - } - - vert = ptr_to_vertex(p->data, idx); - vert[0] = x; - vert[1] = y; - p->dirty = VG_TRUE; -} - -void polygon_vertex(struct polygon *p, int idx, - float *vertex) -{ - float *vert; - if (idx >= p->num_verts) { - /*fixme: error reporting*/ - abort(); - return; - } - - vert = ptr_to_vertex(p->data, idx); - vertex[0] = vert[0]; - vertex[1] = vert[1]; -} - -void polygon_bounding_rect(struct polygon *p, - float *rect) -{ - int i; - float minx, miny, maxx, maxy; - float *vert = ptr_to_vertex(p->data, 0); - minx = vert[0]; - maxx = vert[0]; - miny = vert[1]; - maxy = vert[1]; - - for (i = 1; i < p->num_verts; ++i) { - vert = ptr_to_vertex(p->data, i); - minx = MIN2(vert[0], minx); - miny = MIN2(vert[1], miny); - - maxx = MAX2(vert[0], maxx); - maxy = MAX2(vert[1], maxy); - } - - rect[0] = minx; - rect[1] = miny; - rect[2] = maxx - minx; - rect[3] = maxy - miny; -} - -int polygon_contains_point(struct polygon *p, - float x, float y) -{ - return 0; -} - -void polygon_append_polygon(struct polygon *dst, - struct polygon *src) -{ - if (dst->num_verts + src->num_verts >= dst->size) { - polygon_resize(dst, dst->num_verts + src->num_verts * 1.5); - } - memcpy(ptr_to_vertex(dst->data, dst->num_verts), - src->data, src->num_verts * COMPONENTS * sizeof(VGfloat)); - dst->num_verts += src->num_verts; -} - -VGboolean polygon_is_closed(struct polygon *p) -{ - VGfloat start[2], end[2]; - - polygon_vertex(p, 0, start); - polygon_vertex(p, p->num_verts - 1, end); - - return floatsEqual(start[0], end[0]) && floatsEqual(start[1], end[1]); -} - -static void polygon_prepare_buffer(struct vg_context *ctx, - struct polygon *poly) -{ - struct pipe_context *pipe; - - /*polygon_print(poly);*/ - - pipe = ctx->pipe; - - if (poly->user_vbuf == NULL || poly->dirty) { - poly->screen = pipe->screen; - poly->user_vbuf = poly->data; - poly->dirty = VG_FALSE; - } -} - -void polygon_fill(struct polygon *poly, struct vg_context *ctx) -{ - struct pipe_vertex_element velement; - struct pipe_vertex_buffer vbuffer; - VGfloat bounds[4]; - VGfloat min_x, min_y, max_x, max_y; - - assert(poly); - polygon_bounding_rect(poly, bounds); - min_x = bounds[0]; - min_y = bounds[1]; - max_x = bounds[0] + bounds[2]; - max_y = bounds[1] + bounds[3]; - -#if DEBUG_POLYGON - debug_printf("Poly bounds are [%f, %f], [%f, %f]\n", - min_x, min_y, max_x, max_y); -#endif - - polygon_prepare_buffer(ctx, poly); - - /* tell renderer about the vertex attributes */ - memset(&velement, 0, sizeof(velement)); - velement.src_offset = 0; - velement.instance_divisor = 0; - velement.vertex_buffer_index = 0; - velement.src_format = PIPE_FORMAT_R32G32_FLOAT; - - /* tell renderer about the vertex buffer */ - memset(&vbuffer, 0, sizeof(vbuffer)); - vbuffer.user_buffer = poly->user_vbuf; - vbuffer.stride = COMPONENTS * sizeof(float); /* vertex size */ - - renderer_polygon_stencil_begin(ctx->renderer, - &velement, ctx->state.vg.fill_rule, VG_FALSE); - renderer_polygon_stencil(ctx->renderer, &vbuffer, - PIPE_PRIM_TRIANGLE_FAN, 0, (VGuint) poly->num_verts); - renderer_polygon_stencil_end(ctx->renderer); - - renderer_polygon_fill_begin(ctx->renderer, VG_FALSE); - renderer_polygon_fill(ctx->renderer, min_x, min_y, max_x, max_y); - renderer_polygon_fill_end(ctx->renderer); -} - -void polygon_array_fill(struct polygon_array *polyarray, struct vg_context *ctx) -{ - struct array *polys = polyarray->array; - VGfloat min_x = polyarray->min_x; - VGfloat min_y = polyarray->min_y; - VGfloat max_x = polyarray->max_x; - VGfloat max_y = polyarray->max_y; - struct pipe_vertex_element velement; - struct pipe_vertex_buffer vbuffer; - VGint i; - - -#if DEBUG_POLYGON - debug_printf("%s: Poly bounds are [%f, %f], [%f, %f]\n", - __FUNCTION__, - min_x, min_y, max_x, max_y); -#endif - - /* tell renderer about the vertex attributes */ - memset(&velement, 0, sizeof(velement)); - velement.src_offset = 0; - velement.instance_divisor = 0; - velement.vertex_buffer_index = 0; - velement.src_format = PIPE_FORMAT_R32G32_FLOAT; - - /* tell renderer about the vertex buffer */ - memset(&vbuffer, 0, sizeof(vbuffer)); - vbuffer.stride = COMPONENTS * sizeof(float); /* vertex size */ - - /* prepare the stencil buffer */ - renderer_polygon_stencil_begin(ctx->renderer, - &velement, ctx->state.vg.fill_rule, VG_FALSE); - for (i = 0; i < polys->num_elements; ++i) { - struct polygon *poly = (((struct polygon**)polys->data)[i]); - - polygon_prepare_buffer(ctx, poly); - vbuffer.user_buffer = poly->user_vbuf; - - renderer_polygon_stencil(ctx->renderer, &vbuffer, - PIPE_PRIM_TRIANGLE_FAN, 0, (VGuint) poly->num_verts); - } - renderer_polygon_stencil_end(ctx->renderer); - - /* fill it */ - renderer_polygon_fill_begin(ctx->renderer, VG_FALSE); - renderer_polygon_fill(ctx->renderer, min_x, min_y, max_x, max_y); - renderer_polygon_fill_end(ctx->renderer); -} |