Author: Carlos Lopez <genet...@gmail.com> Date: Sun Dec 11 21:14:15 2011 +0100
Fix crash when inserting an item on a generic empty dynamic list. --- synfig-core/src/synfig/valuenode_dynamiclist.cpp | 83 ++++++++++++++++------ 1 files changed, 61 insertions(+), 22 deletions(-) diff --git a/synfig-core/src/synfig/valuenode_dynamiclist.cpp b/synfig-core/src/synfig/valuenode_dynamiclist.cpp index 710f0fe..fb0ea83 100644 --- a/synfig-core/src/synfig/valuenode_dynamiclist.cpp +++ b/synfig-core/src/synfig/valuenode_dynamiclist.cpp @@ -138,62 +138,101 @@ ValueNode_DynamicList::ListEntry ValueNode_DynamicList::create_list_entry(int index, Time time, Real origin) { ValueNode_DynamicList::ListEntry ret; - - + int c(link_count()); synfig::ValueBase prev,next; - index=index%link_count(); + if(c) + index=index%c; + else + index=0; assert(index>=0); ret.index=index; ret.set_parent_value_node(this); - next=(*list[index].value_node)(time); - - if(index!=0) - prev=(*list[index-1].value_node)(time); - else + if(c) { - if(get_loop()) - prev=(*list[link_count()-1].value_node)(time); + next=(*list[index].value_node)(time); + + if(index!=0) + prev=(*list[index-1].value_node)(time); else { - prev=next; + if(get_loop()) + prev=(*list[link_count()-1].value_node)(time); + else + { + prev=next; + } } } - switch(get_contained_type()) { case ValueBase::TYPE_VECTOR: { - Vector a(prev.get(Vector())), b(next.get(Vector())); - ret.value_node=ValueNode_Const::create((b-a)*origin+a); + if(c) + { + Vector a(prev.get(Vector())), b(next.get(Vector())); + ret.value_node=ValueNode_Const::create((b-a)*origin+a); + } + else + { + ret.value_node=ValueNode_Const::create(Vector()); + } break; } case ValueBase::TYPE_REAL: { - Real a(prev.get(Real())), b(next.get(Real())); - ret.value_node=ValueNode_Const::create((b-a)*origin+a); + if(c) + { + Real a(prev.get(Real())), b(next.get(Real())); + ret.value_node=ValueNode_Const::create((b-a)*origin+a); + } + else + { + ret.value_node=ValueNode_Const::create(Real()); + } break; } case ValueBase::TYPE_COLOR: { - Color a(prev.get(Color())), b(next.get(Color())); - ret.value_node=ValueNode_Composite::create((b-a)*origin+a); + if(c) + { + Color a(prev.get(Color())), b(next.get(Color())); + ret.value_node=ValueNode_Composite::create((b-a)*origin+a); + } + else + { + ret.value_node=ValueNode_Const::create(Color()); + } break; } case ValueBase::TYPE_ANGLE: { - Angle a(prev.get(Angle())), b(next.get(Angle())); - ret.value_node=ValueNode_Const::create((b-a)*origin+a); + if(c) + { + Angle a(prev.get(Angle())), b(next.get(Angle())); + ret.value_node=ValueNode_Const::create((b-a)*origin+a); + } + else + { + ret.value_node=ValueNode_Const::create(Angle()); + } break; } case ValueBase::TYPE_TIME: { - Time a(prev.get(Time())), b(next.get(Time())); - ret.value_node=ValueNode_Const::create((b-a)*origin+a); + if(c) + { + Time a(prev.get(Time())), b(next.get(Time())); + ret.value_node=ValueNode_Const::create((b-a)*origin+a); + } + else + { + ret.value_node=ValueNode_Const::create(Time()); + } break; } default: ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure _______________________________________________ Synfig-devl mailing list Synfig-devl@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/synfig-devl