Support tag operations in analysis and paginated surface

This commit is contained in:
Adrian Johnson 2016-10-01 17:30:13 +09:30
parent 3bd5efa1b6
commit 25da407a5f
8 changed files with 88 additions and 13 deletions

View file

@ -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 *

View file

@ -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);

View file

@ -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,
};

View file

@ -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 = {

View file

@ -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

View file

@ -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

View file

@ -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 = {

View file

@ -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