mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-06 09:18:11 +02:00
Fixed pattern source offset
This commit is contained in:
parent
c15c7b9364
commit
e172b7cec7
9 changed files with 66 additions and 60 deletions
10
ChangeLog
10
ChangeLog
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue