Commit 808643f3 authored by wangxianzhu's avatar wangxianzhu Committed by Commit bot

Reuse existing paint property node is possible

This is required by subsequence caching for spv2. When we copy a cached
subsequence, we won't do actual paint and will use the existing
PaintChunkProperties which points to the paint property nodes created
during the previous paint. We are sure that the values of these property
nodes didn't change since the previous paint because we can use the
cached subsequence.

To meet this requirement, when building the paint property tree, instead
of rebuilding the whole tree by creating all new nodes, we should reuse
the existing nodes if their values don't change. The reused nodes should
be placed in the new tree.

In the future we may also reuse a whole subtree of property nodes.

BUG=596983

Review-Url: https://codereview.chromium.org/2144823006
Cr-Commit-Position: refs/heads/master@{#407243}
parent 50ebc130
......@@ -92,12 +92,12 @@ private:
void setPerspective(PassRefPtr<TransformPaintPropertyNode> perspective) { m_perspective = perspective; }
void setSvgLocalToBorderBoxTransform(PassRefPtr<TransformPaintPropertyNode> transform)
{
DCHECK(!scrollTranslation()) << "SVG elements cannot scroll so there should never be both a scroll translation and an SVG local to border box transform.";
DCHECK(!scrollTranslation() || !transform) << "SVG elements cannot scroll so there should never be both a scroll translation and an SVG local to border box transform.";
m_svgLocalToBorderBoxTransform = transform;
}
void setScrollTranslation(PassRefPtr<TransformPaintPropertyNode> translation)
{
DCHECK(!svgLocalToBorderBoxTransform()) << "SVG elements cannot scroll so there should never be both a scroll translation and an SVG local to border box transform.";
DCHECK(!svgLocalToBorderBoxTransform() || !translation) << "SVG elements cannot scroll so there should never be both a scroll translation and an SVG local to border box transform.";
m_scrollTranslation = translation;
}
void setScrollbarPaintOffset(PassRefPtr<TransformPaintPropertyNode> paintOffset) { m_scrollbarPaintOffset = paintOffset; }
......
......@@ -15,6 +15,7 @@ namespace blink {
class FrameView;
class LayoutObject;
class ObjectPaintProperties;
// The context for PaintPropertyTreeBuilder.
// It's responsible for bookkeeping tree state in other order, for example, the most recent
......@@ -67,6 +68,16 @@ public:
void buildTreeNodes(const LayoutObject&, PaintPropertyTreeBuilderContext&);
private:
template <typename PropertyNode, void (ObjectPaintProperties::*Setter)(PassRefPtr<PropertyNode>)>
static void clearPaintProperty(const LayoutObject&);
template <
typename PropertyNode,
PropertyNode* (ObjectPaintProperties::*Getter)() const,
void (ObjectPaintProperties::*Setter)(PassRefPtr<PropertyNode>),
typename... Args>
static void updateOrCreatePaintProperty(const LayoutObject&, const PaintPropertyTreeBuilderContext&, PropertyNode*& contextProperty, const Args&...);
static void updatePaintOffsetTranslation(const LayoutObject&, PaintPropertyTreeBuilderContext&);
static void updateTransform(const LayoutObject&, PaintPropertyTreeBuilderContext&);
static void updateEffect(const LayoutObject&, PaintPropertyTreeBuilderContext&);
......
......@@ -1109,4 +1109,78 @@ TEST_F(PaintPropertyTreeBuilderTest, SvgPixelSnappingShouldResetPaintOffset)
EXPECT_EQ(svgWithTransformProperties->transform(), rectWithTransformProperties->transform()->parent());
}
TEST_F(PaintPropertyTreeBuilderTest, CachedProperties)
{
setBodyInnerHTML(
"<div id='a' style='transform: translate(33px, 44px)'>"
" <div id='b' style='transform: translate(55px, 66px)'>"
" <div id='c' style='transform: translate(77px, 88px)'>C<div>"
" </div>"
"</div>");
Element* a = document().getElementById("a");
ObjectPaintProperties* aProperties = a->layoutObject()->objectPaintProperties();
TransformPaintPropertyNode* aTransformNode = aProperties->transform();
EXPECT_EQ(TransformationMatrix().translate(33, 44), aTransformNode->matrix());
Element* b = document().getElementById("b");
ObjectPaintProperties* bProperties = b->layoutObject()->objectPaintProperties();
TransformPaintPropertyNode* bTransformNode = bProperties->transform();
EXPECT_EQ(TransformationMatrix().translate(55, 66), bTransformNode->matrix());
Element* c = document().getElementById("c");
ObjectPaintProperties* cProperties = c->layoutObject()->objectPaintProperties();
TransformPaintPropertyNode* cTransformNode = cProperties->transform();
EXPECT_EQ(TransformationMatrix().translate(77, 88), cTransformNode->matrix());
// Change transform of b. B's transform node should be a new node with the new value,
// and a and c's transform nodes should be unchanged (with c's parent adjusted).
b->setAttribute(HTMLNames::styleAttr, "transform: translate(111px, 222px)");
document().view()->updateAllLifecyclePhases();
EXPECT_EQ(aProperties, a->layoutObject()->objectPaintProperties());
EXPECT_EQ(aTransformNode, aProperties->transform());
EXPECT_EQ(bProperties, b->layoutObject()->objectPaintProperties());
bTransformNode = bProperties->transform();
EXPECT_EQ(TransformationMatrix().translate(111, 222), bTransformNode->matrix());
EXPECT_EQ(aTransformNode, bTransformNode->parent());
EXPECT_EQ(cProperties, c->layoutObject()->objectPaintProperties());
EXPECT_EQ(cTransformNode, cProperties->transform());
EXPECT_EQ(bTransformNode, cTransformNode->parent());
// Remove transform from b. B's transform node should be removed from the tree,
// and a and c's transform nodes should be unchanged (with c's parent adjusted).
b->setAttribute(HTMLNames::styleAttr, "");
document().view()->updateAllLifecyclePhases();
EXPECT_EQ(aProperties, a->layoutObject()->objectPaintProperties());
EXPECT_EQ(aTransformNode, aProperties->transform());
EXPECT_EQ(bProperties, b->layoutObject()->objectPaintProperties());
EXPECT_EQ(nullptr, bProperties->transform());
EXPECT_EQ(cProperties, c->layoutObject()->objectPaintProperties());
EXPECT_EQ(cTransformNode, cProperties->transform());
EXPECT_EQ(aTransformNode, cTransformNode->parent());
// Re-add transform to b. B's transform node should be inserted into the tree,
// and a and c's transform nodes should be unchanged (with c's parent adjusted).
b->setAttribute(HTMLNames::styleAttr, "transform: translate(4px, 5px)");
document().view()->updateAllLifecyclePhases();
EXPECT_EQ(aProperties, a->layoutObject()->objectPaintProperties());
EXPECT_EQ(aTransformNode, aProperties->transform());
EXPECT_EQ(bProperties, b->layoutObject()->objectPaintProperties());
bTransformNode = bProperties->transform();
EXPECT_EQ(TransformationMatrix().translate(4, 5), bTransformNode->matrix());
EXPECT_EQ(aTransformNode, bTransformNode->parent());
EXPECT_EQ(cProperties, c->layoutObject()->objectPaintProperties());
EXPECT_EQ(cTransformNode, cProperties->transform());
EXPECT_EQ(bTransformNode, cTransformNode->parent());
}
} // namespace blink
......@@ -37,7 +37,7 @@ gfx::Transform translation(SkMScalar x, SkMScalar y)
EffectPaintPropertyNode* dummyRootEffect()
{
DEFINE_STATIC_REF(EffectPaintPropertyNode, node, EffectPaintPropertyNode::create(1.0));
DEFINE_STATIC_REF(EffectPaintPropertyNode, node, EffectPaintPropertyNode::create(nullptr, 1.0));
return node;
}
......@@ -102,7 +102,7 @@ TEST_F(PaintArtifactCompositorTest, OneTransform)
{
// A 90 degree clockwise rotation about (100, 100).
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(
TransformationMatrix().rotate(90), FloatPoint3D(100, 100, 0));
nullptr, TransformationMatrix().rotate(90), FloatPoint3D(100, 100, 0));
TestPaintArtifact artifact;
artifact.chunk(transform, nullptr, dummyRootEffect())
......@@ -142,9 +142,9 @@ TEST_F(PaintArtifactCompositorTest, TransformCombining)
{
// A translation by (5, 5) within a 2x scale about (10, 10).
RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode::create(
TransformationMatrix().scale(2), FloatPoint3D(10, 10, 0));
nullptr, TransformationMatrix().scale(2), FloatPoint3D(10, 10, 0));
RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode::create(
TransformationMatrix().translate(5, 5), FloatPoint3D(), transform1);
transform1, TransformationMatrix().translate(5, 5), FloatPoint3D());
TestPaintArtifact artifact;
artifact.chunk(transform1, nullptr, dummyRootEffect())
......@@ -175,9 +175,9 @@ TEST_F(PaintArtifactCompositorTest, TransformCombining)
TEST_F(PaintArtifactCompositorTest, LayerOriginCancellation)
{
RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(100, 100, 100, 100));
nullptr, nullptr, FloatRoundedRect(100, 100, 100, 100));
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(
TransformationMatrix().scale(2), FloatPoint3D());
nullptr, TransformationMatrix().scale(2), FloatPoint3D());
TestPaintArtifact artifact;
artifact.chunk(transform, clip, nullptr)
......@@ -203,7 +203,7 @@ TEST_F(PaintArtifactCompositorTest, LayerOriginCancellation)
TEST_F(PaintArtifactCompositorTest, OneClip)
{
RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(100, 100, 300, 200));
nullptr, nullptr, FloatRoundedRect(100, 100, 300, 200));
TestPaintArtifact artifact;
artifact.chunk(nullptr, clip, nullptr)
......@@ -226,9 +226,9 @@ TEST_F(PaintArtifactCompositorTest, OneClip)
TEST_F(PaintArtifactCompositorTest, NestedClips)
{
RefPtr<ClipPaintPropertyNode> clip1 = ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(100, 100, 700, 700));
nullptr, nullptr, FloatRoundedRect(100, 100, 700, 700));
RefPtr<ClipPaintPropertyNode> clip2 = ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(200, 200, 700, 100), clip1);
clip1, nullptr, FloatRoundedRect(200, 200, 700, 100));
TestPaintArtifact artifact;
artifact.chunk(nullptr, clip1, dummyRootEffect())
......@@ -289,8 +289,8 @@ TEST_F(PaintArtifactCompositorTest, DeeplyNestedClips)
Vector<RefPtr<ClipPaintPropertyNode>> clips;
for (unsigned i = 1; i <= 10; i++) {
clips.append(ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(5 * i, 0, 100, 200 - 10 * i),
clips.isEmpty() ? nullptr : clips.last()));
clips.isEmpty() ? nullptr : clips.last(),
nullptr, FloatRoundedRect(5 * i, 0, 100, 200 - 10 * i)));
}
TestPaintArtifact artifact;
......@@ -319,11 +319,11 @@ TEST_F(PaintArtifactCompositorTest, DeeplyNestedClips)
TEST_F(PaintArtifactCompositorTest, SiblingClips)
{
RefPtr<ClipPaintPropertyNode> commonClip = ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(0, 0, 800, 600));
nullptr, nullptr, FloatRoundedRect(0, 0, 800, 600));
RefPtr<ClipPaintPropertyNode> clip1 = ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(0, 0, 400, 600), commonClip);
commonClip, nullptr, FloatRoundedRect(0, 0, 400, 600));
RefPtr<ClipPaintPropertyNode> clip2 = ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(400, 0, 400, 600), commonClip);
commonClip, nullptr, FloatRoundedRect(400, 0, 400, 600));
TestPaintArtifact artifact;
artifact.chunk(nullptr, clip1, nullptr)
......@@ -454,7 +454,7 @@ TEST_F(PaintArtifactCompositorTestWithPropertyTrees, OneTransform)
{
// A 90 degree clockwise rotation about (100, 100).
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(
TransformationMatrix().rotate(90), FloatPoint3D(100, 100, 0));
nullptr, TransformationMatrix().rotate(90), FloatPoint3D(100, 100, 0));
TestPaintArtifact artifact;
artifact.chunk(transform, nullptr, dummyRootEffect())
......@@ -494,9 +494,9 @@ TEST_F(PaintArtifactCompositorTestWithPropertyTrees, TransformCombining)
{
// A translation by (5, 5) within a 2x scale about (10, 10).
RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode::create(
TransformationMatrix().scale(2), FloatPoint3D(10, 10, 0));
nullptr, TransformationMatrix().scale(2), FloatPoint3D(10, 10, 0));
RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode::create(
TransformationMatrix().translate(5, 5), FloatPoint3D(), transform1);
transform1, TransformationMatrix().translate(5, 5), FloatPoint3D());
TestPaintArtifact artifact;
artifact.chunk(transform1, nullptr, dummyRootEffect())
......@@ -530,7 +530,7 @@ TEST_F(PaintArtifactCompositorTestWithPropertyTrees, TransformCombining)
TEST_F(PaintArtifactCompositorTestWithPropertyTrees, OneClip)
{
RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(100, 100, 300, 200));
nullptr, nullptr, FloatRoundedRect(100, 100, 300, 200));
TestPaintArtifact artifact;
artifact.chunk(nullptr, clip, nullptr)
......@@ -552,9 +552,9 @@ TEST_F(PaintArtifactCompositorTestWithPropertyTrees, OneClip)
TEST_F(PaintArtifactCompositorTestWithPropertyTrees, NestedClips)
{
RefPtr<ClipPaintPropertyNode> clip1 = ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(100, 100, 700, 700));
nullptr, nullptr, FloatRoundedRect(100, 100, 700, 700));
RefPtr<ClipPaintPropertyNode> clip2 = ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(200, 200, 700, 100), clip1);
clip1, nullptr, FloatRoundedRect(200, 200, 700, 100));
TestPaintArtifact artifact;
artifact.chunk(nullptr, clip1, dummyRootEffect())
......@@ -608,8 +608,8 @@ TEST_F(PaintArtifactCompositorTestWithPropertyTrees, DeeplyNestedClips)
Vector<RefPtr<ClipPaintPropertyNode>> clips;
for (unsigned i = 1; i <= 10; i++) {
clips.append(ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(5 * i, 0, 100, 200 - 10 * i),
clips.isEmpty() ? nullptr : clips.last()));
clips.isEmpty() ? nullptr : clips.last(),
nullptr, FloatRoundedRect(5 * i, 0, 100, 200 - 10 * i)));
}
TestPaintArtifact artifact;
......@@ -638,11 +638,11 @@ TEST_F(PaintArtifactCompositorTestWithPropertyTrees, DeeplyNestedClips)
TEST_F(PaintArtifactCompositorTestWithPropertyTrees, SiblingClips)
{
RefPtr<ClipPaintPropertyNode> commonClip = ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(0, 0, 800, 600));
nullptr, nullptr, FloatRoundedRect(0, 0, 800, 600));
RefPtr<ClipPaintPropertyNode> clip1 = ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(0, 0, 400, 600), commonClip);
commonClip, nullptr, FloatRoundedRect(0, 0, 400, 600));
RefPtr<ClipPaintPropertyNode> clip2 = ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(400, 0, 400, 600), commonClip);
commonClip, nullptr, FloatRoundedRect(400, 0, 400, 600));
TestPaintArtifact artifact;
artifact.chunk(nullptr, clip1, dummyRootEffect())
......@@ -695,9 +695,9 @@ TEST_F(PaintArtifactCompositorTestWithPropertyTrees, ForeignLayerPassesThrough)
TEST_F(PaintArtifactCompositorTestWithPropertyTrees, EffectTreeConversion)
{
RefPtr<EffectPaintPropertyNode> effect1 = EffectPaintPropertyNode::create(0.5, dummyRootEffect());
RefPtr<EffectPaintPropertyNode> effect2 = EffectPaintPropertyNode::create(0.3, effect1.get());
RefPtr<EffectPaintPropertyNode> effect3 = EffectPaintPropertyNode::create(0.2, dummyRootEffect());
RefPtr<EffectPaintPropertyNode> effect1 = EffectPaintPropertyNode::create(dummyRootEffect(), 0.5);
RefPtr<EffectPaintPropertyNode> effect2 = EffectPaintPropertyNode::create(effect1, 0.3);
RefPtr<EffectPaintPropertyNode> effect3 = EffectPaintPropertyNode::create(dummyRootEffect(), 0.2);
TestPaintArtifact artifact;
artifact.chunk(nullptr, nullptr, effect2.get())
......
......@@ -17,16 +17,23 @@
namespace blink {
// A clip rect created by a css property such as "overflow" or "clip".
// Along with a refernce to the transform space the clip rect is based on,
// Along with a reference to the transform space the clip rect is based on,
// and an (optional) parent ClipPaintPropertyNode for inherited clips.
class PLATFORM_EXPORT ClipPaintPropertyNode : public RefCounted<ClipPaintPropertyNode> {
public:
static PassRefPtr<ClipPaintPropertyNode> create(
PassRefPtr<ClipPaintPropertyNode> parent,
PassRefPtr<TransformPaintPropertyNode> localTransformSpace,
const FloatRoundedRect& clipRect,
PassRefPtr<ClipPaintPropertyNode> parent = nullptr)
const FloatRoundedRect& clipRect)
{
return adoptRef(new ClipPaintPropertyNode(localTransformSpace, clipRect, parent));
return adoptRef(new ClipPaintPropertyNode(parent, localTransformSpace, clipRect));
}
void update(PassRefPtr<ClipPaintPropertyNode> parent, PassRefPtr<TransformPaintPropertyNode> localTransformSpace, const FloatRoundedRect& clipRect)
{
m_parent = parent;
m_localTransformSpace = localTransformSpace;
m_clipRect = clipRect;
}
const TransformPaintPropertyNode* localTransformSpace() const { return m_localTransformSpace.get(); }
......@@ -36,12 +43,12 @@ public:
const ClipPaintPropertyNode* parent() const { return m_parent.get(); }
private:
ClipPaintPropertyNode(PassRefPtr<TransformPaintPropertyNode> localTransformSpace, const FloatRoundedRect& clipRect, PassRefPtr<ClipPaintPropertyNode> parent)
: m_localTransformSpace(localTransformSpace), m_clipRect(clipRect), m_parent(parent) { }
ClipPaintPropertyNode(PassRefPtr<ClipPaintPropertyNode> parent, PassRefPtr<TransformPaintPropertyNode> localTransformSpace, const FloatRoundedRect& clipRect)
: m_parent(parent), m_localTransformSpace(localTransformSpace), m_clipRect(clipRect) { }
RefPtr<TransformPaintPropertyNode> m_localTransformSpace;
const FloatRoundedRect m_clipRect;
RefPtr<ClipPaintPropertyNode> m_parent;
RefPtr<TransformPaintPropertyNode> m_localTransformSpace;
FloatRoundedRect m_clipRect;
};
// Redeclared here to avoid ODR issues.
......
......@@ -19,9 +19,15 @@ namespace blink {
// TODO(pdr): Support more effects than just opacity.
class PLATFORM_EXPORT EffectPaintPropertyNode : public RefCounted<EffectPaintPropertyNode> {
public:
static PassRefPtr<EffectPaintPropertyNode> create(float opacity, PassRefPtr<EffectPaintPropertyNode> parent = nullptr)
static PassRefPtr<EffectPaintPropertyNode> create(PassRefPtr<EffectPaintPropertyNode> parent, float opacity)
{
return adoptRef(new EffectPaintPropertyNode(opacity, parent));
return adoptRef(new EffectPaintPropertyNode(parent, opacity));
}
void update(PassRefPtr<EffectPaintPropertyNode> parent, float opacity)
{
m_parent = parent;
m_opacity = opacity;
}
float opacity() const { return m_opacity; }
......@@ -30,11 +36,11 @@ public:
const EffectPaintPropertyNode* parent() const { return m_parent.get(); }
private:
EffectPaintPropertyNode(float opacity, PassRefPtr<EffectPaintPropertyNode> parent)
: m_opacity(opacity), m_parent(parent) { }
EffectPaintPropertyNode(PassRefPtr<EffectPaintPropertyNode> parent, float opacity)
: m_parent(parent), m_opacity(opacity) { }
const float m_opacity;
RefPtr<EffectPaintPropertyNode> m_parent;
float m_opacity;
};
// Redeclared here to avoid ODR issues.
......
......@@ -35,9 +35,9 @@ public:
private:
void SetUp() override
{
rootTransformNode = TransformPaintPropertyNode::create(TransformationMatrix(), FloatPoint3D(), nullptr);
rootClipNode = ClipPaintPropertyNode::create(rootTransformNode, FloatRoundedRect(LayoutRect::infiniteIntRect()), nullptr);
rootEffectNode = EffectPaintPropertyNode::create(1.0, nullptr);
rootTransformNode = TransformPaintPropertyNode::create(nullptr, TransformationMatrix(), FloatPoint3D());
rootClipNode = ClipPaintPropertyNode::create(nullptr, rootTransformNode, FloatRoundedRect(LayoutRect::infiniteIntRect()));
rootEffectNode = EffectPaintPropertyNode::create(nullptr, 1.0);
geometryMapper = wrapUnique(new GeometryMapper());
}
......@@ -80,7 +80,7 @@ TEST_F(GeometryMapperTest, Root)
TEST_F(GeometryMapperTest, IdentityTransform)
{
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(TransformationMatrix(), FloatPoint3D(), rootPropertyTreeState().transform);
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(rootPropertyTreeState().transform, TransformationMatrix(), FloatPoint3D());
PropertyTreeState localState = rootPropertyTreeState();
localState.transform = transform.get();
......@@ -93,7 +93,7 @@ TEST_F(GeometryMapperTest, TranslationTransform)
{
TransformationMatrix transformMatrix;
transformMatrix.translate(20, 10);
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(transformMatrix, FloatPoint3D(), rootPropertyTreeState().transform);
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(rootPropertyTreeState().transform, transformMatrix, FloatPoint3D());
PropertyTreeState localState = rootPropertyTreeState();
localState.transform = transform.get();
......@@ -113,7 +113,7 @@ TEST_F(GeometryMapperTest, RotationAndScaleTransform)
TransformationMatrix transformMatrix;
transformMatrix.rotate(45);
transformMatrix.scale(2);
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(transformMatrix, FloatPoint3D(0, 0, 0), rootPropertyTreeState().transform);
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(rootPropertyTreeState().transform, transformMatrix, FloatPoint3D(0, 0, 0));
PropertyTreeState localState = rootPropertyTreeState();
localState.transform = transform.get();
......@@ -128,7 +128,7 @@ TEST_F(GeometryMapperTest, RotationAndScaleTransformWithTransformOrigin)
TransformationMatrix transformMatrix;
transformMatrix.rotate(45);
transformMatrix.scale(2);
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(transformMatrix, FloatPoint3D(50, 50, 0), rootPropertyTreeState().transform);
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(rootPropertyTreeState().transform, transformMatrix, FloatPoint3D(50, 50, 0));
PropertyTreeState localState = rootPropertyTreeState();
localState.transform = transform.get();
......@@ -143,11 +143,11 @@ TEST_F(GeometryMapperTest, NestedTransforms)
{
TransformationMatrix rotateTransform;
rotateTransform.rotate(45);
RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode::create(rotateTransform, FloatPoint3D(), rootPropertyTreeState().transform);
RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode::create(rootPropertyTreeState().transform, rotateTransform, FloatPoint3D());
TransformationMatrix scaleTransform;
scaleTransform.scale(2);
RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode::create(scaleTransform, FloatPoint3D(), transform1);
RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode::create(transform1, scaleTransform, FloatPoint3D());
PropertyTreeState localState = rootPropertyTreeState();
localState.transform = transform2.get();
......@@ -166,11 +166,11 @@ TEST_F(GeometryMapperTest, NestedTransformsIntermediateDestination)
{
TransformationMatrix rotateTransform;
rotateTransform.rotate(45);
RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode::create(rotateTransform, FloatPoint3D(), rootPropertyTreeState().transform);
RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode::create(rootPropertyTreeState().transform, rotateTransform, FloatPoint3D());
TransformationMatrix scaleTransform;
scaleTransform.scale(2);
RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode::create(scaleTransform, FloatPoint3D(), transform1);
RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode::create(transform1, scaleTransform, FloatPoint3D());
PropertyTreeState localState = rootPropertyTreeState();
localState.transform = transform2.get();
......@@ -186,7 +186,7 @@ TEST_F(GeometryMapperTest, NestedTransformsIntermediateDestination)
TEST_F(GeometryMapperTest, SimpleClip)
{
RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(rootTransformNode, FloatRoundedRect(10, 10, 50, 50), rootClipNode);
RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(rootClipNode, rootTransformNode, FloatRoundedRect(10, 10, 50, 50));
PropertyTreeState localState = rootPropertyTreeState();
localState.clip = clip.get();
......@@ -207,9 +207,9 @@ TEST_F(GeometryMapperTest, ClipBeforeTransform)
{
TransformationMatrix rotateTransform;
rotateTransform.rotate(45);
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(rotateTransform, FloatPoint3D(), rootPropertyTreeState().transform);
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(rootPropertyTreeState().transform, rotateTransform, FloatPoint3D());
RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(transform.get(), FloatRoundedRect(10, 10, 50, 50), rootClipNode);
RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(rootClipNode, transform.get(), FloatRoundedRect(10, 10, 50, 50));
PropertyTreeState localState = rootPropertyTreeState();
localState.clip = clip.get();
......@@ -233,9 +233,9 @@ TEST_F(GeometryMapperTest, ClipAfterTransform)
{
TransformationMatrix rotateTransform;
rotateTransform.rotate(45);
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(rotateTransform, FloatPoint3D(), rootPropertyTreeState().transform);
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(rootPropertyTreeState().transform, rotateTransform, FloatPoint3D());
RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(rootTransformNode.get(), FloatRoundedRect(10, 10, 200, 200), rootClipNode);
RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(rootClipNode, rootTransformNode.get(), FloatRoundedRect(10, 10, 200, 200));
PropertyTreeState localState = rootPropertyTreeState();
localState.clip = clip.get();
......@@ -257,13 +257,13 @@ TEST_F(GeometryMapperTest, ClipAfterTransform)
TEST_F(GeometryMapperTest, TwoClipsWithTransformBetween)
{
RefPtr<ClipPaintPropertyNode> clip1 = ClipPaintPropertyNode::create(rootTransformNode.get(), FloatRoundedRect(10, 10, 200, 200), rootClipNode);
RefPtr<ClipPaintPropertyNode> clip1 = ClipPaintPropertyNode::create(rootClipNode, rootTransformNode.get(), FloatRoundedRect(10, 10, 200, 200));
TransformationMatrix rotateTransform;
rotateTransform.rotate(45);
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(rotateTransform, FloatPoint3D(), rootPropertyTreeState().transform);
RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::create(rootPropertyTreeState().transform, rotateTransform, FloatPoint3D());
RefPtr<ClipPaintPropertyNode> clip2 = ClipPaintPropertyNode::create(transform.get(), FloatRoundedRect(10, 10, 200, 200), clip1.get());
RefPtr<ClipPaintPropertyNode> clip2 = ClipPaintPropertyNode::create(clip1, transform.get(), FloatRoundedRect(10, 10, 200, 200));
FloatRect input(0, 0, 100, 100);
......@@ -317,11 +317,11 @@ TEST_F(GeometryMapperTest, SiblingTransforms)
// These transforms are siblings. Thus mapping from one to the other requires going through the root.
TransformationMatrix rotateTransform1;
rotateTransform1.rotate(45);
RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode::create(rotateTransform1, FloatPoint3D(), rootPropertyTreeState().transform);
RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode::create(rootPropertyTreeState().transform, rotateTransform1, FloatPoint3D());
TransformationMatrix rotateTransform2;
rotateTransform2.rotate(-45);
RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode::create(rotateTransform2, FloatPoint3D(), rootPropertyTreeState().transform);
RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode::create(rootPropertyTreeState().transform, rotateTransform2, FloatPoint3D());
PropertyTreeState transform1State = rootPropertyTreeState();
transform1State.transform = transform1;
......
......@@ -120,10 +120,10 @@ TEST_F(PaintArtifactToSkCanvasTest, TransformCombining)
TransformationMatrix matrix1;
matrix1.scale(2);
FloatPoint3D origin1(10, 10, 0);
RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode::create(matrix1, origin1);
RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode::create(nullptr, matrix1, origin1);
TransformationMatrix matrix2;
matrix2.translate(5, 5);
RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode::create(matrix2, FloatPoint3D(), transform1.get());
RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode::create(transform1, matrix2, FloatPoint3D());
TestPaintArtifact artifact;
artifact.chunk(transform1.get(), nullptr, nullptr)
......@@ -147,8 +147,8 @@ TEST_F(PaintArtifactToSkCanvasTest, OpacityEffectsCombining)
}
// Build an opacity effect tree.
RefPtr<EffectPaintPropertyNode> opacityEffect1 = EffectPaintPropertyNode::create(0.5);
RefPtr<EffectPaintPropertyNode> opacityEffect2 = EffectPaintPropertyNode::create(0.25, opacityEffect1);
RefPtr<EffectPaintPropertyNode> opacityEffect1 = EffectPaintPropertyNode::create(nullptr, 0.5);
RefPtr<EffectPaintPropertyNode> opacityEffect2 = EffectPaintPropertyNode::create(opacityEffect1, 0.25);
TestPaintArtifact artifact;
artifact.chunk(nullptr, nullptr, opacityEffect1.get())
......@@ -181,10 +181,10 @@ TEST_F(PaintArtifactToSkCanvasTest, ChangingOpacityEffects)
// 0.1 a c 0.3
// | |
// 0.2 b d 0.4
RefPtr<EffectPaintPropertyNode> opacityEffectA = EffectPaintPropertyNode::create(0.1);
RefPtr<EffectPaintPropertyNode> opacityEffectB = EffectPaintPropertyNode::create(0.2, opacityEffectA);
RefPtr<EffectPaintPropertyNode> opacityEffectC = EffectPaintPropertyNode::create(0.3);
RefPtr<EffectPaintPropertyNode> opacityEffectD = EffectPaintPropertyNode::create(0.4, opacityEffectC);
RefPtr<EffectPaintPropertyNode> opacityEffectA = EffectPaintPropertyNode::create(nullptr, 0.1);
RefPtr<EffectPaintPropertyNode> opacityEffectB = EffectPaintPropertyNode::create(opacityEffectA, 0.2);
RefPtr<EffectPaintPropertyNode> opacityEffectC = EffectPaintPropertyNode::create(nullptr, 0.3);
RefPtr<EffectPaintPropertyNode> opacityEffectD = EffectPaintPropertyNode::create(opacityEffectC, 0.4);
// Build a two-chunk artifact directly.
// chunk1 references opacity node b, chunk2 references opacity node d.
......@@ -220,13 +220,13 @@ TEST_F(PaintArtifactToSkCanvasTest, ClipWithScrollEscaping)
// Setup transform tree.
RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode::create(
TransformationMatrix().translate(0, -100), FloatPoint3D());
nullptr, TransformationMatrix().translate(0, -100), FloatPoint3D());
// Setup clip tree.
RefPtr<ClipPaintPropertyNode> clip1 = ClipPaintPropertyNode::create(
transform1.get(), FloatRoundedRect(100, 200, 100, 100));
nullptr, transform1.get(), FloatRoundedRect(100, 200, 100, 100));
RefPtr<ClipPaintPropertyNode> clip2 = ClipPaintPropertyNode::create(
nullptr, FloatRoundedRect(150, 150, 100, 100), clip1.get());
clip1, nullptr, FloatRoundedRect(150, 150, 100, 100));
MockCanvas canvas(kCanvasWidth, kCanvasHeight);
......
......@@ -108,13 +108,13 @@ TEST_F(PaintChunkerTest, BuildMultipleChunksWithSinglePropertyChanging)
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
PaintChunkProperties simpleTransform;
simpleTransform.transform = TransformPaintPropertyNode::create(TransformationMatrix(0, 1, 2, 3, 4, 5), FloatPoint3D(9, 8, 7));
simpleTransform.transform = TransformPaintPropertyNode::create(nullptr, TransformationMatrix(0, 1, 2, 3, 4, 5), FloatPoint3D(9, 8, 7));
chunker.updateCurrentPaintChunkProperties(nullptr, simpleTransform);
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
PaintChunkProperties anotherTransform;
anotherTransform.transform = TransformPaintPropertyNode::create(TransformationMatrix(0, 1, 2, 3, 4, 5), FloatPoint3D(9, 8, 7));
anotherTransform.transform = TransformPaintPropertyNode::create(nullptr, TransformationMatrix(0, 1, 2, 3, 4, 5), FloatPoint3D(9, 8, 7));
chunker.updateCurrentPaintChunkProperties(nullptr, anotherTransform);
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
......@@ -133,21 +133,21 @@ TEST_F(PaintChunkerTest, BuildMultipleChunksWithDifferentPropertyChanges)
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
PaintChunkProperties simpleTransform;
simpleTransform.transform = TransformPaintPropertyNode::create(TransformationMatrix(0, 0, 0, 0, 0, 0), FloatPoint3D(9, 8, 7));
simpleTransform.transform = TransformPaintPropertyNode::create(nullptr, TransformationMatrix(0, 0, 0, 0, 0, 0), FloatPoint3D(9, 8, 7));
chunker.updateCurrentPaintChunkProperties(nullptr, simpleTransform);
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
PaintChunkProperties simpleTransformAndEffect;
simpleTransformAndEffect.transform = simpleTransform.transform;
simpleTransformAndEffect.effect = EffectPaintPropertyNode::create(0.5f);
simpleTransformAndEffect.effect = EffectPaintPropertyNode::create(nullptr, 0.5f);
chunker.updateCurrentPaintChunkProperties(nullptr, simpleTransformAndEffect);
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
PaintChunkProperties simpleTransformAndEffectWithUpdatedTransform;
simpleTransformAndEffectWithUpdatedTransform.transform = TransformPaintPropertyNode::create(TransformationMatrix(1, 1, 0, 0, 0, 0), FloatPoint3D(9, 8, 7));
simpleTransformAndEffectWithUpdatedTransform.effect = EffectPaintPropertyNode::create(simpleTransformAndEffect.effect->opacity());
simpleTransformAndEffectWithUpdatedTransform.transform = TransformPaintPropertyNode::create(nullptr, TransformationMatrix(1, 1, 0, 0, 0, 0), FloatPoint3D(9, 8, 7));
simpleTransformAndEffectWithUpdatedTransform.effect = EffectPaintPropertyNode::create(nullptr, simpleTransformAndEffect.effect->opacity());
chunker.updateCurrentPaintChunkProperties(nullptr, simpleTransformAndEffectWithUpdatedTransform);
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
......@@ -177,7 +177,7 @@ TEST_F(PaintChunkerTest, BuildChunksFromNestedTransforms)
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
PaintChunkProperties simpleTransform;
simpleTransform.transform = TransformPaintPropertyNode::create(TransformationMatrix(0, 1, 2, 3, 4, 5), FloatPoint3D(9, 8, 7));
simpleTransform.transform = TransformPaintPropertyNode::create(nullptr, TransformationMatrix(0, 1, 2, 3, 4, 5), FloatPoint3D(9, 8, 7));
chunker.updateCurrentPaintChunkProperties(nullptr, simpleTransform);
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
......@@ -201,11 +201,11 @@ TEST_F(PaintChunkerTest, ChangingPropertiesWithoutItems)
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
PaintChunkProperties firstTransform;
firstTransform.transform = TransformPaintPropertyNode::create(TransformationMatrix(0, 1, 2, 3, 4, 5), FloatPoint3D(9, 8, 7));
firstTransform.transform = TransformPaintPropertyNode::create(nullptr, TransformationMatrix(0, 1, 2, 3, 4, 5), FloatPoint3D(9, 8, 7));
chunker.updateCurrentPaintChunkProperties(nullptr, firstTransform);
PaintChunkProperties secondTransform;
secondTransform.transform = TransformPaintPropertyNode::create(TransformationMatrix(9, 8, 7, 6, 5, 4), FloatPoint3D(3, 2, 1));
secondTransform.transform = TransformPaintPropertyNode::create(nullptr, TransformationMatrix(9, 8, 7, 6, 5, 4), FloatPoint3D(3, 2, 1));
chunker.updateCurrentPaintChunkProperties(nullptr, secondTransform);
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
......@@ -263,7 +263,7 @@ TEST_F(PaintChunkerTest, ChunkIds)
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
PaintChunkProperties simpleTransform;
simpleTransform.transform = TransformPaintPropertyNode::create(TransformationMatrix(0, 1, 2, 3, 4, 5), FloatPoint3D(9, 8, 7));
simpleTransform.transform = TransformPaintPropertyNode::create(nullptr, TransformationMatrix(0, 1, 2, 3, 4, 5), FloatPoint3D(9, 8, 7));
chunker.updateCurrentPaintChunkProperties(&id1, simpleTransform);
chunker.incrementDisplayItemIndex(i1);
......@@ -296,7 +296,7 @@ TEST_F(PaintChunkerTest, ChunkIdsSkippingCache)
chunker.incrementDisplayItemIndex(NormalTestDisplayItem());
PaintChunkProperties simpleTransform;
simpleTransform.transform = TransformPaintPropertyNode::create(TransformationMatrix(0, 1, 2, 3, 4, 5), FloatPoint3D(9, 8, 7));
simpleTransform.transform = TransformPaintPropertyNode::create(nullptr, TransformationMatrix(0, 1, 2, 3, 4, 5), FloatPoint3D(9, 8, 7));
chunker.updateCurrentPaintChunkProperties(&id1, simpleTransform);
chunker.incrementDisplayItemIndex(i1);
......
......@@ -27,20 +27,20 @@ public:
private:
void SetUp() override
{
rootTransformNode = TransformPaintPropertyNode::create(TransformationMatrix(), FloatPoint3D(), nullptr);
rootClipNode = ClipPaintPropertyNode::create(rootTransformNode, FloatRoundedRect(LayoutRect::infiniteIntRect()), nullptr);
rootEffectNode = EffectPaintPropertyNode::create(1.0, nullptr);
rootTransformNode = TransformPaintPropertyNode::create(nullptr, TransformationMatrix(), FloatPoint3D());
rootClipNode = ClipPaintPropertyNode::create(nullptr, rootTransformNode, FloatRoundedRect(LayoutRect::infiniteIntRect()));
rootEffectNode = EffectPaintPropertyNode::create(nullptr, 1.0);
}
};
TEST_F(PropertyTreeStateTest, LeastCommonAncestor)
{
TransformationMatrix matrix;
RefPtr<TransformPaintPropertyNode> child1 = TransformPaintPropertyNode::create(matrix, FloatPoint3D(), rootPropertyTreeState().transform);
RefPtr<TransformPaintPropertyNode> child2 = TransformPaintPropertyNode::create(matrix, FloatPoint3D(), rootPropertyTreeState().transform);
RefPtr<TransformPaintPropertyNode> child1 = TransformPaintPropertyNode::create(rootPropertyTreeState().transform, matrix, FloatPoint3D());
RefPtr<TransformPaintPropertyNode> child2 = TransformPaintPropertyNode::create(rootPropertyTreeState().transform, matrix, FloatPoint3D());
RefPtr<TransformPaintPropertyNode> childOfChild1 = TransformPaintPropertyNode::create(matrix, FloatPoint3D(), child1);
RefPtr<TransformPaintPropertyNode> childOfChild2 = TransformPaintPropertyNode::create(matrix, FloatPoint3D(), child2);
RefPtr<TransformPaintPropertyNode> childOfChild1 = TransformPaintPropertyNode::create(child1, matrix, FloatPoint3D());
RefPtr<TransformPaintPropertyNode> childOfChild2 = TransformPaintPropertyNode::create(child2, matrix, FloatPoint3D());
EXPECT_EQ(rootPropertyTreeState().transform, propertyTreeNearestCommonAncestor<TransformPaintPropertyNode>(childOfChild1.get(), childOfChild2.get()));
EXPECT_EQ(rootPropertyTreeState().transform, propertyTreeNearestCommonAncestor<TransformPaintPropertyNode>(childOfChild1.get(), child2.get()));
......
......@@ -21,9 +21,16 @@ namespace blink {
// for the root.
class PLATFORM_EXPORT TransformPaintPropertyNode : public RefCounted<TransformPaintPropertyNode> {
public:
static PassRefPtr<TransformPaintPropertyNode> create(const TransformationMatrix& matrix, const FloatPoint3D& origin, PassRefPtr<TransformPaintPropertyNode> parent = nullptr)
static PassRefPtr<TransformPaintPropertyNode> create(PassRefPtr<TransformPaintPropertyNode> parent, const TransformationMatrix& matrix, const FloatPoint3D& origin)
{
return adoptRef(new TransformPaintPropertyNode(matrix, origin, parent));
return adoptRef(new TransformPaintPropertyNode(parent, matrix, origin));
}
void update(PassRefPtr<TransformPaintPropertyNode> parent, const TransformationMatrix& matrix, const FloatPoint3D& origin)
{
m_parent = parent;
m_matrix = matrix;
m_origin = origin;
}
const TransformationMatrix& matrix() const { return m_matrix; }
......@@ -34,13 +41,12 @@ public:
TransformPaintPropertyNode* parent() const { return m_parent.get(); }
private:
TransformPaintPropertyNode(PassRefPtr<TransformPaintPropertyNode> parent, const TransformationMatrix& matrix, const FloatPoint3D& origin)
: m_parent(parent), m_matrix(matrix), m_origin(origin) { }
TransformPaintPropertyNode(const TransformationMatrix& matrix, const FloatPoint3D& origin, PassRefPtr<TransformPaintPropertyNode> parent)
: m_matrix(matrix), m_origin(origin), m_parent(parent) { }
const TransformationMatrix m_matrix;
const FloatPoint3D m_origin;
RefPtr<TransformPaintPropertyNode> m_parent;
TransformationMatrix m_matrix;
FloatPoint3D m_origin;
};
// Redeclared here to avoid ODR issues.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment