diff options
author | Adrian Johnson <ajohnson@redneon.com> | 2016-10-01 17:30:13 +0930 |
---|---|---|
committer | Adrian Johnson <ajohnson@redneon.com> | 2016-10-01 17:30:13 +0930 |
commit | 25da407a5f1d136345759c0d0a2a1d985eb2b392 (patch) | |
tree | a79dd34a23ed5abd343b6a44e03c9c281d9c6528 | |
parent | 3bd5efa1b651503ed9f175f9ea62fff53f0b2882 (diff) |
Support tag operations in analysis and paginated surface
-rw-r--r-- | src/cairo-analysis-surface.c | 37 | ||||
-rw-r--r-- | src/cairo-paginated-private.h | 2 | ||||
-rw-r--r-- | src/cairo-paginated-surface.c | 42 | ||||
-rw-r--r-- | src/cairo-pdf-surface.c | 4 | ||||
-rw-r--r-- | src/cairo-ps-surface.c | 4 | ||||
-rw-r--r-- | src/cairo-svg-surface.c | 4 | ||||
-rw-r--r-- | src/test-paginated-surface.c | 4 | ||||
-rw-r--r-- | src/win32/cairo-win32-printing-surface.c | 4 |
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 |