aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--generic/Icon.c61
1 files changed, 34 insertions, 27 deletions
diff --git a/generic/Icon.c b/generic/Icon.c
index c243311..678e63f 100644
--- a/generic/Icon.c
+++ b/generic/Icon.c
@@ -148,7 +148,7 @@ Clone(ZnItem item)
IconItem icon = (IconItem) item;
if (icon->image != ZnUnspecifiedImage) {
- icon->image = ZnGetImageByValue(icon->image);
+ icon->image = ZnGetImageByValue(icon->image, ZnUpdateItemImage, item);
}
icon->color = ZnGetGradientByValue(icon->color);
}
@@ -167,7 +167,7 @@ Destroy(ZnItem item)
IconItem icon = (IconItem) item;
if (icon->image != ZnUnspecifiedImage) {
- ZnFreeImage(icon->image);
+ ZnFreeImage(icon->image, ZnUpdateItemImage, item);
icon->image = ZnUnspecifiedImage;
}
ZnFreeGradient(icon->color);
@@ -190,7 +190,7 @@ Configure(ZnItem item,
ZnItem old_connected;
old_connected = item->connected_item;
- if (ZnConfigureAttributes(item->wi, item, icon_attrs,
+ if (ZnConfigureAttributes(item->wi, item, item, icon_attrs,
argc, argv, flags) == TCL_ERROR) {
return TCL_ERROR;
}
@@ -520,9 +520,30 @@ Pick(ZnItem item,
ZnWInfo *wi = item->wi;
double dist;
double off_dist = MAX(1, wi->pick_aperture+1);
- ZnPoint *p = ps->point;
+ int x, y, width, height;
+
+ if (wi->render) {
+ ZnPoint p;
+ ZnBBox bbox;
+ ZnTransfo t;
+
+ ZnTransfoInvert(wi->current_transfo, &t);
+ ZnTransformPoint(&t, ps->point, &p);
+ ZnTransformPoint(&t, &icon->dev[0], &bbox.orig);
+ ZnSizeOfImage(icon->image, &width, &height);
+ bbox.corner.x = bbox.orig.x + width;
+ bbox.corner.y = bbox.orig.y + height;
+ dist = ZnRectangleToPointDist(&bbox, &p);
+ x = (int) (p.x - bbox.orig.x);
+ y = (int) (p.y - bbox.orig.y);
+ /*printf("dist: %g\n", dist);*/
+ }
+ else {
+ dist = ZnRectangleToPointDist(&item->item_bounding_box, ps->point);
+ x = (int) (ps->point->x - item->item_bounding_box.orig.x);
+ y = (int) (ps->point->y - item->item_bounding_box.orig.y);
+ }
- dist = ZnRectangleToPointDist(&item->item_bounding_box, p);
/*
* If inside the icon rectangle, try to see if the point
* is actually on the image or not. If it lies in an
@@ -533,40 +554,26 @@ Pick(ZnItem item,
* no means to compute the real distance in the icon's
* vicinity.
*/
- if (dist <= 0.0) {
- ZnPoint dp;
- int x, y, w, h, stride;
- char *bpixels;
-
+ if (dist <= 0) {
dist = 0.0;
- dp.x = p->x - icon->dev->x;
- dp.y = p->y - icon->dev->y;
if (icon->image != ZnUnspecifiedImage) {
- ZnSizeOfImage(icon->image, &w, &h);
- bpixels = ZnImageMask(icon->image, &stride);
- if (!bpixels) {
+ if (ZnPointInImage(icon->image, x, y)) {
/*
- * The image has no bitmap pattern
- * (i.e, it is rectangular and not a bitmap).
+ * The point is actually on the image shape.
*/
return dist;
}
- else if ((dp.x >= w) || (dp.y >= h)) {
+ else {
+ /*
+ * The point is not on the shape but still
+ * inside the image's bounding box.
+ */
return off_dist;
}
}
else {
return dist;
}
- /* BUG: when images can be scaled/rotated (openGL) this doesn't.
- * work. We must compute the invert transform and find the point
- * coordinate in the image space.
- */
- 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;