From 53d07f06f02af7e7c800743f37f120dfb8954613 Mon Sep 17 00:00:00 2001 From: lecoanet Date: Fri, 9 May 2003 14:59:23 +0000 Subject: * (Render): Fixed the marker stippling for openGL --- generic/Track.c | 57 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 15 deletions(-) (limited to 'generic') diff --git a/generic/Track.c b/generic/Track.c index 95f6ac1..7a7e045 100644 --- a/generic/Track.c +++ b/generic/Track.c @@ -1300,6 +1300,28 @@ Draw(ZnItem item) ********************************************************************************** */ #ifdef GL +struct MarkerCBData { + ZnPoint *p; + int num; + ZnReal size; + ZnPoint center; +}; + +static void +MarkerRenderCB(void *closure) +{ + struct MarkerCBData *cbd = (struct MarkerCBData *) closure; + int i; + + glBegin(GL_TRIANGLE_FAN); + glVertex2d(cbd->center.x, cbd->center.y); + for (i = 0; i < cbd->num; i++) { + glVertex2d(cbd->center.x + cbd->p[i].x*cbd->size, + cbd->center.y + cbd->p[i].y*cbd->size); + } + glEnd(); +} + static void Render(ZnItem item) { @@ -1314,31 +1336,36 @@ Render(ZnItem item) ZnPoint *points; unsigned int num_points; ZnReal x0, y0, size; - + /* Draw the marker */ if (track->marker_size_dev != 0) { points = ZnGetCirclePoints(3, ZN_CIRCLE_MEDIUM, 0.0, 2*M_PI, &num_points, NULL); x0 = track->dev.x; y0 = track->dev.y; size = track->marker_size_dev; - color = ZnGetGradientColor(track->marker_color, 0.0, &alpha); - alpha = ZnComposeAlpha(alpha, wi->alpha); - glColor4us(color->red, color->green, color->blue, alpha); if (ISSET(track->flags, MARKER_FILLED_BIT)) { + ZnBBox bbox; + struct MarkerCBData cbd; + + cbd.center.x = x0; + cbd.center.y = y0; + cbd.num = num_points; + cbd.size = size; + cbd.p = points; glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - if (track->marker_fill_pattern != ZnUnspecifiedImage) { /* Fill stippled */ - /* - * Setup polygon stippling. - */ - glEnable(GL_POLYGON_STIPPLE); - glPolygonStipple(ZnImageMask(track->marker_fill_pattern, NULL)); + if (track->marker_fill_pattern != ZnUnspecifiedImage) { /* Fill stippled */ + ZnResetBBox(&bbox); + ZnAddPointToBBox(&bbox, track->dev.x-size, track->dev.y-size); + ZnAddPointToBBox(&bbox, track->dev.x+size, track->dev.y+size); + ZnRenderTile(wi, track->marker_fill_pattern, track->marker_color, + MarkerRenderCB, &cbd, (ZnPoint *) &bbox); } - glBegin(GL_TRIANGLE_FAN); - for (i = 0; i < num_points; i++) { - glVertex2d(x0, y0); - glVertex2d(x0 + points[i].x*size, y0 + points[i].y*size); + else { + color = ZnGetGradientColor(track->marker_color, 0.0, &alpha); + alpha = ZnComposeAlpha(alpha, wi->alpha); + glColor4us(color->red, color->green, color->blue, alpha); + MarkerRenderCB(&cbd); } - glEnd(); } else { glLineWidth(1.0); -- cgit v1.1