Remove .gitignore do nothing is ignored.
[synfig.git] / synfig-core / trunk / src / synfig / layer_duplicate.cpp
index 922704a..d002016 100644 (file)
@@ -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<ValueNode_Duplicate> 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;
 }