From f8c4a63cf27597af47f88363b45abfc0f869e660 Mon Sep 17 00:00:00 2001 From: lecoanet Date: Thu, 16 May 2002 09:40:36 +0000 Subject: Adaptation suite au remaniement du code des images. Ajout de l'attribut -composealpha. Mise en correspondance des types d'attributs avec la doc. Adaptation des prototypes de ToArea et Pick pour accomoder les nouvelles fonctionalit�s des commandes de find/addtag. Suppression de la variable de classe has_fields --- generic/Icon.c | 220 ++++++++++++++++++++++----------------------------------- 1 file changed, 84 insertions(+), 136 deletions(-) (limited to 'generic/Icon.c') diff --git a/generic/Icon.c b/generic/Icon.c index d3812ed..37dc235 100644 --- a/generic/Icon.c +++ b/generic/Icon.c @@ -51,16 +51,15 @@ typedef struct _IconItemStruct { /* Public data */ ZnPoint pos; - char *image_name; + ZnImage image; ZnAnchor anchor; ZnAnchor connection_anchor; - Pixmap mask; /* Used only if the image is *NOT* specified */ - ZnGradient *color; /* Used only with the mask in GLX (alpha part + ZnImage mask; /* Used only if the image is *NOT* specified */ + ZnGradient *color; /* Used only with the mask (in GLX alpha part * is always meaningful). */ /* Private data */ ZnPoint pos_dev; - ZnImage image; } IconItemStruct, *IconItem; @@ -69,6 +68,9 @@ static ZnAttrConfig icon_attrs[] = { Tk_Offset(IconItemStruct, anchor), 0, ZN_COORDS_FLAG, False }, { ZN_CONFIG_GRADIENT, "-color", NULL, Tk_Offset(IconItemStruct, color), 0, ZN_DRAW_FLAG, False }, + { ZN_CONFIG_BOOL, "-composealpha", NULL, + Tk_Offset(IconItemStruct, header.flags), COMPOSE_ALPHA_BIT, + ZN_DRAW_FLAG, False }, { ZN_CONFIG_BOOL, "-composerotation", NULL, Tk_Offset(IconItemStruct, header.flags), COMPOSE_ROTATION_BIT, ZN_COORDS_FLAG, False }, @@ -81,9 +83,8 @@ static ZnAttrConfig icon_attrs[] = { { ZN_CONFIG_ANCHOR, "-connectionanchor", NULL, Tk_Offset(IconItemStruct, connection_anchor), 0, ZN_COORDS_FLAG, False }, { ZN_CONFIG_IMAGE, "-image", NULL, - Tk_Offset(IconItemStruct, image_name), 0, - ZN_COORDS_FLAG|ZN_IMAGE_FLAG, False }, - { ZN_CONFIG_PATTERN, "-mask", NULL, + Tk_Offset(IconItemStruct, image), 0, ZN_COORDS_FLAG, False }, + { ZN_CONFIG_BITMAP, "-mask", NULL, Tk_Offset(IconItemStruct, mask), 0, ZN_DRAW_FLAG|ZN_REPICK_FLAG, False }, { ZN_CONFIG_POINT, "-position", NULL, Tk_Offset(IconItemStruct, pos), 0, ZN_COORDS_FLAG, False}, @@ -93,7 +94,7 @@ static ZnAttrConfig icon_attrs[] = { { ZN_CONFIG_BOOL, "-sensitive", NULL, Tk_Offset(IconItemStruct, header.flags), SENSITIVE_BIT, ZN_REPICK_FLAG, False }, - { ZN_CONFIG_TAGS, "-tags", NULL, + { ZN_CONFIG_TAG_LIST, "-tags", NULL, Tk_Offset(IconItemStruct, header.tags), 0, 0, False }, { ZN_CONFIG_BOOL, "-visible", NULL, Tk_Offset(IconItemStruct, header.flags), VISIBLE_BIT, @@ -103,28 +104,6 @@ static ZnAttrConfig icon_attrs[] = { }; -/* - ********************************************************************************** - * - * IconImageChange -- - * - ********************************************************************************** - */ -static void -IconImageChange(ClientData client_data, - int x, - int y, - int width, - int height, - int image_width, - int image_height) -{ - IconItem icon = (IconItem) client_data; - - InvalidateImage(icon->image_name); - ITEM.Invalidate((Item) icon, ZN_COORDS_FLAG); -} - /* ********************************************************************************** @@ -144,16 +123,16 @@ 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_ICON_PRIORITY; icon->pos.x = icon->pos.y = 0.0; - icon->image_name = ""; icon->image = ZnUnspecifiedImage; icon->anchor = ZnAnchorNW; icon->connection_anchor = ZnAnchorSW; - icon->mask = ZnUnspecifiedPattern; + icon->mask = ZnUnspecifiedImage; icon->color = ZnGetGradientByValue(wi->fore_color); return ZN_OK; @@ -171,19 +150,12 @@ static void Clone(Item item) { IconItem icon = (IconItem) item; - WidgetInfo *wi = item->wi; - char *text; if (icon->image != ZnUnspecifiedImage) { - text = ZnMalloc((strlen(icon->image_name) + 1) * sizeof(char)); - strcpy(text, icon->image_name); - icon->image_name = text; - icon->image = Tk_GetImage(wi->interp, wi->win, icon->image_name, - IconImageChange, (ClientData) icon); + icon->image = ZnGetImageByValue(icon->image); } - if (icon->mask != ZnUnspecifiedPattern) { - icon->mask = Tk_GetBitmap(wi->interp, wi->win, - Tk_NameOfBitmap(wi->dpy, icon->mask)); + if (icon->mask != ZnUnspecifiedImage) { + icon->mask = ZnGetImageByValue(icon->mask); } icon->color = ZnGetGradientByValue(icon->color); } @@ -199,19 +171,15 @@ Clone(Item item) static void Destroy(Item item) { - WidgetInfo *wi = item->wi; IconItem icon = (IconItem) item; if (icon->image != ZnUnspecifiedImage) { - Tk_FreeImage(icon->image); + ZnFreeImage(icon->image); icon->image = ZnUnspecifiedImage; } - if (strlen(icon->image_name) != 0) { - ZnFree(icon->image_name); - } - if (icon->mask != ZnUnspecifiedPattern) { - Tk_FreeBitmap(wi->dpy, icon->mask); - icon->mask = ZnUnspecifiedPattern; + if (icon->mask != ZnUnspecifiedImage) { + ZnFreeImage(icon->mask); + icon->mask = ZnUnspecifiedImage; } ZnFreeGradient(icon->color); } @@ -230,12 +198,11 @@ Configure(Item item, Tcl_Obj *CONST argv[], int *flags) { - IconItem icon = (IconItem) item; - WidgetInfo *wi = item->wi; - Item old_connected; + Item old_connected; old_connected = item->connected_item; - if (ZnConfigureAttributes(wi, item, icon_attrs, argc, argv, flags) == ZN_ERROR) { + if (ZnConfigureAttributes(item->wi, item, icon_attrs, + argc, argv, flags) == ZN_ERROR) { return ZN_ERROR; } @@ -254,13 +221,6 @@ Configure(Item item, } } - if (ISSET(*flags, ZN_IMAGE_FLAG)) { - if (ValidateImage(wi, item, icon->image_name, IconImageChange, - &icon->image, "icon -image") == ZN_ERROR) { - return ZN_ERROR; - } - } - return ZN_OK; } @@ -298,8 +258,7 @@ ComputeCoordinates(Item item, { WidgetInfo *wi = item->wi; IconItem icon = (IconItem) item; - ZnDim width, height; - int w, h; + int width, height; ResetBBox(&item->item_bounding_box); @@ -307,18 +266,16 @@ ComputeCoordinates(Item item, * If there is no image and no mask then nothing to show. */ if (icon->image == ZnUnspecifiedImage && - icon->mask == ZnUnspecifiedPattern) { + icon->mask == ZnUnspecifiedImage) { return; } if (icon->image != ZnUnspecifiedImage) { - Tk_SizeOfImage(icon->image, &w, &h); + ZnSizeOfImage(icon->image, &width, &height); } else { - Tk_SizeOfBitmap(wi->dpy, icon->mask, &w,&h); + ZnSizeOfImage(icon->mask, &width, &height); } - width = w; - height = h; /* * The connected item support anchors, this is checked by @@ -367,21 +324,18 @@ ComputeCoordinates(Item item, */ static int ToArea(Item item, - ZnBBox *area, - Tk_Uid tag_uid, - int enclosed, - ZnBool report) + ZnToArea ta) { IconItem icon = (IconItem) item; - ZnBBox box; + ZnBBox box, *area = ta->area; int w, h; box.orig = icon->pos_dev; if (icon->image != ZnUnspecifiedImage) { - Tk_SizeOfImage(icon->image, &w, &h); + ZnSizeOfImage(icon->image, &w, &h); } - else if (icon->mask != ZnUnspecifiedPattern) { - Tk_SizeOfBitmap(item->wi->dpy, icon->mask, &w, &h); + else if (icon->mask != ZnUnspecifiedImage) { + ZnSizeOfImage(icon->mask, &w, &h); } box.corner.x = box.orig.x + w; box.corner.y = box.orig.y + h; @@ -404,12 +358,11 @@ Draw(Item item) IconItem icon = (IconItem) item; XGCValues values; int gc_mask = 0; - ImageBits *im_bits; - Pixmap pmap, mask_pmap; int w, h; ZnBBox box, inter, *clip_box; Region clip_region; ZnBool simple; + Pixmap pixmap, mask_pmap; if (icon->image != ZnUnspecifiedImage) { /* @@ -424,23 +377,22 @@ Draw(Item item) * using the image mask and the current clip and use this * bitmap as the current clip. */ - Tk_SizeOfImage(icon->image, &w, &h); + ZnSizeOfImage(icon->image, &w, &h); box.orig = icon->pos_dev; box.corner.x = icon->pos_dev.x + w; box.corner.y = icon->pos_dev.y + h; IntersectBBox(&box, &wi->damaged_area, &inter); box = inter; - im_bits = GetImageBits(wi->win, icon->image_name, icon->image); - pmap = GetImagePixmap(wi->win, icon->image_name, icon->image, &mask_pmap); ZnCurrentClip(wi, &clip_region, NULL, &simple); - if ((im_bits->mask == ZnUnspecifiedPattern) || simple) { - if (im_bits->mask != ZnUnspecifiedPattern) { + pixmap = ZnImagePixmap(icon->image, &mask_pmap); + if (mask_pmap == ZnUnspecifiedImage || simple) { + if (mask_pmap != ZnUnspecifiedImage) { XSetClipMask(wi->dpy, wi->gc, mask_pmap); values.clip_x_origin = (int) icon->pos_dev.x; values.clip_y_origin = (int) icon->pos_dev.y; XChangeGC(wi->dpy, wi->gc, GCClipXOrigin|GCClipYOrigin, &values); } - XCopyArea(wi->dpy, pmap, wi->draw_buffer, wi->gc, + XCopyArea(wi->dpy, pixmap, wi->draw_buffer, wi->gc, box.orig.x-icon->pos_dev.x, box.orig.y-icon->pos_dev.y, box.corner.x-box.orig.x, box.corner.y-box.orig.y, box.orig.x, box.orig.y); @@ -453,19 +405,18 @@ Draw(Item item) /* * Build of the mask */ - mask_pmap = XCreatePixmap(wi->dpy, ZnWindowId(wi->win), - im_bits->width, im_bits->height, 1); + Pixmap mask_pmap = XCreatePixmap(wi->dpy, ZnWindowId(wi->win), w, h, 1); gc = XCreateGC(wi->dpy, mask_pmap, 0, NULL); - XFillRectangle(wi->dpy, mask_pmap, gc, 0, 0, im_bits->width, im_bits->height); + XFillRectangle(wi->dpy, mask_pmap, gc, 0, 0, w, h); XSetRegion(wi->dpy, gc, clip_region); values.foreground = 1; values.background = 0; values.clip_x_origin = (int) -icon->pos_dev.x; values.clip_y_origin = (int) -icon->pos_dev.y; XChangeGC(wi->dpy, gc, - GCForeground|GCBackground|GCClipXOrigin|GCClipYOrigin, &values); - XPutImage(wi->dpy, mask_pmap, gc, im_bits->mask, 0, 0, 0, 0, - im_bits->width, im_bits->height); + GCForeground|GCBackground|GCClipXOrigin|GCClipYOrigin, + &values); + XPutImage(wi->dpy, mask_pmap, gc, ZnImageMask(icon->image), 0, 0, 0, 0, w, h); XFreeGC(wi->dpy, gc); /* * Drawing of the icon using the mask. @@ -474,7 +425,7 @@ Draw(Item item) values.clip_x_origin = (int) icon->pos_dev.x; values.clip_y_origin = (int) icon->pos_dev.y; XChangeGC(wi->dpy, wi->gc, GCClipXOrigin|GCClipYOrigin, &values); - XCopyArea(wi->dpy, pmap, wi->draw_buffer, wi->gc, + XCopyArea(wi->dpy, pixmap, wi->draw_buffer, wi->gc, box.orig.x-icon->pos_dev.x, box.orig.y-icon->pos_dev.y, box.corner.x-box.orig.x, box.corner.y-box.orig.y, box.orig.x, box.orig.y); @@ -484,8 +435,9 @@ Draw(Item item) XFreePixmap(wi->dpy, mask_pmap); } } - else if (icon->mask != ZnUnspecifiedPattern) { - Tk_SizeOfBitmap(wi->dpy, icon->mask, &w,&h); + else if (icon->mask != ZnUnspecifiedImage) { + ZnSizeOfImage(icon->mask, &w, &h); + pixmap = ZnImagePixmap(icon->mask, NULL); box.orig = icon->pos_dev; box.corner.x = icon->pos_dev.x + w; box.corner.y = icon->pos_dev.y + h; @@ -495,7 +447,7 @@ Draw(Item item) box = inter; } values.fill_style = FillStippled; - values.stipple = icon->mask; + values.stipple = pixmap; values.ts_x_origin = icon->pos_dev.x; values.ts_y_origin = icon->pos_dev.y; values.foreground = ZnPixel(ZnGetGradientColor(icon->color, 0, NULL)); @@ -523,12 +475,10 @@ Render(Item item) IconItem icon = (IconItem) item; if (icon->image != ZnUnspecifiedImage) { - RenderImage(wi, GetImageTexture(wi->win, icon->image_name, icon->image), - icon->color, &icon->pos_dev, False); + ZnRenderImage(wi, icon->image, icon->color, &icon->pos_dev, False); } - else if (icon->mask != ZnUnspecifiedPattern) { - RenderImage(wi, (ImageBits *) GetBitmapTexture(wi->dpy, icon->mask), - icon->color, &icon->pos_dev, True); + else if (icon->mask != ZnUnspecifiedImage) { + ZnRenderImage(wi, icon->mask, icon->color, &icon->pos_dev, True); } #endif } @@ -559,18 +509,14 @@ IsSensitive(Item item, */ static double Pick(Item item, - ZnPoint *p, - Item start_item, - int aperture, - Item *a_item, - int *part) + ZnPick ps) { IconItem icon = (IconItem) item; WidgetInfo *wi = item->wi; double dist; - int width, height; double off_dist = MAX(1, wi->pick_aperture+1); - + ZnPoint *p = ps->point; + dist = RectangleToPointDist(&item->item_bounding_box, p); /* * If inside the bounding box, try to see if the point @@ -583,44 +529,47 @@ Pick(Item item, * vicinity. */ if (dist <= 0.0) { - BitmapBits *bitmap=NULL; - ImageBits *im_bits; ZnPoint dp; + int x, y, w, h, stride; + char *bpixels; dist = 0.0; dp.x = p->x - icon->pos_dev.x; dp.y = p->y - icon->pos_dev.y; if (icon->image != ZnUnspecifiedImage) { - Tk_SizeOfImage(icon->image, &width, &height); - if (dp.x >= width || dp.y >= height) { - dist = off_dist; - goto out_pick; + ZnSizeOfImage(icon->image, &w, &h); + bpixels = ZnImagePattern(icon->image, &stride); + if (!bpixels) { + /* + * The image has no bitmap pattern + * (i.e, it is rectangular and not a bitmap). + */ + return dist; } - im_bits = GetImageBits(wi->win, icon->image_name, icon->image); - bitmap = im_bits->b_bits; - } - else if (icon->mask != ZnUnspecifiedPattern) { - Tk_SizeOfBitmap(wi->dpy, icon->mask, &width, &height); - if (dp.x >= width || dp.y >= height) { - dist = off_dist; - goto out_pick; + else if ((dp.x >= w) || (dp.y >= h)) { + return off_dist; } - bitmap = GetBitmapMask(wi->dpy, icon->mask); } - if (bitmap != NULL) { - int x = (int) dp.x; - int y = (int) dp.y; - if (! GetBitmapPixel(bitmap, x, y)) { - dist = off_dist; + else if (icon->mask != ZnUnspecifiedImage) { + bpixels = ZnImagePattern(icon->mask, &stride); + ZnSizeOfImage(icon->mask, &w, &h); + if ((dp.x >= w) || (dp.y >= h)) { + return off_dist; } } + else { + return dist; + } + x = (int) dp.x; + y = (int) dp.y; + if (! ZnGetBitmapPixel(bpixels, stride, x, y)) { + dist = off_dist; + } } else if (dist < off_dist) { dist = off_dist; } - -out_pick: - /*printf("dist = %g\n", dist);*/ + return dist; } @@ -655,12 +604,12 @@ GetAnchor(Item item, int w=0, h=0; if ((icon->image != ZnUnspecifiedImage) || - (icon->mask != ZnUnspecifiedPattern)) { + (icon->mask != ZnUnspecifiedImage)) { if (icon->image != ZnUnspecifiedImage) { - Tk_SizeOfImage(icon->image, &w, &h); + ZnSizeOfImage(icon->image, &w, &h); } else { - Tk_SizeOfBitmap(item->wi->dpy, icon->mask, &w, &h); + ZnSizeOfImage(icon->mask, &w, &h); } Origin2Anchor(&icon->pos_dev, w, h, anchor, p); } @@ -689,10 +638,10 @@ GetClipVertices(Item item, ZnListAssertSize(item->wi->work_pts, 2); if (icon->image != ZnUnspecifiedImage) { - Tk_SizeOfImage(icon->image, &w, &h); + ZnSizeOfImage(icon->image, &w, &h); } - else { - Tk_SizeOfBitmap(item->wi->dpy, icon->mask, &w, &h); + else if (icon->mask != ZnUnspecifiedImage) { + ZnSizeOfImage(icon->mask, &w, &h); } points = (ZnPoint *) ZnListArray(item->wi->work_pts); TRI_STRIP1(tristrip, points, 2); @@ -755,7 +704,6 @@ Coords(Item item, */ static ItemClassStruct ICON_ITEM_CLASS = { sizeof(IconItemStruct), - False, /* has_fields */ 0, /* num_parts */ True, /* has_anchors */ "icon", -- cgit v1.1