| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef StyleDifference_h |
| #define StyleDifference_h |
| |
| #include "wtf/Assertions.h" |
| |
| namespace blink { |
| |
| class StyleDifference { |
| public: |
| enum PropertyDifference { |
| TransformChanged = 1 << 0, |
| OpacityChanged = 1 << 1, |
| ZIndexChanged = 1 << 2, |
| FilterChanged = 1 << 3, |
| // The object needs to issue paint invalidations if it contains text or properties dependent on color (e.g., border or outline). |
| TextOrColorChanged = 1 << 4, |
| }; |
| |
| StyleDifference() |
| : m_paintInvalidationType(NoPaintInvalidation) |
| , m_layoutType(NoLayout) |
| , m_propertySpecificDifferences(0) |
| { } |
| |
| bool hasDifference() const { return m_paintInvalidationType || m_layoutType || m_propertySpecificDifferences; } |
| |
| bool hasAtMostPropertySpecificDifferences(unsigned propertyDifferences) const |
| { |
| return !m_paintInvalidationType && !m_layoutType && !(m_propertySpecificDifferences & ~propertyDifferences); |
| } |
| |
| bool needsPaintInvalidation() const { return m_paintInvalidationType != NoPaintInvalidation; } |
| void clearNeedsPaintInvalidation() { m_paintInvalidationType = NoPaintInvalidation; } |
| |
| // The object just needs to issue paint invalidations. |
| bool needsPaintInvalidationObject() const { return m_paintInvalidationType == PaintInvalidationObject; } |
| void setNeedsPaintInvalidationObject() |
| { |
| ASSERT(!needsPaintInvalidationLayer()); |
| m_paintInvalidationType = PaintInvalidationObject; |
| } |
| |
| // The layer and its descendant layers need to issue paint invalidations. |
| bool needsPaintInvalidationLayer() const { return m_paintInvalidationType == PaintInvalidationLayer; } |
| void setNeedsPaintInvalidationLayer() { m_paintInvalidationType = PaintInvalidationLayer; } |
| |
| bool needsLayout() const { return m_layoutType != NoLayout; } |
| void clearNeedsLayout() { m_layoutType = NoLayout; } |
| |
| // The offset of this positioned object has been updated. |
| bool needsPositionedMovementLayout() const { return m_layoutType == PositionedMovement; } |
| void setNeedsPositionedMovementLayout() |
| { |
| ASSERT(!needsFullLayout()); |
| m_layoutType = PositionedMovement; |
| } |
| |
| bool needsFullLayout() const { return m_layoutType == FullLayout; } |
| void setNeedsFullLayout() { m_layoutType = FullLayout; } |
| |
| bool transformChanged() const { return m_propertySpecificDifferences & TransformChanged; } |
| void setTransformChanged() { m_propertySpecificDifferences |= TransformChanged; } |
| |
| bool opacityChanged() const { return m_propertySpecificDifferences & OpacityChanged; } |
| void setOpacityChanged() { m_propertySpecificDifferences |= OpacityChanged; } |
| |
| bool zIndexChanged() const { return m_propertySpecificDifferences & ZIndexChanged; } |
| void setZIndexChanged() { m_propertySpecificDifferences |= ZIndexChanged; } |
| |
| bool filterChanged() const { return m_propertySpecificDifferences & FilterChanged; } |
| void setFilterChanged() { m_propertySpecificDifferences |= FilterChanged; } |
| |
| bool textOrColorChanged() const { return m_propertySpecificDifferences & TextOrColorChanged; } |
| void setTextOrColorChanged() { m_propertySpecificDifferences |= TextOrColorChanged; } |
| |
| private: |
| enum PaintInvalidationType { |
| NoPaintInvalidation = 0, |
| PaintInvalidationObject, |
| PaintInvalidationLayer |
| }; |
| unsigned m_paintInvalidationType : 2; |
| |
| enum LayoutType { |
| NoLayout = 0, |
| PositionedMovement, |
| FullLayout |
| }; |
| unsigned m_layoutType : 2; |
| |
| unsigned m_propertySpecificDifferences : 5; |
| }; |
| |
| } // namespace blink |
| |
| #endif // StyleDifference_h |