aboutsummaryrefslogtreecommitdiff
path: root/generic/Arc.c
diff options
context:
space:
mode:
authorlecoanet2003-05-09 15:02:11 +0000
committerlecoanet2003-05-09 15:02:11 +0000
commit8f07676db7e61313ab560249a957fad293f0c333 (patch)
treee2476c29f63d1c3d5d22e71e846e5f3dd45aba61 /generic/Arc.c
parent78221195a8f1c5177a7bb0feb20fa2ce9b0575b7 (diff)
downloadtkzinc-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.c57
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);
}
}