diff options
-rw-r--r-- | libgnomecanvas/gnome-canvas-shape.c | 45 | ||||
-rw-r--r-- | libgnomecanvas/gnome-canvas-util.c | 55 | ||||
-rw-r--r-- | libgnomecanvas/gnome-canvas-util.h | 2 |
3 files changed, 58 insertions, 44 deletions
diff --git a/libgnomecanvas/gnome-canvas-shape.c b/libgnomecanvas/gnome-canvas-shape.c index f99b10b976..d1ad26ce5b 100644 --- a/libgnomecanvas/gnome-canvas-shape.c +++ b/libgnomecanvas/gnome-canvas-shape.c @@ -488,49 +488,6 @@ gnome_canvas_shape_draw (GnomeCanvasItem *item, } static void -my_cairo_matrix_transform_rectangle (const cairo_matrix_t *matrix, - double *x1, double *y1, double *x2, double *y2) -{ - double maxx, maxy, minx, miny; - double tmpx, tmpy; - - tmpx = *x1; - tmpy = *y1; - cairo_matrix_transform_point (matrix, &tmpx, &tmpy); - minx = maxx = tmpx; - miny = maxy = tmpy; - - tmpx = *x2; - tmpy = *y1; - cairo_matrix_transform_point (matrix, &tmpx, &tmpy); - minx = MIN (minx, tmpx); - maxx = MAX (maxx, tmpx); - miny = MIN (miny, tmpy); - maxy = MAX (maxy, tmpy); - - tmpx = *x2; - tmpy = *y2; - cairo_matrix_transform_point (matrix, &tmpx, &tmpy); - minx = MIN (minx, tmpx); - maxx = MAX (maxx, tmpx); - miny = MIN (miny, tmpy); - maxy = MAX (maxy, tmpy); - - tmpx = *x1; - tmpy = *y2; - cairo_matrix_transform_point (matrix, &tmpx, &tmpy); - minx = MIN (minx, tmpx); - maxx = MAX (maxx, tmpx); - miny = MIN (miny, tmpy); - maxy = MAX (maxy, tmpy); - - *x1 = minx; - *x2 = maxx; - *y1 = miny; - *y2 = maxy; -} - -static void gnome_canvas_shape_bounds (GnomeCanvasItem *item, gdouble *x1, gdouble *y1, gdouble *x2, gdouble *y2) { GnomeCanvasShape * shape; @@ -573,7 +530,7 @@ gnome_canvas_shape_update (GnomeCanvasItem *item, gdouble *affine, ArtSVP *clip_ gnome_canvas_shape_bounds (item, &x1, &x2, &y1, &y2); gnome_canvas_item_i2w_matrix (item, &matrix); - my_cairo_matrix_transform_rectangle (&matrix, &x1, &y1, &x2, &y2); + gnome_canvas_matrix_transform_rect (&matrix, &x1, &y1, &x2, &y2); gnome_canvas_update_bbox (GNOME_CANVAS_ITEM (shape), floor (x1), floor (y1), ceil (x2), ceil (y2)); diff --git a/libgnomecanvas/gnome-canvas-util.c b/libgnomecanvas/gnome-canvas-util.c index 1a2e0b2ca3..d05171b4e4 100644 --- a/libgnomecanvas/gnome-canvas-util.c +++ b/libgnomecanvas/gnome-canvas-util.c @@ -103,3 +103,58 @@ gnome_canvas_cairo_create_scratch (void) return cr; } + +/** + * gnome_canvas_matrix_transform_rect: + * @matrix: a cairo matrix + * @x1: x coordinate of top left position of rectangle (in-out) + * @y1: y coordinate of top left position of rectangle (in-out) + * @x2: x coordinate of bottom right position of rectangle (in-out) + * @y2: y coordinate of bottom right position of rectangle (in-out) + * + * Computes the smallest rectangle containing the whole area of the given + * rectangle after applying the transformation given in @matrix. + **/ +void +gnome_canvas_matrix_transform_rect (const cairo_matrix_t *matrix, + double *x1, double *y1, double *x2, double *y2) +{ + double maxx, maxy, minx, miny; + double tmpx, tmpy; + + tmpx = *x1; + tmpy = *y1; + cairo_matrix_transform_point (matrix, &tmpx, &tmpy); + minx = maxx = tmpx; + miny = maxy = tmpy; + + tmpx = *x2; + tmpy = *y1; + cairo_matrix_transform_point (matrix, &tmpx, &tmpy); + minx = MIN (minx, tmpx); + maxx = MAX (maxx, tmpx); + miny = MIN (miny, tmpy); + maxy = MAX (maxy, tmpy); + + tmpx = *x2; + tmpy = *y2; + cairo_matrix_transform_point (matrix, &tmpx, &tmpy); + minx = MIN (minx, tmpx); + maxx = MAX (maxx, tmpx); + miny = MIN (miny, tmpy); + maxy = MAX (maxy, tmpy); + + tmpx = *x1; + tmpy = *y2; + cairo_matrix_transform_point (matrix, &tmpx, &tmpy); + minx = MIN (minx, tmpx); + maxx = MAX (maxx, tmpx); + miny = MIN (miny, tmpy); + maxy = MAX (maxy, tmpy); + + *x1 = minx; + *x2 = maxx; + *y1 = miny; + *y2 = maxy; +} + diff --git a/libgnomecanvas/gnome-canvas-util.h b/libgnomecanvas/gnome-canvas-util.h index bc7dee9c50..52e245e7de 100644 --- a/libgnomecanvas/gnome-canvas-util.h +++ b/libgnomecanvas/gnome-canvas-util.h @@ -49,6 +49,8 @@ void gnome_canvas_update_bbox (GnomeCanvasItem *item, gint x1, gint y1, gint x2, /* Create a scratch cairo_t for measuring purposes */ cairo_t *gnome_canvas_cairo_create_scratch (void); +void gnome_canvas_matrix_transform_rect (const cairo_matrix_t *matrix, double *x1, double *y1, double *x2, double *y2); + G_END_DECLS #endif |