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 ObjectPaintProperties_h | 5 #ifndef ObjectPaintProperties_h |
6 #define ObjectPaintProperties_h | 6 #define ObjectPaintProperties_h |
7 | 7 |
8 #include "core/CoreExport.h" | 8 #include "core/CoreExport.h" |
9 #include "platform/geometry/LayoutPoint.h" | 9 #include "platform/geometry/LayoutPoint.h" |
10 #include "platform/graphics/paint/ClipPaintPropertyNode.h" | 10 #include "platform/graphics/paint/ClipPaintPropertyNode.h" |
11 #include "platform/graphics/paint/EffectPaintPropertyNode.h" | 11 #include "platform/graphics/paint/EffectPaintPropertyNode.h" |
12 #include "platform/graphics/paint/PaintChunkProperties.h" | 12 #include "platform/graphics/paint/PaintChunkProperties.h" |
13 #include "platform/graphics/paint/PropertyTreeState.h" | 13 #include "platform/graphics/paint/PropertyTreeState.h" |
14 #include "platform/graphics/paint/ScrollPaintPropertyNode.h" | 14 #include "platform/graphics/paint/ScrollPaintPropertyNode.h" |
15 #include "platform/graphics/paint/TransformPaintPropertyNode.h" | 15 #include "platform/graphics/paint/TransformPaintPropertyNode.h" |
16 #include "wtf/PassRefPtr.h" | 16 #include "wtf/PassRefPtr.h" |
17 #include "wtf/PtrUtil.h" | 17 #include "wtf/PtrUtil.h" |
18 #include "wtf/RefPtr.h" | 18 #include "wtf/RefPtr.h" |
19 #include <memory> | 19 #include <memory> |
20 | 20 |
21 namespace blink { | 21 namespace blink { |
22 | 22 |
23 // This class stores property tree related information associated with a LayoutO
bject. | 23 // This class stores property tree related information associated with a |
| 24 // LayoutObject. |
24 // Currently there are two groups of information: | 25 // Currently there are two groups of information: |
25 // 1. The set of property nodes created locally by this LayoutObject. | 26 // 1. The set of property nodes created locally by this LayoutObject. |
26 // 2. The set of property nodes (inherited, or created locally) and paint offset
that can be used | 27 // 2. The set of property nodes (inherited, or created locally) and paint offset |
27 // to paint the border box of this LayoutObject (see: localBorderBoxPropertie
s). | 28 // that can be used to paint the border box of this LayoutObject (see: |
| 29 // localBorderBoxProperties). |
28 class CORE_EXPORT ObjectPaintProperties { | 30 class CORE_EXPORT ObjectPaintProperties { |
29 WTF_MAKE_NONCOPYABLE(ObjectPaintProperties); | 31 WTF_MAKE_NONCOPYABLE(ObjectPaintProperties); |
30 USING_FAST_MALLOC(ObjectPaintProperties); | 32 USING_FAST_MALLOC(ObjectPaintProperties); |
31 | 33 |
32 public: | 34 public: |
33 static std::unique_ptr<ObjectPaintProperties> create() { | 35 static std::unique_ptr<ObjectPaintProperties> create() { |
34 return wrapUnique(new ObjectPaintProperties()); | 36 return wrapUnique(new ObjectPaintProperties()); |
35 } | 37 } |
36 | 38 |
37 // The hierarchy of the transform subtree created by a LayoutObject is as foll
ows: | 39 // The hierarchy of the transform subtree created by a LayoutObject is as |
38 // [ paintOffsetTranslation ] Normally paint offset is accumulated w
ithout creating a node | 40 // follows: |
39 // | until we see, for example, transform o
r position:fixed. | 41 // [ paintOffsetTranslation ] Normally paint offset is accumulated |
| 42 // | without creating a node until we see, |
| 43 // | for example, transform or |
| 44 // | position:fixed. |
40 // +---[ transform ] The space created by CSS transform. | 45 // +---[ transform ] The space created by CSS transform. |
41 // | This is the local border box space, se
e: localBorderBoxProperties below. | 46 // | This is the local border box space, |
| 47 // | see: localBorderBoxProperties below. |
42 // +---[ perspective ] The space created by CSS perspective. | 48 // +---[ perspective ] The space created by CSS perspective. |
43 // | +---[ svgLocalToBorderBoxTransform ] Additional transform for child
ren of the outermost root SVG. | 49 // | +---[ svgLocalToBorderBoxTransform ] Additional transform for |
| 50 // children of the outermost root SVG. |
44 // | OR (SVG does not support scrolling.) | 51 // | OR (SVG does not support scrolling.) |
45 // | +---[ scrollTranslation ] The space created by overflow clip. | 52 // | +---[ scrollTranslation ] The space created by overflow clip. |
46 // +---[ scrollbarPaintOffset ] TODO(trchen): Remove this once we bake
the paint offset into frameRect. | 53 // +---[ scrollbarPaintOffset ] TODO(trchen): Remove this once we bake |
47 // This is equivalent to the local border
box space above, | 54 // the paint offset into frameRect. This |
48 // with pixel snapped paint offset baked
in. It is really redundant, | 55 // is equivalent to the local border box |
49 // but it is a pain to teach scrollbars t
o paint with an offset. | 56 // space above, with pixel snapped paint |
| 57 // offset baked in. It is really |
| 58 // redundant, but it is a pain to teach |
| 59 // scrollbars to paint with an offset. |
50 const TransformPaintPropertyNode* paintOffsetTranslation() const { | 60 const TransformPaintPropertyNode* paintOffsetTranslation() const { |
51 return m_paintOffsetTranslation.get(); | 61 return m_paintOffsetTranslation.get(); |
52 } | 62 } |
53 const TransformPaintPropertyNode* transform() const { | 63 const TransformPaintPropertyNode* transform() const { |
54 return m_transform.get(); | 64 return m_transform.get(); |
55 } | 65 } |
56 const TransformPaintPropertyNode* perspective() const { | 66 const TransformPaintPropertyNode* perspective() const { |
57 return m_perspective.get(); | 67 return m_perspective.get(); |
58 } | 68 } |
59 const TransformPaintPropertyNode* svgLocalToBorderBoxTransform() const { | 69 const TransformPaintPropertyNode* svgLocalToBorderBoxTransform() const { |
60 return m_svgLocalToBorderBoxTransform.get(); | 70 return m_svgLocalToBorderBoxTransform.get(); |
61 } | 71 } |
62 const TransformPaintPropertyNode* scrollTranslation() const { | 72 const TransformPaintPropertyNode* scrollTranslation() const { |
63 return m_scrollTranslation.get(); | 73 return m_scrollTranslation.get(); |
64 } | 74 } |
65 const TransformPaintPropertyNode* scrollbarPaintOffset() const { | 75 const TransformPaintPropertyNode* scrollbarPaintOffset() const { |
66 return m_scrollbarPaintOffset.get(); | 76 return m_scrollbarPaintOffset.get(); |
67 } | 77 } |
68 | 78 |
69 // Auxiliary scrolling information. Includes information such as the hierarchy
of scrollable | 79 // Auxiliary scrolling information. Includes information such as the hierarchy |
70 // areas, the extent that can be scrolled, etc. The actual scroll offset is st
ored in the | 80 // of scrollable areas, the extent that can be scrolled, etc. The actual |
71 // transform tree (m_scrollTranslation). | 81 // scroll offset is stored in the transform tree (m_scrollTranslation). |
72 const ScrollPaintPropertyNode* scroll() const { return m_scroll.get(); } | 82 const ScrollPaintPropertyNode* scroll() const { return m_scroll.get(); } |
73 | 83 |
74 const EffectPaintPropertyNode* effect() const { return m_effect.get(); } | 84 const EffectPaintPropertyNode* effect() const { return m_effect.get(); } |
75 | 85 |
76 // The hierarchy of the clip subtree created by a LayoutObject is as follows: | 86 // The hierarchy of the clip subtree created by a LayoutObject is as follows: |
77 // [ css clip ] | 87 // [ css clip ] |
78 // [ css clip fixed position] | 88 // [ css clip fixed position] |
79 // [ inner border radius clip ] Clip created by a rounded border with overflow
clip. This clip | 89 // [ inner border radius clip ] Clip created by a rounded border with overflow |
80 // is not inset by scrollbars. | 90 // clip. This clip is not inset by scrollbars. |
81 // +--- [ overflow clip ] Clip created by overflow clip and is inset by
the scrollbars. | 91 // +--- [ overflow clip ] Clip created by overflow clip and is inset by |
| 92 // the scrollbars. |
82 const ClipPaintPropertyNode* cssClip() const { return m_cssClip.get(); } | 93 const ClipPaintPropertyNode* cssClip() const { return m_cssClip.get(); } |
83 const ClipPaintPropertyNode* cssClipFixedPosition() const { | 94 const ClipPaintPropertyNode* cssClipFixedPosition() const { |
84 return m_cssClipFixedPosition.get(); | 95 return m_cssClipFixedPosition.get(); |
85 } | 96 } |
86 const ClipPaintPropertyNode* innerBorderRadiusClip() const { | 97 const ClipPaintPropertyNode* innerBorderRadiusClip() const { |
87 return m_innerBorderRadiusClip.get(); | 98 return m_innerBorderRadiusClip.get(); |
88 } | 99 } |
89 const ClipPaintPropertyNode* overflowClip() const { | 100 const ClipPaintPropertyNode* overflowClip() const { |
90 return m_overflowClip.get(); | 101 return m_overflowClip.get(); |
91 } | 102 } |
92 | 103 |
93 // The complete set of property tree nodes (inherited, or created locally) and
paint offset that | 104 // The complete set of property tree nodes (inherited, or created locally) and |
94 // can be used to paint. |paintOffset| is relative to the propertyTreeState's
transform space. | 105 // paint offset that can be used to paint. |paintOffset| is relative to the |
| 106 // propertyTreeState's transform space. |
95 // See: localBorderBoxProperties and contentsProperties. | 107 // See: localBorderBoxProperties and contentsProperties. |
96 struct PropertyTreeStateWithOffset { | 108 struct PropertyTreeStateWithOffset { |
97 PropertyTreeStateWithOffset(LayoutPoint offset, PropertyTreeState treeState) | 109 PropertyTreeStateWithOffset(LayoutPoint offset, PropertyTreeState treeState) |
98 : paintOffset(offset), propertyTreeState(treeState) {} | 110 : paintOffset(offset), propertyTreeState(treeState) {} |
99 LayoutPoint paintOffset; | 111 LayoutPoint paintOffset; |
100 PropertyTreeState propertyTreeState; | 112 PropertyTreeState propertyTreeState; |
101 }; | 113 }; |
102 | 114 |
103 // This is a complete set of property nodes and paint offset that should be us
ed as a starting | 115 // This is a complete set of property nodes and paint offset that should be |
104 // point to paint this layout object. This is cached because some properties i
nherit from the | 116 // used as a starting point to paint this layout object. This is cached |
105 // containing block chain instead of the painting parent and cannot be derived
in O(1) during | 117 // because some properties inherit from the containing block chain instead of |
106 // the paint walk. | 118 // the painting parent and cannot be derived in O(1) during the paint walk. |
107 // For example, <div style='opacity: 0.3; position: relative; margin: 11px;'/>
would have a | 119 // For example, <div style='opacity: 0.3; position: relative; margin: 11px;'/> |
108 // paint offset of (11px, 11px) and propertyTreeState.effect() would be an eff
ect node with | 120 // would have a paint offset of (11px, 11px) and propertyTreeState.effect() |
109 // opacity of 0.3 which was created by the div itself. Note that propertyTreeS
tate.transform() | 121 // would be an effect node with opacity of 0.3 which was created by the div |
110 // would not be null but would instead point to the transform space setup by d
iv's ancestors. | 122 // itself. Note that propertyTreeState.transform() would not be null but would |
| 123 // instead point to the transform space setup by div's ancestors. |
111 const PropertyTreeStateWithOffset* localBorderBoxProperties() const { | 124 const PropertyTreeStateWithOffset* localBorderBoxProperties() const { |
112 return m_localBorderBoxProperties.get(); | 125 return m_localBorderBoxProperties.get(); |
113 } | 126 } |
114 void setLocalBorderBoxProperties( | 127 void setLocalBorderBoxProperties( |
115 std::unique_ptr<PropertyTreeStateWithOffset> properties) { | 128 std::unique_ptr<PropertyTreeStateWithOffset> properties) { |
116 m_localBorderBoxProperties = std::move(properties); | 129 m_localBorderBoxProperties = std::move(properties); |
117 } | 130 } |
118 | 131 |
119 // This is the complete set of property nodes and paint offset that can be use
d to paint the | 132 // This is the complete set of property nodes and paint offset that can be |
120 // contents of this object. It is similar to localBorderBoxProperties but incl
udes properties | 133 // used to paint the contents of this object. It is similar to |
121 // (e.g., overflow clip, scroll translation) that apply to contents. This is s
uitable for paint | 134 // localBorderBoxProperties but includes properties (e.g., overflow clip, |
| 135 // scroll translation) that apply to contents. This is suitable for paint |
122 // invalidation. | 136 // invalidation. |
123 ObjectPaintProperties::PropertyTreeStateWithOffset contentsProperties() const; | 137 ObjectPaintProperties::PropertyTreeStateWithOffset contentsProperties() const; |
124 | 138 |
125 void clearPaintOffsetTranslation() { m_paintOffsetTranslation = nullptr; } | 139 void clearPaintOffsetTranslation() { m_paintOffsetTranslation = nullptr; } |
126 void clearTransform() { m_transform = nullptr; } | 140 void clearTransform() { m_transform = nullptr; } |
127 void clearEffect() { m_effect = nullptr; } | 141 void clearEffect() { m_effect = nullptr; } |
128 void clearCssClip() { m_cssClip = nullptr; } | 142 void clearCssClip() { m_cssClip = nullptr; } |
129 void clearCssClipFixedPosition() { m_cssClipFixedPosition = nullptr; } | 143 void clearCssClipFixedPosition() { m_cssClipFixedPosition = nullptr; } |
130 void clearInnerBorderRadiusClip() { m_innerBorderRadiusClip = nullptr; } | 144 void clearInnerBorderRadiusClip() { m_innerBorderRadiusClip = nullptr; } |
131 void clearOverflowClip() { m_overflowClip = nullptr; } | 145 void clearOverflowClip() { m_overflowClip = nullptr; } |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 RefPtr<TransformPaintPropertyNode> m_scrollTranslation; | 241 RefPtr<TransformPaintPropertyNode> m_scrollTranslation; |
228 RefPtr<TransformPaintPropertyNode> m_scrollbarPaintOffset; | 242 RefPtr<TransformPaintPropertyNode> m_scrollbarPaintOffset; |
229 RefPtr<ScrollPaintPropertyNode> m_scroll; | 243 RefPtr<ScrollPaintPropertyNode> m_scroll; |
230 | 244 |
231 std::unique_ptr<PropertyTreeStateWithOffset> m_localBorderBoxProperties; | 245 std::unique_ptr<PropertyTreeStateWithOffset> m_localBorderBoxProperties; |
232 }; | 246 }; |
233 | 247 |
234 } // namespace blink | 248 } // namespace blink |
235 | 249 |
236 #endif // ObjectPaintProperties_h | 250 #endif // ObjectPaintProperties_h |
OLD | NEW |