X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Fcanvas.cpp;h=74c737f6b2e77624c29e31286acafa1b96c7ea11;hb=4cd211467061154545ef7b5f5617dce7b177bf16;hp=605fd268a612de1b354f005fbb4b6c4958af295f;hpb=1d29969a238c1a58b7c9fa2e8dfda76441283360;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/canvas.cpp b/synfig-core/trunk/src/synfig/canvas.cpp index 605fd26..74c737f 100644 --- a/synfig-core/trunk/src/synfig/canvas.cpp +++ b/synfig-core/trunk/src/synfig/canvas.cpp @@ -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 composite = etl::handle::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.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); } }