static void cdpoly(cdCtxCanvas *ctxcanvas, int mode, cdPoint* poly, int n) { int i; if (mode != CD_BEZIER && mode != CD_PATH) { for (i = 0; i < n; i++) { if (ctxcanvas->canvas->use_matrix) cdMatrixTransformPoint(ctxcanvas->xmatrix, poly[i].x, poly[i].y, &(poly[i].x), &(poly[i].y)); } } switch( mode ) { case CD_FILL: if (ctxcanvas->canvas->new_region) { GdkRegion* rgn = gdk_region_polygon((GdkPoint*)poly, n, ctxcanvas->canvas->fill_mode == CD_EVENODD ? GDK_EVEN_ODD_RULE : GDK_WINDING_RULE); sCombineRegion(ctxcanvas, rgn); } else gdk_draw_polygon(ctxcanvas->wnd, ctxcanvas->gc, TRUE, (GdkPoint*)poly, n); break; case CD_CLOSED_LINES: cdgdkCheckSolidStyle(ctxcanvas, 1); gdk_draw_polygon(ctxcanvas->wnd, ctxcanvas->gc, FALSE, (GdkPoint*)poly, n); cdgdkCheckSolidStyle(ctxcanvas, 0); break; case CD_OPEN_LINES: cdgdkCheckSolidStyle(ctxcanvas, 1); gdk_draw_lines(ctxcanvas->wnd, ctxcanvas->gc, (GdkPoint*)poly, n); cdgdkCheckSolidStyle(ctxcanvas, 0); break; case CD_CLIP: ctxcanvas->clip_rgn = gdk_region_polygon((GdkPoint*)poly, n, ctxcanvas->canvas->fill_mode == CD_EVENODD ? GDK_EVEN_ODD_RULE : GDK_WINDING_RULE); if (ctxcanvas->canvas->clip_mode == CD_CLIPPOLYGON) cdclip(ctxcanvas, CD_CLIPPOLYGON); break; case CD_BEZIER: cdSimPolyBezier(ctxcanvas->canvas, poly, n); break; case CD_PATH: cdSimPolyPath(ctxcanvas->canvas, poly, n); break; } }
void cdpolySIM(cdCtxCanvas* ctxcanvas, int mode, cdPoint* poly, int n) { cdCanvas* canvas = ((cdCtxCanvasBase*)ctxcanvas)->canvas; int i, reset = 1; switch(mode) { case CD_CLOSED_LINES: poly[n] = poly[0]; n++; /* continue */ case CD_OPEN_LINES: if (simLineStyleNoReset) /* Bezier simulation use several poly */ { reset = 0; simLineStyleNoReset = 1; } for (i = 0; i< n - 1; i++) canvas->cxLine(canvas->ctxcanvas, poly[i].x, poly[i].y, poly[i+1].x, poly[i+1].y); if (reset) simLineStyleNoReset = 0; break; case CD_BEZIER: simLineStyleNoReset = 1; cdSimPolyBezier(canvas, poly, n); simLineStyleNoReset = 0; break; case CD_FILL: { /* must set line attributes here, because fill simulation use cxLine */ int oldwidth = cdCanvasLineWidth(canvas, 1); int oldstyle = cdCanvasLineStyle(canvas, CD_CONTINUOUS); int old_use_matrix = canvas->use_matrix; if (canvas->use_matrix && !canvas->invert_yaxis) { for(i = 0; i < n; i++) cdMatrixTransformPoint(canvas->matrix, poly[i].x, poly[i].y, &poly[i].x, &poly[i].y); } /* must disable transformation here, because line simulation use cxPixel */ canvas->use_matrix = 0; simPolyFill(canvas->simulation, poly, n); canvas->use_matrix = old_use_matrix; cdCanvasLineStyle(canvas, oldstyle); cdCanvasLineWidth(canvas, oldwidth); } break; } }