mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-05 16:58:01 +02:00
Fixed anchoring/transformation of pattern for stroke/fill.
This commit is contained in:
parent
596d081d47
commit
daf4141a03
3 changed files with 59 additions and 12 deletions
|
|
@ -1,3 +1,10 @@
|
|||
2003-08-26 Carl Worth <cworth@isi.edu>
|
||||
|
||||
* src/cairo_gstate.c (_cairo_gstate_set_pattern): Fixed to anchor
|
||||
pattern at current point instead of the origin.
|
||||
(_cairo_gstate_stroke): Fixed to properly transform pattern.
|
||||
(_cairo_gstate_fill): Fixed to properly transform pattern.
|
||||
|
||||
2003-07-31 Richard Henderson <rth@twiddle.net>
|
||||
|
||||
* src/cairo_color.c (CAIRO_COLOR_DEFAULT): Mark const.
|
||||
|
|
|
|||
|
|
@ -318,11 +318,9 @@ _cairo_gstate_set_pattern (cairo_gstate_t *gstate, cairo_surface_t *pattern)
|
|||
gstate->pattern = pattern;
|
||||
_cairo_surface_reference (gstate->pattern);
|
||||
|
||||
gstate->pattern_offset.x = 0;
|
||||
gstate->pattern_offset.y = 0;
|
||||
cairo_matrix_transform_point (&gstate->ctm,
|
||||
&gstate->pattern_offset.x,
|
||||
&gstate->pattern_offset.y);
|
||||
_cairo_gstate_get_current_point (gstate,
|
||||
&gstate->pattern_offset.x,
|
||||
&gstate->pattern_offset.y);
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
|
@ -806,8 +804,8 @@ cairo_status_t
|
|||
_cairo_gstate_stroke (cairo_gstate_t *gstate)
|
||||
{
|
||||
cairo_status_t status;
|
||||
|
||||
cairo_traps_t traps;
|
||||
cairo_matrix_t user_to_pattern, device_to_pattern;
|
||||
|
||||
_cairo_pen_init (&gstate->pen_regular, gstate->line_width / 2.0, gstate);
|
||||
|
||||
|
|
@ -819,12 +817,22 @@ _cairo_gstate_stroke (cairo_gstate_t *gstate)
|
|||
return status;
|
||||
}
|
||||
|
||||
if (gstate->pattern) {
|
||||
cairo_surface_get_matrix (gstate->pattern, &user_to_pattern);
|
||||
cairo_matrix_multiply (&device_to_pattern, &gstate->ctm_inverse, &user_to_pattern);
|
||||
cairo_surface_set_matrix (gstate->pattern, &device_to_pattern);
|
||||
}
|
||||
|
||||
_cairo_gstate_clip_and_composite_trapezoids (gstate,
|
||||
gstate->pattern ? gstate->pattern : gstate->solid,
|
||||
gstate->operator,
|
||||
gstate->surface,
|
||||
&traps);
|
||||
|
||||
/* restore the matrix originally in the pattern surface */
|
||||
if (gstate->pattern)
|
||||
cairo_surface_set_matrix (gstate->pattern, &user_to_pattern);
|
||||
|
||||
cairo_traps_fini (&traps);
|
||||
|
||||
_cairo_gstate_new_path (gstate);
|
||||
|
|
@ -929,6 +937,7 @@ _cairo_gstate_fill (cairo_gstate_t *gstate)
|
|||
{
|
||||
cairo_status_t status;
|
||||
cairo_traps_t traps;
|
||||
cairo_matrix_t user_to_pattern, device_to_pattern;
|
||||
|
||||
cairo_traps_init (&traps);
|
||||
|
||||
|
|
@ -938,11 +947,22 @@ _cairo_gstate_fill (cairo_gstate_t *gstate)
|
|||
return status;
|
||||
}
|
||||
|
||||
if (gstate->pattern) {
|
||||
cairo_surface_get_matrix (gstate->pattern, &user_to_pattern);
|
||||
cairo_matrix_multiply (&device_to_pattern, &gstate->ctm_inverse, &user_to_pattern);
|
||||
cairo_surface_set_matrix (gstate->pattern, &device_to_pattern);
|
||||
}
|
||||
|
||||
_cairo_gstate_clip_and_composite_trapezoids (gstate,
|
||||
gstate->pattern ? gstate->pattern : gstate->solid,
|
||||
gstate->operator,
|
||||
gstate->surface,
|
||||
&traps);
|
||||
|
||||
/* restore the matrix originally in the pattern surface */
|
||||
if (gstate->pattern)
|
||||
cairo_surface_set_matrix (gstate->pattern, &user_to_pattern);
|
||||
|
||||
cairo_traps_fini (&traps);
|
||||
|
||||
_cairo_gstate_new_path (gstate);
|
||||
|
|
|
|||
|
|
@ -318,11 +318,9 @@ _cairo_gstate_set_pattern (cairo_gstate_t *gstate, cairo_surface_t *pattern)
|
|||
gstate->pattern = pattern;
|
||||
_cairo_surface_reference (gstate->pattern);
|
||||
|
||||
gstate->pattern_offset.x = 0;
|
||||
gstate->pattern_offset.y = 0;
|
||||
cairo_matrix_transform_point (&gstate->ctm,
|
||||
&gstate->pattern_offset.x,
|
||||
&gstate->pattern_offset.y);
|
||||
_cairo_gstate_get_current_point (gstate,
|
||||
&gstate->pattern_offset.x,
|
||||
&gstate->pattern_offset.y);
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
|
@ -806,8 +804,8 @@ cairo_status_t
|
|||
_cairo_gstate_stroke (cairo_gstate_t *gstate)
|
||||
{
|
||||
cairo_status_t status;
|
||||
|
||||
cairo_traps_t traps;
|
||||
cairo_matrix_t user_to_pattern, device_to_pattern;
|
||||
|
||||
_cairo_pen_init (&gstate->pen_regular, gstate->line_width / 2.0, gstate);
|
||||
|
||||
|
|
@ -819,12 +817,22 @@ _cairo_gstate_stroke (cairo_gstate_t *gstate)
|
|||
return status;
|
||||
}
|
||||
|
||||
if (gstate->pattern) {
|
||||
cairo_surface_get_matrix (gstate->pattern, &user_to_pattern);
|
||||
cairo_matrix_multiply (&device_to_pattern, &gstate->ctm_inverse, &user_to_pattern);
|
||||
cairo_surface_set_matrix (gstate->pattern, &device_to_pattern);
|
||||
}
|
||||
|
||||
_cairo_gstate_clip_and_composite_trapezoids (gstate,
|
||||
gstate->pattern ? gstate->pattern : gstate->solid,
|
||||
gstate->operator,
|
||||
gstate->surface,
|
||||
&traps);
|
||||
|
||||
/* restore the matrix originally in the pattern surface */
|
||||
if (gstate->pattern)
|
||||
cairo_surface_set_matrix (gstate->pattern, &user_to_pattern);
|
||||
|
||||
cairo_traps_fini (&traps);
|
||||
|
||||
_cairo_gstate_new_path (gstate);
|
||||
|
|
@ -929,6 +937,7 @@ _cairo_gstate_fill (cairo_gstate_t *gstate)
|
|||
{
|
||||
cairo_status_t status;
|
||||
cairo_traps_t traps;
|
||||
cairo_matrix_t user_to_pattern, device_to_pattern;
|
||||
|
||||
cairo_traps_init (&traps);
|
||||
|
||||
|
|
@ -938,11 +947,22 @@ _cairo_gstate_fill (cairo_gstate_t *gstate)
|
|||
return status;
|
||||
}
|
||||
|
||||
if (gstate->pattern) {
|
||||
cairo_surface_get_matrix (gstate->pattern, &user_to_pattern);
|
||||
cairo_matrix_multiply (&device_to_pattern, &gstate->ctm_inverse, &user_to_pattern);
|
||||
cairo_surface_set_matrix (gstate->pattern, &device_to_pattern);
|
||||
}
|
||||
|
||||
_cairo_gstate_clip_and_composite_trapezoids (gstate,
|
||||
gstate->pattern ? gstate->pattern : gstate->solid,
|
||||
gstate->operator,
|
||||
gstate->surface,
|
||||
&traps);
|
||||
|
||||
/* restore the matrix originally in the pattern surface */
|
||||
if (gstate->pattern)
|
||||
cairo_surface_set_matrix (gstate->pattern, &user_to_pattern);
|
||||
|
||||
cairo_traps_fini (&traps);
|
||||
|
||||
_cairo_gstate_new_path (gstate);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue