summaryrefslogtreecommitdiff
path: root/src/cairo-ps-surface.c
diff options
context:
space:
mode:
authormh0310.choi <mh0310.choi@samsung.com>2015-07-28 10:46:57 +0900
committermh0310.choi <mh0310.choi@samsung.com>2015-07-28 13:08:12 +0900
commit5e67a6f721eaedda61300baf0799199c7771ebd0 (patch)
tree6cd50b52498aab50e79b966cdccc2a137db316d9 /src/cairo-ps-surface.c
parentd3aeffba37161d2b76b29c4ea13369bd67a47a8e (diff)
downloadcairo-5e67a6f721eaedda61300baf0799199c7771ebd0.tar.gz
cairo-5e67a6f721eaedda61300baf0799199c7771ebd0.tar.bz2
cairo-5e67a6f721eaedda61300baf0799199c7771ebd0.zip
- from 1.12.14 to 1.14.2 Change-Id: I3b62d212041b337bbb926d579f9ce74f42a45c3b
Diffstat (limited to 'src/cairo-ps-surface.c')
-rw-r--r--[-rwxr-xr-x]src/cairo-ps-surface.c149
1 files changed, 102 insertions, 47 deletions
diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c
index 01df6090b..4fc15f632 100755..100644
--- a/src/cairo-ps-surface.c
+++ b/src/cairo-ps-surface.c
@@ -340,14 +340,48 @@ _cairo_ps_surface_emit_header (cairo_ps_surface_t *surface)
"/rg { setrgbcolor } bind def\n"
"/d1 { setcachedevice } bind def\n");
+ if (!surface->eps) {
+ _cairo_output_stream_printf (surface->final_stream,
+ "/cairo_set_page_size {\n"
+ " %% Change paper size, but only if different from previous paper size otherwise\n"
+ " %% duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size\n"
+ " %% so we use the same when checking if the size changes.\n"
+ " /setpagedevice where {\n"
+ " pop currentpagedevice\n"
+ " /PageSize known {\n"
+ " 2 copy\n"
+ " currentpagedevice /PageSize get aload pop\n"
+ " exch 4 1 roll\n"
+ " sub abs 5 gt\n"
+ " 3 1 roll\n"
+ " sub abs 5 gt\n"
+ " or\n"
+ " } {\n"
+ " true\n"
+ " } ifelse\n"
+ " {\n"
+ " 2 array astore\n"
+ " 2 dict begin\n"
+ " /PageSize exch def\n"
+ " /ImagingBBox null def\n"
+ " currentdict end\n"
+ " setpagedevice\n"
+ " } {\n"
+ " pop pop\n"
+ " } ifelse\n"
+ " } {\n"
+ " pop\n"
+ " } ifelse\n"
+ "} def\n");
+ }
+
_cairo_output_stream_printf (surface->final_stream,
"%%%%EndProlog\n");
+ _cairo_output_stream_printf (surface->final_stream,
+ "%%%%BeginSetup\n");
num_comments = _cairo_array_num_elements (&surface->dsc_setup_comments);
if (num_comments) {
- _cairo_output_stream_printf (surface->final_stream,
- "%%%%BeginSetup\n");
-
comments = _cairo_array_index (&surface->dsc_setup_comments, 0);
for (i = 0; i < num_comments; i++) {
_cairo_output_stream_printf (surface->final_stream,
@@ -355,9 +389,6 @@ _cairo_ps_surface_emit_header (cairo_ps_surface_t *surface)
free (comments[i]);
comments[i] = NULL;
}
-
- _cairo_output_stream_printf (surface->final_stream,
- "%%%%EndSetup\n");
}
}
@@ -385,8 +416,13 @@ _cairo_ps_surface_emit_type1_font_subset (cairo_ps_surface_t *surface,
"%% _cairo_ps_surface_emit_type1_font_subset\n");
#endif
+ _cairo_output_stream_printf (surface->final_stream,
+ "%%%%BeginResource: font %s\n",
+ subset.base_font);
length = subset.header_length + subset.data_length + subset.trailer_length;
_cairo_output_stream_write (surface->final_stream, subset.data, length);
+ _cairo_output_stream_printf (surface->final_stream,
+ "%%%%EndResource\n");
_cairo_type1_subset_fini (&subset);
@@ -409,15 +445,18 @@ _cairo_ps_surface_emit_type1_font_fallback (cairo_ps_surface_t *surface,
if (unlikely (status))
return status;
- /* FIXME: Figure out document structure convention for fonts */
-
#if DEBUG_PS
_cairo_output_stream_printf (surface->final_stream,
"%% _cairo_ps_surface_emit_type1_font_fallback\n");
#endif
+ _cairo_output_stream_printf (surface->final_stream,
+ "%%%%BeginResource: font %s\n",
+ subset.base_font);
length = subset.header_length + subset.data_length + subset.trailer_length;
_cairo_output_stream_write (surface->final_stream, subset.data, length);
+ _cairo_output_stream_printf (surface->final_stream,
+ "%%%%EndResource\n");
_cairo_type1_fallback_fini (&subset);
@@ -446,6 +485,9 @@ _cairo_ps_surface_emit_truetype_font_subset (cairo_ps_surface_t *surface,
#endif
_cairo_output_stream_printf (surface->final_stream,
+ "%%%%BeginResource: font %s\n",
+ subset.ps_name);
+ _cairo_output_stream_printf (surface->final_stream,
"11 dict begin\n"
"/FontType 42 def\n"
"/FontName /%s def\n"
@@ -527,13 +569,15 @@ _cairo_ps_surface_emit_truetype_font_subset (cairo_ps_surface_t *surface,
"/f-%d-%d currentdict end definefont pop\n",
font_subset->font_id,
font_subset->subset_id);
-
+ _cairo_output_stream_printf (surface->final_stream,
+ "%%%%EndResource\n");
_cairo_truetype_subset_fini (&subset);
+
return CAIRO_STATUS_SUCCESS;
}
-static cairo_status_t
+static cairo_int_status_t
_cairo_ps_emit_imagemask (cairo_image_surface_t *image,
cairo_output_stream_t *stream)
{
@@ -587,7 +631,8 @@ _cairo_ps_surface_analyze_user_font_subset (cairo_scaled_font_subset_t *font_sub
type3_surface = _cairo_type3_glyph_surface_create (font_subset->scaled_font,
NULL,
_cairo_ps_emit_imagemask,
- surface->font_subsets);
+ surface->font_subsets,
+ TRUE);
for (i = 0; i < font_subset->num_glyphs; i++) {
status = _cairo_type3_glyph_surface_analyze_glyph (type3_surface,
@@ -624,6 +669,8 @@ _cairo_ps_surface_emit_type3_font_subset (cairo_ps_surface_t *surface,
#endif
_cairo_output_stream_printf (surface->final_stream,
+ "%%%%BeginResource: font\n");
+ _cairo_output_stream_printf (surface->final_stream,
"8 dict begin\n"
"/FontType 3 def\n"
"/FontMatrix [1 0 0 1 0 0] def\n"
@@ -633,7 +680,8 @@ _cairo_ps_surface_emit_type3_font_subset (cairo_ps_surface_t *surface,
type3_surface = _cairo_type3_glyph_surface_create (font_subset->scaled_font,
NULL,
_cairo_ps_emit_imagemask,
- surface->font_subsets);
+ surface->font_subsets,
+ TRUE);
status = type3_surface->status;
if (unlikely (status)) {
cairo_surface_destroy (type3_surface);
@@ -705,6 +753,8 @@ _cairo_ps_surface_emit_type3_font_subset (cairo_ps_surface_t *surface,
- _cairo_fixed_to_double (font_bbox.p1.y),
font_subset->font_id,
font_subset->subset_id);
+ _cairo_output_stream_printf (surface->final_stream,
+ "%%%%EndResource\n");
return CAIRO_STATUS_SUCCESS;
}
@@ -1025,7 +1075,8 @@ _cairo_ps_surface_create_for_stream_internal (cairo_output_stream_t *stream,
_cairo_pdf_operators_init (&surface->pdf_operators,
surface->stream,
&surface->cairo_to_ps,
- surface->font_subsets);
+ surface->font_subsets,
+ TRUE);
surface->num_pages = 0;
cairo_list_init (&surface->document_media);
@@ -1568,6 +1619,9 @@ _cairo_ps_surface_finish (void *abstract_surface)
if (unlikely (status))
goto CLEANUP;
+ _cairo_output_stream_printf (surface->final_stream,
+ "%%%%EndSetup\n");
+
status = _cairo_ps_surface_emit_body (surface);
if (unlikely (status))
goto CLEANUP;
@@ -2738,11 +2792,9 @@ _cairo_ps_surface_emit_image (cairo_ps_surface_t *surface,
}
_cairo_output_stream_printf (surface->stream,
- " /Interpolate %s def\n"
" /ImageMatrix [ 1 0 0 -1 0 %d ] def\n"
"end\n"
"%s\n",
- interpolate,
ps_image->height,
stencil_mask ? "imagemask" : "image");
}
@@ -3113,6 +3165,16 @@ _cairo_ps_surface_emit_surface (cairo_ps_surface_t *surface,
{
cairo_int_status_t status;
+ if (source_pattern->type == CAIRO_PATTERN_TYPE_SURFACE &&
+ source_pattern->extend != CAIRO_EXTEND_PAD)
+ {
+ cairo_surface_t *surf = ((cairo_surface_pattern_t *) source_pattern)->surface;
+
+ status = _cairo_ps_surface_emit_jpeg_image (surface, surf, width, height);
+ if (status != CAIRO_INT_STATUS_UNSUPPORTED)
+ return status;
+ }
+
if (source_surface->type == CAIRO_SURFACE_TYPE_RECORDING) {
if (source_surface->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE) {
cairo_surface_subsurface_t *sub = (cairo_surface_subsurface_t *) source_surface;
@@ -3122,12 +3184,6 @@ _cairo_ps_surface_emit_surface (cairo_ps_surface_t *surface,
}
} else {
cairo_image_surface_t *image = (cairo_image_surface_t *) source_surface;
- if (source_pattern->extend != CAIRO_EXTEND_PAD) {
- status = _cairo_ps_surface_emit_jpeg_image (surface, source_surface,
- width, height);
- if (status != CAIRO_INT_STATUS_UNSUPPORTED)
- return status;
- }
status = _cairo_ps_surface_emit_image (surface, image,
op, source_pattern->filter, stencil_mask);
@@ -3267,11 +3323,9 @@ _cairo_ps_surface_paint_surface (cairo_ps_surface_t *surface,
cairo_matrix_scale (&ps_p2d, 1.0, -1.0);
if (! _cairo_matrix_is_identity (&ps_p2d)) {
- _cairo_output_stream_printf (surface->stream,
- "[ %f %f %f %f %f %f ] concat\n",
- ps_p2d.xx, ps_p2d.yx,
- ps_p2d.xy, ps_p2d.yy,
- ps_p2d.x0, ps_p2d.y0);
+ _cairo_output_stream_printf (surface->stream, "[ ");
+ _cairo_output_stream_print_matrix (surface->stream, &ps_p2d);
+ _cairo_output_stream_printf (surface->stream, " ] concat\n");
}
status = _cairo_ps_surface_emit_surface (surface,
@@ -3419,7 +3473,7 @@ _cairo_ps_surface_emit_surface_pattern (cairo_ps_surface_t *surface,
_cairo_output_stream_printf (surface->stream,
" /BBox [0 0 %d %d]\n"
" /PaintProc {\n"
- " CairoPattern\n"
+ " pop CairoPattern\n"
" [-1 0 0 1 %d 0] concat CairoPattern\n"
" [ 1 0 0 -1 0 %d] concat CairoPattern\n"
" [-1 0 0 1 %d 0] concat CairoPattern\n"
@@ -3440,7 +3494,7 @@ _cairo_ps_surface_emit_surface_pattern (cairo_ps_surface_t *surface,
pattern_width, pattern_height);
}
_cairo_output_stream_printf (surface->stream,
- " /PaintProc { CairoPattern }\n");
+ " /PaintProc { pop CairoPattern }\n");
}
_cairo_output_stream_printf (surface->stream,
@@ -3458,12 +3512,10 @@ _cairo_ps_surface_emit_surface_pattern (cairo_ps_surface_t *surface,
cairo_matrix_translate (&ps_p2d, 0.0, pattern_height);
cairo_matrix_scale (&ps_p2d, 1.0, -1.0);
+ _cairo_output_stream_printf (surface->stream, "[ ");
+ _cairo_output_stream_print_matrix (surface->stream, &ps_p2d);
_cairo_output_stream_printf (surface->stream,
- "[ %f %f %f %f %f %f ]\n",
- ps_p2d.xx, ps_p2d.yx,
- ps_p2d.xy, ps_p2d.yy,
- ps_p2d.x0, ps_p2d.y0);
- _cairo_output_stream_printf (surface->stream,
+ " ]\n"
"makepattern setpattern\n");
release_source:
@@ -3837,11 +3889,10 @@ _cairo_ps_surface_emit_gradient (cairo_ps_surface_t *surface,
if (is_ps_pattern) {
_cairo_output_stream_printf (surface->stream,
">>\n"
- "[ %f %f %f %f %f %f ]\n"
- "makepattern setpattern\n",
- pat_to_ps.xx, pat_to_ps.yx,
- pat_to_ps.xy, pat_to_ps.yy,
- pat_to_ps.x0, pat_to_ps.y0);
+ "[ ");
+ _cairo_output_stream_print_matrix (surface->stream, &pat_to_ps);
+ _cairo_output_stream_printf (surface->stream, " ]\n"
+ "makepattern setpattern\n");
} else {
_cairo_output_stream_printf (surface->stream,
"shfill\n");
@@ -3919,11 +3970,10 @@ _cairo_ps_surface_emit_mesh_pattern (cairo_ps_surface_t *surface,
if (is_ps_pattern) {
_cairo_output_stream_printf (surface->stream,
">>\n"
- "[ %f %f %f %f %f %f ]\n",
- pat_to_ps.xx, pat_to_ps.yx,
- pat_to_ps.xy, pat_to_ps.yy,
- pat_to_ps.x0, pat_to_ps.y0);
+ "[ \n");
+ _cairo_output_stream_print_matrix (surface->stream, &pat_to_ps);
_cairo_output_stream_printf (surface->stream,
+ " ]\n"
"makepattern\n"
"setpattern\n");
} else {
@@ -4022,11 +4072,9 @@ _cairo_ps_surface_paint_gradient (cairo_ps_surface_t *surface,
cairo_matrix_multiply (&pat_to_ps, &pat_to_ps, &surface->cairo_to_ps);
if (! _cairo_matrix_is_identity (&pat_to_ps)) {
- _cairo_output_stream_printf (surface->stream,
- "[%f %f %f %f %f %f] concat\n",
- pat_to_ps.xx, pat_to_ps.yx,
- pat_to_ps.xy, pat_to_ps.yy,
- pat_to_ps.x0, pat_to_ps.y0);
+ _cairo_output_stream_printf (surface->stream, "[");
+ _cairo_output_stream_print_matrix (surface->stream, &pat_to_ps);
+ _cairo_output_stream_printf (surface->stream, "] concat\n");
}
if (source->type == CAIRO_PATTERN_TYPE_MESH) {
@@ -4578,6 +4626,13 @@ _cairo_ps_surface_set_bounding_box (void *abstract_surface,
x1, y1, x2, y2);
}
+ if (!surface->eps) {
+ _cairo_output_stream_printf (surface->stream,
+ "%f %f cairo_set_page_size\n",
+ ceil(surface->width),
+ ceil(surface->height));
+ }
+
_cairo_output_stream_printf (surface->stream,
"%%%%EndPageSetup\n"
"q %d %d %d %d rectclip q\n",