summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cairo-analysis-surface.c2
-rw-r--r--src/cairo-meta-surface.c1
-rw-r--r--src/cairo-paginated-surface.c1
-rw-r--r--src/cairo-pdf-surface.c1
-rw-r--r--src/cairo-script-surface.c1
-rw-r--r--src/cairo-surface.c41
-rw-r--r--src/cairo-xlib-surface.c12
-rw-r--r--src/cairoint.h5
-rw-r--r--src/test-meta-surface.c1
-rw-r--r--src/test-paginated-surface.c1
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