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