bool StateBrush_Context::build_transform_stack( Canvas::Handle canvas, Layer::Handle layer, CanvasView::Handle canvas_view, TransformStack& transform_stack ) { int count = 0; for(Canvas::iterator i = canvas->begin(); i != canvas->end() ;++i) { if(*i == layer) return true; if((*i)->active()) { Transform::Handle trans((*i)->get_transform()); if(trans) { transform_stack.push(trans); count++; } } // If this is a paste canvas layer, then we need to // descend into it if(etl::handle<Layer_PasteCanvas> layer_pastecanvas = etl::handle<Layer_PasteCanvas>::cast_dynamic(*i)) { transform_stack.push_back( new Transform_Matrix( layer_pastecanvas->get_guid(), layer_pastecanvas->get_summary_transformation().get_matrix() ) ); if (build_transform_stack(layer_pastecanvas->get_sub_canvas(), layer, canvas_view, transform_stack)) return true; transform_stack.pop(); } } while(count-- > 0) transform_stack.pop(); return false; }
//! \writeme int synfig::waypoint_collect(set<Waypoint, std::less<UniqueID> > &waypoint_set, const Time &time, const etl::handle<Node> &node) { const TimePointSet& timepoint_set(node->get_times()); // Check to see if there is anything in here at the given time if(timepoint_set.find(time)==timepoint_set.end()) return 0; // Check if we are a linkable value node LinkableValueNode::Handle linkable_value_node; linkable_value_node=linkable_value_node.cast_dynamic(node); if(linkable_value_node) { const int link_count(linkable_value_node->link_count()); int i,ret(0); for(i=0;i<link_count;i++) ret+=waypoint_collect(waypoint_set,time,linkable_value_node->get_link(i).get()); return ret; } // Check if we are a layer Layer::Handle layer; layer=layer.cast_dynamic(node); if(layer) { const Layer::DynamicParamList& dyn_param_list(layer->dynamic_param_list()); Layer::DynamicParamList::const_iterator iter; int ret(0); for(iter=dyn_param_list.begin();iter!=dyn_param_list.end();++iter) ret+=waypoint_collect(waypoint_set,time,iter->second); ValueBase canvas_value(layer->get_param("canvas")); if(canvas_value.get_type()==type_canvas) { etl::handle<Layer_PasteCanvas> p = etl::handle<Layer_PasteCanvas>::cast_dynamic(layer); if (p) ret+=waypoint_collect(waypoint_set, time + p->get_time_offset(), Canvas::Handle(canvas_value.get(Canvas::Handle()))); else ret+=waypoint_collect(waypoint_set, time, Canvas::Handle(canvas_value.get(Canvas::Handle()))); } return ret; } // Check if we are a canvas Canvas::Handle canvas; canvas=canvas.cast_dynamic(node); if(canvas) { Canvas::const_iterator iter; int ret(0); for(iter=canvas->begin();iter!=canvas->end();++iter) ret+=waypoint_collect(waypoint_set,time,*iter); return ret; } // Check if we are an animated value node ValueNode_Animated::Handle value_node_animated; value_node_animated=value_node_animated.cast_dynamic(node); if(value_node_animated) { try{ Waypoint waypoint=*value_node_animated->find(time); // If it is already in the waypoint set, then // don't bother adding it again if(waypoint_set.find(waypoint)!=waypoint_set.end()) return 0; waypoint_set.insert(waypoint); return 1; }catch(...) { return 0; } } return 0; }