diff --git a/boilerplate/cairo-boilerplate-pdf.c b/boilerplate/cairo-boilerplate-pdf.c index fb7d1aa2f..470fb06d2 100644 --- a/boilerplate/cairo-boilerplate-pdf.c +++ b/boilerplate/cairo-boilerplate-pdf.c @@ -178,17 +178,8 @@ _cairo_boilerplate_pdf_convert_to_image (cairo_surface_t *surface) { pdf_target_closure_t *ptc = cairo_surface_get_user_data (surface, &pdf_closure_key); - FILE *file; - cairo_surface_t *image; - - file = cairo_boilerplate_open_any2ppm (ptc->filename, 1); - if (file == NULL) - return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_READ_ERROR); - - image = cairo_boilerplate_image_surface_create_from_ppm_stream (file); - fclose (file); - return image; + return cairo_boilerplate_convert_to_image (ptc->filename, 1); } cairo_surface_t * diff --git a/boilerplate/cairo-boilerplate-svg.c b/boilerplate/cairo-boilerplate-svg.c index 7a07d1b37..c3ad8d2fe 100644 --- a/boilerplate/cairo-boilerplate-svg.c +++ b/boilerplate/cairo-boilerplate-svg.c @@ -170,17 +170,8 @@ _cairo_boilerplate_svg_convert_to_image (cairo_surface_t *surface) { svg_target_closure_t *ptc = cairo_surface_get_user_data (surface, &svg_closure_key); - FILE *file; - cairo_surface_t *image; - - file = cairo_boilerplate_open_any2ppm (ptc->filename, 0); - if (file == NULL) - return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_READ_ERROR); - - image = cairo_boilerplate_image_surface_create_from_ppm_stream (file); - fclose (file); - return image; + return cairo_boilerplate_convert_to_image (ptc->filename, 0); } cairo_surface_t * diff --git a/boilerplate/cairo-boilerplate.c b/boilerplate/cairo-boilerplate.c index 039fb3dee..65898e16f 100644 --- a/boilerplate/cairo-boilerplate.c +++ b/boilerplate/cairo-boilerplate.c @@ -706,7 +706,8 @@ any2ppm_daemon_exists (void) FILE * cairo_boilerplate_open_any2ppm (const char *filename, - int page) + int page, + unsigned int flags) { char command[4096]; #if HAS_DAEMON @@ -714,6 +715,9 @@ cairo_boilerplate_open_any2ppm (const char *filename, struct sockaddr_un addr; int len; + if (flags & CAIRO_BOILERPLATE_OPEN_NO_DAEMON) + goto POPEN; + if (! any2ppm_daemon_exists ()) { if (system ("./any2ppm") != 0) goto POPEN; @@ -747,7 +751,7 @@ cairo_boilerplate_open_any2ppm (const char *filename, } static cairo_bool_t -freadn (char *buf, int len, FILE *file) +freadn (unsigned char *buf, int len, FILE *file) { int ret; @@ -822,6 +826,33 @@ cairo_boilerplate_image_surface_create_from_ppm_stream (FILE *file) return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_READ_ERROR); } +cairo_surface_t * +cairo_boilerplate_convert_to_image (const char *filename, int page) +{ + FILE *file; + unsigned int flags = 0; + cairo_surface_t *image; + + RETRY: + file = cairo_boilerplate_open_any2ppm (filename, 1, flags); + if (file == NULL) + return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_READ_ERROR); + + image = cairo_boilerplate_image_surface_create_from_ppm_stream (file); + fclose (file); + + if (cairo_surface_status (image) == CAIRO_STATUS_READ_ERROR) { + if (flags == 0) { + /* Try again in process, e.g. to propagate a CRASH. */ + cairo_surface_destroy (image); + flags = CAIRO_BOILERPLATE_OPEN_NO_DAEMON; + goto RETRY; + } + } + + return image; +} + int cairo_boilerplate_version (void) { diff --git a/boilerplate/cairo-boilerplate.h b/boilerplate/cairo-boilerplate.h index df2da0913..7b6dbc31c 100644 --- a/boilerplate/cairo-boilerplate.h +++ b/boilerplate/cairo-boilerplate.h @@ -176,13 +176,20 @@ cairo_boilerplate_get_image_surface_from_png (const char *filename, cairo_surface_t * cairo_boilerplate_surface_create_in_error (cairo_status_t status); +enum { + CAIRO_BOILERPLATE_OPEN_NO_DAEMON = 0x1, +}; + FILE * cairo_boilerplate_open_any2ppm (const char *filename, - int page); - + int page, + unsigned int flags); cairo_surface_t * cairo_boilerplate_image_surface_create_from_ppm_stream (FILE *file); +cairo_surface_t * +cairo_boilerplate_convert_to_image (const char *filename, int page); + int cairo_boilerplate_version (void);