49
54
cairo_content_t content,
52
59
cairo_boilerplate_mode_t mode,
55
63
pdf_target_closure_t *ptc;
56
64
cairo_surface_t *surface;
65
cairo_status_t status;
58
67
/* Sanitize back to a real cairo_content_t value. */
59
68
if (content == CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED)
64
73
ptc->width = width;
65
74
ptc->height = height;
67
xasprintf (&ptc->filename, "%s-pdf-%s-out.pdf",
68
name, cairo_boilerplate_content_name (content));
76
xasprintf (&ptc->filename, "%s-out.pdf", name);
77
xunlink (ptc->filename);
70
79
surface = cairo_pdf_surface_create (ptc->filename, width, height);
71
if (cairo_surface_status (surface)) {
80
if (cairo_surface_status (surface))
81
goto CLEANUP_FILENAME;
76
83
cairo_surface_set_fallback_resolution (surface, 72., 72.);
78
85
if (content == CAIRO_CONTENT_COLOR) {
80
87
surface = cairo_surface_create_similar (ptc->target,
81
88
CAIRO_CONTENT_COLOR,
90
if (cairo_surface_status (surface))
84
93
ptc->target = NULL;
87
cairo_boilerplate_surface_set_user_data (surface,
96
status = cairo_surface_set_user_data (surface, &pdf_closure_key, ptc, NULL);
97
if (status == CAIRO_STATUS_SUCCESS)
100
cairo_surface_destroy (surface);
101
surface = cairo_boilerplate_surface_create_in_error (status);
104
cairo_surface_destroy (ptc->target);
106
free (ptc->filename);
95
_cairo_boilerplate_pdf_surface_write_to_png (cairo_surface_t *surface, const char *filename)
112
_cairo_boilerplate_pdf_finish_surface (cairo_surface_t *surface)
97
pdf_target_closure_t *ptc = cairo_surface_get_user_data (surface, &pdf_closure_key);
114
pdf_target_closure_t *ptc = cairo_surface_get_user_data (surface,
116
cairo_status_t status;
100
118
/* Both surface and ptc->target were originally created at the
101
119
* same dimensions. We want a 1:1 copy here, so we first clear any
112
130
cairo_set_source_surface (cr, surface, 0, 0);
113
131
cairo_paint (cr);
114
132
cairo_show_page (cr);
133
status = cairo_status (cr);
115
134
cairo_destroy (cr);
117
139
cairo_surface_finish (surface);
140
status = cairo_surface_status (surface);
118
144
surface = ptc->target;
121
147
cairo_surface_finish (surface);
148
status = cairo_surface_status (surface);
152
return CAIRO_STATUS_SUCCESS;
156
_cairo_boilerplate_pdf_surface_write_to_png (cairo_surface_t *surface, const char *filename)
158
pdf_target_closure_t *ptc = cairo_surface_get_user_data (surface, &pdf_closure_key);
122
162
sprintf (command, "./pdf2png %s %s 1",
123
163
ptc->filename, filename);
125
if (system (command) != 0)
165
exitstatus = system (command);
166
#if _XOPEN_SOURCE && HAVE_SIGNAL_H
167
if (WIFSIGNALED (exitstatus))
168
raise (WTERMSIG (exitstatus));
126
171
return CAIRO_STATUS_WRITE_ERROR;
128
173
return CAIRO_STATUS_SUCCESS;
176
static cairo_surface_t *
177
_cairo_boilerplate_pdf_convert_to_image (cairo_surface_t *surface)
179
pdf_target_closure_t *ptc = cairo_surface_get_user_data (surface,
182
cairo_surface_t *image;
184
file = cairo_boilerplate_open_any2ppm (ptc->filename, 1);
186
return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_READ_ERROR);
188
image = cairo_boilerplate_image_surface_create_from_ppm_stream (file);
195
_cairo_boilerplate_pdf_get_image_surface (cairo_surface_t *surface,
199
cairo_surface_t *image;
201
image = _cairo_boilerplate_pdf_convert_to_image (surface);
202
cairo_surface_set_device_offset (image,
203
cairo_image_surface_get_width (image) - width,
204
cairo_image_surface_get_height (image) - height);
205
surface = _cairo_boilerplate_get_image_surface (image, width, height);
206
cairo_surface_destroy (image);
132
212
_cairo_boilerplate_pdf_cleanup (void *closure)