Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef TransformPaintPropertyNode_h | 5 #ifndef TransformPaintPropertyNode_h |
| 6 #define TransformPaintPropertyNode_h | 6 #define TransformPaintPropertyNode_h |
| 7 | 7 |
| 8 #include "platform/PlatformExport.h" | 8 #include "platform/PlatformExport.h" |
| 9 #include "platform/geometry/FloatPoint3D.h" | 9 #include "platform/geometry/FloatPoint3D.h" |
| 10 #include "platform/transforms/TransformationMatrix.h" | 10 #include "platform/transforms/TransformationMatrix.h" |
| 11 #include "wtf/PassRefPtr.h" | 11 #include "wtf/PassRefPtr.h" |
| 12 #include "wtf/RefCounted.h" | 12 #include "wtf/RefCounted.h" |
| 13 #include "wtf/RefPtr.h" | 13 #include "wtf/RefPtr.h" |
| 14 | 14 |
| 15 #include <iosfwd> | 15 #include <iosfwd> |
| 16 | 16 |
| 17 namespace blink { | 17 namespace blink { |
| 18 | 18 |
| 19 // A transform created by a css property such as "transform" or "perspective" | 19 // A transform created by a css property such as "transform" or "perspective" |
| 20 // along with a reference to the parent TransformPaintPropertyNode, or nullptr | 20 // along with a reference to the parent TransformPaintPropertyNode, or nullptr |
| 21 // for the root. | 21 // for the root. |
| 22 class PLATFORM_EXPORT TransformPaintPropertyNode : public RefCounted<TransformPa intPropertyNode> { | 22 class PLATFORM_EXPORT TransformPaintPropertyNode : public RefCounted<TransformPa intPropertyNode> { |
| 23 public: | 23 public: |
| 24 static PassRefPtr<TransformPaintPropertyNode> create(const TransformationMat rix& matrix, const FloatPoint3D& origin, PassRefPtr<TransformPaintPropertyNode> parent = nullptr) | 24 enum TransformStyle { FlattenTransform, Preserve3D }; |
| 25 enum RenderingContextBehavior { | |
|
trchen
2016/07/13 04:39:44
I don't think this belong here. This is a CSS conc
jbroman
2016/07/13 21:47:13
Because the |this| pointer doesn't exist yet there
trchen
2016/07/13 22:31:42
Why do we need to TransformPaintPropertyNode* as s
jbroman
2016/07/14 20:34:58
It doesn't need to be; it just was (it's convenien
| |
| 26 // The node should participate in the context provided, if any, but not | |
| 27 // establish a new one. | |
| 28 DontEstablishNewRenderingContext, | |
| 29 | |
| 30 // The node should establish a new 3D rendering context. | |
| 31 // No existing rendering context root should be provided. | |
| 32 EstablishNewRenderingContext | |
| 33 }; | |
| 34 | |
| 35 // Creates a transform node, allowing full specification of the rendering | |
| 36 // context and transform style. If renderingContextBehavior is | |
| 37 // EstablishNewRenderingContext, then the renderingContextRoot provided must | |
| 38 // be null. | |
| 39 static PassRefPtr<TransformPaintPropertyNode> create( | |
| 40 const TransformationMatrix& matrix, | |
| 41 const FloatPoint3D& origin, | |
| 42 PassRefPtr<TransformPaintPropertyNode> parent, | |
| 43 RenderingContextBehavior renderingContextBehavior, | |
| 44 const TransformPaintPropertyNode* renderingContextRoot, | |
| 45 TransformStyle transformStyle) | |
| 25 { | 46 { |
| 26 return adoptRef(new TransformPaintPropertyNode(matrix, origin, parent)); | 47 return adoptRef(new TransformPaintPropertyNode(matrix, origin, parent, r enderingContextBehavior, renderingContextRoot, transformStyle)); |
| 48 } | |
| 49 | |
| 50 // As above, but inherits the rendering context and transform style from the | |
| 51 // parent transform node. Never establishes a new rendering context. | |
| 52 static PassRefPtr<TransformPaintPropertyNode> create( | |
| 53 const TransformationMatrix& matrix, | |
| 54 const FloatPoint3D& origin, | |
| 55 PassRefPtr<TransformPaintPropertyNode> parent = nullptr) | |
| 56 { | |
| 57 if (!parent) | |
| 58 return create(matrix, origin, nullptr, DontEstablishNewRenderingCont ext, nullptr, FlattenTransform); | |
| 59 | |
| 60 // Have to copy the data out of parent before we pass the reference | |
| 61 // (and null out the local pointer). | |
| 62 const TransformPaintPropertyNode* renderingContextRoot = parent->renderi ngContextRoot(); | |
| 63 TransformStyle transformStyle = parent->transformStyle(); | |
| 64 return create(matrix, origin, parent, DontEstablishNewRenderingContext, renderingContextRoot, transformStyle); | |
| 27 } | 65 } |
| 28 | 66 |
| 29 const TransformationMatrix& matrix() const { return m_matrix; } | 67 const TransformationMatrix& matrix() const { return m_matrix; } |
| 30 const FloatPoint3D& origin() const { return m_origin; } | 68 const FloatPoint3D& origin() const { return m_origin; } |
| 31 | 69 |
| 32 // Parent transform that this transform is relative to, or nullptr if this | 70 // Parent transform that this transform is relative to, or nullptr if this |
| 33 // is the root transform. | 71 // is the root transform. |
| 34 TransformPaintPropertyNode* parent() const { return m_parent.get(); } | 72 TransformPaintPropertyNode* parent() const { return m_parent.get(); } |
| 35 | 73 |
| 74 // Content whose transform nodes have a common rendering context root is 3D | |
| 75 // sorted. If this is nullptr, content will not be 3D sorted. | |
| 76 const TransformPaintPropertyNode* renderingContextRoot() const { return m_re nderingContextRoot; } | |
| 77 bool hasRenderingContext() const { return renderingContextRoot(); } | |
| 78 | |
| 79 // If a transform node flattens transform, then content within it is | |
| 80 // flattened into the plane of the transform space (including this node's | |
| 81 // matrix). If it preserves 3D, then no such flattening occurs. | |
| 82 // | |
| 83 // This corresponds fairly closely to CSS transform-style semantics, and in | |
| 84 // CSS is fairly tightly connected with the rendering context root. | |
| 85 TransformStyle transformStyle() const { return m_transformStyle; } | |
| 86 bool flattensTransform() const { return transformStyle() == FlattenTransform ; } | |
| 87 bool preserves3D() const { return transformStyle() == Preserve3D; } | |
|
trchen
2016/07/13 04:39:44
Ditto. It is a leak of CSS concept. I think flatte
chrishtr
2016/07/13 20:30:50
I don't understand this comment, could you rephras
jbroman
2016/07/13 21:47:13
This isn't the CSS concept, because it is not inte
trchen
2016/07/13 22:31:42
In that case, why not name it "flattensLocalToScre
trchen
2016/07/13 22:31:42
For example:
<div style="transform-style:preserve
jbroman
2016/07/14 20:34:58
We can, and now this CL does. It does require some
| |
| 88 | |
| 36 private: | 89 private: |
| 90 TransformPaintPropertyNode( | |
| 91 const TransformationMatrix& matrix, | |
| 92 const FloatPoint3D& origin, | |
| 93 PassRefPtr<TransformPaintPropertyNode> parent, | |
| 94 RenderingContextBehavior renderingContextBehavior, | |
| 95 const TransformPaintPropertyNode* renderingContextRoot, | |
| 96 TransformStyle transformStyle) | |
| 97 : m_matrix(matrix) | |
| 98 , m_origin(origin) | |
| 99 , m_parent(parent) | |
| 100 , m_transformStyle(transformStyle) | |
| 101 { | |
| 102 switch (renderingContextBehavior) { | |
| 103 case DontEstablishNewRenderingContext: | |
| 104 m_renderingContextRoot = renderingContextRoot; | |
| 105 break; | |
| 106 case EstablishNewRenderingContext: | |
| 107 DCHECK(!renderingContextRoot); | |
| 108 m_renderingContextRoot = this; | |
| 109 break; | |
| 110 } | |
| 37 | 111 |
| 38 TransformPaintPropertyNode(const TransformationMatrix& matrix, const FloatPo int3D& origin, PassRefPtr<TransformPaintPropertyNode> parent) | 112 // Every rendering context root must preserve 3D. |
| 39 : m_matrix(matrix), m_origin(origin), m_parent(parent) { } | 113 DCHECK(!m_renderingContextRoot || m_renderingContextRoot->preserves3D()) ; |
| 114 } | |
| 40 | 115 |
| 41 const TransformationMatrix m_matrix; | 116 const TransformationMatrix m_matrix; |
| 42 const FloatPoint3D m_origin; | 117 const FloatPoint3D m_origin; |
| 43 RefPtr<TransformPaintPropertyNode> m_parent; | 118 RefPtr<TransformPaintPropertyNode> m_parent; |
| 119 const TransformPaintPropertyNode* m_renderingContextRoot; | |
| 120 const TransformStyle m_transformStyle; | |
| 44 }; | 121 }; |
| 45 | 122 |
| 46 // Redeclared here to avoid ODR issues. | 123 // Redeclared here to avoid ODR issues. |
| 47 // See platform/testing/PaintPrinters.h. | 124 // See platform/testing/PaintPrinters.h. |
| 48 void PrintTo(const TransformPaintPropertyNode&, std::ostream*); | 125 void PrintTo(const TransformPaintPropertyNode&, std::ostream*); |
| 49 | 126 |
| 50 } // namespace blink | 127 } // namespace blink |
| 51 | 128 |
| 52 #endif // TransformPaintPropertyNode_h | 129 #endif // TransformPaintPropertyNode_h |
| OLD | NEW |