summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Johnson <ajohnson@redneon.com>2016-10-01 17:30:13 +0930
committerAdrian Johnson <ajohnson@redneon.com>2016-10-01 17:30:13 +0930
commit25da407a5f1d136345759c0d0a2a1d985eb2b392 (patch)
treea79dd34a23ed5abd343b6a44e03c9c281d9c6528
parent3bd5efa1b651503ed9f175f9ea62fff53f0b2882 (diff)
Support tag operations in analysis and paginated surface
-rw-r--r--src/cairo-analysis-surface.c37
-rw-r--r--src/cairo-paginated-private.h2
-rw-r--r--src/cairo-paginated-surface.c42
-rw-r--r--src/cairo-pdf-surface.c4
-rw-r--r--src/cairo-ps-surface.c4
-rw-r--r--src/cairo-svg-surface.c4
-rw-r--r--src/test-paginated-surface.c4
-rw-r--r--src/win32/cairo-win32-printing-surface.c4
8 files changed, 88 insertions, 13 deletions
diff --git a/src/cairo-analysis-surface.c b/src/cairo-analysis-surface.c
index 58b02e79f..a968f4015 100644
--- a/src/cairo-analysis-surface.c
+++ b/src/cairo-analysis-surface.c
@@ -728,6 +728,39 @@ _cairo_analysis_surface_show_text_glyphs (void *abstract_surface,
return _add_operation (surface, &extents, backend_status);
}
+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)
+{
+ cairo_analysis_surface_t *surface = abstract_surface;
+ cairo_int_status_t backend_status;
+
+ backend_status = CAIRO_INT_STATUS_SUCCESS;
+ if (surface->target->backend->tag != NULL) {
+ backend_status =
+ surface->target->backend->tag (surface->target,
+ begin,
+ tag_name,
+ attributes,
+ source,
+ stroke_style,
+ ctm,
+ ctm_inverse,
+ clip);
+ if (_cairo_int_status_is_error (backend_status))
+ return backend_status;
+ }
+
+ return backend_status;
+}
+
static const cairo_surface_backend_t cairo_analysis_surface_backend = {
CAIRO_INTERNAL_SURFACE_TYPE_ANALYSIS,
@@ -760,7 +793,9 @@ static const cairo_surface_backend_t cairo_analysis_surface_backend = {
NULL, /* fill_stroke */
_cairo_analysis_surface_show_glyphs,
_cairo_analysis_surface_has_show_text_glyphs,
- _cairo_analysis_surface_show_text_glyphs
+ _cairo_analysis_surface_show_text_glyphs,
+ NULL, /* get_supported_mime_types */
+ _cairo_analysis_surface_tag
};
cairo_surface_t *
diff --git a/src/cairo-paginated-private.h b/src/cairo-paginated-private.h
index b827faba0..29eefc76a 100644
--- a/src/cairo-paginated-private.h
+++ b/src/cairo-paginated-private.h
@@ -56,7 +56,7 @@ struct _cairo_paginated_surface_backend {
* CAIRO_PAGINATED_MODE_RENDER. See more details in the
* documentation for _cairo_paginated_surface_create below.
*/
- void
+ cairo_warn cairo_int_status_t
(*set_paginated_mode) (void *surface,
cairo_paginated_mode_t mode);
diff --git a/src/cairo-paginated-surface.c b/src/cairo-paginated-surface.c
index 68fa37ce3..749f0de73 100644
--- a/src/cairo-paginated-surface.c
+++ b/src/cairo-paginated-surface.c
@@ -352,8 +352,11 @@ _paint_page (cairo_paginated_surface_t *surface)
if (unlikely (analysis->status))
return _cairo_surface_set_error (surface->target, analysis->status);
- surface->backend->set_paginated_mode (surface->target,
+ status = surface->backend->set_paginated_mode (surface->target,
CAIRO_PAGINATED_MODE_ANALYZE);
+ if (unlikely (status))
+ goto FAIL;
+
status = _cairo_recording_surface_replay_and_create_regions (surface->recording_surface,
NULL, analysis, FALSE);
if (status)
@@ -401,8 +404,10 @@ _paint_page (cairo_paginated_surface_t *surface)
}
if (has_supported) {
- surface->backend->set_paginated_mode (surface->target,
- CAIRO_PAGINATED_MODE_RENDER);
+ status = surface->backend->set_paginated_mode (surface->target,
+ CAIRO_PAGINATED_MODE_RENDER);
+ if (unlikely (status))
+ goto FAIL;
status = _cairo_recording_surface_replay_region (surface->recording_surface,
NULL,
@@ -417,8 +422,10 @@ _paint_page (cairo_paginated_surface_t *surface)
cairo_rectangle_int_t extents;
cairo_bool_t is_bounded;
- surface->backend->set_paginated_mode (surface->target,
- CAIRO_PAGINATED_MODE_FALLBACK);
+ status = surface->backend->set_paginated_mode (surface->target,
+ CAIRO_PAGINATED_MODE_FALLBACK);
+ if (unlikely (status))
+ goto FAIL;
is_bounded = _cairo_surface_get_extents (surface->target, &extents);
if (! is_bounded) {
@@ -435,8 +442,10 @@ _paint_page (cairo_paginated_surface_t *surface)
cairo_region_t *region;
int num_rects, i;
- surface->backend->set_paginated_mode (surface->target,
+ status = surface->backend->set_paginated_mode (surface->target,
CAIRO_PAGINATED_MODE_FALLBACK);
+ if (unlikely (status))
+ goto FAIL;
region = _cairo_analysis_surface_get_unsupported (analysis);
@@ -660,6 +669,26 @@ _cairo_paginated_surface_get_supported_mime_types (void *abstract_surface)
return NULL;
}
+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)
+{
+ cairo_paginated_surface_t *surface = abstract_surface;
+
+ return _cairo_surface_tag (surface->recording_surface,
+ begin, tag_name, attributes,
+ source, style,
+ ctm, ctm_inverse,
+ clip);
+}
+
static cairo_surface_t *
_cairo_paginated_surface_snapshot (void *abstract_other)
{
@@ -714,4 +743,5 @@ static const cairo_surface_backend_t cairo_paginated_surface_backend = {
_cairo_paginated_surface_has_show_text_glyphs,
_cairo_paginated_surface_show_text_glyphs,
_cairo_paginated_surface_get_supported_mime_types,
+ _cairo_paginated_surface_tag,
};
diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c
index 944e9d62f..3f879fb2e 100644
--- a/src/cairo-pdf-surface.c
+++ b/src/cairo-pdf-surface.c
@@ -7917,7 +7917,7 @@ _cairo_pdf_surface_get_supported_mime_types (void *abstract_surface)
return _cairo_pdf_supported_mime_types;
}
-static void
+static cairo_int_status_t
_cairo_pdf_surface_set_paginated_mode (void *abstract_surface,
cairo_paginated_mode_t paginated_mode)
{
@@ -7930,6 +7930,8 @@ _cairo_pdf_surface_set_paginated_mode (void *abstract_surface,
surface->surface_extents.width = ceil (surface->width);
surface->surface_extents.height = ceil (surface->height);
}
+
+ return CAIRO_INT_STATUS_SUCCESS;
}
static const cairo_surface_backend_t cairo_pdf_surface_backend = {
diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c
index 240c8e21a..1e020c056 100644
--- a/src/cairo-ps-surface.c
+++ b/src/cairo-ps-surface.c
@@ -4513,7 +4513,7 @@ _cairo_ps_surface_get_supported_mime_types (void *abstract_surface)
return _cairo_ps_supported_mime_types;
}
-static void
+static cairo_int_status_t
_cairo_ps_surface_set_paginated_mode (void *abstract_surface,
cairo_paginated_mode_t paginated_mode)
{
@@ -4536,6 +4536,8 @@ _cairo_ps_surface_set_paginated_mode (void *abstract_surface,
_cairo_surface_clipper_reset (&surface->clipper);
}
}
+
+ return CAIRO_STATUS_SUCCESS;
}
static cairo_int_status_t
diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c
index 2e023b313..2a020c017 100644
--- a/src/cairo-svg-surface.c
+++ b/src/cairo-svg-surface.c
@@ -2852,13 +2852,15 @@ _cairo_svg_document_finish (cairo_svg_document_t *document)
return status;
}
-static void
+static cairo_int_status_t
_cairo_svg_surface_set_paginated_mode (void *abstract_surface,
cairo_paginated_mode_t paginated_mode)
{
cairo_svg_surface_t *surface = abstract_surface;
surface->paginated_mode = paginated_mode;
+
+ return CAIRO_STATUS_SUCCESS;
}
static cairo_bool_t
diff --git a/src/test-paginated-surface.c b/src/test-paginated-surface.c
index a0d4c1cee..a9f073fe4 100644
--- a/src/test-paginated-surface.c
+++ b/src/test-paginated-surface.c
@@ -232,13 +232,15 @@ _test_paginated_surface_show_text_glyphs (void *abstract_surface,
}
-static void
+static cairo_int_status_t
_test_paginated_surface_set_paginated_mode (void *abstract_surface,
cairo_paginated_mode_t mode)
{
test_paginated_surface_t *surface = abstract_surface;
surface->paginated_mode = mode;
+
+ return CAIRO_STATUS_SUCCESS;
}
static const cairo_surface_backend_t test_paginated_surface_backend = {
diff --git a/src/win32/cairo-win32-printing-surface.c b/src/win32/cairo-win32-printing-surface.c
index 983ef598d..68321c86c 100644
--- a/src/win32/cairo-win32-printing-surface.c
+++ b/src/win32/cairo-win32-printing-surface.c
@@ -2090,13 +2090,15 @@ _cairo_win32_printing_surface_start_page (void *abstract_surface)
return CAIRO_STATUS_SUCCESS;
}
-static void
+static cairo_int_status_t
_cairo_win32_printing_surface_set_paginated_mode (void *abstract_surface,
cairo_paginated_mode_t paginated_mode)
{
cairo_win32_printing_surface_t *surface = abstract_surface;
surface->paginated_mode = paginated_mode;
+
+ return CAIRO_STATUS_SUCCESS;
}
static cairo_bool_t