Re-enable the 'alpha brighten' and 'alpha darken' blend methods. Why were they hidde...
[synfig.git] / synfig-core / trunk / src / synfig / canvas.cpp
index 605fd26..74c737f 100644 (file)
@@ -1181,33 +1181,31 @@ 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 &&
+                               Color::is_straight(composite->get_blend_method()) &&
+                               !composite->reads_context())
                        {
                                Canvas::Handle sub_canvas(Canvas::create_inline(op_canvas));
                                sub_canvas->push_back(composite = composite->clone());
-                               sub_canvas->set_time(time); // region and outline don't calculate their bounding rects until their time is set
                                layer = Layer::create("PasteCanvas");
                                layer->set_description(strprintf("PasteCanvas wrapper for '%s'", composite->get_non_empty_description().c_str()));
                                Layer_PasteCanvas* paste_canvas(static_cast<Layer_PasteCanvas*>(layer.get()));
-                               paste_canvas->set_sub_canvas(sub_canvas);
-                               paste_canvas->set_blend_method(Color::BLEND_STRAIGHT);
+                               paste_canvas->set_blend_method(composite->get_blend_method());
                                paste_canvas->set_amount(composite->get_amount());
+                               composite->set_blend_method(Color::BLEND_STRAIGHT); // do this before calling set_time() or set_sub_canvas()
                                composite->set_amount(1.0f);
+                               sub_canvas->set_time(time); // region and outline don't calculate their bounding rects until their time is set
+                               paste_canvas->set_sub_canvas(sub_canvas);
                        }
                }