Author: Carlos Lopez <genet...@gmail.com>
Date:   Tue Apr 23 20:15:36 2013 +0200

Fix bug #399: Cairo render crashes with several blend modes in non debug.

---

 synfig-core/src/synfig/cairo_operators.cpp |   63 ++++++++++++++++++++++++----
 1 files changed, 55 insertions(+), 8 deletions(-)

diff --git a/synfig-core/src/synfig/cairo_operators.cpp 
b/synfig-core/src/synfig/cairo_operators.cpp
index 0c5f535..b8259b0 100644
--- a/synfig-core/src/synfig/cairo_operators.cpp
+++ b/synfig-core/src/synfig/cairo_operators.cpp
@@ -202,11 +202,28 @@ void cairo_paint_with_alpha_operator(cairo_t* acr, float 
alpha, Color::BlendMeth
                        cairo_status_t status;
                        status=cairo_pattern_get_surface(pattern, &source);
                        if(status)
+                       {
+                               // return gracefully
+                               synfig::error("%s", 
cairo_status_to_string(status));
+                               cairo_pattern_destroy(pattern);
                                return;
+                       }
                        CairoSurface csource(source);
                        CairoSurface cdest(cairo_get_target(cr));
-                       assert(cdest.map_cairo_image());
-                       assert(csource.map_cairo_image());
+
+                       if(!cdest.map_cairo_image())
+                       {
+                                       // return gracefully
+                                       cairo_pattern_destroy(pattern);
+                                       return;
+                       }
+                       if(!csource.map_cairo_image())
+                          {
+                                  // return gracefully
+                                  cairo_pattern_destroy(pattern);
+                                  cdest.unmap_cairo_image();
+                                  return;
+                          }
                        
                        double x1, y1, x2, y2, x0, y0;
                        cairo_clip_extents(cr, &x1, &y1, &x2, &y2);
@@ -219,7 +236,6 @@ void cairo_paint_with_alpha_operator(cairo_t* acr, float 
alpha, Color::BlendMeth
                        int h=csource.get_h();
                        int h0=(int)y0;
                        int w0=(int)x0;
-                                                                       
                        for(int y=0;y<h;y++)
                                for(int x=0;x<w;x++)
                                {
@@ -258,11 +274,28 @@ void cairo_paint_with_alpha_operator(cairo_t* acr, float 
alpha, Color::BlendMeth
                        cairo_status_t status;
                        status=cairo_pattern_get_surface(pattern, &source);
                        if(status)
+                       {
+                               // return gracefully
+                               synfig::error("%s", 
cairo_status_to_string(status));
+                               cairo_pattern_destroy(pattern);
                                return;
+                       }
                        CairoSurface csource(source);
                        CairoSurface cdest(cairo_get_target(cr));
-                       assert(cdest.map_cairo_image());
-                       assert(csource.map_cairo_image());
+                       
+                       if(!cdest.map_cairo_image())
+                       {
+                               // return gracefully
+                               cairo_pattern_destroy(pattern);
+                               return;
+                       }
+                       if(!csource.map_cairo_image())
+                       {
+                               // return gracefully
+                               cairo_pattern_destroy(pattern);
+                               cdest.unmap_cairo_image();
+                               return;
+                       }
                        
                        double x1, y1, x2, y2, x0, y0;
                        cairo_clip_extents(cr, &x1, &y1, &x2, &y2);
@@ -300,13 +333,27 @@ void cairo_paint_with_alpha_operator(cairo_t* acr, float 
alpha, Color::BlendMeth
                        status=cairo_pattern_get_surface(pattern, &source);
                        if(status)
                        {
-                               synfig::info("%s", 
cairo_status_to_string(status));
+                               // return gracefully
+                               synfig::error("%s", 
cairo_status_to_string(status));
+                               cairo_pattern_destroy(pattern);
                                return;
                        }
                        CairoSurface csource(source);
                        CairoSurface cdest(cairo_get_target(cr));
-                       assert(cdest.map_cairo_image());
-                       assert(csource.map_cairo_image());
+                       
+                       if(!cdest.map_cairo_image())
+                       {
+                               // return gracefully
+                               cairo_pattern_destroy(pattern);
+                               return;
+                       }
+                       if(!csource.map_cairo_image())
+                       {
+                               // return gracefully
+                               cairo_pattern_destroy(pattern);
+                               cdest.unmap_cairo_image();
+                               return;
+                       }
                        
                        double x1, y1, x2, y2, x0, y0;
                        cairo_clip_extents(cr, &x1, &y1, &x2, &y2);


------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service 
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr
_______________________________________________
Synfig-devl mailing list
Synfig-devl@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/synfig-devl

Reply via email to