Author: Carlos Lopez <[email protected]>
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/synfig-devl