diff options
author | Dave Davenport <qball@gmpclient.org> | 2017-06-26 20:16:20 +0200 |
---|---|---|
committer | Dave Davenport <qball@gmpclient.org> | 2017-06-26 20:16:20 +0200 |
commit | cf7d0866d52fe2d8f3b78b74a784642be8d7eedb (patch) | |
tree | e1f3e888360cedb2ac1ded5b2e662749af080be9 /source/helper.c | |
parent | 3556f6519800938883d1fb1a36e20b92e91e0b4f (diff) |
[Helper] Add basic error checking to svg loading code.
Diffstat (limited to 'source/helper.c')
-rw-r--r-- | source/helper.c | 56 |
1 files changed, 38 insertions, 18 deletions
diff --git a/source/helper.c b/source/helper.c index 5b79696c..43538a20 100644 --- a/source/helper.c +++ b/source/helper.c @@ -1075,24 +1075,44 @@ char *helper_get_theme_path ( const char *file ) cairo_surface_t* cairo_image_surface_create_from_svg ( const gchar* file, int height ) { - cairo_surface_t *surface; - cairo_t *cr; - RsvgHandle * handle; - RsvgDimensionData dimensions; - - handle = rsvg_handle_new_from_file ( file, NULL ); - rsvg_handle_get_dimensions ( handle, &dimensions ); - double scale = (double) height / dimensions.height; - surface = cairo_image_surface_create ( CAIRO_FORMAT_ARGB32, - (double) dimensions.width * scale, - (double) dimensions.height * scale ); - cr = cairo_create ( surface ); - cairo_scale ( cr, scale, scale ); - rsvg_handle_render_cairo ( handle, cr ); - cairo_destroy ( cr ); - - rsvg_handle_close ( handle, NULL ); - g_object_unref ( handle ); + GError *error = NULL; + cairo_surface_t *surface = NULL; + RsvgHandle * handle; + + handle = rsvg_handle_new_from_file ( file, &error ); + if ( handle != NULL ) { + cairo_t *cr; + RsvgDimensionData dimensions; + // Update DPI. + rsvg_handle_set_dpi ( handle, config.dpi ); + // Get size. + rsvg_handle_get_dimensions ( handle, &dimensions ); + // Create cairo surface in the right size. + double scale = (double) height / dimensions.height; + surface = cairo_image_surface_create ( CAIRO_FORMAT_ARGB32, + (double) dimensions.width * scale, + (double) dimensions.height * scale ); + gboolean failed = cairo_surface_status ( surface ) != CAIRO_STATUS_SUCCESS; + if ( !failed ) { + cr = cairo_create ( surface ); + cairo_scale ( cr, scale, scale ); + failed = rsvg_handle_render_cairo ( handle, cr ); + cairo_destroy ( cr ); + } + + rsvg_handle_close ( handle, &error ); + g_object_unref ( handle ); + + /** Rendering fails */ + if ( failed ) { + cairo_surface_destroy ( surface ); + surface = NULL; + } + } + if ( error != NULL ) { + g_warning ( "Failed to render SVG file: '%s': %s", file, error->message ); + g_error_free ( error ); + } return surface; } |