[PATCH 6/6] DEBUGGING SUPPORT. NOT FOR TRUNK.
Bryce Harrington <[email protected]>
| Newsgroups | gmane.comp.lib.cairo |
|---|---|
| Message-ID | <[email protected]> |
From: Bryce Harrington <[email protected]> Signed-off-by: Bryce Harrington <[email protected]> --- src/cairo-default-context.c | 22 +++++++++- src/cairo-gstate.c | 7 ++++ src/cairo-matrix.c | 96 ++++++++++++++++++++++++++++++++----------- src/cairo-pen.c | 2 +- 4 files changed, 99 insertions(+), 28 deletions(-) diff --git a/src/cairo-default-context.c b/src/cairo-default-context.c index e4ceba4..8094e14 100644 --- a/src/cairo-default-context.c +++ b/src/cairo-default-context.c @@ -813,14 +813,32 @@ _cairo_default_context_rel_line_to (void *abstract_cr, double dx, double dy) double x, y; cairo_get_current_point ((cairo_t*)cr, &x, &y); + + printf("_cairo_default_context_rel_line_to: %5.2f %5.2f -> ", x, y); x += dx; y += dy; - _cairo_gstate_user_to_backend (cr->gstate, &x, &y); + printf("%5.2f %5.2f -> ", x, y); + + // This transforms the point to the gstate->ctm matrix + _cairo_gstate_user_to_device (cr->gstate, &x, &y); + printf("%5.2f %5.2f -> ", x, y); x_fixed = _cairo_fixed_from_double (x); y_fixed = _cairo_fixed_from_double (y); - + printf("%d %d\n", x_fixed, y_fixed); return _cairo_path_fixed_line_to (cr->path, x_fixed, y_fixed); + + /* + cairo_default_context_t *cr = abstract_cr; + cairo_fixed_t dx_fixed, dy_fixed; + + _cairo_gstate_user_to_device_distance (cr->gstate, &dx, &dy); + + dx_fixed = _cairo_fixed_from_double (dx); + dy_fixed = _cairo_fixed_from_double (dy); + + return _cairo_path_fixed_line_to (cr->path, dx_fixed, dy_fixed); + */ } diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c index b4e988e..b8536dc 100644 --- a/src/cairo-gstate.c +++ b/src/cairo-gstate.c @@ -783,6 +783,13 @@ _cairo_gstate_identity_matrix (cairo_gstate_t *gstate) void _cairo_gstate_user_to_device (cairo_gstate_t *gstate, double *x, double *y) { + /* + printf("gstate->ctm: %f %f %f %f %f %f %f %f\n", + gstate->ctm.xx, gstate->ctm.xy, + gstate->ctm.yx, gstate->ctm.yy, + gstate->ctm.x0, gstate->ctm.y0, + gstate->ctm.px, gstate->ctm.py); + */ cairo_matrix_transform_point (&gstate->ctm, x, y); } diff --git a/src/cairo-matrix.c b/src/cairo-matrix.c index 6d6e344..9662101 100644 --- a/src/cairo-matrix.c +++ b/src/cairo-matrix.c @@ -341,49 +341,85 @@ void cairo_matrix_multiply (cairo_matrix_t *result, const cairo_matrix_t *a, const cairo_matrix_t *b) { cairo_matrix_t r; - double p0; - - r.xx = a->xx * b->xx + a->yx * b->xy + a->px * b->x0; - r.yx = a->xx * b->yx + a->yx * b->yy + a->px * b->y0; - - r.xy = a->xy * b->xx + a->yy * b->xy + a->py * b->x0; - r.yy = a->xy * b->yx + a->yy * b->yy + a->py * b->y0; - - r.x0 = a->x0 * b->xx + a->y0 * b->xy + 1 * b->x0; - r.y0 = a->x0 * b->yx + a->y0 * b->yy + 1 * b->y0; - - r.px = a->xx * b->px + a->yx * b->py + a->px * 1; - r.py = a->xy * b->px + a->yy * b->py + a->py * 1; - p0 = a->x0 * b->px + a->y0 * b->py + 1 * 1; - - printf("cairo_matrix_multiply: xx=%f yx=%f xy=%f yy=%f x0=%f y0=%f\n", r.xx, r.yx, r.xy, r.yy, r.x0, r.y0); - - _cairo_matrix_scalar_multiply (&r, 1 / p0); - + _cairo_matrix_multiply (&r, a, b); *result = r; } slim_hidden_def(cairo_matrix_multiply); +/* + * _cairo_matrix_multiply: + * + * This multiplies two 3x3 matrices together. Here is the mathematics + * for this operation: + * + * r = A * B + * + * { rxx rxy rx0 } { Axx Axy Ax0 } { Bxx Bxy Bx0 } + * r = { ryx ryy ry0 } = { Ayx Ayy Ay0 } * { Byx Byy By0 } + * { rpx rpy rp0 } { Apx Apy 1 } { Bpx Bpy 1 } + * + * rxx = Axx*Bxx + Axy*Byx + Ax0*Bpx + * rxy = Axx*Bxy + Axy*Byy + Ax0*Bpy + * rx0 = Axx*Bx0 + Axy*By0 + Ax0*1 + * + * ryx = Ayx*Bxx + Ayy*Byx + Ay0*Bpx + * ryy = Ayx*Bxy + Ayy*Byy + Ay0*Bpy + * ry0 = Ayx*Bx0 + Ayy*By0 + Ay0*1 + * + * rpx = Apx*Bxx + Apy*Byx + 1 *Bpx + * rpy = Apx*Bxy + Apy*Byy + 1 *Bpy + * rp0 = Apx*Bx0 + Apy*By0 + 1 *1 + */ void _cairo_matrix_multiply (cairo_matrix_t *r, const cairo_matrix_t *a, const cairo_matrix_t *b) { double p0; +/* //Original non-projective case + r->xx = a->xx * b->xx + a->yx * b->xy; + r->yx = a->xx * b->yx + a->yx * b->yy; - r->xx = a->xx * b->xx + a->yx * b->xy + a->px * b->x0; - r->yx = a->xx * b->yx + a->yx * b->yy + a->px * b->y0; + r->xy = a->xy * b->xx + a->yy * b->xy; + r->yy = a->xy * b->yx + a->yy * b->yy; + r->x0 = a->x0 * b->xx + a->y0 * b->xy + b->x0; + r->y0 = a->x0 * b->yx + a->y0 * b->yy + b->y0; +*/ +/* // My calculation + r->xx = a->xx*b->xx + a->xy*b->yx + a->x0*b->px; + r->xy = a->xx*b->xy + a->xy*b->yy + a->x0*b->py; + r->x0 = a->xx*b->x0 + a->xy*b->y0 + a->x0*1; + + r->yx = a->yx*b->xx + a->yy*b->yx + a->y0*b->px; + r->yy = a->yx*b->xy + a->yy*b->yy + a->y0*b->py; + r->y0 = a->yx*b->x0 + a->yy*b->y0 + a->y0*1; + + r->px = a->px*b->xx + a->py*b->yx + 1 *b->px; + r->py = a->px*b->xy + a->py*b->yy + 1 *b->py; + p0 = a->px*b->x0 + a->py*b->y0 + 1 *1; +*/ + // Maarten's calculation + r->xx = a->xx * b->xx + a->yx * b->xy + a->px * b->x0; r->xy = a->xy * b->xx + a->yy * b->xy + a->py * b->x0; - r->yy = a->xy * b->yx + a->yy * b->yy + a->py * b->y0; - r->x0 = a->x0 * b->xx + a->y0 * b->xy + 1 * b->x0; + + r->yx = a->xx * b->yx + a->yx * b->yy + a->px * b->y0; + r->yy = a->xy * b->yx + a->yy * b->yy + a->py * b->y0; r->y0 = a->x0 * b->yx + a->y0 * b->yy + 1 * b->y0; r->px = a->xx * b->px + a->yx * b->py + a->px * 1; r->py = a->xy * b->px + a->yy * b->py + a->py * 1; p0 = a->x0 * b->px + a->y0 * b->py + 1 * 1; +/* + printf("cairo_matrix_multiply: %f %f %f\n", + r->xx, r->xy, r->x0); + printf(" %f %f %f\n", + r->yx, r->yy, r->y0); + printf(" %f %f %f\n", + r->px, r->py, p0); +*/ _cairo_matrix_scalar_multiply (r, 1 / p0); } @@ -414,10 +450,10 @@ void cairo_matrix_transform_distance (const cairo_matrix_t *matrix, double *dx, double *dy) { double new_p; - new_p = matrix->px * *dx + matrix->py * *dy + 1; *dx = (matrix->xx * *dx + matrix->xy * *dy) / new_p; *dy = (matrix->yx * *dx + matrix->yy * *dy) / new_p; + //printf("cairo_matrix_transform_distance: %f %f (%f)\n", *dx, *dy, new_p); } slim_hidden_def(cairo_matrix_transform_distance); @@ -435,10 +471,14 @@ void cairo_matrix_transform_point (const cairo_matrix_t *matrix, double *x, double *y) { double new_p; + double old_x, old_y; + old_x = *x; + old_y = *y; new_p = matrix->px * *x + matrix->py * *y + 1; *x = (matrix->xx * *x + matrix->xy * *y + matrix->x0) / new_p; *y = (matrix->yx * *x + matrix->yy * *y + matrix->y0) / new_p; + //printf("cairo_matrix_transform_point %f %f -> %f %f (%f)\n", old_x, old_y, *x, *y, new_p); } slim_hidden_def(cairo_matrix_transform_point); @@ -716,7 +756,7 @@ _cairo_matrix_compute_basis_scale_factors (const cairo_matrix_t *matrix, cairo_bool_t x_basis) { double det; - + printf("_cairo_matrix_compute_basis_scale_factors"); det = _cairo_matrix_compute_determinant (matrix); if (! ISFINITE (det)) @@ -1000,6 +1040,8 @@ _cairo_matrix_to_pixman_matrix (const cairo_matrix_t *matrix, cairo_matrix_t inv; unsigned max_iterations; + printf("_cairo_matrix_to_pixman_matrix"); + pixman_transform->matrix[0][0] = _cairo_fixed_16_16_from_double (matrix->xx); pixman_transform->matrix[0][1] = _cairo_fixed_16_16_from_double (matrix->xy); pixman_transform->matrix[0][2] = _cairo_fixed_16_16_from_double (matrix->x0); @@ -1116,6 +1158,8 @@ _cairo_matrix_is_pixman_translation (const cairo_matrix_t *matrix, { double tx, ty; + printf("_cairo_matrix_is_pixman_translation"); + if (!_cairo_matrix_is_translation (matrix)) return FALSE; @@ -1183,6 +1227,8 @@ _cairo_matrix_to_pixman_matrix_offset (const cairo_matrix_t *matrix, { cairo_bool_t is_pixman_translation; + printf("_cairo_matrix_to_pixman_matrix_offset\n"); + is_pixman_translation = _cairo_matrix_is_pixman_translation (matrix, filter, x_offset, diff --git a/src/cairo-pen.c b/src/cairo-pen.c index 61be0e8..101625c 100644 --- a/src/cairo-pen.c +++ b/src/cairo-pen.c @@ -89,7 +89,7 @@ _cairo_pen_init (cairo_pen_t *pen, theta = -theta; dx = radius * cos (theta); dy = radius * sin (theta); - cairo_matrix_transform_distance (ctm, &dx, &dy); + //cairo_matrix_transform_distance (ctm, &dx, &dy); v->point.x = _cairo_fixed_from_double (dx); v->point.y = _cairo_fixed_from_double (dy); } -- 1.7.9.5 -- cairo mailing list [email protected] http://lists.cairographics.org/mailman/listinfo/cairo