mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-01-22 12:20:26 +01:00
[gstate] Apply target device offsets to patterns immediately
Previously target device offsets were applied in cairo-surface.c which could cause bugs when paths were taken as fallbacks, as for example pointed out byade55037ffand quick-fixed by79190d8985. The quick-fix is now unnecessary and was removed.
This commit is contained in:
parent
4b720d56db
commit
a2254e5647
3 changed files with 10 additions and 94 deletions
|
|
@ -897,6 +897,10 @@ _cairo_gstate_copy_transformed_pattern (cairo_gstate_t *gstate,
|
||||||
|
|
||||||
if (! _cairo_matrix_is_identity (ctm_inverse))
|
if (! _cairo_matrix_is_identity (ctm_inverse))
|
||||||
_cairo_pattern_transform (pattern, ctm_inverse);
|
_cairo_pattern_transform (pattern, ctm_inverse);
|
||||||
|
|
||||||
|
if (_cairo_surface_has_device_transform (gstate->target))
|
||||||
|
_cairo_pattern_transform (pattern,
|
||||||
|
&gstate->target->device_transform_inverse);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
||||||
|
|
@ -984,35 +984,6 @@ _clip_to_boxes (cairo_clip_t **clip,
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX _cairo_surface_backend_fill? */
|
|
||||||
static cairo_status_t
|
|
||||||
_wrap_surface_fill (cairo_surface_t *surface,
|
|
||||||
cairo_operator_t op,
|
|
||||||
const cairo_pattern_t *source,
|
|
||||||
cairo_path_fixed_t *path,
|
|
||||||
cairo_fill_rule_t fill_rule,
|
|
||||||
double tolerance,
|
|
||||||
cairo_antialias_t antialias,
|
|
||||||
cairo_clip_t *clip)
|
|
||||||
{
|
|
||||||
if (surface->backend->fill != NULL) {
|
|
||||||
cairo_status_t status;
|
|
||||||
|
|
||||||
status = surface->backend->fill (surface, op, source,
|
|
||||||
path, fill_rule,
|
|
||||||
tolerance, antialias,
|
|
||||||
clip);
|
|
||||||
|
|
||||||
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
return _cairo_surface_fallback_fill (surface, op, source,
|
|
||||||
path, fill_rule,
|
|
||||||
tolerance, antialias,
|
|
||||||
clip);
|
|
||||||
}
|
|
||||||
|
|
||||||
cairo_status_t
|
cairo_status_t
|
||||||
_cairo_surface_fallback_paint (cairo_surface_t *surface,
|
_cairo_surface_fallback_paint (cairo_surface_t *surface,
|
||||||
cairo_operator_t op,
|
cairo_operator_t op,
|
||||||
|
|
@ -1066,12 +1037,12 @@ _cairo_surface_fallback_paint (cairo_surface_t *surface,
|
||||||
if (clip != NULL && clip_path->prev == NULL &&
|
if (clip != NULL && clip_path->prev == NULL &&
|
||||||
_cairo_operator_bounded_by_mask (op))
|
_cairo_operator_bounded_by_mask (op))
|
||||||
{
|
{
|
||||||
return _wrap_surface_fill (surface, op, source,
|
return _cairo_surface_fill (surface, op, source,
|
||||||
&clip_path->path,
|
&clip_path->path,
|
||||||
clip_path->fill_rule,
|
clip_path->fill_rule,
|
||||||
clip_path->tolerance,
|
clip_path->tolerance,
|
||||||
clip_path->antialias,
|
clip_path->antialias,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
status = _cairo_traps_init_boxes (&traps, boxes, num_boxes);
|
status = _cairo_traps_init_boxes (&traps, boxes, num_boxes);
|
||||||
|
|
|
||||||
|
|
@ -91,11 +91,6 @@ static DEFINE_NIL_SURFACE(CAIRO_STATUS_WRITE_ERROR, _cairo_surface_nil_write_err
|
||||||
static DEFINE_NIL_SURFACE(CAIRO_STATUS_INVALID_STRIDE, _cairo_surface_nil_invalid_stride);
|
static DEFINE_NIL_SURFACE(CAIRO_STATUS_INVALID_STRIDE, _cairo_surface_nil_invalid_stride);
|
||||||
static DEFINE_NIL_SURFACE(CAIRO_STATUS_INVALID_SIZE, _cairo_surface_nil_invalid_size);
|
static DEFINE_NIL_SURFACE(CAIRO_STATUS_INVALID_SIZE, _cairo_surface_nil_invalid_size);
|
||||||
|
|
||||||
static void
|
|
||||||
_cairo_surface_copy_pattern_for_destination (const cairo_pattern_t **pattern,
|
|
||||||
cairo_surface_t *destination,
|
|
||||||
cairo_pattern_t *pattern_copy);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* _cairo_surface_set_error:
|
* _cairo_surface_set_error:
|
||||||
* @surface: a surface
|
* @surface: a surface
|
||||||
|
|
@ -1922,7 +1917,6 @@ _cairo_surface_paint (cairo_surface_t *surface,
|
||||||
cairo_clip_t *clip)
|
cairo_clip_t *clip)
|
||||||
{
|
{
|
||||||
cairo_status_t status;
|
cairo_status_t status;
|
||||||
cairo_pattern_union_t dev_source;
|
|
||||||
|
|
||||||
if (unlikely (surface->status))
|
if (unlikely (surface->status))
|
||||||
return surface->status;
|
return surface->status;
|
||||||
|
|
@ -1932,10 +1926,6 @@ _cairo_surface_paint (cairo_surface_t *surface,
|
||||||
|
|
||||||
_cairo_surface_begin_modification (surface);
|
_cairo_surface_begin_modification (surface);
|
||||||
|
|
||||||
_cairo_surface_copy_pattern_for_destination (&source,
|
|
||||||
surface,
|
|
||||||
&dev_source.base);
|
|
||||||
|
|
||||||
if (surface->backend->paint != NULL) {
|
if (surface->backend->paint != NULL) {
|
||||||
status = surface->backend->paint (surface, op, source, clip);
|
status = surface->backend->paint (surface, op, source, clip);
|
||||||
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
|
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
|
||||||
|
|
@ -1956,8 +1946,6 @@ _cairo_surface_mask (cairo_surface_t *surface,
|
||||||
cairo_clip_t *clip)
|
cairo_clip_t *clip)
|
||||||
{
|
{
|
||||||
cairo_status_t status;
|
cairo_status_t status;
|
||||||
cairo_pattern_union_t dev_source;
|
|
||||||
cairo_pattern_union_t dev_mask;
|
|
||||||
|
|
||||||
if (unlikely (surface->status))
|
if (unlikely (surface->status))
|
||||||
return surface->status;
|
return surface->status;
|
||||||
|
|
@ -1967,11 +1955,6 @@ _cairo_surface_mask (cairo_surface_t *surface,
|
||||||
|
|
||||||
_cairo_surface_begin_modification (surface);
|
_cairo_surface_begin_modification (surface);
|
||||||
|
|
||||||
_cairo_surface_copy_pattern_for_destination (&source, surface,
|
|
||||||
&dev_source.base);
|
|
||||||
_cairo_surface_copy_pattern_for_destination (&mask, surface,
|
|
||||||
&dev_mask.base);
|
|
||||||
|
|
||||||
if (surface->backend->mask != NULL) {
|
if (surface->backend->mask != NULL) {
|
||||||
status = surface->backend->mask (surface, op, source, mask, clip);
|
status = surface->backend->mask (surface, op, source, mask, clip);
|
||||||
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
|
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
|
||||||
|
|
@ -2012,16 +1995,9 @@ _cairo_surface_fill_stroke (cairo_surface_t *surface,
|
||||||
_cairo_surface_begin_modification (surface);
|
_cairo_surface_begin_modification (surface);
|
||||||
|
|
||||||
if (surface->backend->fill_stroke) {
|
if (surface->backend->fill_stroke) {
|
||||||
cairo_pattern_union_t dev_stroke_source;
|
|
||||||
cairo_pattern_union_t dev_fill_source;
|
|
||||||
cairo_matrix_t dev_ctm = *stroke_ctm;
|
cairo_matrix_t dev_ctm = *stroke_ctm;
|
||||||
cairo_matrix_t dev_ctm_inverse = *stroke_ctm_inverse;
|
cairo_matrix_t dev_ctm_inverse = *stroke_ctm_inverse;
|
||||||
|
|
||||||
_cairo_surface_copy_pattern_for_destination (&stroke_source, surface,
|
|
||||||
&dev_stroke_source.base);
|
|
||||||
_cairo_surface_copy_pattern_for_destination (&fill_source, surface,
|
|
||||||
&dev_fill_source.base);
|
|
||||||
|
|
||||||
status = surface->backend->fill_stroke (surface,
|
status = surface->backend->fill_stroke (surface,
|
||||||
fill_op, fill_source, fill_rule,
|
fill_op, fill_source, fill_rule,
|
||||||
fill_tolerance, fill_antialias,
|
fill_tolerance, fill_antialias,
|
||||||
|
|
@ -2065,7 +2041,6 @@ _cairo_surface_stroke (cairo_surface_t *surface,
|
||||||
cairo_clip_t *clip)
|
cairo_clip_t *clip)
|
||||||
{
|
{
|
||||||
cairo_status_t status;
|
cairo_status_t status;
|
||||||
cairo_pattern_union_t dev_source;
|
|
||||||
|
|
||||||
if (unlikely (surface->status))
|
if (unlikely (surface->status))
|
||||||
return surface->status;
|
return surface->status;
|
||||||
|
|
@ -2075,9 +2050,6 @@ _cairo_surface_stroke (cairo_surface_t *surface,
|
||||||
|
|
||||||
_cairo_surface_begin_modification (surface);
|
_cairo_surface_begin_modification (surface);
|
||||||
|
|
||||||
_cairo_surface_copy_pattern_for_destination (&source, surface,
|
|
||||||
&dev_source.base);
|
|
||||||
|
|
||||||
if (surface->backend->stroke != NULL) {
|
if (surface->backend->stroke != NULL) {
|
||||||
status = surface->backend->stroke (surface, op, source,
|
status = surface->backend->stroke (surface, op, source,
|
||||||
path, stroke_style,
|
path, stroke_style,
|
||||||
|
|
@ -2110,7 +2082,6 @@ _cairo_surface_fill (cairo_surface_t *surface,
|
||||||
cairo_clip_t *clip)
|
cairo_clip_t *clip)
|
||||||
{
|
{
|
||||||
cairo_status_t status;
|
cairo_status_t status;
|
||||||
cairo_pattern_union_t dev_source;
|
|
||||||
|
|
||||||
if (unlikely (surface->status))
|
if (unlikely (surface->status))
|
||||||
return surface->status;
|
return surface->status;
|
||||||
|
|
@ -2120,8 +2091,6 @@ _cairo_surface_fill (cairo_surface_t *surface,
|
||||||
|
|
||||||
_cairo_surface_begin_modification (surface);
|
_cairo_surface_begin_modification (surface);
|
||||||
|
|
||||||
_cairo_surface_copy_pattern_for_destination (&source, surface,
|
|
||||||
&dev_source.base);
|
|
||||||
if (surface->backend->fill != NULL) {
|
if (surface->backend->fill != NULL) {
|
||||||
status = surface->backend->fill (surface, op, source,
|
status = surface->backend->fill (surface, op, source,
|
||||||
path, fill_rule,
|
path, fill_rule,
|
||||||
|
|
@ -2429,7 +2398,6 @@ _cairo_surface_show_text_glyphs (cairo_surface_t *surface,
|
||||||
{
|
{
|
||||||
cairo_status_t status;
|
cairo_status_t status;
|
||||||
cairo_scaled_font_t *dev_scaled_font = scaled_font;
|
cairo_scaled_font_t *dev_scaled_font = scaled_font;
|
||||||
cairo_pattern_union_t dev_source;
|
|
||||||
|
|
||||||
if (unlikely (surface->status))
|
if (unlikely (surface->status))
|
||||||
return surface->status;
|
return surface->status;
|
||||||
|
|
@ -2442,9 +2410,6 @@ _cairo_surface_show_text_glyphs (cairo_surface_t *surface,
|
||||||
|
|
||||||
_cairo_surface_begin_modification (surface);
|
_cairo_surface_begin_modification (surface);
|
||||||
|
|
||||||
_cairo_surface_copy_pattern_for_destination (&source, surface,
|
|
||||||
&dev_source.base);
|
|
||||||
|
|
||||||
if (_cairo_surface_has_device_transform (surface) &&
|
if (_cairo_surface_has_device_transform (surface) &&
|
||||||
! _cairo_matrix_is_integer_translation (&surface->device_transform, NULL, NULL))
|
! _cairo_matrix_is_integer_translation (&surface->device_transform, NULL, NULL))
|
||||||
{
|
{
|
||||||
|
|
@ -2793,30 +2758,6 @@ _cairo_surface_composite_shape_fixup_unbounded (cairo_surface_t *dst,
|
||||||
clip_region);
|
clip_region);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* _cairo_surface_copy_pattern_for_destination
|
|
||||||
* @pattern: the pattern to copy
|
|
||||||
* @destination: the destination surface for which the pattern is being copied
|
|
||||||
* @pattern_copy: the location to hold the copy
|
|
||||||
*
|
|
||||||
* Copies the given pattern, taking into account device scale and offsets
|
|
||||||
* of the destination surface.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
_cairo_surface_copy_pattern_for_destination (const cairo_pattern_t **pattern,
|
|
||||||
cairo_surface_t *destination,
|
|
||||||
cairo_pattern_t *pattern_copy)
|
|
||||||
{
|
|
||||||
if (! _cairo_surface_has_device_transform (destination))
|
|
||||||
return;
|
|
||||||
|
|
||||||
_cairo_pattern_init_static_copy (pattern_copy, *pattern);
|
|
||||||
_cairo_pattern_transform (pattern_copy,
|
|
||||||
&destination->device_transform_inverse);
|
|
||||||
|
|
||||||
*pattern = pattern_copy;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* _cairo_surface_set_resolution
|
* _cairo_surface_set_resolution
|
||||||
* @surface: the surface
|
* @surface: the surface
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue