1 #include "evas_gl_private.h"
6 evas_gl_common_poly_point_add(Evas_GL_Polygon *poly, int x, int y)
8 Evas_GL_Polygon_Point *pt;
10 if (!poly) poly = calloc(1, sizeof(Evas_GL_Polygon));
11 if (!poly) return NULL;
12 pt = calloc(1, sizeof(Evas_GL_Polygon_Point));
16 poly->points = evas_list_append(poly->points, pt);
22 evas_gl_common_poly_points_clear(Evas_GL_Polygon *poly)
24 if (!poly) return NULL;
27 Evas_GL_Polygon_Point *pt;
29 pt = poly->points->data;
30 poly->points = evas_list_remove(poly->points, pt);
33 if (poly->dl > 0) glDeleteLists(poly->dl, 1);
39 static void _evas_gl_tess_begin_cb(GLenum which);
40 static void _evas_gl_tess_end_cb(void);
41 static void _evas_gl_tess_error_cb(GLenum errorcode);
42 static void _evas_gl_tess_vertex_cb(GLvoid *vertex);
43 static void _evas_gl_tess_combine_cb(GLdouble coords[3], GLdouble *vertex_data[4], GLfloat weight[4], GLdouble **data_out);
46 _evas_gl_tess_begin_cb(GLenum which)
52 _evas_gl_tess_end_cb(void)
58 _evas_gl_tess_error_cb(GLenum errorcode)
63 _evas_gl_tess_vertex_cb(GLvoid *vertex)
68 glVertex2d(v[0], v[1]);
72 _evas_gl_tess_combine_cb(GLdouble coords[3], GLdouble *vertex_data[4], GLfloat weight[4], GLdouble **data_out)
76 vertex = (GLdouble *) malloc(6 * sizeof(GLdouble));
77 vertex[0] = coords[0];
78 vertex[1] = coords[1];
84 evas_gl_common_poly_draw(Evas_GL_Context *gc, Evas_GL_Polygon *poly)
88 static void *tess = NULL;
91 RGBA_Draw_Context *dc = gc->dc;
93 a = (dc->col.col >> 24) & 0xff;
94 r = (dc->col.col >> 16) & 0xff;
95 g = (dc->col.col >> 8 ) & 0xff;
96 b = (dc->col.col ) & 0xff;
97 evas_gl_common_context_color_set(gc, r, g, b, a);
98 if (a < 255) evas_gl_common_context_blend_set(gc, 1);
99 else evas_gl_common_context_blend_set(gc, 0);
101 evas_gl_common_context_clip_set(gc, 1,
102 dc->clip.x, dc->clip.y,
103 dc->clip.w, dc->clip.h);
105 evas_gl_common_context_clip_set(gc, 0,
107 evas_gl_common_context_texture_set(gc, NULL, 0, 0, 0);
108 evas_gl_common_context_read_buf_set(gc, GL_BACK);
109 evas_gl_common_context_write_buf_set(gc, GL_BACK);
111 if (poly->changed || poly->dl <= 0)
113 if (poly->dl > 0) glDeleteLists(poly->dl, 1);
114 poly->dl = glGenLists(1);
116 glNewList(poly->dl, GL_COMPILE_AND_EXECUTE);
122 gluTessCallback(tess, GLU_TESS_BEGIN, _evas_gl_tess_begin_cb);
123 gluTessCallback(tess, GLU_TESS_END, _evas_gl_tess_end_cb);
124 gluTessCallback(tess, GLU_TESS_ERROR, _evas_gl_tess_error_cb);
125 gluTessCallback(tess, GLU_TESS_VERTEX, _evas_gl_tess_vertex_cb);
126 gluTessCallback(tess, GLU_TESS_COMBINE, _evas_gl_tess_combine_cb);
129 num = evas_list_count(poly->points);
131 glp = malloc(num * 6 * sizeof(GLdouble));
132 gluTessNormal(tess, 0, 0, 1);
133 gluTessProperty(tess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD);
134 gluTessBeginPolygon(tess, NULL);
135 gluTessBeginContour(tess);
136 for (l = poly->points; l; l = l->next)
138 Evas_GL_Polygon_Point *p;
144 gluTessVertex(tess, &(glp[i - 3]), &(glp[i - 3]));
147 gluTessEndContour(tess);
148 gluTessEndPolygon(tess);
152 for (l = poly->points; l; l = l->next)
154 Evas_GL_Polygon_Point *p;
157 glVertex2i(p->x, p->y);
168 glCallList(poly->dl);