aboutsummaryrefslogtreecommitdiffstats
path: root/libgnomecanvas
diff options
context:
space:
mode:
Diffstat (limited to 'libgnomecanvas')
-rw-r--r--libgnomecanvas/gailcanvasitem.c171
1 files changed, 32 insertions, 139 deletions
diff --git a/libgnomecanvas/gailcanvasitem.c b/libgnomecanvas/gailcanvasitem.c
index 2e4232d65d..1c08d66f5f 100644
--- a/libgnomecanvas/gailcanvasitem.c
+++ b/libgnomecanvas/gailcanvasitem.c
@@ -45,15 +45,9 @@ static void gail_canvas_item_remove_focus_handler (AtkComponent *compo
guint handler_id);
static gboolean is_item_on_screen (GnomeCanvasItem *item);
static void get_item_extents (GnomeCanvasItem *item,
- gint *x,
- gint *y,
- gint *width,
- gint *height);
+ GdkRectangle *extents);
static gboolean is_item_in_window (GnomeCanvasItem *item,
- gint x,
- gint y,
- gint width,
- gint height);
+ const GdkRectangle *extents);
static AtkGObjectAccessibleClass *parent_class = NULL;
@@ -274,7 +268,7 @@ gail_canvas_item_get_extents (AtkComponent *component,
GnomeCanvasItem *item;
gint window_x, window_y;
gint toplevel_x, toplevel_y;
- gint local_x, local_y;
+ GdkRectangle extents;
g_return_if_fail (GAIL_IS_CANVAS_ITEM (component));
atk_gobj = ATK_GOBJECT_ACCESSIBLE (component);
@@ -290,8 +284,10 @@ gail_canvas_item_get_extents (AtkComponent *component,
/* If this item has no parent canvas, something's broken */
g_return_if_fail (GTK_IS_WIDGET (item->canvas));
- get_item_extents (item, &local_x, &local_y, width, height);
- if (!is_item_in_window (item, local_x, local_y, *width, *height))
+ get_item_extents (item, &extents);
+ *width = extents.width;
+ *height = extents.height;
+ if (!is_item_in_window (item, &extents))
{
*x = G_MININT;
*y = G_MININT;
@@ -300,8 +296,8 @@ gail_canvas_item_get_extents (AtkComponent *component,
gail_misc_get_origins (GTK_WIDGET (item->canvas), &window_x, &window_y,
&toplevel_x, &toplevel_y);
- *x = local_x + window_x - toplevel_x;
- *y = local_y + window_y - toplevel_y;
+ *x = extents.x + window_x - toplevel_x;
+ *y = extents.y + window_y - toplevel_y;
/* If screen coordinates are requested, modify x and y appropriately */
if (coord_type == ATK_XY_SCREEN)
@@ -356,131 +352,39 @@ gail_canvas_item_remove_focus_handler (AtkComponent *component,
static gboolean
is_item_on_screen (GnomeCanvasItem *item)
{
- gint x, y, width, height;
+ GdkRectangle extents;
- get_item_extents (item, &x, &y, &width, &height);
- return is_item_in_window (item, x, y, width, height);
+ get_item_extents (item, &extents);
+ return is_item_in_window (item, &extents);
}
static void
get_item_extents (GnomeCanvasItem *item,
- gint *x,
- gint *y,
- gint *width,
- gint *height)
+ GdkRectangle *extents)
{
- gdouble bx1, by1, bx2, by2;
- gdouble i2c[6];
- ArtPoint p1, p2, p3, p4;
- ArtPoint q1, q2, q3, q4;
- gdouble min_x1, min_y1, min_x2, min_y2;
- gdouble max_x1, max_y1, max_x2, max_y2;
- gint x1, y1, x2, y2;
- gint scroll_x, scroll_y;
+ double x1, x2, y1, y2;
+ cairo_matrix_t i2c;
- /* Get the bounding box in item-relative coordinates */
-
- bx1 = by1 = bx2 = by2 = 0.0;
+ x1 = y1 = x2 = y2 = 0.0;
if (GNOME_CANVAS_ITEM_CLASS (G_OBJECT_GET_CLASS (item))->bounds)
GNOME_CANVAS_ITEM_CLASS (G_OBJECT_GET_CLASS (item))->bounds (
- item, &bx1, &by1, &bx2, &by2);
+ item, &x1, &y1, &x2, &y2);
/* Get the item coordinates -> canvas pixel coordinates affine */
- gnome_canvas_item_i2c_affine (item, i2c);
-
- /* Convert the bounding box to canvas pixel coordinates and find its minimum
- * surrounding rectangle.
- */
-
- p1.x = p2.x = bx1;
- p1.y = p4.y = by1;
- p3.x = p4.x = bx2;
- p2.y = p3.y = by2;
-
- art_affine_point (&q1, &p1, i2c);
- art_affine_point (&q2, &p2, i2c);
- art_affine_point (&q3, &p3, i2c);
- art_affine_point (&q4, &p4, i2c);
-
- if (q1.x < q2.x)
- {
- min_x1 = q1.x;
- max_x1 = q2.x;
- }
- else
- {
- min_x1 = q2.x;
- max_x1 = q1.x;
- }
-
- if (q1.y < q2.y)
- {
- min_y1 = q1.y;
- max_y1 = q2.y;
- }
- else
- {
- min_y1 = q2.y;
- max_y1 = q1.y;
- }
+ gnome_canvas_item_i2c_matrix (item, &i2c);
+ gnome_canvas_matrix_transform_rect (&i2c, &x1, &y1, &x2, &y2);
- if (q3.x < q4.x)
- {
- min_x2 = q3.x;
- max_x2 = q4.x;
- }
- else
- {
- min_x2 = q4.x;
- max_x2 = q3.x;
- }
-
- if (q3.y < q4.y)
- {
- min_y2 = q3.y;
- max_y2 = q4.y;
- }
- else
- {
- min_y2 = q4.y;
- max_y2 = q3.y;
- }
-
- bx1 = MIN (min_x1, min_x2);
- by1 = MIN (min_y1, min_y2);
- bx2 = MAX (max_x1, max_x2);
- by2 = MAX (max_y1, max_y2);
-
- /* Convert to integer coordinates */
-
- x1 = floor (bx1);
- y1 = floor (by1);
- x2 = ceil (bx2);
- y2 = ceil (by2);
-
- gnome_canvas_get_scroll_offsets (item->canvas, &scroll_x, &scroll_y);
-
- if (x)
- *x = x1 - scroll_x;
-
- if (y)
- *y = y1 - scroll_y;
-
- if (width)
- *width = x2 - x1;
-
- if (height)
- *height = y2 - y1;
+ extents->x = floor (x1);
+ extents->y = floor (y1);
+ extents->width = ceil (x2) - extents->x;
+ extents->height = ceil (y2) - extents->y;
}
static gboolean
-is_item_in_window (GnomeCanvasItem *item,
- gint x,
- gint y,
- gint width,
- gint height)
+is_item_in_window (GnomeCanvasItem *item,
+ const GdkRectangle *extents)
{
GtkWidget *widget;
GdkWindow *window;
@@ -490,24 +394,13 @@ is_item_in_window (GnomeCanvasItem *item,
window = gtk_widget_get_window (widget);
if (window)
{
- gint window_width, window_height;
-
- gdk_window_get_geometry (window, NULL, NULL,
- &window_width, &window_height, NULL);
- /*
- * Check whether rectangles intersect
- */
- if (x + width <= 0 ||
- y + height <= 0 ||
- x > window_width ||
- y > window_height)
- {
- retval = FALSE;
- }
- else
- {
- retval = TRUE;
- }
+ GdkRectangle window_rect;
+
+ window_rect.x = 0;
+ window_rect.y = 0;
+ gdk_drawable_get_size (window, &window_rect.width, &window_rect.height);
+
+ retval = gdk_rectangle_intersect (extents, &window_rect, NULL);
}
else
{