Hopefully this will work better. It only makes a temporary encapsulation around...
authordooglus <dooglus@1f10aa63-cdf2-0310-b900-c93c546f37ac>
Wed, 23 Jan 2008 17:41:25 +0000 (17:41 +0000)
committerdooglus <dooglus@1f10aa63-cdf2-0310-b900-c93c546f37ac>
Wed, 23 Jan 2008 17:41:25 +0000 (17:41 +0000)
git-svn-id: http://svn.voria.com/code@1432 1f10aa63-cdf2-0310-b900-c93c546f37ac

synfig-core/trunk/src/synfig/canvas.cpp

index 605fd26..3f4f8cf 100644 (file)
@@ -1181,22 +1181,18 @@ 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<Layer_Composite> composite = etl::handle<Layer_Composite>::cast_dynamic(layer);
 
-                       /* 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
+                       /* 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) 
+                        * context to work on.  the Layer::reads_context() method
+                        * returns true for layers which need to be able to see
+                        * their context.  we can't encapsulate those.
                         */
-                        if (composite && composite->get_blend_method() == Color::BLEND_STRAIGHT &&
-                               layer->get_bounding_rect() != Rect::full_plane())
+                       if (composite && composite->get_blend_method() == Color::BLEND_STRAIGHT &&
+                               !composite->reads_context())
                        {
                                Canvas::Handle sub_canvas(Canvas::create_inline(op_canvas));
                                sub_canvas->push_back(composite = composite->clone());