pdf: reset gstate in groups

This commit is contained in:
Adrian Johnson 2021-10-04 14:30:33 +10:30
parent 58aadd1481
commit 059f044e62

View file

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