diff options
Diffstat (limited to 'generic/Curve.c')
-rw-r--r-- | generic/Curve.c | 126 |
1 files changed, 20 insertions, 106 deletions
diff --git a/generic/Curve.c b/generic/Curve.c index e0444bd..1363231 100644 --- a/generic/Curve.c +++ b/generic/Curve.c @@ -37,9 +37,6 @@ #ifdef GPC #include "gpc/gpc.h" #endif -#ifdef GLX -#include <GL/tube.h> -#endif #include <ctype.h> #include <malloc.h> @@ -369,7 +366,7 @@ Destroy(Item item) { WidgetInfo *wi = item->wi; CurveItem cv = (CurveItem) item; - + POLY_FREE(&cv->shape); if (cv->grad_geo) { ZnFree(cv->grad_geo); @@ -441,7 +438,6 @@ SetRenderFlags(CurveItem cv) ISCLEAR(cv->flags, FILLED_BIT) && cv->line_width && ISCLEAR(cv->flags, RELIEF_OK) && ISCLEAR(cv->flags, CLOSED_BIT)); - ASSIGN(cv->flags, LAST_END_OK, (cv->last_end != NULL) && (cv->shape.num_contours == 1) && (cv->shape.contours[0].num_points > 1) && @@ -815,7 +811,7 @@ ComputeCoordinates(Item item, &cv->fill_color->g.p, cv->grad_geo); } else if (cv->fill_color->type == ZN_PATH_GRADIENT) { - ZnTransformPoint(wi->current_transfo, &cv->fill_color->g.p, &cv->grad_geo[0]); + ZnTransformPoint(wi->current_transfo, &cv->fill_color->g.p, &cv->grad_geo[0]); } } else { @@ -1242,7 +1238,7 @@ Render(Item item) #ifdef GLX WidgetInfo *wi = item->wi; CurveItem cv = (CurveItem) item; - int i, j, num_points; + int j, num_points; ZnPoint *points; XColor *color; int alpha; @@ -1261,11 +1257,13 @@ Render(Item item) if (ISSET(cv->flags, FILLED_OK)) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); if (!ZnGradientFlat(cv->fill_color)) { - RenderGradient(wi, cv->fill_color, CurveRenderCB, cv, cv->grad_geo, &cv->dev_shape); + RenderGradient(wi, cv->fill_color, CurveRenderCB, cv, cv->grad_geo, + &cv->dev_shape); } else if (cv->tile != ZnUnspecifiedImage) { /* Fill tiled */ RenderTile(wi, GetImageTexture(wi->win, cv->tile_name, cv->tile), - cv->fill_color, CurveRenderCB, cv, (ZnPoint *) &item->item_bounding_box); + cv->fill_color, CurveRenderCB, cv, + (ZnPoint *) &item->item_bounding_box); } else { if (cv->fill_pattern != ZnUnspecifiedPattern) { /* Fill stippled */ @@ -1323,99 +1321,17 @@ Render(Item item) } } else { - color = cv->line_color; - glColor4us(color->red, color->green, color->blue, alpha); - if ((cv->line_width <= wi->max_line_width) && - (cv->line_width <= wi->max_point_width)) { - glLineWidth(cv->line_width); - SetLineStyle(wi, cv->line_style); - for (j = 0; j < cv->dev_shape.num_contours; j++) { - num_points = cv->dev_shape.contours[j].num_points; - points = cv->dev_shape.contours[j].points; - if (ISSET(cv->flags, CLOSED_BIT)) { - glBegin(GL_LINE_LOOP); - } - else { - glBegin(GL_LINE_STRIP); - } - for (i = 0; i < num_points; i++) { - glVertex2f(points[i].x, points[i].y); - } - glEnd(); - } - if (cv->line_width > 1) { - glPointSize(cv->line_width); - for (j = 0; j < cv->dev_shape.num_contours; j++) { - num_points = cv->dev_shape.contours[j].num_points; - points = cv->dev_shape.contours[j].points; - glBegin(GL_POINTS); - for (i = 0; i < num_points; i++) { - glVertex2f(points[i].x, points[i].y); - } - glEnd(); - } - } - } - else { - double lw_2 = (double) cv->line_width / 2.0; - double section[2][2] = { { 0.0, -lw_2 }, { 0.0, lw_2 } }; - double up[3] = { 1.0, 0.0, 0.0 }; - double (*gl_pts)[3]; - int style, num; - - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - for (j = 0; j < cv->dev_shape.num_contours; j++) { - num_points = cv->dev_shape.contours[j].num_points; - points = cv->dev_shape.contours[j].points; - ZnListAssertSize(wi->work_doubles, (num_points+3)*3); - gl_pts = (void *) ZnListArray(wi->work_doubles); - if (ISSET(cv->flags, CLOSED_BIT)) { - gl_pts[0][0] = points[num_points-1].x; - gl_pts[0][1] = points[num_points-1].y; - gl_pts[0][2] = 0; - gl_pts[num_points+1][0] = points[0].x; - gl_pts[num_points+1][1] = points[0].y; - gl_pts[num_points+1][2] = 0; - gl_pts[num_points+2][0] = points[1].x; - gl_pts[num_points+2][1] = points[1].y; - gl_pts[num_points+2][2] = 0; - } - else { - gl_pts[0][0] = points[0].x; - gl_pts[1][1] = points[0].y; - gl_pts[2][2] = 0; - gl_pts[num_points+1][0] = points[num_points-1].x; - gl_pts[num_points+1][1] = points[num_points-1].y; - gl_pts[num_points+1][2] = 0; - } - for (i = 0; i < num_points; i++) { - gl_pts[i+1][0] = points[i].x; - gl_pts[i+1][1] = points[i].y; - gl_pts[i+1][2] = 0; - } - switch (cv->join_style) { - case JoinRound: - style = TUBE_JN_ROUND; - break; - case JoinMiter: - style = TUBE_JN_ANGLE; - break; - case JoinBevel: - style = TUBE_JN_CUT; - break; - } - if (cv->cap_style == CapRound) { - style |= TUBE_JN_CAP; - } - style |= TUBE_CONTOUR_CLOSED; - - num = num_points+2; - if (ISSET(cv->flags, CLOSED_BIT)) { - num++; - } - gleSetJoinStyle(style); - gleExtrusion(2, section, NULL, up, num, gl_pts, NULL); - } + ZnLineEnd first = ISSET(cv->flags, FIRST_END_OK) ? cv->first_end : NULL; + ZnLineEnd last = ISSET(cv->flags, LAST_END_OK) ? cv->last_end : NULL; + ZnBool closed = ISSET(cv->flags, CLOSED_BIT); + + for (j = 0; j < cv->dev_shape.num_contours; j++) { + RenderPolyline(wi, + cv->dev_shape.contours[j].points, + cv->dev_shape.contours[j].num_points, + cv->line_width, closed, + cv->line_style, cv->cap_style, cv->join_style, + first, last, cv->line_color, alpha); } } } @@ -1918,11 +1834,9 @@ Contour(Item item, POLY_INIT(&rpoly); gpc_polygon_clip(cmd, (gpc_polygon *) &cv->shape, (gpc_polygon *) poly, (gpc_polygon *) &rpoly); + POLY_SET(&cv->shape, &rpoly); - /*printf("cmd %d, num contours %d, num vertices %d\n", - cmd, - cv->shape.num_contours, - cv->shape.contours[0].num_points);*/ + ITEM.Invalidate(item, ZN_COORDS_FLAG); } #endif |