mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-02-04 04:50:31 +01:00
Remove all gstate from _cairo_surface_tag
The gstate is not required and was causing some tag operations to be ignored.
This commit is contained in:
parent
ff2a95d6e5
commit
1c64d2635b
11 changed files with 29 additions and 219 deletions
|
|
@ -755,12 +755,7 @@ static cairo_int_status_t
|
|||
_cairo_analysis_surface_tag (void *abstract_surface,
|
||||
cairo_bool_t begin,
|
||||
const char *tag_name,
|
||||
const char *attributes,
|
||||
const cairo_pattern_t *source,
|
||||
const cairo_stroke_style_t *stroke_style,
|
||||
const cairo_matrix_t *ctm,
|
||||
const cairo_matrix_t *ctm_inverse,
|
||||
const cairo_clip_t *clip)
|
||||
const char *attributes)
|
||||
{
|
||||
cairo_analysis_surface_t *surface = abstract_surface;
|
||||
cairo_int_status_t backend_status;
|
||||
|
|
@ -771,12 +766,7 @@ _cairo_analysis_surface_tag (void *abstract_surface,
|
|||
surface->target->backend->tag (surface->target,
|
||||
begin,
|
||||
tag_name,
|
||||
attributes,
|
||||
source,
|
||||
stroke_style,
|
||||
ctm,
|
||||
ctm_inverse,
|
||||
clip);
|
||||
attributes);
|
||||
if (backend_status == CAIRO_INT_STATUS_SUCCESS)
|
||||
surface->has_supported = TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1657,44 +1657,10 @@ cairo_status_t
|
|||
_cairo_gstate_tag_begin (cairo_gstate_t *gstate,
|
||||
const char *tag_name, const char *attributes)
|
||||
{
|
||||
cairo_pattern_union_t source_pattern;
|
||||
cairo_stroke_style_t style;
|
||||
double dash[2];
|
||||
cairo_status_t status;
|
||||
cairo_matrix_t aggregate_transform;
|
||||
cairo_matrix_t aggregate_transform_inverse;
|
||||
|
||||
status = _cairo_gstate_get_pattern_status (gstate->source);
|
||||
if (unlikely (status))
|
||||
return status;
|
||||
|
||||
cairo_matrix_multiply (&aggregate_transform,
|
||||
&gstate->ctm,
|
||||
&gstate->target->device_transform);
|
||||
cairo_matrix_multiply (&aggregate_transform_inverse,
|
||||
&gstate->target->device_transform_inverse,
|
||||
&gstate->ctm_inverse);
|
||||
|
||||
memcpy (&style, &gstate->stroke_style, sizeof (gstate->stroke_style));
|
||||
if (_cairo_stroke_style_dash_can_approximate (&gstate->stroke_style, &aggregate_transform, gstate->tolerance)) {
|
||||
style.dash = dash;
|
||||
_cairo_stroke_style_dash_approximate (&gstate->stroke_style, &gstate->ctm, gstate->tolerance,
|
||||
&style.dash_offset,
|
||||
style.dash,
|
||||
&style.num_dashes);
|
||||
}
|
||||
|
||||
_cairo_gstate_copy_transformed_source (gstate, &source_pattern.base);
|
||||
|
||||
return _cairo_surface_tag (gstate->target,
|
||||
TRUE, /* begin */
|
||||
tag_name,
|
||||
attributes ? attributes : "",
|
||||
&source_pattern.base,
|
||||
&style,
|
||||
&aggregate_transform,
|
||||
&aggregate_transform_inverse,
|
||||
gstate->clip);
|
||||
attributes ? attributes : "");
|
||||
}
|
||||
|
||||
cairo_status_t
|
||||
|
|
@ -1704,12 +1670,7 @@ _cairo_gstate_tag_end (cairo_gstate_t *gstate,
|
|||
return _cairo_surface_tag (gstate->target,
|
||||
FALSE, /* begin */
|
||||
tag_name,
|
||||
NULL, /* attributes */
|
||||
NULL, /* source */
|
||||
NULL, /* stroke_style */
|
||||
NULL, /* ctm */
|
||||
NULL, /* ctm_inverse*/
|
||||
NULL); /* clip */
|
||||
NULL); /* attributes */
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -737,20 +737,12 @@ static cairo_int_status_t
|
|||
_cairo_paginated_surface_tag (void *abstract_surface,
|
||||
cairo_bool_t begin,
|
||||
const char *tag_name,
|
||||
const char *attributes,
|
||||
const cairo_pattern_t *source,
|
||||
const cairo_stroke_style_t *style,
|
||||
const cairo_matrix_t *ctm,
|
||||
const cairo_matrix_t *ctm_inverse,
|
||||
const cairo_clip_t *clip)
|
||||
const char *attributes)
|
||||
{
|
||||
cairo_paginated_surface_t *surface = abstract_surface;
|
||||
|
||||
return _cairo_surface_tag (surface->recording_surface,
|
||||
begin, tag_name, attributes,
|
||||
source, style,
|
||||
ctm, ctm_inverse,
|
||||
clip);
|
||||
begin, tag_name, attributes);
|
||||
}
|
||||
|
||||
static cairo_surface_t *
|
||||
|
|
|
|||
|
|
@ -8440,12 +8440,7 @@ static cairo_int_status_t
|
|||
_cairo_pdf_surface_tag (void *abstract_surface,
|
||||
cairo_bool_t begin,
|
||||
const char *tag_name,
|
||||
const char *attributes,
|
||||
const cairo_pattern_t *source,
|
||||
const cairo_stroke_style_t *style,
|
||||
const cairo_matrix_t *ctm,
|
||||
const cairo_matrix_t *ctm_inverse,
|
||||
const cairo_clip_t *clip)
|
||||
const char *attributes)
|
||||
{
|
||||
cairo_pdf_surface_t *surface = abstract_surface;
|
||||
cairo_int_status_t status = 0;
|
||||
|
|
|
|||
|
|
@ -120,10 +120,6 @@ typedef struct _cairo_command_tag {
|
|||
cairo_bool_t begin;
|
||||
char *tag_name;
|
||||
char *attributes;
|
||||
cairo_pattern_union_t source;
|
||||
cairo_stroke_style_t style;
|
||||
cairo_matrix_t ctm;
|
||||
cairo_matrix_t ctm_inverse;
|
||||
} cairo_command_tag_t;
|
||||
|
||||
typedef union _cairo_command {
|
||||
|
|
|
|||
|
|
@ -487,8 +487,6 @@ _cairo_recording_surface_finish (void *abstract_surface)
|
|||
free (command->tag.tag_name);
|
||||
if (command->tag.begin) {
|
||||
free (command->tag.attributes);
|
||||
_cairo_pattern_fini (&command->tag.source.base);
|
||||
_cairo_stroke_style_fini (&command->tag.style);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -651,14 +649,14 @@ _command_init (cairo_recording_surface_t *surface,
|
|||
command->op = op;
|
||||
command->region = CAIRO_RECORDING_REGION_ALL;
|
||||
|
||||
command->extents = composite->unbounded;
|
||||
command->extents = composite ? composite->unbounded : _cairo_empty_rectangle;
|
||||
command->chain = NULL;
|
||||
command->index = surface->commands.num_elements;
|
||||
|
||||
/* steal the clip */
|
||||
command->clip = NULL;
|
||||
if (! _cairo_composite_rectangles_can_reduce_clip (composite,
|
||||
composite->clip))
|
||||
if (composite && ! _cairo_composite_rectangles_can_reduce_clip (composite,
|
||||
composite->clip))
|
||||
{
|
||||
command->clip = composite->clip;
|
||||
composite->clip = NULL;
|
||||
|
|
@ -1092,12 +1090,7 @@ static cairo_int_status_t
|
|||
_cairo_recording_surface_tag (void *abstract_surface,
|
||||
cairo_bool_t begin,
|
||||
const char *tag_name,
|
||||
const char *attributes,
|
||||
const cairo_pattern_t *source,
|
||||
const cairo_stroke_style_t *style,
|
||||
const cairo_matrix_t *ctm,
|
||||
const cairo_matrix_t *ctm_inverse,
|
||||
const cairo_clip_t *clip)
|
||||
const char *attributes)
|
||||
{
|
||||
cairo_status_t status;
|
||||
cairo_recording_surface_t *surface = abstract_surface;
|
||||
|
|
@ -1106,13 +1099,6 @@ _cairo_recording_surface_tag (void *abstract_surface,
|
|||
|
||||
TRACE ((stderr, "%s: surface=%d\n", __FUNCTION__, surface->base.unique_id));
|
||||
|
||||
status = _cairo_composite_rectangles_init_for_paint (&composite,
|
||||
&surface->base,
|
||||
CAIRO_OPERATOR_SOURCE,
|
||||
source ? source : &_cairo_pattern_black.base,
|
||||
clip);
|
||||
if (unlikely (status))
|
||||
return status;
|
||||
|
||||
command = calloc (1, sizeof (cairo_command_tag_t));
|
||||
if (unlikely (command == NULL)) {
|
||||
|
|
@ -1122,7 +1108,7 @@ _cairo_recording_surface_tag (void *abstract_surface,
|
|||
|
||||
status = _command_init (surface,
|
||||
&command->header, CAIRO_COMMAND_TAG, CAIRO_OPERATOR_SOURCE,
|
||||
&composite);
|
||||
NULL);
|
||||
if (unlikely (status))
|
||||
goto CLEANUP_COMMAND;
|
||||
|
||||
|
|
@ -1140,36 +1126,17 @@ _cairo_recording_surface_tag (void *abstract_surface,
|
|||
goto CLEANUP_STRINGS;
|
||||
}
|
||||
}
|
||||
|
||||
status = _cairo_pattern_init_snapshot (&command->source.base, source);
|
||||
if (unlikely (status))
|
||||
goto CLEANUP_STRINGS;
|
||||
|
||||
status = _cairo_stroke_style_init_copy (&command->style, style);
|
||||
if (unlikely (status))
|
||||
goto CLEANUP_SOURCE;
|
||||
|
||||
command->ctm = *ctm;
|
||||
command->ctm_inverse = *ctm_inverse;
|
||||
}
|
||||
|
||||
status = _cairo_recording_surface_commit (surface, &command->header);
|
||||
if (unlikely (status)) {
|
||||
if (begin)
|
||||
goto CLEANUP_STYLE;
|
||||
else
|
||||
goto CLEANUP_STRINGS;
|
||||
}
|
||||
if (unlikely (status))
|
||||
goto CLEANUP_STRINGS;
|
||||
|
||||
_cairo_recording_surface_destroy_bbtree (surface);
|
||||
|
||||
_cairo_composite_rectangles_fini (&composite);
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
|
||||
CLEANUP_STYLE:
|
||||
_cairo_stroke_style_fini (&command->style);
|
||||
CLEANUP_SOURCE:
|
||||
_cairo_pattern_fini (&command->source.base);
|
||||
CLEANUP_STRINGS:
|
||||
free (command->tag_name);
|
||||
free (command->attributes);
|
||||
|
|
@ -1475,35 +1442,14 @@ _cairo_recording_surface_copy__tag (cairo_recording_surface_t *surface,
|
|||
goto err_command;
|
||||
}
|
||||
}
|
||||
|
||||
status = _cairo_pattern_init_copy (&command->source.base,
|
||||
&src->tag.source.base);
|
||||
if (unlikely (status))
|
||||
goto err_command;
|
||||
|
||||
status = _cairo_stroke_style_init_copy (&command->style,
|
||||
&src->tag.style);
|
||||
if (unlikely (status))
|
||||
goto err_source;
|
||||
|
||||
command->ctm = src->tag.ctm;
|
||||
command->ctm_inverse = src->tag.ctm_inverse;
|
||||
}
|
||||
|
||||
status = _cairo_recording_surface_commit (surface, &command->header);
|
||||
if (unlikely (status)) {
|
||||
if (src->tag.begin)
|
||||
goto err_style;
|
||||
else
|
||||
goto err_command;
|
||||
}
|
||||
if (unlikely (status))
|
||||
goto err_command;
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
|
||||
err_style:
|
||||
_cairo_stroke_style_fini (&command->style);
|
||||
err_source:
|
||||
_cairo_pattern_fini (&command->source.base);
|
||||
err_command:
|
||||
free(command->tag_name);
|
||||
free(command->attributes);
|
||||
|
|
@ -1906,8 +1852,10 @@ _cairo_recording_surface_replay_internal (cairo_recording_surface_t *surface,
|
|||
if (! replay_all && command->header.region != region)
|
||||
continue;
|
||||
|
||||
if (! _cairo_rectangle_intersects (&extents, &command->header.extents))
|
||||
continue;
|
||||
if (! _cairo_rectangle_intersects (&extents, &command->header.extents)) {
|
||||
if (command->header.type != CAIRO_COMMAND_TAG)
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (command->header.type) {
|
||||
case CAIRO_COMMAND_PAINT:
|
||||
|
|
@ -2044,12 +1992,7 @@ _cairo_recording_surface_replay_internal (cairo_recording_surface_t *surface,
|
|||
status = _cairo_surface_wrapper_tag (&wrapper,
|
||||
command->tag.begin,
|
||||
command->tag.tag_name,
|
||||
command->tag.attributes,
|
||||
&command->tag.source.base,
|
||||
&command->tag.style,
|
||||
&command->tag.ctm,
|
||||
&command->tag.ctm_inverse,
|
||||
command->header.clip);
|
||||
command->tag.attributes);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
@ -2163,12 +2106,7 @@ _cairo_recording_surface_replay_one (cairo_recording_surface_t *surface,
|
|||
status = _cairo_surface_wrapper_tag (&wrapper,
|
||||
command->tag.begin,
|
||||
command->tag.tag_name,
|
||||
command->tag.attributes,
|
||||
&command->tag.source.base,
|
||||
&command->tag.style,
|
||||
&command->tag.ctm,
|
||||
&command->tag.ctm_inverse,
|
||||
command->header.clip);
|
||||
command->tag.attributes);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -205,12 +205,7 @@ struct _cairo_surface_backend {
|
|||
(*tag) (void *surface,
|
||||
cairo_bool_t begin,
|
||||
const char *tag_name,
|
||||
const char *attributes,
|
||||
const cairo_pattern_t *source,
|
||||
const cairo_stroke_style_t *style,
|
||||
const cairo_matrix_t *ctm,
|
||||
const cairo_matrix_t *ctm_inverse,
|
||||
const cairo_clip_t *clip);
|
||||
const char *attributes);
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -163,12 +163,7 @@ cairo_private cairo_status_t
|
|||
_cairo_surface_wrapper_tag (cairo_surface_wrapper_t *wrapper,
|
||||
cairo_bool_t begin,
|
||||
const char *tag_name,
|
||||
const char *attributes,
|
||||
const cairo_pattern_t *source,
|
||||
const cairo_stroke_style_t *stroke_style,
|
||||
const cairo_matrix_t *ctm,
|
||||
const cairo_matrix_t *ctm_inverse,
|
||||
const cairo_clip_t *clip);
|
||||
const char *attributes);
|
||||
|
||||
cairo_private cairo_surface_t *
|
||||
_cairo_surface_wrapper_create_similar (cairo_surface_wrapper_t *wrapper,
|
||||
|
|
|
|||
|
|
@ -505,47 +505,13 @@ cairo_status_t
|
|||
_cairo_surface_wrapper_tag (cairo_surface_wrapper_t *wrapper,
|
||||
cairo_bool_t begin,
|
||||
const char *tag_name,
|
||||
const char *attributes,
|
||||
const cairo_pattern_t *source,
|
||||
const cairo_stroke_style_t *stroke_style,
|
||||
const cairo_matrix_t *ctm,
|
||||
const cairo_matrix_t *ctm_inverse,
|
||||
const cairo_clip_t *clip)
|
||||
const char *attributes)
|
||||
{
|
||||
cairo_status_t status;
|
||||
cairo_clip_t *dev_clip;
|
||||
cairo_matrix_t dev_ctm = *ctm;
|
||||
cairo_matrix_t dev_ctm_inverse = *ctm_inverse;
|
||||
cairo_pattern_union_t source_copy;
|
||||
|
||||
if (unlikely (wrapper->target->status))
|
||||
return wrapper->target->status;
|
||||
|
||||
dev_clip = _cairo_surface_wrapper_get_clip (wrapper, clip);
|
||||
if (wrapper->needs_transform) {
|
||||
cairo_matrix_t m;
|
||||
|
||||
_cairo_surface_wrapper_get_transform (wrapper, &m);
|
||||
|
||||
cairo_matrix_multiply (&dev_ctm, &dev_ctm, &m);
|
||||
|
||||
status = cairo_matrix_invert (&m);
|
||||
assert (status == CAIRO_STATUS_SUCCESS);
|
||||
|
||||
cairo_matrix_multiply (&dev_ctm_inverse, &m, &dev_ctm_inverse);
|
||||
|
||||
_copy_transformed_pattern (&source_copy.base, source, &m);
|
||||
source = &source_copy.base;
|
||||
}
|
||||
|
||||
status = _cairo_surface_tag (wrapper->target,
|
||||
begin, tag_name, attributes,
|
||||
source, stroke_style,
|
||||
&dev_ctm, &dev_ctm_inverse,
|
||||
dev_clip);
|
||||
|
||||
_cairo_clip_destroy (dev_clip);
|
||||
return status;
|
||||
return _cairo_surface_tag (wrapper->target, begin, tag_name, attributes);
|
||||
}
|
||||
|
||||
cairo_surface_t *
|
||||
|
|
|
|||
|
|
@ -2937,12 +2937,7 @@ cairo_status_t
|
|||
_cairo_surface_tag (cairo_surface_t *surface,
|
||||
cairo_bool_t begin,
|
||||
const char *tag_name,
|
||||
const char *attributes,
|
||||
const cairo_pattern_t *source,
|
||||
const cairo_stroke_style_t *stroke_style,
|
||||
const cairo_matrix_t *ctm,
|
||||
const cairo_matrix_t *ctm_inverse,
|
||||
const cairo_clip_t *clip)
|
||||
const char *attributes)
|
||||
{
|
||||
cairo_int_status_t status;
|
||||
|
||||
|
|
@ -2955,15 +2950,7 @@ _cairo_surface_tag (cairo_surface_t *surface,
|
|||
if (surface->backend->tag == NULL)
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
|
||||
if (begin) {
|
||||
status = _pattern_has_error (source);
|
||||
if (unlikely (status))
|
||||
return status;
|
||||
}
|
||||
|
||||
status = surface->backend->tag (surface, begin, tag_name, attributes,
|
||||
source, stroke_style,
|
||||
ctm, ctm_inverse, clip);
|
||||
status = surface->backend->tag (surface, begin, tag_name, attributes);
|
||||
surface->is_clear = FALSE;
|
||||
|
||||
return _cairo_surface_set_error (surface, status);
|
||||
|
|
|
|||
|
|
@ -1465,12 +1465,7 @@ cairo_private cairo_status_t
|
|||
_cairo_surface_tag (cairo_surface_t *surface,
|
||||
cairo_bool_t begin,
|
||||
const char *tag_name,
|
||||
const char *attributes,
|
||||
const cairo_pattern_t *source,
|
||||
const cairo_stroke_style_t *stroke_style,
|
||||
const cairo_matrix_t *ctm,
|
||||
const cairo_matrix_t *ctm_inverse,
|
||||
const cairo_clip_t *clip);
|
||||
const char *attributes);
|
||||
|
||||
cairo_private cairo_status_t
|
||||
_cairo_surface_acquire_source_image (cairo_surface_t *surface,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue