boost::shared_ptr<RotoItem> RotoItem::getPreviousItemInLayer() const { boost::shared_ptr<RotoLayer> layer = getParentLayer(); if (!layer) { return boost::shared_ptr<RotoItem>(); } return getPreviousInLayer(layer, shared_from_this()); }
RotoItemPtr RotoItem::getPreviousItemInLayer() const { RotoLayerPtr layer = getParentLayer(); if (!layer) { return RotoItemPtr(); } return getPreviousInLayer( layer, shared_from_this() ); }
static RotoItemPtr getPreviousInLayer(const RotoLayerPtr& layer, const boost::shared_ptr<const RotoItem>& item) { RotoItems layerItems = layer->getItems_mt_safe(); if ( layerItems.empty() ) { return RotoItemPtr(); } RotoItems::iterator found = layerItems.end(); if (item) { for (RotoItems::iterator it = layerItems.begin(); it != layerItems.end(); ++it) { if (*it == item) { found = it; break; } } assert( found != layerItems.end() ); } else { found = layerItems.end(); } if ( found != layerItems.end() ) { ++found; if ( found != layerItems.end() ) { return *found; } } //Item was still not found, find in great parent layer RotoLayerPtr parentLayer = layer->getParentLayer(); if (!parentLayer) { return RotoItemPtr(); } RotoItems greatParentItems = parentLayer->getItems_mt_safe(); found = greatParentItems.end(); for (RotoItems::iterator it = greatParentItems.begin(); it != greatParentItems.end(); ++it) { if (*it == layer) { found = it; break; } } assert( found != greatParentItems.end() ); RotoItemPtr ret = getPreviousInLayer(parentLayer, layer); assert(ret != item); return ret; }