From e172b7cec739ca57f9034d62029e00283a9ab84c Mon Sep 17 00:00:00 2001 From: David Reveman Date: Thu, 22 Apr 2004 02:22:36 +0000 Subject: [PATCH] Fixed pattern source offset --- ChangeLog | 10 ++++++++++ src/cairo-gstate.c | 8 ++++---- src/cairo-pattern.c | 30 ++++++++++++++---------------- src/cairo-surface.c | 14 +++++++------- src/cairo_gl_surface.c | 10 +++++----- src/cairo_gstate.c | 8 ++++---- src/cairo_pattern.c | 30 ++++++++++++++---------------- src/cairo_surface.c | 14 +++++++------- src/cairoint.h | 2 +- 9 files changed, 66 insertions(+), 60 deletions(-) diff --git a/ChangeLog b/ChangeLog index 97ad2a2fb..9d1defbff 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2004-04-22 David Reveman + + * src/cairoint.h: + * src/cairo_surface.c (_cairo_surface_create_pattern): + * src/cairo_pattern.c (_cairo_pattern_set_source_offset) + (_cairo_pattern_get_image): + * src/cairo_gstate.c (_cairo_gstate_create_pattern): + * src/cairo_gl_surface.c (_cairo_gl_surface_create_pattern): Fixed + pattern source offset. + 2004-04-20 David Reveman * src/cairo_pattern.c (_cairo_image_data_set_linear): Use diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c index ed8c8a1a8..ba2107bf7 100644 --- a/src/cairo-gstate.c +++ b/src/cairo-gstate.c @@ -1280,6 +1280,10 @@ _cairo_gstate_create_pattern (cairo_gstate_t *gstate, _cairo_pattern_set_alpha (pattern, gstate->alpha); _cairo_pattern_transform (pattern, &gstate->ctm, &gstate->ctm_inverse); + _cairo_pattern_set_source_offset (pattern, + gstate->pattern_offset.x, + gstate->pattern_offset.y); + status = _cairo_surface_create_pattern (gstate->surface, pattern, extents); if (status) { _cairo_pattern_fini (pattern); @@ -1288,10 +1292,6 @@ _cairo_gstate_create_pattern (cairo_gstate_t *gstate, if (pattern->type == CAIRO_PATTERN_SURFACE) _cairo_pattern_prepare_surface (pattern); - - _cairo_pattern_add_source_offset (pattern, - gstate->pattern_offset.x, - gstate->pattern_offset.y); return CAIRO_STATUS_SUCCESS; } diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c index 176c30a00..e4a0d5e75 100644 --- a/src/cairo-pattern.c +++ b/src/cairo-pattern.c @@ -336,11 +336,11 @@ _cairo_pattern_set_alpha (cairo_pattern_t *pattern, double alpha) } void -_cairo_pattern_add_source_offset (cairo_pattern_t *pattern, +_cairo_pattern_set_source_offset (cairo_pattern_t *pattern, double x, double y) { - pattern->source_offset.x += x; - pattern->source_offset.y += y; + pattern->source_offset.x = x; + pattern->source_offset.y = y; } void @@ -656,30 +656,28 @@ _cairo_pattern_get_image (cairo_pattern_t *pattern, cairo_box_t *box) case CAIRO_PATTERN_LINEAR: case CAIRO_PATTERN_RADIAL: { char *data; - int width = ceil (_cairo_fixed_to_double (box->p2.x)) - - floor (_cairo_fixed_to_double (box->p1.x)); - int height = ceil (_cairo_fixed_to_double (box->p2.y)) - - floor (_cairo_fixed_to_double (box->p1.y)); + int x = floor (_cairo_fixed_to_double (box->p1.x)); + int y = floor (_cairo_fixed_to_double (box->p1.y)); + int width = ceil (_cairo_fixed_to_double (box->p2.x)) - x; + int height = ceil (_cairo_fixed_to_double (box->p2.y)) - y; data = malloc (width * height * 4); if (!data) return NULL; - - _cairo_pattern_add_source_offset (pattern, - floor (_cairo_fixed_to_double (box->p1.x)), - floor (_cairo_fixed_to_double (box->p1.y))); - + if (pattern->type == CAIRO_PATTERN_RADIAL) _cairo_image_data_set_radial (pattern, - pattern->source_offset.x, - pattern->source_offset.y, + pattern->source_offset.x + x, + pattern->source_offset.y + y, data, width, height); else _cairo_image_data_set_linear (pattern, - pattern->source_offset.x, - pattern->source_offset.y, + pattern->source_offset.x + x, + pattern->source_offset.y + y, data, width, height); + _cairo_pattern_set_source_offset (pattern, x, y); + surface = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_ARGB32, width, height, diff --git a/src/cairo-surface.c b/src/cairo-surface.c index 60b4487d4..9c5ff1eba 100644 --- a/src/cairo-surface.c +++ b/src/cairo-surface.c @@ -424,10 +424,10 @@ _cairo_surface_create_pattern (cairo_surface_t *surface, /* handle pattern opacity */ if (pattern->color.alpha != 1.0) { - int width = ceil (_cairo_fixed_to_double (box->p2.x)) - - floor (_cairo_fixed_to_double (box->p1.x)); - int height = ceil (_cairo_fixed_to_double (box->p2.y)) - - floor (_cairo_fixed_to_double (box->p1.y)); + int x = floor (_cairo_fixed_to_double (box->p1.x)); + int y = floor (_cairo_fixed_to_double (box->p1.y)); + int width = ceil (_cairo_fixed_to_double (box->p2.x)) - x; + int height = ceil (_cairo_fixed_to_double (box->p2.y)) - y; cairo_pattern_t alpha; pattern->source = @@ -462,9 +462,9 @@ _cairo_surface_create_pattern (cairo_surface_t *surface, save_repeat); if (status == CAIRO_STATUS_SUCCESS) { - _cairo_pattern_add_source_offset (pattern, - floor (_cairo_fixed_to_double (box->p1.x)), - floor (_cairo_fixed_to_double (box->p1.y))); + _cairo_pattern_set_source_offset (pattern, + pattern->source_offset.x + x, + pattern->source_offset.y + y); } else cairo_surface_destroy (pattern->source); } diff --git a/src/cairo_gl_surface.c b/src/cairo_gl_surface.c index cb9871f6b..1bd124938 100644 --- a/src/cairo_gl_surface.c +++ b/src/cairo_gl_surface.c @@ -584,8 +584,10 @@ _cairo_gl_surface_create_pattern (void *abstract_surface, cairo_gl_surface_t *surface = abstract_surface; glitz_surface_t *programmatic = NULL; cairo_gl_surface_t *gl_surface; - double x = floor (_cairo_fixed_to_double (box->p1.x)); - double y = floor (_cairo_fixed_to_double (box->p1.y)); + double bbox_x = floor (_cairo_fixed_to_double (box->p1.x)); + double bbox_y = floor (_cairo_fixed_to_double (box->p1.y)); + double x = bbox_x + pattern->source_offset.x; + double y = bbox_y + pattern->source_offset.y; switch (pattern->type) { case CAIRO_PATTERN_SOLID: { @@ -715,9 +717,7 @@ _cairo_gl_surface_create_pattern (void *abstract_surface, gl_surface->pattern_box = *box; pattern->source = &gl_surface->base; - _cairo_pattern_add_source_offset (pattern, - floor (_cairo_fixed_to_double (box->p1.x)), - floor (_cairo_fixed_to_double (box->p1.y))); + _cairo_pattern_set_source_offset (pattern, bbox_x, bbox_y); return CAIRO_STATUS_SUCCESS; } diff --git a/src/cairo_gstate.c b/src/cairo_gstate.c index ed8c8a1a8..ba2107bf7 100644 --- a/src/cairo_gstate.c +++ b/src/cairo_gstate.c @@ -1280,6 +1280,10 @@ _cairo_gstate_create_pattern (cairo_gstate_t *gstate, _cairo_pattern_set_alpha (pattern, gstate->alpha); _cairo_pattern_transform (pattern, &gstate->ctm, &gstate->ctm_inverse); + _cairo_pattern_set_source_offset (pattern, + gstate->pattern_offset.x, + gstate->pattern_offset.y); + status = _cairo_surface_create_pattern (gstate->surface, pattern, extents); if (status) { _cairo_pattern_fini (pattern); @@ -1288,10 +1292,6 @@ _cairo_gstate_create_pattern (cairo_gstate_t *gstate, if (pattern->type == CAIRO_PATTERN_SURFACE) _cairo_pattern_prepare_surface (pattern); - - _cairo_pattern_add_source_offset (pattern, - gstate->pattern_offset.x, - gstate->pattern_offset.y); return CAIRO_STATUS_SUCCESS; } diff --git a/src/cairo_pattern.c b/src/cairo_pattern.c index 176c30a00..e4a0d5e75 100644 --- a/src/cairo_pattern.c +++ b/src/cairo_pattern.c @@ -336,11 +336,11 @@ _cairo_pattern_set_alpha (cairo_pattern_t *pattern, double alpha) } void -_cairo_pattern_add_source_offset (cairo_pattern_t *pattern, +_cairo_pattern_set_source_offset (cairo_pattern_t *pattern, double x, double y) { - pattern->source_offset.x += x; - pattern->source_offset.y += y; + pattern->source_offset.x = x; + pattern->source_offset.y = y; } void @@ -656,30 +656,28 @@ _cairo_pattern_get_image (cairo_pattern_t *pattern, cairo_box_t *box) case CAIRO_PATTERN_LINEAR: case CAIRO_PATTERN_RADIAL: { char *data; - int width = ceil (_cairo_fixed_to_double (box->p2.x)) - - floor (_cairo_fixed_to_double (box->p1.x)); - int height = ceil (_cairo_fixed_to_double (box->p2.y)) - - floor (_cairo_fixed_to_double (box->p1.y)); + int x = floor (_cairo_fixed_to_double (box->p1.x)); + int y = floor (_cairo_fixed_to_double (box->p1.y)); + int width = ceil (_cairo_fixed_to_double (box->p2.x)) - x; + int height = ceil (_cairo_fixed_to_double (box->p2.y)) - y; data = malloc (width * height * 4); if (!data) return NULL; - - _cairo_pattern_add_source_offset (pattern, - floor (_cairo_fixed_to_double (box->p1.x)), - floor (_cairo_fixed_to_double (box->p1.y))); - + if (pattern->type == CAIRO_PATTERN_RADIAL) _cairo_image_data_set_radial (pattern, - pattern->source_offset.x, - pattern->source_offset.y, + pattern->source_offset.x + x, + pattern->source_offset.y + y, data, width, height); else _cairo_image_data_set_linear (pattern, - pattern->source_offset.x, - pattern->source_offset.y, + pattern->source_offset.x + x, + pattern->source_offset.y + y, data, width, height); + _cairo_pattern_set_source_offset (pattern, x, y); + surface = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_ARGB32, width, height, diff --git a/src/cairo_surface.c b/src/cairo_surface.c index 60b4487d4..9c5ff1eba 100644 --- a/src/cairo_surface.c +++ b/src/cairo_surface.c @@ -424,10 +424,10 @@ _cairo_surface_create_pattern (cairo_surface_t *surface, /* handle pattern opacity */ if (pattern->color.alpha != 1.0) { - int width = ceil (_cairo_fixed_to_double (box->p2.x)) - - floor (_cairo_fixed_to_double (box->p1.x)); - int height = ceil (_cairo_fixed_to_double (box->p2.y)) - - floor (_cairo_fixed_to_double (box->p1.y)); + int x = floor (_cairo_fixed_to_double (box->p1.x)); + int y = floor (_cairo_fixed_to_double (box->p1.y)); + int width = ceil (_cairo_fixed_to_double (box->p2.x)) - x; + int height = ceil (_cairo_fixed_to_double (box->p2.y)) - y; cairo_pattern_t alpha; pattern->source = @@ -462,9 +462,9 @@ _cairo_surface_create_pattern (cairo_surface_t *surface, save_repeat); if (status == CAIRO_STATUS_SUCCESS) { - _cairo_pattern_add_source_offset (pattern, - floor (_cairo_fixed_to_double (box->p1.x)), - floor (_cairo_fixed_to_double (box->p1.y))); + _cairo_pattern_set_source_offset (pattern, + pattern->source_offset.x + x, + pattern->source_offset.y + y); } else cairo_surface_destroy (pattern->source); } diff --git a/src/cairoint.h b/src/cairoint.h index 510c8088c..3c39bcef4 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -1335,7 +1335,7 @@ extern void __internal_linkage _cairo_pattern_set_alpha (cairo_pattern_t *pattern, double alpha); extern void __internal_linkage -_cairo_pattern_add_source_offset (cairo_pattern_t *pattern, +_cairo_pattern_set_source_offset (cairo_pattern_t *pattern, double x, double y); extern void __internal_linkage