Ejemplo n.º 1
0
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());
}
Ejemplo n.º 2
0
RotoItemPtr
RotoItem::getPreviousItemInLayer() const
{
    RotoLayerPtr layer = getParentLayer();

    if (!layer) {
        return RotoItemPtr();
    }

    return getPreviousInLayer( layer, shared_from_this() );
}
Ejemplo n.º 3
0
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;
}