diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2009-08-17 10:11:32 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2009-08-29 17:07:02 +0100 |
commit | 6ff711b6305a9cf65e584d92258a6fa4e78c31ef (patch) | |
tree | 1020ba56da5e951ec43fe91eba472ef447fc23f1 /src/cairo-matrix.c | |
parent | cd7b27ff5c01a533c2c065c4b455ad19df2be3bb (diff) | |
download | cairo-6ff711b6305a9cf65e584d92258a6fa4e78c31ef.tar.gz |
[matrix] Improve bbox finding for translation matrix
If the matrix is a pure translation matrix than we can skip determination
of the extents and just translate the input bbox.
Diffstat (limited to 'src/cairo-matrix.c')
-rw-r--r-- | src/cairo-matrix.c | 56 |
1 files changed, 29 insertions, 27 deletions
diff --git a/src/cairo-matrix.c b/src/cairo-matrix.c index 94ed0e915..bf20ee4fc 100644 --- a/src/cairo-matrix.c +++ b/src/cairo-matrix.c @@ -371,37 +371,39 @@ _cairo_matrix_transform_bounding_box (const cairo_matrix_t *matrix, double min_x, max_x; double min_y, max_y; - if (_cairo_matrix_is_identity (matrix)) { - if (is_tight) - *is_tight = TRUE; - - return; - } - if (matrix->xy == 0. && matrix->yx == 0.) { /* non-rotation/skew matrix, just map the two extreme points */ - quad_x[0] = *x1; - quad_y[0] = *y1; - cairo_matrix_transform_distance (matrix, &quad_x[0], &quad_y[0]); - - quad_x[1] = *x2; - quad_y[1] = *y2; - cairo_matrix_transform_distance (matrix, &quad_x[1], &quad_y[1]); - - if (quad_x[0] < quad_x[1]) { - *x1 = quad_x[0] + matrix->x0; - *x2 = quad_x[1] + matrix->x0; - } else { - *x1 = quad_x[1] + matrix->x0; - *x2 = quad_x[0] + matrix->x0; + + if (matrix->xx != 1.) { + quad_x[0] = *x1 * matrix->xx; + quad_x[1] = *x2 * matrix->xx; + if (quad_x[0] < quad_x[1]) { + *x1 = quad_x[0]; + *x2 = quad_x[1]; + } else { + *x1 = quad_x[1]; + *x2 = quad_x[0]; + } + } + if (matrix->x0 != 0.) { + *x1 += matrix->x0; + *x2 += matrix->x0; } - if (quad_y[0] < quad_y[1]) { - *y1 = quad_y[0] + matrix->y0; - *y2 = quad_y[1] + matrix->y0; - } else { - *y1 = quad_y[1] + matrix->y0; - *y2 = quad_y[0] + matrix->y0; + if (matrix->yy != 1.) { + quad_y[0] = *y1 * matrix->yy; + quad_y[1] = *y2 * matrix->yy; + if (quad_y[0] < quad_y[1]) { + *y1 = quad_y[0]; + *y2 = quad_y[1]; + } else { + *y1 = quad_y[1]; + *y2 = quad_y[0]; + } + } + if (matrix->y0 != 0.) { + *y1 += matrix->y0; + *y2 += matrix->y0; } if (is_tight) |