ScrollingStateNode.cpp [plain text]
#include "config.h"
#include "ScrollingStateNode.h"
#if ENABLE(ASYNC_SCROLLING) || USE(COORDINATED_GRAPHICS)
#include "ScrollingStateFixedNode.h"
#include "ScrollingStateTree.h"
#include "TextStream.h"
#include <wtf/text/WTFString.h>
namespace WebCore {
ScrollingStateNode::ScrollingStateNode(ScrollingNodeType nodeType, ScrollingStateTree& scrollingStateTree, ScrollingNodeID nodeID)
: m_nodeType(nodeType)
, m_nodeID(nodeID)
, m_changedProperties(0)
, m_scrollingStateTree(scrollingStateTree)
, m_parent(nullptr)
{
}
ScrollingStateNode::ScrollingStateNode(const ScrollingStateNode& stateNode, ScrollingStateTree& adoptiveTree)
: m_nodeType(stateNode.nodeType())
, m_nodeID(stateNode.scrollingNodeID())
, m_changedProperties(stateNode.changedProperties())
, m_scrollingStateTree(adoptiveTree)
, m_parent(nullptr)
{
if (hasChangedProperty(ScrollLayer))
setLayer(stateNode.layer().toRepresentation(adoptiveTree.preferredLayerRepresentation()));
scrollingStateTree().addNode(this);
}
ScrollingStateNode::~ScrollingStateNode()
{
}
void ScrollingStateNode::setPropertyChanged(unsigned propertyBit)
{
if (m_changedProperties & (1 << propertyBit))
return;
m_changedProperties |= (1 << propertyBit);
m_scrollingStateTree.setHasChangedProperties();
}
PassRefPtr<ScrollingStateNode> ScrollingStateNode::cloneAndReset(ScrollingStateTree& adoptiveTree)
{
RefPtr<ScrollingStateNode> clone = this->clone(adoptiveTree);
resetChangedProperties();
cloneAndResetChildren(*clone, adoptiveTree);
return clone.release();
}
void ScrollingStateNode::cloneAndResetChildren(ScrollingStateNode& clone, ScrollingStateTree& adoptiveTree)
{
if (!m_children)
return;
for (auto& child : *m_children)
clone.appendChild(child->cloneAndReset(adoptiveTree));
}
void ScrollingStateNode::appendChild(PassRefPtr<ScrollingStateNode> childNode)
{
childNode->setParent(this);
if (!m_children)
m_children = adoptPtr(new Vector<RefPtr<ScrollingStateNode>>);
m_children->append(childNode);
}
void ScrollingStateNode::setLayer(const LayerRepresentation& layerRepresentation)
{
if (layerRepresentation == m_layer)
return;
m_layer = layerRepresentation;
setPropertyChanged(ScrollLayer);
}
void ScrollingStateNode::dump(TextStream& ts, int indent) const
{
writeIndent(ts, indent);
dumpProperties(ts, indent);
if (m_children) {
writeIndent(ts, indent + 1);
ts << "(children " << children()->size() << "\n";
for (auto& child : *m_children)
child->dump(ts, indent + 2);
writeIndent(ts, indent + 1);
ts << ")\n";
}
writeIndent(ts, indent);
ts << ")\n";
}
String ScrollingStateNode::scrollingStateTreeAsText() const
{
TextStream ts;
dump(ts, 0);
return ts.release();
}
}
#endif // ENABLE(ASYNC_SCROLLING) || USE(COORDINATED_GRAPHICS)