Index: third_party/WebKit/Source/core/paint/ObjectPaintProperties.h |
diff --git a/third_party/WebKit/Source/core/paint/ObjectPaintProperties.h b/third_party/WebKit/Source/core/paint/ObjectPaintProperties.h |
index 2d729712ed4d258ab5d5a4d25b3a1cdd79812e37..9c9a1a7ef390ce1af5aa1dff570c137d6ca4184e 100644 |
--- a/third_party/WebKit/Source/core/paint/ObjectPaintProperties.h |
+++ b/third_party/WebKit/Source/core/paint/ObjectPaintProperties.h |
@@ -48,22 +48,22 @@ public: |
// This is equivalent to the local border box space above, |
// with pixel snapped paint offset baked in. It is really redundant, |
// but it is a pain to teach scrollbars to paint with an offset. |
- TransformPaintPropertyNode* paintOffsetTranslation() const { return m_paintOffsetTranslation.get(); } |
- TransformPaintPropertyNode* transform() const { return m_transform.get(); } |
- TransformPaintPropertyNode* perspective() const { return m_perspective.get(); } |
- TransformPaintPropertyNode* svgLocalToBorderBoxTransform() const { return m_svgLocalToBorderBoxTransform.get(); } |
- TransformPaintPropertyNode* scrollTranslation() const { return m_scrollTranslation.get(); } |
- TransformPaintPropertyNode* scrollbarPaintOffset() const { return m_scrollbarPaintOffset.get(); } |
+ const TransformPaintPropertyNode* paintOffsetTranslation() const { return m_paintOffsetTranslation.get(); } |
+ const TransformPaintPropertyNode* transform() const { return m_transform.get(); } |
+ const TransformPaintPropertyNode* perspective() const { return m_perspective.get(); } |
+ const TransformPaintPropertyNode* svgLocalToBorderBoxTransform() const { return m_svgLocalToBorderBoxTransform.get(); } |
+ const TransformPaintPropertyNode* scrollTranslation() const { return m_scrollTranslation.get(); } |
+ const TransformPaintPropertyNode* scrollbarPaintOffset() const { return m_scrollbarPaintOffset.get(); } |
- EffectPaintPropertyNode* effect() const { return m_effect.get(); } |
+ const EffectPaintPropertyNode* effect() const { return m_effect.get(); } |
// The hierarchy of the clip subtree created by a LayoutObject is as follows: |
// [ css clip ] |
// | |
// +--- [ overflow clip ] |
- ClipPaintPropertyNode* cssClip() const { return m_cssClip.get(); } |
- ClipPaintPropertyNode* cssClipFixedPosition() const { return m_cssClipFixedPosition.get(); } |
- ClipPaintPropertyNode* overflowClip() const { return m_overflowClip.get(); } |
+ const ClipPaintPropertyNode* cssClip() const { return m_cssClip.get(); } |
+ const ClipPaintPropertyNode* cssClipFixedPosition() const { return m_cssClipFixedPosition.get(); } |
+ const ClipPaintPropertyNode* overflowClip() const { return m_overflowClip.get(); } |
// This is a complete set of property nodes that should be used as a starting point to paint |
// this layout object. It is needed becauase some property inherits from the containing block, |
@@ -76,33 +76,53 @@ public: |
LayoutPoint paintOffset; |
PropertyTreeState propertyTreeState; |
}; |
- LocalBorderBoxProperties* localBorderBoxProperties() const { return m_localBorderBoxProperties.get(); } |
+ const LocalBorderBoxProperties* localBorderBoxProperties() const { return m_localBorderBoxProperties.get(); } |
-private: |
- ObjectPaintProperties() { } |
+ void clearPaintOffsetTranslation() { m_paintOffsetTranslation = nullptr; } |
+ void clearTransform() { m_transform = nullptr; } |
+ void clearEffect() { m_effect = nullptr; } |
+ void clearCssClip() { m_cssClip = nullptr; } |
+ void clearCssClipFixedPosition() { m_cssClipFixedPosition = nullptr; } |
+ void clearOverflowClip() { m_overflowClip = nullptr; } |
+ void clearPerspective() { m_perspective = nullptr; } |
+ void clearSvgLocalToBorderBoxTransform() { m_svgLocalToBorderBoxTransform = nullptr; } |
+ void clearScrollTranslation() { m_scrollTranslation = nullptr; } |
+ void clearScrollbarPaintOffset() { m_scrollbarPaintOffset = nullptr; } |
- friend class PaintPropertyTreeBuilder; |
- // These setters should only be used by PaintPropertyTreeBuilder. |
- void setPaintOffsetTranslation(PassRefPtr<TransformPaintPropertyNode> paintOffset) { m_paintOffsetTranslation = paintOffset; } |
- void setTransform(PassRefPtr<TransformPaintPropertyNode> transform) { m_transform = transform; } |
- void setEffect(PassRefPtr<EffectPaintPropertyNode> effect) { m_effect = effect; } |
- void setCssClip(PassRefPtr<ClipPaintPropertyNode> clip) { m_cssClip = clip; } |
- void setCssClipFixedPosition(PassRefPtr<ClipPaintPropertyNode> clip) { m_cssClipFixedPosition = clip; } |
- void setOverflowClip(PassRefPtr<ClipPaintPropertyNode> clip) { m_overflowClip = clip; } |
- void setPerspective(PassRefPtr<TransformPaintPropertyNode> perspective) { m_perspective = perspective; } |
- void setSvgLocalToBorderBoxTransform(PassRefPtr<TransformPaintPropertyNode> transform) |
+ template <typename... Args> TransformPaintPropertyNode* createOrUpdatePaintOffsetTranslation(Args&&... args) { return createOrUpdateProperty(m_paintOffsetTranslation, std::forward<Args>(args)...); } |
+ template <typename... Args> TransformPaintPropertyNode* createOrUpdateTransform(Args&&... args) { return createOrUpdateProperty(m_transform, std::forward<Args>(args)...); } |
+ template <typename... Args> TransformPaintPropertyNode* createOrUpdatePerspective(Args&&... args) { return createOrUpdateProperty(m_perspective, std::forward<Args>(args)...); } |
+ template <typename... Args> TransformPaintPropertyNode* createOrUpdateSvgLocalToBorderBoxTransform(Args&&... args) |
{ |
- 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; |
+ DCHECK(!scrollTranslation()) << "SVG elements cannot scroll so there should never be both a scroll translation and an SVG local to border box transform."; |
+ return createOrUpdateProperty(m_svgLocalToBorderBoxTransform, std::forward<Args>(args)...); |
} |
- void setScrollTranslation(PassRefPtr<TransformPaintPropertyNode> translation) |
+ template <typename... Args> TransformPaintPropertyNode* createOrUpdateScrollTranslation(Args&&... args) |
{ |
- 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; |
+ DCHECK(!svgLocalToBorderBoxTransform()) << "SVG elements cannot scroll so there should never be both a scroll translation and an SVG local to border box transform."; |
+ return createOrUpdateProperty(m_scrollTranslation, std::forward<Args>(args)...); |
} |
- void setScrollbarPaintOffset(PassRefPtr<TransformPaintPropertyNode> paintOffset) { m_scrollbarPaintOffset = paintOffset; } |
+ template <typename... Args> TransformPaintPropertyNode* createOrUpdateScrollbarPaintOffset(Args&&... args) { return createOrUpdateProperty(m_scrollbarPaintOffset, std::forward<Args>(args)...); } |
+ template <typename... Args> EffectPaintPropertyNode* createOrUpdateEffect(Args&&... args) { return createOrUpdateProperty(m_effect, std::forward<Args>(args)...); } |
+ template <typename... Args> ClipPaintPropertyNode* createOrUpdateCssClip(Args&&... args) { return createOrUpdateProperty(m_cssClip, std::forward<Args>(args)...); } |
+ template <typename... Args> ClipPaintPropertyNode* createOrUpdateCssClipFixedPosition(Args&&... args) { return createOrUpdateProperty(m_cssClipFixedPosition, std::forward<Args>(args)...); } |
+ template <typename... Args> ClipPaintPropertyNode* createOrUpdateOverflowClip(Args&&... args) { return createOrUpdateProperty(m_overflowClip, std::forward<Args>(args)...); } |
+ |
void setLocalBorderBoxProperties(std::unique_ptr<LocalBorderBoxProperties> properties) { m_localBorderBoxProperties = std::move(properties); } |
+private: |
+ ObjectPaintProperties() { } |
+ |
+ template <typename PaintPropertyNode, typename... Args> |
+ PaintPropertyNode* createOrUpdateProperty(RefPtr<PaintPropertyNode>& field, Args&&... args) |
+ { |
+ if (field) |
+ field->update(std::forward<Args>(args)...); |
+ else |
+ field = PaintPropertyNode::create(std::forward<Args>(args)...); |
+ return field.get(); |
+ } |
+ |
RefPtr<TransformPaintPropertyNode> m_paintOffsetTranslation; |
RefPtr<TransformPaintPropertyNode> m_transform; |
RefPtr<EffectPaintPropertyNode> m_effect; |