From 15211f83dfb611f510753ea9513a77e2ca49cb0d Mon Sep 17 00:00:00 2001 From: Nicola Fontana Date: Fri, 18 Mar 2011 02:02:06 +0100 Subject: [PATCH] [CpmlExtents] Corrected the extents transformation As highlighted by the commit 318ec709d8295025acf80b9f9ebb172c89acb214, transforming the extents box involves recomputing a new extents on the resulting transformed shape. The old algorithm of transforming org and size is wrong. --- src/cpml/cpml-extents.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/cpml/cpml-extents.c b/src/cpml/cpml-extents.c index 74657716..25d05b22 100644 --- a/src/cpml/cpml-extents.c +++ b/src/cpml/cpml-extents.c @@ -237,17 +237,34 @@ cpml_extents_pair_is_inside(const CpmlExtents *extents, const CpmlPair *src) * @extents: the container #CpmlExtents * @matrix: the transformation matrix * - * Shortcut to apply a specific transformation matrix to @extents. - * It basically convert the org field - * with cairo_matrix_transform_point() and size - * with cairo_matrix_transform_distance(). + * Transforms the four corners of @extents with @matrix and + * recomputes @extents. This will logically equivalent to transform + * an extents box and gets the extents of the resulting shape. **/ void cpml_extents_transform(CpmlExtents *extents, const cairo_matrix_t *matrix) { + CpmlPair p[4]; + if (extents->is_defined == 0) return; - cairo_matrix_transform_point(matrix, &extents->org.x, &extents->org.y); - cairo_matrix_transform_distance(matrix, &extents->size.x, &extents->size.y); + p[0] = extents->org; + p[1].x = extents->org.x + extents->size.x; + p[1].y = extents->org.y; + p[2].x = extents->org.x + extents->size.x; + p[2].y = extents->org.y + extents->size.y; + p[3].x = extents->org.x; + p[3].y = extents->org.y + extents->size.y; + + cairo_matrix_transform_point(matrix, &p[0].x, &p[0].y); + cairo_matrix_transform_point(matrix, &p[1].x, &p[1].y); + cairo_matrix_transform_point(matrix, &p[2].x, &p[2].y); + cairo_matrix_transform_point(matrix, &p[3].x, &p[3].y); + + extents->is_defined = 0; + cpml_extents_pair_add(extents, &p[0]); + cpml_extents_pair_add(extents, &p[1]); + cpml_extents_pair_add(extents, &p[2]); + cpml_extents_pair_add(extents, &p[3]); } -- 2.11.4.GIT