From 2d887d99c74f2097021a1f4f7c1d2306b8f9b429 Mon Sep 17 00:00:00 2001 From: Adrian Johnson Date: Sat, 10 Sep 2011 23:21:28 +0930 Subject: [PATCH] ps: use reusable stream for mesh pattern data File data used by a shading pattern must reusable since the pattern may read the file multiple times. As currentfile is not reusable, use the /ReusableStreamDecode to make it reusable. --- src/cairo-ps-surface.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c index fcfb2f1c7..cf1c8d8a9 100644 --- a/src/cairo-ps-surface.c +++ b/src/cairo-ps-surface.c @@ -3605,11 +3605,25 @@ _cairo_ps_surface_emit_mesh_pattern (cairo_ps_surface_t *surface, return status; _cairo_output_stream_printf (surface->stream, + "currentfile\n" + "/ASCII85Decode filter /FlateDecode filter /ReusableStreamDecode filter\n"); + + status = _cairo_ps_surface_emit_base85_string (surface, + shading.data, + shading.data_length, + CAIRO_PS_COMPRESS_DEFLATE, + FALSE); + if (status) + return status; + + _cairo_output_stream_printf (surface->stream, + "\n" + "/CairoData exch def\n" "<< /PatternType 2\n" " /Shading\n" " << /ShadingType %d\n" " /ColorSpace /DeviceRGB\n" - " /DataSource currentfile /ASCII85Decode filter /FlateDecode filter\n" + " /DataSource CairoData\n" " /BitsPerCoordinate %d\n" " /BitsPerComponent %d\n" " /BitsPerFlag %d\n" @@ -3633,16 +3647,9 @@ _cairo_ps_surface_emit_mesh_pattern (cairo_ps_surface_t *surface, pat_to_ps.xy, pat_to_ps.yy, pat_to_ps.x0, pat_to_ps.y0); _cairo_output_stream_printf (surface->stream, - "makepattern\n"); - - status = _cairo_ps_surface_emit_base85_string (surface, - shading.data, - shading.data_length, - CAIRO_PS_COMPRESS_DEFLATE, - FALSE); - _cairo_output_stream_printf (surface->stream, - "\n" - "setpattern\n"); + "makepattern\n" + "setpattern\n" + "currentdict /CairoData undef\n"); _cairo_pdf_shading_fini (&shading);