mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-01-20 13:40:31 +01:00
[script] Hide the implicit CLEAR for similar surfaces
Do emit the clear that is performed by the surface layer on similar surfaces.
This commit is contained in:
parent
005b195f06
commit
b6db3053dc
1 changed files with 43 additions and 0 deletions
|
|
@ -127,6 +127,7 @@ struct _cairo_script_surface {
|
|||
unsigned long id;
|
||||
cairo_list_t operand;
|
||||
cairo_bool_t defined;
|
||||
cairo_bool_t is_clear;
|
||||
|
||||
double width, height;
|
||||
|
||||
|
|
@ -1616,6 +1617,7 @@ _cairo_script_surface_create_similar (void *abstract_surface,
|
|||
_content_to_string (content),
|
||||
surface->id);
|
||||
surface->defined = TRUE;
|
||||
surface->is_clear = TRUE;
|
||||
target_push (surface);
|
||||
|
||||
return &surface->base;
|
||||
|
|
@ -1903,6 +1905,11 @@ _cairo_script_surface_paint (void *abstract_surface,
|
|||
cairo_script_surface_t *surface = abstract_surface;
|
||||
cairo_status_t status;
|
||||
|
||||
if (op == CAIRO_OPERATOR_CLEAR) {
|
||||
if (surface->is_clear)
|
||||
goto DONE;
|
||||
}
|
||||
|
||||
ctx_active (surface->ctx);
|
||||
|
||||
status = _cairo_surface_clipper_set_clip (&surface->clipper, clip);
|
||||
|
|
@ -1924,8 +1931,11 @@ _cairo_script_surface_paint (void *abstract_surface,
|
|||
_cairo_output_stream_puts (surface->ctx->stream,
|
||||
"paint\n");
|
||||
|
||||
surface->is_clear = op == CAIRO_OPERATOR_CLEAR && clip == NULL;
|
||||
|
||||
ctx_inactive (surface->ctx);
|
||||
|
||||
DONE:
|
||||
if (_cairo_surface_wrapper_is_active (&surface->wrapper)) {
|
||||
return _cairo_surface_wrapper_paint (&surface->wrapper,
|
||||
op, source, clip);
|
||||
|
|
@ -1944,6 +1954,11 @@ _cairo_script_surface_mask (void *abstract_surface,
|
|||
cairo_script_surface_t *surface = abstract_surface;
|
||||
cairo_status_t status;
|
||||
|
||||
if (op == CAIRO_OPERATOR_CLEAR) {
|
||||
if (surface->is_clear)
|
||||
goto DONE;
|
||||
}
|
||||
|
||||
ctx_active (surface->ctx);
|
||||
|
||||
status = _cairo_surface_clipper_set_clip (&surface->clipper, clip);
|
||||
|
|
@ -1975,8 +1990,11 @@ _cairo_script_surface_mask (void *abstract_surface,
|
|||
_cairo_output_stream_puts (surface->ctx->stream,
|
||||
" mask\n");
|
||||
|
||||
surface->is_clear = FALSE;
|
||||
|
||||
ctx_inactive (surface->ctx);
|
||||
|
||||
DONE:
|
||||
if (_cairo_surface_wrapper_is_active (&surface->wrapper)) {
|
||||
return _cairo_surface_wrapper_mask (&surface->wrapper,
|
||||
op, source, mask, clip);
|
||||
|
|
@ -2001,6 +2019,11 @@ _cairo_script_surface_stroke (void *abstract_surface,
|
|||
cairo_bool_t matrix_updated = FALSE;
|
||||
cairo_status_t status;
|
||||
|
||||
if (op == CAIRO_OPERATOR_CLEAR) {
|
||||
if (surface->is_clear)
|
||||
goto DONE;
|
||||
}
|
||||
|
||||
ctx_active (surface->ctx);
|
||||
|
||||
status = _cairo_surface_clipper_set_clip (&surface->clipper, clip);
|
||||
|
|
@ -2047,8 +2070,11 @@ _cairo_script_surface_stroke (void *abstract_surface,
|
|||
|
||||
_cairo_output_stream_puts (surface->ctx->stream, "stroke+\n");
|
||||
|
||||
surface->is_clear = FALSE;
|
||||
|
||||
ctx_inactive (surface->ctx);
|
||||
|
||||
DONE:
|
||||
if (_cairo_surface_wrapper_is_active (&surface->wrapper)) {
|
||||
return _cairo_surface_wrapper_stroke (&surface->wrapper,
|
||||
op, source, path,
|
||||
|
|
@ -2075,6 +2101,11 @@ _cairo_script_surface_fill (void *abstract_surface,
|
|||
cairo_bool_t matrix_updated = FALSE;
|
||||
cairo_status_t status;
|
||||
|
||||
if (op == CAIRO_OPERATOR_CLEAR) {
|
||||
if (surface->is_clear)
|
||||
goto DONE;
|
||||
}
|
||||
|
||||
ctx_active (surface->ctx);
|
||||
|
||||
status = _cairo_surface_clipper_set_clip (&surface->clipper, clip);
|
||||
|
|
@ -2119,8 +2150,11 @@ _cairo_script_surface_fill (void *abstract_surface,
|
|||
|
||||
_cairo_output_stream_puts (surface->ctx->stream, "fill+\n");
|
||||
|
||||
surface->is_clear = FALSE;
|
||||
|
||||
ctx_inactive (surface->ctx);
|
||||
|
||||
DONE:
|
||||
if (_cairo_surface_wrapper_is_active (&surface->wrapper)) {
|
||||
return _cairo_surface_wrapper_fill (&surface->wrapper,
|
||||
op, source, path,
|
||||
|
|
@ -2699,6 +2733,11 @@ _cairo_script_surface_show_text_glyphs (void *abstract_surface,
|
|||
int n;
|
||||
cairo_output_stream_t *base85_stream = NULL;
|
||||
|
||||
if (op == CAIRO_OPERATOR_CLEAR) {
|
||||
if (surface->is_clear)
|
||||
goto DONE;
|
||||
}
|
||||
|
||||
ctx_active (surface->ctx);
|
||||
|
||||
status = _cairo_surface_clipper_set_clip (&surface->clipper, clip);
|
||||
|
|
@ -2907,8 +2946,11 @@ _cairo_script_surface_show_text_glyphs (void *abstract_surface,
|
|||
"] show-glyphs\n");
|
||||
}
|
||||
|
||||
surface->is_clear = FALSE;
|
||||
|
||||
ctx_inactive (surface->ctx);
|
||||
|
||||
DONE:
|
||||
if (_cairo_surface_wrapper_is_active (&surface->wrapper)){
|
||||
return _cairo_surface_wrapper_show_text_glyphs (&surface->wrapper,
|
||||
op, source,
|
||||
|
|
@ -3068,6 +3110,7 @@ _cairo_script_surface_create_internal (cairo_script_vmcontext_t *ctx,
|
|||
surface->height = height;
|
||||
|
||||
surface->defined = FALSE;
|
||||
surface->is_clear = FALSE;
|
||||
surface->id = (unsigned long) -1;
|
||||
cairo_list_init (&surface->operand);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue