diff options
-rw-r--r-- | src/cairo-analysis-surface.c | 2 | ||||
-rw-r--r-- | src/cairo-meta-surface.c | 1 | ||||
-rw-r--r-- | src/cairo-paginated-surface.c | 1 | ||||
-rw-r--r-- | src/cairo-pdf-surface.c | 1 | ||||
-rw-r--r-- | src/cairo-script-surface.c | 1 | ||||
-rw-r--r-- | src/cairo-surface.c | 41 | ||||
-rw-r--r-- | src/cairo-xlib-surface.c | 12 | ||||
-rw-r--r-- | src/cairoint.h | 5 | ||||
-rw-r--r-- | src/test-meta-surface.c | 1 | ||||
-rw-r--r-- | src/test-paginated-surface.c | 1 |
10 files changed, 48 insertions, 18 deletions
diff --git a/src/cairo-analysis-surface.c b/src/cairo-analysis-surface.c index 0529a74de..e098445b4 100644 --- a/src/cairo-analysis-surface.c +++ b/src/cairo-analysis-surface.c @@ -749,6 +749,7 @@ static const cairo_surface_backend_t cairo_analysis_surface_backend = { NULL, /* reset */ NULL, /* fill_stroke */ NULL, /* create_solid_pattern_surface */ + NULL, /* can_repaint_solid_pattern_surface */ _cairo_analysis_surface_has_show_text_glyphs, _cairo_analysis_surface_show_text_glyphs }; @@ -966,6 +967,7 @@ static const cairo_surface_backend_t cairo_null_surface_backend = { NULL, /* reset */ NULL, /* fill_stroke */ NULL, /* create_solid_pattern_surface */ + NULL, /* can_repaint_solid_pattern_surface */ NULL, /* has_show_text_glyphs */ NULL /* show_text_glyphs */ }; diff --git a/src/cairo-meta-surface.c b/src/cairo-meta-surface.c index 0f6e6324f..6938526de 100644 --- a/src/cairo-meta-surface.c +++ b/src/cairo-meta-surface.c @@ -678,6 +678,7 @@ static const cairo_surface_backend_t cairo_meta_surface_backend = { NULL, /* reset */ NULL, /* fill_stroke */ NULL, /* create_solid_pattern_surface */ + NULL, /* can_repaint_solid_pattern_surface */ _cairo_meta_surface_has_show_text_glyphs, _cairo_meta_surface_show_text_glyphs diff --git a/src/cairo-paginated-surface.c b/src/cairo-paginated-surface.c index ce4e4defc..5d4e08fa8 100644 --- a/src/cairo-paginated-surface.c +++ b/src/cairo-paginated-surface.c @@ -701,6 +701,7 @@ static const cairo_surface_backend_t cairo_paginated_surface_backend = { NULL, /* reset */ NULL, /* fill_stroke */ NULL, /* create_solid_pattern_surface */ + NULL, /* can_repaint_solid_pattern_surface */ _cairo_paginated_surface_has_show_text_glyphs, _cairo_paginated_surface_show_text_glyphs }; diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c index 5862c4b5d..d453f205e 100644 --- a/src/cairo-pdf-surface.c +++ b/src/cairo-pdf-surface.c @@ -5335,6 +5335,7 @@ static const cairo_surface_backend_t cairo_pdf_surface_backend = { NULL, /* reset */ _cairo_pdf_surface_fill_stroke, NULL, /* create_solid_pattern_surface */ + NULL, /* can_repaint_solid_pattern_surface */ _cairo_pdf_surface_has_show_text_glyphs, _cairo_pdf_surface_show_text_glyphs, }; diff --git a/src/cairo-script-surface.c b/src/cairo-script-surface.c index 906e4ed53..2585a500f 100644 --- a/src/cairo-script-surface.c +++ b/src/cairo-script-surface.c @@ -2452,6 +2452,7 @@ _cairo_script_surface_backend = { NULL, /* reset */ NULL, /* fill_stroke */ NULL, /* create_solid_pattern_surface */ + NULL, /* can_repaint_solid_pattern_surface */ /* The alternate high-level text operation */ _cairo_script_surface_has_show_text_glyphs, diff --git a/src/cairo-surface.c b/src/cairo-surface.c index 077af5b41..4dd034eb1 100644 --- a/src/cairo-surface.c +++ b/src/cairo-surface.c @@ -334,19 +334,19 @@ cairo_surface_t * _cairo_surface_create_solid_pattern_surface (cairo_surface_t *other, const cairo_solid_pattern_t *solid_pattern) { - cairo_surface_t *surface; + if (other->backend->create_solid_pattern_surface != NULL) { + cairo_surface_t *surface; - if (other->backend->create_solid_pattern_surface) { - surface = other->backend->create_solid_pattern_surface (other, solid_pattern); + surface = other->backend->create_solid_pattern_surface (other, + solid_pattern); if (surface) return surface; } - surface = _cairo_surface_create_similar_solid (other, - solid_pattern->content, - 1, 1, - &solid_pattern->color); - return surface; + return _cairo_surface_create_similar_solid (other, + solid_pattern->content, + 1, 1, + &solid_pattern->color); } cairo_int_status_t @@ -354,17 +354,24 @@ _cairo_surface_repaint_solid_pattern_surface (cairo_surface_t *other, cairo_surface_t *solid_surface, const cairo_solid_pattern_t *solid_pattern) { - if (other->backend->create_solid_pattern_surface) - /* Solid pattern surface for this backend are not trivial to make. - * Skip repainting. - * - * This does not work optimally with things like analysis surface that - * are proxies. But returning UNSUPPORTED is *safe* as it only - * disables some caching. - */ + /* Solid pattern surface for these backends are special and not trivial + * to repaint. Skip repainting. + * + * This does not work optimally with things like analysis surface that + * are proxies. But returning UNSUPPORTED is *safe* as it only + * disables some caching. + */ + if (other->backend->create_solid_pattern_surface != NULL && + ! other->backend->can_repaint_solid_pattern_surface (solid_surface, + solid_pattern)) + { return CAIRO_INT_STATUS_UNSUPPORTED; + } - return _cairo_surface_paint (solid_surface, CAIRO_OPERATOR_SOURCE, &solid_pattern->base, NULL); + return _cairo_surface_paint (solid_surface, + CAIRO_OPERATOR_SOURCE, + &solid_pattern->base, + NULL); } cairo_clip_mode_t diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c index 68d819225..1826ed9ef 100644 --- a/src/cairo-xlib-surface.c +++ b/src/cairo-xlib-surface.c @@ -1310,6 +1310,15 @@ _cairo_xlib_surface_create_solid_pattern_surface (void *abstrac return &surface->base; } +static cairo_bool_t +_cairo_xlib_surface_can_repaint_solid_pattern_surface (void *abstract_surface, + const cairo_solid_pattern_t *solid_pattern) +{ + cairo_xlib_surface_t *other = abstract_surface; + return CAIRO_SURFACE_RENDER_HAS_COMPOSITE (other); +} + + static cairo_status_t _cairo_xlib_surface_set_matrix (cairo_xlib_surface_t *surface, cairo_matrix_t *matrix, @@ -2469,7 +2478,8 @@ static const cairo_surface_backend_t cairo_xlib_surface_backend = { _cairo_xlib_surface_is_similar, _cairo_xlib_surface_reset, NULL, /* fill_stroke */ - _cairo_xlib_surface_create_solid_pattern_surface + _cairo_xlib_surface_create_solid_pattern_surface, + _cairo_xlib_surface_can_repaint_solid_pattern_surface }; /** diff --git a/src/cairoint.h b/src/cairoint.h index 21c5d6286..81664368e 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -823,6 +823,11 @@ struct _cairo_surface_backend { const cairo_solid_pattern_t *solid_pattern); cairo_bool_t + (*can_repaint_solid_pattern_surface) + (void *surface, + const cairo_solid_pattern_t *solid_pattern); + + cairo_bool_t (*has_show_text_glyphs) (void *surface); cairo_warn cairo_int_status_t diff --git a/src/test-meta-surface.c b/src/test-meta-surface.c index 42bf6b0ce..d5e14d7d1 100644 --- a/src/test-meta-surface.c +++ b/src/test-meta-surface.c @@ -336,6 +336,7 @@ static const cairo_surface_backend_t test_meta_surface_backend = { NULL, /* reset */ NULL, /* fill_stroke */ NULL, /* create_solid_pattern_surface */ + NULL, /* can_repaint_solid_pattern_surface */ _test_meta_surface_has_show_text_glyphs, _test_meta_surface_show_text_glyphs }; diff --git a/src/test-paginated-surface.c b/src/test-paginated-surface.c index 4c566470e..d42700c8a 100644 --- a/src/test-paginated-surface.c +++ b/src/test-paginated-surface.c @@ -326,6 +326,7 @@ static const cairo_surface_backend_t test_paginated_surface_backend = { NULL, /* reset */ NULL, /* fill_stroke */ NULL, /* create_solid_pattern_surface */ + NULL, /* can_repaint_solid_pattern_surface */ _test_paginated_surface_has_show_text_glyphs, _test_paginated_surface_show_text_glyphs |