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:
Adrian Johnson 2021-07-16 09:42:56 +09:30
parent ff2a95d6e5
commit 1c64d2635b
11 changed files with 29 additions and 219 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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