summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Johnson <ajohnson@redneon.com>2022-04-26 12:58:41 +0000
committerAdrian Johnson <ajohnson@redneon.com>2022-04-26 12:58:41 +0000
commitf07d539c07488edccd0bea241073572bc20c8ed1 (patch)
tree9507c86e241dca063a8b29862d611e1c83b8ef99
parentfafbfcda91aad8fcf197b350f37db2a4b14361f9 (diff)
parente37afffd50a3f8f2becc943824d33aac36fae9ec (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.c38
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;