[lasem] svg_view: don't call cairo_image_surface_get_width with cairo == NULL



commit a97ce350695aea2463b31a03c6e27852972b3951
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Mon Jul 13 20:06:47 2015 +0200

    svg_view: don't call cairo_image_surface_get_width with cairo == NULL
    
    Cairo crashes in this case.

 src/lsmsvgview.c |   81 +++++++++++++++++++++++++++--------------------------
 1 files changed, 41 insertions(+), 40 deletions(-)
---
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index 4ee9eda..04e501a 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -1881,58 +1881,59 @@ lsm_svg_view_pop_filter (LsmSvgView *view)
 
        if (LSM_IS_SVG_FILTER_ELEMENT (filter_element) &&
            view->pattern_data->pattern != NULL) {
-               cairo_matrix_t matrix;
-               LsmBox subregion;
-
-               view->filter_surfaces = NULL;
-
                cairo_pattern_get_surface (view->pattern_data->pattern, &surface);
+               if (surface != NULL) {
+                       cairo_matrix_t matrix;
+                       LsmBox subregion;
 
-               subregion.x = 0;
-               subregion.y = 0;
-               subregion.width = cairo_image_surface_get_width (surface);
-               subregion.height = cairo_image_surface_get_height (surface);
+                       view->filter_surfaces = NULL;
 
-               filter_surface = lsm_svg_filter_surface_new_with_content ("SourceGraphic", surface, 
&subregion);
-               cairo_pattern_get_matrix (view->pattern_data->pattern, &matrix);
+                       subregion.x = 0;
+                       subregion.y = 0;
+                       subregion.width = cairo_image_surface_get_width (surface);
+                       subregion.height = cairo_image_surface_get_height (surface);
 
-               view->filter_surfaces = g_slist_prepend (view->filter_surfaces, filter_surface);
+                       filter_surface = lsm_svg_filter_surface_new_with_content ("SourceGraphic", surface, 
&subregion);
+                       cairo_pattern_get_matrix (view->pattern_data->pattern, &matrix);
 
-               lsm_svg_element_force_render (filter_element, view);
+                       view->filter_surfaces = g_slist_prepend (view->filter_surfaces, filter_surface);
 
-               if (view->debug_filter) {
-                       GSList *iter;
-                       char *filename;
-                       static int count = 0;
+                       lsm_svg_element_force_render (filter_element, view);
 
-                       for (iter = view->filter_surfaces; iter != NULL; iter = iter->next) {
-                               LsmSvgFilterSurface *surface = iter->data;
+                       if (view->debug_filter) {
+                               GSList *iter;
+                               char *filename;
+                               static int count = 0;
 
-                               filename = g_strdup_printf ("filter-%04d-%s-%s.png", count++,
-                                                           view->style->filter->value,
-                                                           lsm_svg_filter_surface_get_name (surface));
-                               cairo_surface_write_to_png (lsm_svg_filter_surface_get_cairo_surface 
(surface), filename);
-                               g_free (filename);
+                               for (iter = view->filter_surfaces; iter != NULL; iter = iter->next) {
+                                       LsmSvgFilterSurface *surface = iter->data;
+
+                                       filename = g_strdup_printf ("filter-%04d-%s-%s.png", count++,
+                                                       view->style->filter->value,
+                                                       lsm_svg_filter_surface_get_name (surface));
+                                       cairo_surface_write_to_png (lsm_svg_filter_surface_get_cairo_surface 
(surface), filename);
+                                       g_free (filename);
+                               }
                        }
-               }
 
-               if (view->filter_surfaces->next != NULL) {
-                       cairo_pattern_t *pattern;
-                       cairo_surface_t *surface;
+                       if (view->filter_surfaces->next != NULL) {
+                               cairo_pattern_t *pattern;
+                               cairo_surface_t *surface;
+
+                               surface = lsm_svg_filter_surface_get_cairo_surface 
(view->filter_surfaces->data);
+                               pattern = cairo_pattern_create_for_surface (surface);
+                               cairo_pattern_set_extend (pattern, CAIRO_EXTEND_NONE);
+                               cairo_pattern_set_matrix (pattern, &matrix);
+                               cairo_set_source (view->pattern_data->old_cairo, pattern);
+                               cairo_pattern_destroy (pattern);
+                               cairo_paint_with_alpha (view->pattern_data->old_cairo, 
view->style->opacity->value);
+                       }
 
-                       surface = lsm_svg_filter_surface_get_cairo_surface (view->filter_surfaces->data);
-                       pattern = cairo_pattern_create_for_surface (surface);
-                       cairo_pattern_set_extend (pattern, CAIRO_EXTEND_NONE);
-                       cairo_pattern_set_matrix (pattern, &matrix);
-                       cairo_set_source (view->pattern_data->old_cairo, pattern);
-                       cairo_pattern_destroy (pattern);
-                       cairo_paint_with_alpha (view->pattern_data->old_cairo, view->style->opacity->value);
+                       for (iter = view->filter_surfaces; iter != NULL; iter = iter->next)
+                               lsm_svg_filter_surface_unref (iter->data);
+                       g_slist_free (view->filter_surfaces);
+                       view->filter_surfaces = NULL;
                }
-
-               for (iter = view->filter_surfaces; iter != NULL; iter = iter->next)
-                       lsm_svg_filter_surface_unref (iter->data);
-               g_slist_free (view->filter_surfaces);
-               view->filter_surfaces = NULL;
        }
 
        _end_pattern (view);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]