diff options
author | Adrian Johnson <ajohnson@redneon.com> | 2022-04-26 12:58:41 +0000 |
---|---|---|
committer | Adrian Johnson <ajohnson@redneon.com> | 2022-04-26 12:58:41 +0000 |
commit | f07d539c07488edccd0bea241073572bc20c8ed1 (patch) | |
tree | 9507c86e241dca063a8b29862d611e1c83b8ef99 | |
parent | fafbfcda91aad8fcf197b350f37db2a4b14361f9 (diff) | |
parent | e37afffd50a3f8f2becc943824d33aac36fae9ec (diff) |
Merge branch 'issue-514' into 'master'
pdf: reset current operator when resetting clip
Closes #514
See merge request cairo/cairo!256
-rw-r--r-- | src/cairo-pdf-surface.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c index d2581ce77..57258b107 100644 --- a/src/cairo-pdf-surface.c +++ b/src/cairo-pdf-surface.c @@ -421,6 +421,7 @@ _cairo_pdf_surface_clipper_intersect_clip_path (cairo_surface_clipper_t *clipper _cairo_output_stream_printf (surface->output, "Q q\n"); surface->current_pattern_is_solid_color = FALSE; + surface->current_operator = CAIRO_OPERATOR_OVER; _cairo_pdf_operators_reset (&surface->pdf_operators); return CAIRO_STATUS_SUCCESS; @@ -1242,7 +1243,8 @@ _cairo_operator_to_pdf_blend_mode (cairo_operator_t op) static void _cairo_pdf_surface_emit_group_resources (cairo_pdf_surface_t *surface, - cairo_pdf_group_resources_t *res) + cairo_pdf_group_resources_t *res, + cairo_bool_t gs0) { int num_alphas, num_smasks, num_resources, i; double alpha; @@ -1257,6 +1259,11 @@ _cairo_pdf_surface_emit_group_resources (cairo_pdf_surface_t *surface, _cairo_output_stream_printf (surface->output, " /ExtGState <<\n"); + if (gs0) { + _cairo_output_stream_printf (surface->output, + " /gs0 << /BM /Normal /SMask /None /CA 1.0 /ca 1.0 >>\n"); + } + for (i = 0; i < CAIRO_NUM_OPERATORS; i++) { if (res->operators[i]) { _cairo_output_stream_printf (surface->output, @@ -2058,7 +2065,7 @@ _cairo_pdf_surface_write_memory_stream (cairo_pdf_surface_t *surface, _cairo_output_stream_printf (surface->output, " >>\n" " /Resources\n"); - _cairo_pdf_surface_emit_group_resources (surface, resources); + _cairo_pdf_surface_emit_group_resources (surface, resources, TRUE); _cairo_output_stream_printf (surface->output, ">>\n" "stream\n"); @@ -2079,9 +2086,6 @@ _cairo_pdf_surface_open_group (cairo_pdf_surface_t *surface, assert (surface->group_stream.active == FALSE); surface->group_stream.active = TRUE; - surface->current_pattern_is_solid_color = FALSE; - surface->current_operator = CAIRO_OPERATOR_OVER; - _cairo_pdf_operators_reset (&surface->pdf_operators); surface->group_stream.mem_stream = _cairo_memory_stream_create (); @@ -2108,6 +2112,12 @@ _cairo_pdf_surface_open_group (cairo_pdf_surface_t *surface, surface->group_stream.is_knockout = FALSE; surface->group_stream.bbox = *bbox; + /* Reset gstate */ + _cairo_output_stream_printf (surface->output, "/gs0 gs\n"); + surface->current_pattern_is_solid_color = FALSE; + surface->current_operator = CAIRO_OPERATOR_OVER; + _cairo_pdf_operators_reset (&surface->pdf_operators); + return status; } @@ -2420,7 +2430,8 @@ _cairo_pdf_surface_open_content_stream (cairo_pdf_surface_t *surface, } static cairo_int_status_t -_cairo_pdf_surface_close_content_stream (cairo_pdf_surface_t *surface) +_cairo_pdf_surface_close_content_stream (cairo_pdf_surface_t *surface, + cairo_bool_t is_form) { cairo_int_status_t status; @@ -2440,7 +2451,7 @@ _cairo_pdf_surface_close_content_stream (cairo_pdf_surface_t *surface) _cairo_output_stream_printf (surface->output, "%d 0 obj\n", surface->content_resources.id); - _cairo_pdf_surface_emit_group_resources (surface, &surface->resources); + _cairo_pdf_surface_emit_group_resources (surface, &surface->resources, is_form); _cairo_output_stream_printf (surface->output, "endobj\n"); @@ -3690,6 +3701,9 @@ _cairo_pdf_surface_emit_recording_surface (cairo_pdf_surface_t *surface, if (unlikely (status)) goto err; + /* Reset gstate */ + _cairo_output_stream_printf (surface->output, "/gs0 gs\n"); + if (source->content == CAIRO_CONTENT_COLOR) { status = _cairo_pdf_surface_add_alpha (surface, 1.0, &alpha); if (unlikely (status)) @@ -3712,7 +3726,7 @@ _cairo_pdf_surface_emit_recording_surface (cairo_pdf_surface_t *surface, if (unlikely (status)) goto err; - status = _cairo_pdf_surface_close_content_stream (surface); + status = _cairo_pdf_surface_close_content_stream (surface, TRUE); _cairo_surface_clipper_reset (&surface->clipper); surface->clipper = old_clipper; @@ -5380,7 +5394,7 @@ _cairo_pdf_surface_show_page (void *abstract_surface) if (unlikely (status)) return status; - status = _cairo_pdf_surface_close_content_stream (surface); + status = _cairo_pdf_surface_close_content_stream (surface, FALSE); if (unlikely (status)) return status; @@ -6649,7 +6663,7 @@ _cairo_pdf_surface_emit_type3_font_subset (cairo_pdf_surface_t *surface, _cairo_output_stream_printf (surface->output, " /Resources\n"); - _cairo_pdf_surface_emit_group_resources (surface, &surface->resources); + _cairo_pdf_surface_emit_group_resources (surface, &surface->resources, FALSE); if (to_unicode_stream.id != 0) _cairo_output_stream_printf (surface->output, @@ -7382,7 +7396,7 @@ _cairo_pdf_surface_write_page (cairo_pdf_surface_t *surface) if (unlikely (status)) return status; - status = _cairo_pdf_surface_close_content_stream (surface); + status = _cairo_pdf_surface_close_content_stream (surface, FALSE); if (unlikely (status)) return status; } @@ -7681,7 +7695,7 @@ _cairo_pdf_surface_start_fallback (cairo_pdf_surface_t *surface) cairo_box_double_t bbox; cairo_int_status_t status; - status = _cairo_pdf_surface_close_content_stream (surface); + status = _cairo_pdf_surface_close_content_stream (surface, FALSE); if (unlikely (status)) return status; |