summaryrefslogtreecommitdiff
path: root/gdk-pixbuf/gnome-canvas-pixbuf.c
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@redhat.com>1999-11-02 23:11:09 +0000
committerArturo Espinosa <unammx@src.gnome.org>1999-11-02 23:11:09 +0000
commitcacae33871cf79edaddca661d42dff50d4afc40e (patch)
treedcb65f41de1ad98482b785728469186a741826cb /gdk-pixbuf/gnome-canvas-pixbuf.c
parentd611593ffdb064262ecbe85cdf16c5f6345f5858 (diff)
downloadgtk+-cacae33871cf79edaddca661d42dff50d4afc40e.tar.gz
Implemented the ::point() method. We do a simple containment test instead
1999-11-02 Federico Mena Quintero <federico@redhat.com> * src/gnome-canvas-pixbuf.c (gnome_canvas_pixbuf_point): Implemented the ::point() method. We do a simple containment test instead of a full distance calculation since the canvas is going to change to that scheme, anyways.
Diffstat (limited to 'gdk-pixbuf/gnome-canvas-pixbuf.c')
-rw-r--r--gdk-pixbuf/gnome-canvas-pixbuf.c87
1 files changed, 57 insertions, 30 deletions
diff --git a/gdk-pixbuf/gnome-canvas-pixbuf.c b/gdk-pixbuf/gnome-canvas-pixbuf.c
index 7f77eda8d8..bf45512d79 100644
--- a/gdk-pixbuf/gnome-canvas-pixbuf.c
+++ b/gdk-pixbuf/gnome-canvas-pixbuf.c
@@ -22,6 +22,8 @@
#include <config.h>
#include <math.h>
+#include <libgnomeui/gnome-canvas.h>
+#include <libgnomeui/gnome-canvas-util.h>
#include "gdk-pixbuf.h"
#include "gnome-canvas-pixbuf.h"
#include "libart_lgpl/art_rgb_pixbuf_affine.h"
@@ -76,11 +78,11 @@ static void gnome_canvas_pixbuf_update (GnomeCanvasItem *item, double *affine,
ArtSVP *clip_path, int flags);
static void gnome_canvas_pixbuf_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
int x, int y, int width, int height);
+static void gnome_canvas_pixbuf_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf);
static double gnome_canvas_pixbuf_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
GnomeCanvasItem **actual_item);
static void gnome_canvas_pixbuf_bounds (GnomeCanvasItem *item,
double *x1, double *y1, double *x2, double *y2);
-static void gnome_canvas_pixbuf_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf);
static GnomeCanvasItemClass *parent_class;
@@ -152,9 +154,9 @@ gnome_canvas_pixbuf_class_init (GnomeCanvasPixbufClass *class)
item_class->update = gnome_canvas_pixbuf_update;
item_class->draw = gnome_canvas_pixbuf_draw;
+ item_class->render = gnome_canvas_pixbuf_render;
item_class->point = gnome_canvas_pixbuf_point;
item_class->bounds = gnome_canvas_pixbuf_bounds;
- item_class->render = gnome_canvas_pixbuf_render;
}
/* Object initialization function for the pixbuf canvas item */
@@ -674,34 +676,6 @@ transform_pixbuf (guchar *dest, int x, int y, int width, int height, int rowstri
}
}
-/* Render for the pixbuf canvas item */
-static void
-gnome_canvas_pixbuf_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf)
-{
- GnomeCanvasPixbuf *gcp;
- PixbufPrivate *priv;
- double i2c[6], render_affine[6];
-
- gcp = GNOME_CANVAS_PIXBUF (item);
- priv = gcp->priv;
-
- if (!priv->pixbuf)
- return;
-
- gnome_canvas_item_i2c_affine (item, i2c);
- compute_render_affine (gcp, render_affine, i2c);
- gnome_canvas_buf_ensure_buf (buf);
-
- art_rgb_pixbuf_affine (buf->buf,
- buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1,
- buf->buf_rowstride,
- priv->pixbuf->art_pixbuf,
- render_affine,
- ART_FILTER_NEAREST, NULL);
-
- buf->is_bg = 0;
-}
-
/* Draw handler for the pixbuf canvas item */
static void
gnome_canvas_pixbuf_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
@@ -742,6 +716,34 @@ gnome_canvas_pixbuf_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
g_free (buf);
}
+/* Render handler for the pixbuf canvas item */
+static void
+gnome_canvas_pixbuf_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf)
+{
+ GnomeCanvasPixbuf *gcp;
+ PixbufPrivate *priv;
+ double i2c[6], render_affine[6];
+
+ gcp = GNOME_CANVAS_PIXBUF (item);
+ priv = gcp->priv;
+
+ if (!priv->pixbuf)
+ return;
+
+ gnome_canvas_item_i2c_affine (item, i2c);
+ compute_render_affine (gcp, render_affine, i2c);
+ gnome_canvas_buf_ensure_buf (buf);
+
+ art_rgb_pixbuf_affine (buf->buf,
+ buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1,
+ buf->buf_rowstride,
+ priv->pixbuf->art_pixbuf,
+ render_affine,
+ ART_FILTER_NEAREST, NULL);
+
+ buf->is_bg = 0;
+}
+
/* Point handler for the pixbuf canvas item */
@@ -753,12 +755,23 @@ gnome_canvas_pixbuf_point (GnomeCanvasItem *item, double x, double y, int cx, in
PixbufPrivate *priv;
double i2c[6], render_affine[6], inv[6];
ArtPoint c, p;
+ int px, py;
+ double no_hit;
+ ArtPixBuf *apb;
+ guchar *src;
gcp = GNOME_CANVAS_PIXBUF (item);
priv = gcp->priv;
*actual_item = item;
+ no_hit = item->canvas->pixels_per_unit * 2 + 10;
+
+ if (!priv->pixbuf)
+ return no_hit;
+
+ apb = priv->pixbuf->art_pixbuf;
+
gnome_canvas_item_i2c_affine (item, i2c);
compute_render_affine (gcp, render_affine, i2c);
art_affine_invert (inv, render_affine);
@@ -766,7 +779,21 @@ gnome_canvas_pixbuf_point (GnomeCanvasItem *item, double x, double y, int cx, in
c.x = cx;
c.y = cy;
art_affine_point (&p, &c, inv);
+ px = p.x;
+ py = p.y;
+
+ if (px < 0 || px >= apb->width || py < 0 || py >= apb->height)
+ return no_hit;
+ if (!apb->has_alpha)
+ return TRUE;
+
+ src = apb->pixels + py * apb->rowstride + px * apb->n_channels;
+
+ if (src[3] < 128)
+ return no_hit;
+ else
+ return 0.0;
}