diff options
-rw-r--r-- | Bezier.c | 164 |
1 files changed, 59 insertions, 105 deletions
@@ -77,14 +77,13 @@ typedef struct _BezierItemStruct { int cap_style; ReliefStyle relief; ZnDim line_width; /* If 0 the path is not drawn, if <2 relief is flat */ - Pixmap fill_pattern; + ZnImage fill_pattern; ZnGradient *fill_color; - Pixmap line_pattern; + ZnImage line_pattern; ZnGradient *line_color; - char *tile_name; + ZnImage tile; /* Private data */ - ZnImage tile; ZnList dev_points; ZnGradient *gradient; ZnTriStrip tristrip; @@ -96,6 +95,9 @@ static ZnAttrConfig bz_attrs[] = { { ZN_CONFIG_CAP_STYLE, "-capstyle", NULL, Tk_Offset(BezierItemStruct, cap_style), 0, ZN_COORDS_FLAG, False }, + { ZN_CONFIG_BOOL, "-composealpha", NULL, + Tk_Offset(BezierItemStruct, header.flags), COMPOSE_ALPHA_BIT, + ZN_DRAW_FLAG, False }, { ZN_CONFIG_BOOL, "-composerotation", NULL, Tk_Offset(BezierItemStruct, header.flags), COMPOSE_ROTATION_BIT, ZN_COORDS_FLAG, False }, @@ -105,7 +107,7 @@ static ZnAttrConfig bz_attrs[] = { { ZN_CONFIG_GRADIENT, "-fillcolor", NULL, Tk_Offset(BezierItemStruct, fill_color), 0, ZN_COORDS_FLAG|ZN_BORDER_FLAG, False }, - { ZN_CONFIG_PATTERN, "-fillpattern", NULL, + { ZN_CONFIG_BITMAP, "-fillpattern", NULL, Tk_Offset(BezierItemStruct, fill_pattern), 0, ZN_DRAW_FLAG, False }, { ZN_CONFIG_BOOL, "-filled", NULL, Tk_Offset(BezierItemStruct, flags), FILLED_BIT, ZN_COORDS_FLAG, False }, @@ -116,7 +118,7 @@ static ZnAttrConfig bz_attrs[] = { { ZN_CONFIG_GRADIENT, "-linecolor", NULL, Tk_Offset(BezierItemStruct, line_color), 0, ZN_DRAW_FLAG, False }, - { ZN_CONFIG_PATTERN, "-linepattern", NULL, + { ZN_CONFIG_BITMAP, "-linepattern", NULL, Tk_Offset(BezierItemStruct, line_pattern), 0, ZN_DRAW_FLAG, False }, { ZN_CONFIG_LINE_STYLE, "-linestyle", NULL, Tk_Offset(BezierItemStruct, line_style), 0, ZN_DRAW_FLAG, False }, @@ -130,11 +132,10 @@ static ZnAttrConfig bz_attrs[] = { { ZN_CONFIG_BOOL, "-sensitive", NULL, Tk_Offset(BezierItemStruct, header.flags), SENSITIVE_BIT, ZN_REPICK_FLAG, False }, - { ZN_CONFIG_TAGS, "-tags", NULL, + { ZN_CONFIG_TAG_LIST, "-tags", NULL, Tk_Offset(BezierItemStruct, header.tags), 0, 0, False }, { ZN_CONFIG_IMAGE, "-tile", NULL, - Tk_Offset(BezierItemStruct, tile_name), 0, - ZN_DRAW_FLAG|ZN_TILE_FLAG, False }, + Tk_Offset(BezierItemStruct, tile), 0, ZN_DRAW_FLAG, False }, { ZN_CONFIG_BOOL, "-visible", NULL, Tk_Offset(BezierItemStruct, header.flags), VISIBLE_BIT, ZN_DRAW_FLAG|ZN_REPICK_FLAG|ZN_VIS_FLAG, False }, @@ -143,28 +144,6 @@ static ZnAttrConfig bz_attrs[] = { }; -/* - ********************************************************************************** - * - * BzTileChange -- - * - ********************************************************************************** - */ -static void -BzTileChange(ClientData client_data, - int x, - int y, - int width, - int height, - int image_width, - int image_height) -{ - BezierItem bz = (BezierItem) client_data; - - InvalidateImage(bz->tile_name); - ITEM.Invalidate((Item) bz, ZN_COORDS_FLAG); -} - /* ********************************************************************************** @@ -192,6 +171,7 @@ Init(Item item, /* Init attributes */ SET(item->flags, VISIBLE_BIT); SET(item->flags, SENSITIVE_BIT); + SET(item->flags, COMPOSE_ALPHA_BIT); SET(item->flags, COMPOSE_ROTATION_BIT); SET(item->flags, COMPOSE_SCALE_BIT); item->priority = DEFAULT_BEZIER_PRIORITY; @@ -229,10 +209,9 @@ Init(Item item, bz->line_style = LINE_SIMPLE; bz->relief = RELIEF_FLAT; bz->line_width = 1; - bz->tile_name = ""; bz->tile = ZnUnspecifiedImage; - bz->fill_pattern = ZnUnspecifiedPattern; - bz->line_pattern = ZnUnspecifiedPattern; + bz->fill_pattern = ZnUnspecifiedImage; + bz->line_pattern = ZnUnspecifiedImage; bz->cap_style = CapRound; bz->fill_color = ZnGetGradientByValue(wi->fore_color); @@ -253,8 +232,6 @@ static void Clone(Item item) { BezierItem bz = (BezierItem) item; - WidgetInfo *wi = item->wi; - char *text; bz->dev_points = NULL; bz->tristrip.num_strips = 0; @@ -270,10 +247,6 @@ Clone(Item item) if (bz->points) { bz->points = ZnListDuplicate(bz->points); } - if (bz->line_pattern != ZnUnspecifiedPattern) { - bz->line_pattern = Tk_GetBitmap(wi->interp, wi->win, - Tk_NameOfBitmap(wi->dpy, bz->line_pattern)); - } if (bz->first_end) { LineEndDuplicate(bz->first_end); } @@ -281,15 +254,13 @@ Clone(Item item) LineEndDuplicate(bz->last_end); } if (bz->tile != ZnUnspecifiedImage) { - text = ZnMalloc((strlen(bz->tile_name) + 1) * sizeof(char)); - strcpy(text, bz->tile_name); - bz->tile_name = text; - bz->tile = Tk_GetImage(wi->interp, wi->win, bz->tile_name, - BzTileChange, (ClientData) bz); + bz->tile = ZnGetImageByValue(bz->tile); + } + if (bz->line_pattern != ZnUnspecifiedImage) { + bz->line_pattern = ZnGetImageByValue(bz->line_pattern); } - if (bz->fill_pattern != ZnUnspecifiedPattern) { - bz->fill_pattern = Tk_GetBitmap(wi->interp, wi->win, - Tk_NameOfBitmap(wi->dpy, bz->fill_pattern)); + if (bz->fill_pattern != ZnUnspecifiedImage) { + bz->fill_pattern = ZnGetImageByValue(bz->fill_pattern); } bz->line_color = ZnGetGradientByValue(bz->line_color); bz->fill_color = ZnGetGradientByValue(bz->fill_color); @@ -306,8 +277,7 @@ Clone(Item item) static void Destroy(Item item) { - WidgetInfo *wi = item->wi; - BezierItem bz = (BezierItem) item; + BezierItem bz = (BezierItem) item; if (bz->points) { ZnListFree(bz->points); @@ -331,17 +301,16 @@ Destroy(Item item) ZnFreeGradient(bz->gradient); } if (bz->tile != ZnUnspecifiedImage) { - Tk_FreeImage(bz->tile); + ZnFreeImage(bz->tile); bz->tile = ZnUnspecifiedImage; } - if (strlen(bz->tile_name) != 0) { - ZnFree(bz->tile_name); - } - if (bz->line_pattern != ZnUnspecifiedPattern) { - Tk_FreeBitmap(wi->dpy, bz->line_pattern); + if (bz->line_pattern != ZnUnspecifiedImage) { + ZnFreeImage(bz->line_pattern); + bz->line_pattern = ZnUnspecifiedImage; } - if (bz->fill_pattern != ZnUnspecifiedPattern) { - Tk_FreeBitmap(wi->dpy, bz->fill_pattern); + if (bz->fill_pattern != ZnUnspecifiedImage) { + ZnFreeImage(bz->fill_pattern); + bz->fill_pattern = ZnUnspecifiedImage; } ZnFreeGradient(bz->fill_color); ZnFreeGradient(bz->line_color); @@ -412,12 +381,6 @@ Configure(Item item, status = ZN_ERROR; } } - if (ISSET(*flags, ZN_TILE_FLAG)) { - if (ValidateImage(wi, item, bz->tile_name, BzTileChange, - &bz->tile, "bezier -tile") == ZN_ERROR) { - status = ZN_ERROR; - } - } return status; } @@ -539,8 +502,8 @@ ComputeCoordinates(Item item, /* * Compute the bounding box. */ - GetPolygonReliefBBox(dev_points, num_points, - ISCLEAR(bz->flags, CCW)?-lw:lw, &bbox); + ZnGetPolygonReliefBBox(dev_points, num_points, + ISCLEAR(bz->flags, CCW)?-lw:lw, &bbox); AddBBoxToBBox(&item->item_bounding_box, &bbox); return; } @@ -592,13 +555,13 @@ ComputeCoordinates(Item item, } if (bz->fill_color->type == ZN_AXIAL_GRADIENT) { POLY_CONTOUR1(&poly, points, num_points); - ComputeAxialGradient(wi, &poly, bz->fill_color->g.angle, - bz->grad_geo); + ZnComputeAxialGradient(wi, &poly, bz->fill_color->g.angle, + bz->grad_geo); } else if (bz->fill_color->type == ZN_RADIAL_GRADIENT) { POLY_CONTOUR1(&poly, dev_points, num_points); - ComputeRadialGradient(wi, &poly, &item->item_bounding_box, - &bz->fill_color->g.p, bz->grad_geo); + ZnComputeRadialGradient(wi, &poly, &item->item_bounding_box, + &bz->fill_color->g.p, bz->grad_geo); } else if (bz->fill_color->type == ZN_PATH_GRADIENT) { ZnTransformPoint(wi->current_transfo, &bz->fill_color->g.p, @@ -626,10 +589,7 @@ ComputeCoordinates(Item item, */ static int ToArea(Item item, - ZnBBox *area, - Tk_Uid tag_uid, - int enclosed, - ZnBool report) + ZnToArea ta) { BezierItem bz = (BezierItem) item; WidgetInfo *wi = item->wi; @@ -637,6 +597,7 @@ ToArea(Item item, ZnPoint end_points[LINE_END_POINTS]; int num_points, result=-1, result2; int lw = bz->line_width; + ZnBBox *area = ta->area; if (bz->dev_points == NULL) { return -1; @@ -660,8 +621,8 @@ ToArea(Item item, bz->cap_style, JoinRound, area); } else { - result2 = PolygonReliefInBBox(points, num_points, - ISCLEAR(bz->flags, CCW)?-lw:lw, area); + result2 = ZnPolygonReliefInBBox(points, num_points, + ISCLEAR(bz->flags, CCW)?-lw:lw, area); } if (ISCLEAR(bz->flags, FILLED_OK)) { if (result2 == 0) { @@ -730,16 +691,15 @@ Draw(Item item) values.foreground = ZnPixel(ZnGetGradientColor(bz->fill_color, 0.0, NULL)); gc_mask = GCFillStyle; if (bz->tile != ZnUnspecifiedImage) { /* Fill tiled */ - Pixmap pmap = GetImagePixmap(wi->win, bz->tile_name, bz->tile, NULL); values.fill_style = FillTiled; - values.tile = pmap; + values.tile = ZnImagePixmap(bz->tile, NULL); values.ts_x_origin = REAL_TO_INT(item->item_bounding_box.orig.x); values.ts_y_origin = REAL_TO_INT(item->item_bounding_box.orig.y); gc_mask |= GCTileStipXOrigin|GCTileStipYOrigin|GCTile; } - else if (bz->fill_pattern != ZnUnspecifiedPattern) { /* Fill stippled */ + else if (bz->fill_pattern != ZnUnspecifiedImage) { /* Fill stippled */ values.fill_style = FillStippled; - values.stipple = bz->fill_pattern; + values.stipple = ZnImagePixmap(bz->fill_pattern, NULL); values.ts_x_origin = REAL_TO_INT(item->item_bounding_box.orig.x); values.ts_y_origin = REAL_TO_INT(item->item_bounding_box.orig.y); gc_mask |= GCTileStipXOrigin|GCTileStipYOrigin|GCStipple|GCForeground; @@ -788,22 +748,22 @@ Draw(Item item) } relief = (relief & ~RELIEF_MASK) | relief_dir; } - DrawPolygonRelief(wi, relief, bz->gradient, points, num_points, lw); + ZnDrawPolygonRelief(wi, relief, bz->gradient, points, num_points, lw); } else { - SetLineStyle(wi, bz->line_style); + ZnSetLineStyle(wi, bz->line_style); values.foreground = ZnPixel(ZnGetGradientColor(bz->line_color, 0, NULL)); values.line_width = (lw == 1) ? 0 : lw; values.join_style = JoinRound; values.cap_style = bz->cap_style; - if (bz->line_pattern == ZnUnspecifiedPattern) { + if (bz->line_pattern == ZnUnspecifiedImage) { values.fill_style = FillSolid; XChangeGC(wi->dpy, wi->gc, GCFillStyle|GCLineWidth|GCJoinStyle|GCCapStyle|GCForeground, &values); } else { values.fill_style = FillStippled; - values.stipple = bz->line_pattern; + values.stipple = ZnImagePixmap(bz->line_pattern, NULL); XChangeGC(wi->dpy, wi->gc, GCFillStyle|GCStipple|GCLineWidth|GCJoinStyle|GCCapStyle|GCForeground, &values); @@ -909,21 +869,20 @@ Render(Item item) ZnPoly poly; POLY_CONTOUR1(&poly, points, num_points); - RenderGradient(wi, bz->fill_color, BezierRenderCB, bz, - bz->grad_geo, &poly); + ZnRenderGradient(wi, bz->fill_color, BezierRenderCB, bz, + bz->grad_geo, &poly); } else if (bz->tile != ZnUnspecifiedImage) { /* Fill tiled */ - RenderTile(wi, GetImageTexture(wi->win, bz->tile_name, bz->tile), - bz->fill_color, BezierRenderCB, bz, - (ZnPoint *) &item->item_bounding_box); + ZnRenderTile(wi, bz->tile, bz->fill_color, BezierRenderCB, bz, + (ZnPoint *) &item->item_bounding_box); } else { - if (bz->fill_pattern != ZnUnspecifiedPattern) { /* Fill stippled */ + if (bz->fill_pattern != ZnUnspecifiedImage) { /* Fill stippled */ /* * Setup polygon stippling. */ glEnable(GL_POLYGON_STIPPLE); - glPolygonStipple(GetBitmapMask(wi->dpy, bz->fill_pattern)->pixels); + glPolygonStipple(ZnImagePattern(bz->fill_pattern, NULL)); } color = ZnGetGradientColor(bz->fill_color, 0.0, &alpha); alpha = ZnComposeAlpha(alpha, wi->alpha); @@ -958,16 +917,16 @@ Render(Item item) } relief = (relief & ~RELIEF_MASK) | relief_dir; } - RenderPolygonRelief(wi, relief, bz->gradient, True, - points, num_points, line_width); + ZnRenderPolygonRelief(wi, relief, bz->gradient, True, + points, num_points, line_width); } else { ZnLineEnd first = ISSET(bz->flags, FIRST_END_OK) ? bz->first_end : NULL; ZnLineEnd last = ISSET(bz->flags, LAST_END_OK) ? bz->last_end : NULL; - RenderPolyline(wi, points, num_points, - bz->line_width, bz->line_style, bz->cap_style, JoinRound, - first, last, bz->line_color); + ZnRenderPolyline(wi, points, num_points, + bz->line_width, bz->line_style, bz->cap_style, + JoinRound, first, last, bz->line_color); } } #endif @@ -999,16 +958,12 @@ IsSensitive(Item item, */ static double Pick(Item item, - ZnPoint *p, - Item start_item, - int aperture, - Item *a_item, - int *part) + ZnPick ps) { BezierItem bz = (BezierItem) item; WidgetInfo *wi = item->wi; double dist=1.0e40, new_dist; - ZnPoint *points; + ZnPoint *points, *p = ps->point; ZnPoint end_points[LINE_END_POINTS]; int num_points; int lw = bz->line_width; @@ -1041,8 +996,8 @@ Pick(Item item, } } else { - new_dist = PolygonReliefToPointDist(points, num_points, - ISCLEAR(bz->flags, CCW)?-lw:lw, p); + new_dist = ZnPolygonReliefToPointDist(points, num_points, + ISCLEAR(bz->flags, CCW)?-lw:lw, p); if (new_dist < dist) { dist = new_dist; } @@ -1370,7 +1325,6 @@ PickVertex(Item item, */ static ItemClassStruct BEZIER_ITEM_CLASS = { sizeof(BezierItemStruct), - False, /* has_fields */ 0, /* num_parts */ False, /* has_anchors */ "bezier", |