X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Flayer_duplicate.cpp;h=d0020163d229d084d0dcef67d664724afd13ca0c;hb=9459638ad6797b8139f1e9f0715c96076dbf0890;hp=922704a989b502700e601f3069059c4e7fc32542;hpb=268b63024cb094deda14ea7ae1f30c98dd4495cc;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/layer_duplicate.cpp b/synfig-core/trunk/src/synfig/layer_duplicate.cpp index 922704a..d002016 100644 --- a/synfig-core/trunk/src/synfig/layer_duplicate.cpp +++ b/synfig-core/trunk/src/synfig/layer_duplicate.cpp @@ -6,7 +6,7 @@ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley -** Copyright (c) 2007 Chris Moore +** Copyright (c) 2007, 2008 Chris Moore ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as @@ -70,7 +70,6 @@ Layer_Duplicate::Layer_Duplicate(): Layer::Handle Layer_Duplicate::clone(const GUID& deriv_guid)const { - printf("cloning layer duplicate\n"); Layer::Handle ret = (Layer::Handle)Layer_Composite::clone(deriv_guid); const DynamicParamList &dpl = dynamic_param_list(); @@ -78,7 +77,7 @@ Layer_Duplicate::clone(const GUID& deriv_guid)const // if we have a dynamic "index" parameter, make a new one in the clone // it's not good to have two references to the same index valuenode, - // or nested duplicatations cause an infinite loop + // or nested duplications cause an infinite loop if (iter != dpl.end()) ret->connect_dynamic_param(iter->first,iter->second->clone(deriv_guid)); @@ -120,7 +119,23 @@ Layer_Duplicate::set_time(Context context, Time time, const Point &pos)const Color Layer_Duplicate::get_color(Context context, const Point &pos)const { - return context.get_color(pos); + handle duplicate_param = get_duplicate_param(); + if (!duplicate_param) return context.get_color(pos); + + Color::BlendMethod blend_method(get_blend_method()); + float amount(get_amount()); + Color color; + + Mutex::Lock lock(mutex); + duplicate_param->reset_index(time_cur); + do + { + context.set_time(time_cur+1); + context.set_time(time_cur); + color = Color::blend(context.get_color(pos),color,amount,blend_method); + } while (duplicate_param->step(time_cur)); + + return color; } Layer::Vocab @@ -173,6 +188,7 @@ Layer_Duplicate::accelerated_render(Context context,Surface *surface,int quality Color::BlendMethod blend_method(get_blend_method()); int steps = duplicate_param->count_steps(time_cur); + Mutex::Lock lock(mutex); duplicate_param->reset_index(time_cur); do { @@ -183,14 +199,12 @@ Layer_Duplicate::accelerated_render(Context context,Surface *surface,int quality if(!context.accelerated_render(&tmp,quality,renddesc,&subimagecb)) return false; Surface::alpha_pen apen(surface->begin()); - apen.set_alpha(1.0); + apen.set_alpha(get_amount()); // \todo have a checkbox allowing use of 'behind' to reverse the order? - apen.set_blend_method(blend_method); + apen.set_blend_method(i ? blend_method : Color::BLEND_COMPOSITE); tmp.blit_to(apen); i++; } while (duplicate_param->step(time_cur)); - duplicate_param->reset_index(time_cur); - return true; }