aboutsummaryrefslogtreecommitdiffstats
path: root/libgnomecanvas/gnome-canvas-util.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2010-10-15 17:00:27 +0800
committerMatthew Barnes <mbarnes@redhat.com>2010-10-30 01:50:00 +0800
commit6be035b9ff4f9d6c9c5f5b110a77322b7b776606 (patch)
treec00533fdb0305e61fc668a21cd749f793e98a4fc /libgnomecanvas/gnome-canvas-util.c
parent61900647523c854d322ed6a7f79922d7e03c33a0 (diff)
downloadgsoc2013-evolution-6be035b9ff4f9d6c9c5f5b110a77322b7b776606.tar
gsoc2013-evolution-6be035b9ff4f9d6c9c5f5b110a77322b7b776606.tar.gz
gsoc2013-evolution-6be035b9ff4f9d6c9c5f5b110a77322b7b776606.tar.bz2
gsoc2013-evolution-6be035b9ff4f9d6c9c5f5b110a77322b7b776606.tar.lz
gsoc2013-evolution-6be035b9ff4f9d6c9c5f5b110a77322b7b776606.tar.xz
gsoc2013-evolution-6be035b9ff4f9d6c9c5f5b110a77322b7b776606.tar.zst
gsoc2013-evolution-6be035b9ff4f9d6c9c5f5b110a77322b7b776606.zip
gnome-canvas: Split out matrix_transform_rect code
Diffstat (limited to 'libgnomecanvas/gnome-canvas-util.c')
-rw-r--r--libgnomecanvas/gnome-canvas-util.c55
1 files changed, 55 insertions, 0 deletions
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;
+}
+