From 1d29969a238c1a58b7c9fa2e8dfda76441283360 Mon Sep 17 00:00:00 2001 From: dooglus Date: Wed, 23 Jan 2008 14:44:29 +0000 Subject: [PATCH] Improve this code to allow layers like 'blur' to work. git-svn-id: http://svn.voria.com/code@1428 1f10aa63-cdf2-0310-b900-c93c546f37ac --- synfig-core/trunk/src/synfig/canvas.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/synfig-core/trunk/src/synfig/canvas.cpp b/synfig-core/trunk/src/synfig/canvas.cpp index 270a71f..605fd26 100644 --- a/synfig-core/trunk/src/synfig/canvas.cpp +++ b/synfig-core/trunk/src/synfig/canvas.cpp @@ -1180,7 +1180,23 @@ synfig::optimize_layers(Time time, Context context, Canvas::Handle op_canvas, bo // \todo: this code probably needs modification to work properly with motionblur and duplicate etl::handle composite = etl::handle::cast_dynamic(layer); - if (composite && composite->get_blend_method() == Color::BLEND_STRAIGHT) + + /* this still isn't right; the problem is that some layers + * (such as circle) don't touch pixels that aren't part of + * the circle, so they don't get blended correctly when using + * a straight blend. so we encapsulate the circle, and the + * encapsulation layer takes care of the transparent pixels + * for us. if we do that for all layers, however, then the + * distortion layers no longer work, since they have no + * context to work on. as an approximation to fixing this, + * let's encapsulate only the layers which don't have the + * full plane as their bounding rect. that tends to catch + * the layers we want to catch, but still isn't quite right + * (consider the circle layer with 'invert' enabled, for + * instance) + */ + if (composite && composite->get_blend_method() == Color::BLEND_STRAIGHT && + layer->get_bounding_rect() != Rect::full_plane()) { Canvas::Handle sub_canvas(Canvas::create_inline(op_canvas)); sub_canvas->push_back(composite = composite->clone()); -- 2.7.4