diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c index e51c36156..e3d104228 100644 --- a/src/cairo-pdf-surface.c +++ b/src/cairo-pdf-surface.c @@ -1239,7 +1239,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; @@ -1254,6 +1255,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, @@ -2055,7 +2061,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"); @@ -2076,9 +2082,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 (); @@ -2105,6 +2108,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; } @@ -2417,7 +2426,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; @@ -2437,7 +2447,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"); @@ -3681,6 +3691,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)) @@ -3703,7 +3716,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; @@ -5371,7 +5384,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; @@ -6628,7 +6641,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, @@ -7363,7 +7376,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; } @@ -7662,7 +7675,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;