diff options
author | Federico Mena Quintero <federico@redhat.com> | 1999-11-02 23:11:09 +0000 |
---|---|---|
committer | Arturo Espinosa <unammx@src.gnome.org> | 1999-11-02 23:11:09 +0000 |
commit | cacae33871cf79edaddca661d42dff50d4afc40e (patch) | |
tree | dcb65f41de1ad98482b785728469186a741826cb /gdk-pixbuf/gnome-canvas-pixbuf.c | |
parent | d611593ffdb064262ecbe85cdf16c5f6345f5858 (diff) | |
download | gtk+-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.c | 87 |
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; } |