diff options
author | Adrian Johnson <ajohnson@redneon.com> | 2012-05-27 22:59:13 +0930 |
---|---|---|
committer | Adrian Johnson <ajohnson@redneon.com> | 2012-05-27 22:59:13 +0930 |
commit | f3ae8302072dbcee38be4e0a9397e5aaa4084ecf (patch) | |
tree | 07c87d035733a1b14aa11e40eb57dc580d9d9477 | |
parent | 5dd119c1fef0c30bc71311ca9ccacf1f6e8017cf (diff) |
pdf: merge _emit_recording_surface and _emit_recording_subsurface into the one function
-rw-r--r-- | src/cairo-pdf-surface.c | 112 |
1 files changed, 26 insertions, 86 deletions
diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c index 3448c5ff..66f9c391 100644 --- a/src/cairo-pdf-surface.c +++ b/src/cairo-pdf-surface.c @@ -2681,11 +2681,28 @@ _cairo_pdf_surface_emit_recording_surface (cairo_pdf_surface_t *surface, int alpha = 0; cairo_surface_t *free_me = NULL; cairo_surface_t *source; + const cairo_rectangle_int_t *extents; + int width; + int height; + cairo_bool_t is_subsurface; assert (pdf_source->type == CAIRO_PATTERN_TYPE_SURFACE); + extents = &pdf_source->hash_entry->extents; + width = pdf_source->hash_entry->width; + height = pdf_source->hash_entry->height; + is_subsurface = FALSE; source = pdf_source->surface; - if (_cairo_surface_is_snapshot (source)) + if (_cairo_surface_is_snapshot (source)) { free_me = source = _cairo_surface_snapshot_get_target (source); + } else if (source->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE) { + cairo_surface_subsurface_t *sub = (cairo_surface_subsurface_t *) source; + + source = sub->target; + extents = &sub->extents; + width = extents->width; + height = extents->height; + is_subsurface = TRUE; + } old_width = surface->width; old_height = surface->height; @@ -2694,16 +2711,15 @@ _cairo_pdf_surface_emit_recording_surface (cairo_pdf_surface_t *surface, _cairo_surface_clipper_init (&surface->clipper, _cairo_pdf_surface_clipper_intersect_clip_path); - _cairo_pdf_surface_set_size_internal (surface, - pdf_source->hash_entry->width, - pdf_source->hash_entry->height); + _cairo_pdf_surface_set_size_internal (surface, width, height); + /* Patterns are emitted after fallback images. The paginated mode * needs to be set to _RENDER while the recording surface is replayed * back to this surface. */ surface->paginated_mode = CAIRO_PAGINATED_MODE_RENDER; _cairo_pdf_group_resources_clear (&surface->resources); - _get_bbox_from_extents (pdf_source->hash_entry->height, &pdf_source->hash_entry->extents, &bbox); + _get_bbox_from_extents (height, extents, &bbox); status = _cairo_pdf_surface_open_content_stream (surface, &bbox, &pdf_source->hash_entry->surface_res, TRUE); if (unlikely (status)) goto err; @@ -2721,7 +2737,7 @@ _cairo_pdf_surface_emit_recording_surface (cairo_pdf_surface_t *surface, } status = _cairo_recording_surface_replay_region (source, - NULL, + is_subsurface ? extents : NULL, &surface->base, CAIRO_RECORDING_REGION_NATIVE); assert (status != CAIRO_INT_STATUS_UNSUPPORTED); @@ -2743,89 +2759,13 @@ err: } static cairo_status_t -_cairo_pdf_surface_emit_recording_subsurface (cairo_pdf_surface_t *surface, - cairo_surface_t *recording_surface, - const cairo_rectangle_int_t *extents, - cairo_pdf_resource_t resource) -{ - double old_width, old_height; - cairo_paginated_mode_t old_paginated_mode; - cairo_surface_clipper_t old_clipper; - cairo_box_double_t bbox; - cairo_int_status_t status; - int alpha = 0; - - old_width = surface->width; - old_height = surface->height; - old_paginated_mode = surface->paginated_mode; - old_clipper = surface->clipper; - _cairo_surface_clipper_init (&surface->clipper, - _cairo_pdf_surface_clipper_intersect_clip_path); - - _cairo_pdf_surface_set_size_internal (surface, - extents->width, - extents->height); - /* Patterns are emitted after fallback images. The paginated mode - * needs to be set to _RENDER while the recording surface is replayed - * back to this surface. - */ - surface->paginated_mode = CAIRO_PAGINATED_MODE_RENDER; - _cairo_pdf_group_resources_clear (&surface->resources); - _get_bbox_from_extents (extents->height, extents, &bbox); - status = _cairo_pdf_surface_open_content_stream (surface, &bbox, &resource, TRUE); - if (unlikely (status)) - return status; - - if (cairo_surface_get_content (recording_surface) == CAIRO_CONTENT_COLOR) { - status = _cairo_pdf_surface_add_alpha (surface, 1.0, &alpha); - if (unlikely (status)) - return status; - - _cairo_output_stream_printf (surface->output, - "q /a%d gs 0 0 0 rg 0 0 %f %f re f Q\n", - alpha, - surface->width, - surface->height); - } - - status = _cairo_recording_surface_replay_region (recording_surface, - extents, - &surface->base, - CAIRO_RECORDING_REGION_NATIVE); - assert (status != CAIRO_INT_STATUS_UNSUPPORTED); - if (unlikely (status)) - return status; - - status = _cairo_pdf_surface_close_content_stream (surface); - - _cairo_surface_clipper_reset (&surface->clipper); - surface->clipper = old_clipper; - _cairo_pdf_surface_set_size_internal (surface, - old_width, - old_height); - surface->paginated_mode = old_paginated_mode; - - return status; -} - -static cairo_status_t _cairo_pdf_surface_emit_surface (cairo_pdf_surface_t *surface, cairo_pdf_source_surface_t *src_surface) { - if (src_surface->type == CAIRO_PATTERN_TYPE_SURFACE) { - if (src_surface->surface->type == CAIRO_SURFACE_TYPE_RECORDING) { - if (src_surface->surface->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE) { - cairo_surface_subsurface_t *sub = (cairo_surface_subsurface_t *) src_surface->surface; - return _cairo_pdf_surface_emit_recording_subsurface (surface, - sub->target, - &sub->extents, - src_surface->hash_entry->surface_res); - } else { - return _cairo_pdf_surface_emit_recording_surface (surface, - src_surface); - } - } - } + if (src_surface->type == CAIRO_PATTERN_TYPE_SURFACE && + src_surface->surface->type == CAIRO_SURFACE_TYPE_RECORDING) + return _cairo_pdf_surface_emit_recording_surface (surface, src_surface); + return _cairo_pdf_surface_emit_image_surface (surface, src_surface); } |