TreeSynchronizer.cpp [plain text]
#include "config.h"
#include "TreeSynchronizer.h"
#include "LayerChromium.h"
#include "cc/CCLayerImpl.h"
#include <wtf/RefPtr.h>
namespace WebCore {
void TreeSynchronizer::addCCLayerImplsToMapRecursive(CCLayerImplMap& map, CCLayerImpl* ccLayerImpl)
{
map.set(ccLayerImpl->id(), ccLayerImpl);
const Vector<RefPtr<CCLayerImpl> >& children = ccLayerImpl->children();
for (size_t i = 0; i < children.size(); ++i)
addCCLayerImplsToMapRecursive(map, children[i].get());
if (CCLayerImpl* maskLayer = ccLayerImpl->maskLayer())
addCCLayerImplsToMapRecursive(map, maskLayer);
if (CCLayerImpl* replicaLayer = ccLayerImpl->replicaLayer())
addCCLayerImplsToMapRecursive(map, replicaLayer);
}
PassRefPtr<CCLayerImpl> TreeSynchronizer::synchronizeTreeRecursive(LayerChromium* layer, CCLayerImplMap& map)
{
RefPtr<CCLayerImpl> ccLayerImpl;
CCLayerImplMap::iterator it = map.find(layer->id());
if (it != map.end()) {
ccLayerImpl = it->second; ccLayerImpl->clearChildList();
} else {
ccLayerImpl = layer->createCCLayerImpl();
map.set(layer->id(), ccLayerImpl); }
const Vector<RefPtr<LayerChromium> >& children = layer->children();
for (size_t i = 0; i < children.size(); ++i)
ccLayerImpl->addChild(synchronizeTreeRecursive(children[i].get(), map));
if (LayerChromium* maskLayer = layer->maskLayer())
ccLayerImpl->setMaskLayer(synchronizeTreeRecursive(maskLayer, map));
if (LayerChromium* replicaLayer = layer->replicaLayer())
ccLayerImpl->setReplicaLayer(synchronizeTreeRecursive(replicaLayer, map));
layer->setCCLayerImpl(ccLayerImpl.get());
layer->pushPropertiesTo(ccLayerImpl.get());
return ccLayerImpl.release();
}
PassRefPtr<CCLayerImpl> TreeSynchronizer::synchronizeTrees(LayerChromium* layerChromiumRoot, PassRefPtr<CCLayerImpl> prpOldCCLayerImplRoot)
{
RefPtr<CCLayerImpl> oldCCLayerImplRoot = prpOldCCLayerImplRoot;
CCLayerImplMap map;
if (oldCCLayerImplRoot)
addCCLayerImplsToMapRecursive(map, oldCCLayerImplRoot.get());
RefPtr<CCLayerImpl> newCCLayerImplRoot = synchronizeTreeRecursive(layerChromiumRoot, map);
return newCCLayerImplRoot.release();
}
}