summaryrefslogtreecommitdiffstats
path: root/source/helper.c
diff options
context:
space:
mode:
authorDave Davenport <qball@gmpclient.org>2017-06-26 20:16:20 +0200
committerDave Davenport <qball@gmpclient.org>2017-06-26 20:16:20 +0200
commitcf7d0866d52fe2d8f3b78b74a784642be8d7eedb (patch)
treee1f3e888360cedb2ac1ded5b2e662749af080be9 /source/helper.c
parent3556f6519800938883d1fb1a36e20b92e91e0b4f (diff)
[Helper] Add basic error checking to svg loading code.
Diffstat (limited to 'source/helper.c')
-rw-r--r--source/helper.c56
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;
}