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; }
void RotoLayer::save(RotoItemSerialization *obj) const { RotoLayerSerialization* s = dynamic_cast<RotoLayerSerialization*>(obj); assert(s); if (!s) { throw std::logic_error("RotoLayer::save"); } RotoItems items; { QMutexLocker l(&itemMutex); items = _imp->items; } for (RotoItems::const_iterator it = items.begin(); it != items.end(); ++it) { boost::shared_ptr<Bezier> isBezier = boost::dynamic_pointer_cast<Bezier>(*it); boost::shared_ptr<RotoStrokeItem> isStroke = boost::dynamic_pointer_cast<RotoStrokeItem>(*it); boost::shared_ptr<RotoLayer> layer = boost::dynamic_pointer_cast<RotoLayer>(*it); boost::shared_ptr<RotoItemSerialization> childSerialization; if (isBezier && !isStroke) { childSerialization.reset(new BezierSerialization); isBezier->save( childSerialization.get() ); } else if (isStroke) { childSerialization.reset( new RotoStrokeItemSerialization() ); isStroke->save( childSerialization.get() ); } else { assert(layer); if (layer) { childSerialization.reset(new RotoLayerSerialization); layer->save( childSerialization.get() ); } } assert(childSerialization); s->children.push_back(childSerialization); } RotoItem::save(obj); }