summaryrefslogtreecommitdiff
path: root/src/cairo-matrix.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2009-08-17 10:11:32 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2009-08-29 17:07:02 +0100
commit6ff711b6305a9cf65e584d92258a6fa4e78c31ef (patch)
tree1020ba56da5e951ec43fe91eba472ef447fc23f1 /src/cairo-matrix.c
parentcd7b27ff5c01a533c2c065c4b455ad19df2be3bb (diff)
downloadcairo-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.c56
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)