diff options
author | lecoanet | 2003-05-09 15:02:11 +0000 |
---|---|---|
committer | lecoanet | 2003-05-09 15:02:11 +0000 |
commit | 8f07676db7e61313ab560249a957fad293f0c333 (patch) | |
tree | e2476c29f63d1c3d5d22e71e846e5f3dd45aba61 /generic/Arc.c | |
parent | 78221195a8f1c5177a7bb0feb20fa2ce9b0575b7 (diff) | |
download | tkzinc-8f07676db7e61313ab560249a957fad293f0c333.zip tkzinc-8f07676db7e61313ab560249a957fad293f0c333.tar.gz tkzinc-8f07676db7e61313ab560249a957fad293f0c333.tar.bz2 tkzinc-8f07676db7e61313ab560249a957fad293f0c333.tar.xz |
* (Render): Fixed the pattern filling under openGL. Stippling
can't be used to fill patterns. Now texture mapping is used
instead. As a side effect -fillpattern and -tile use the same
internal variable reducing memory requirements.
Diffstat (limited to 'generic/Arc.c')
-rw-r--r-- | generic/Arc.c | 57 |
1 files changed, 21 insertions, 36 deletions
diff --git a/generic/Arc.c b/generic/Arc.c index 5b69992..147bf83 100644 --- a/generic/Arc.c +++ b/generic/Arc.c @@ -70,7 +70,6 @@ typedef struct _ArcItemStruct { int start_angle; int angle_extent; ZnImage line_pattern; - ZnImage fill_pattern; ZnGradient *fill_color; ZnGradient *line_color; ZnDim line_width; @@ -109,7 +108,7 @@ static ZnAttrConfig arc_attrs[] = { { ZN_CONFIG_BOOL, "-filled", NULL, Tk_Offset(ArcItemStruct, flags), FILLED_BIT, ZN_COORDS_FLAG, False }, { ZN_CONFIG_BITMAP, "-fillpattern", NULL, - Tk_Offset(ArcItemStruct, fill_pattern), 0, ZN_DRAW_FLAG, False }, + Tk_Offset(ArcItemStruct, tile), 0, ZN_DRAW_FLAG, False }, { ZN_CONFIG_LINE_END, "-firstend", NULL, Tk_Offset(ArcItemStruct, first_end), 0, ZN_COORDS_FLAG, False }, { ZN_CONFIG_LINE_END, "-lastend", NULL, @@ -177,7 +176,6 @@ Init(ZnItem item, CLEAR(arc->flags, PIE_SLICE_BIT); CLEAR(arc->flags, USING_POLY_BIT); arc->line_pattern = ZnUnspecifiedImage; - arc->fill_pattern = ZnUnspecifiedImage; arc->tile = ZnUnspecifiedImage; arc->line_style = ZN_LINE_SIMPLE; arc->line_width = 1; @@ -233,9 +231,6 @@ Clone(ZnItem item) if (arc->line_pattern != ZnUnspecifiedImage) { arc->line_pattern = ZnGetImageByValue(arc->line_pattern); } - if (arc->fill_pattern != ZnUnspecifiedImage) { - arc->fill_pattern = ZnGetImageByValue(arc->fill_pattern); - } arc->line_color = ZnGetGradientByValue(arc->line_color); arc->fill_color = ZnGetGradientByValue(arc->fill_color); arc->grad_geo = NULL; @@ -274,10 +269,6 @@ Destroy(ZnItem item) ZnFreeImage(arc->line_pattern); arc->line_pattern = ZnUnspecifiedImage; } - if (arc->fill_pattern != ZnUnspecifiedImage) { - ZnFreeImage(arc->fill_pattern); - arc->fill_pattern = ZnUnspecifiedImage; - } if (arc->grad_geo) { ZnFree(arc->grad_geo); } @@ -1017,23 +1008,25 @@ Draw(ZnItem item) if (ISSET(arc->flags, FILLED_BIT)) { values.foreground = ZnPixel(ZnGetGradientColor(arc->fill_color, 0.0, NULL)); values.arc_mode = ISSET(arc->flags, PIE_SLICE_BIT) ? ArcPieSlice : ArcChord; - if (arc->tile != ZnUnspecifiedImage) { /* Fill Tiled */ - values.fill_style = FillTiled; - values.tile = ZnImagePixmap(arc->tile); - values.ts_x_origin = (int) item->item_bounding_box.orig.x; - values.ts_y_origin = (int) item->item_bounding_box.orig.y; - XChangeGC(wi->dpy, wi->gc, - GCTileStipXOrigin|GCTileStipYOrigin|GCFillStyle|GCTile|GCArcMode, - &values); - } - else if (arc->fill_pattern != ZnUnspecifiedImage) { /* Fill stippled */ - values.fill_style = FillStippled; - values.stipple = ZnImagePixmap(arc->fill_pattern); - values.ts_x_origin = (int) item->item_bounding_box.orig.x; - values.ts_y_origin = (int) item->item_bounding_box.orig.y; - XChangeGC(wi->dpy, wi->gc, - GCTileStipXOrigin|GCTileStipYOrigin|GCFillStyle|GCStipple|GCForeground|GCArcMode, - &values); + if (arc->tile != ZnUnspecifiedImage) { + if (!ZnImageIsBitmap(arc->tile)) { /* Fill tiled */ + values.fill_style = FillTiled; + values.tile = ZnImagePixmap(arc->tile); + values.ts_x_origin = (int) item->item_bounding_box.orig.x; + values.ts_y_origin = (int) item->item_bounding_box.orig.y; + XChangeGC(wi->dpy, wi->gc, + GCTileStipXOrigin|GCTileStipYOrigin|GCFillStyle|GCTile|GCArcMode, + &values); + } + else { /* Fill stippled */ + values.fill_style = FillStippled; + values.stipple = ZnImagePixmap(arc->tile); + values.ts_x_origin = (int) item->item_bounding_box.orig.x; + values.ts_y_origin = (int) item->item_bounding_box.orig.y; + XChangeGC(wi->dpy, wi->gc, + GCTileStipXOrigin|GCTileStipYOrigin|GCFillStyle|GCStipple|GCForeground|GCArcMode, + &values); + } } else { /* Fill solid */ values.fill_style = FillSolid; @@ -1231,23 +1224,15 @@ Render(ZnItem item) ZnRenderGradient(wi, arc->fill_color, ArcRenderCB, arc, arc->grad_geo, &poly); } - else if (arc->tile != ZnUnspecifiedImage) { /* Fill tiled */ + else if (arc->tile != ZnUnspecifiedImage) { /* Fill tiled/stippled */ ZnRenderTile(wi, arc->tile, arc->fill_color, ArcRenderCB, arc, (ZnPoint *) &item->item_bounding_box); } else { - if (arc->fill_pattern != ZnUnspecifiedImage) { /* Fill stippled */ - /* - * Setup polygon stippling. - */ - glEnable(GL_POLYGON_STIPPLE); - glPolygonStipple(ZnImageMask(arc->fill_pattern, NULL)); - } color = ZnGetGradientColor(arc->fill_color, 0.0, &alpha); alpha = ZnComposeAlpha(alpha, wi->alpha); glColor4us(color->red, color->green, color->blue, alpha); ArcRenderCB(arc); - glDisable(GL_POLYGON_STIPPLE); } } |