Don't show timing information for calls to LayerGroupTreeStore::rebuild() and LayerPa...
[synfig.git] / synfig-core / trunk / src / synfig / canvas.cpp
index 270a71f..74c737f 100644 (file)
@@ -1180,18 +1180,32 @@ 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);
-                       if (composite && composite->get_blend_method() == Color::BLEND_STRAIGHT)
+
+                       /* 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.  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 &&
+                               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);
                        }
                }