aboutsummaryrefslogtreecommitdiff
path: root/generic/Icon.c
diff options
context:
space:
mode:
authorlecoanet2002-05-16 09:40:36 +0000
committerlecoanet2002-05-16 09:40:36 +0000
commitf8c4a63cf27597af47f88363b45abfc0f869e660 (patch)
treeb1e13b5cf3c08f6f391501a2c7306d638060c6e8 /generic/Icon.c
parentfc5443fb490fcb2c4eafc084db91000a08068c71 (diff)
downloadtkzinc-f8c4a63cf27597af47f88363b45abfc0f869e660.zip
tkzinc-f8c4a63cf27597af47f88363b45abfc0f869e660.tar.gz
tkzinc-f8c4a63cf27597af47f88363b45abfc0f869e660.tar.bz2
tkzinc-f8c4a63cf27597af47f88363b45abfc0f869e660.tar.xz
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
Diffstat (limited to 'generic/Icon.c')
-rw-r--r--generic/Icon.c220
1 files changed, 84 insertions, 136 deletions
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",