Fixed pattern source offset

This commit is contained in:
David Reveman 2004-04-22 02:22:36 +00:00
parent c15c7b9364
commit e172b7cec7
9 changed files with 66 additions and 60 deletions

View file

@ -1,3 +1,13 @@
2004-04-22 David Reveman <c99drn@cs.umu.se>
* 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 <c99drn@cs.umu.se>
* src/cairo_pattern.c (_cairo_image_data_set_linear): Use

View file

@ -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;
}

View file

@ -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,

View file

@ -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);
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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,

View file

@ -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);
}

View file

@ -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