1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef StyleDifference_h
6#define StyleDifference_h
7
8#include "wtf/Assertions.h"
9
10namespace blink {
11
12class StyleDifference {
13public:
14    enum PropertyDifference {
15        TransformChanged = 1 << 0,
16        OpacityChanged = 1 << 1,
17        ZIndexChanged = 1 << 2,
18        FilterChanged = 1 << 3,
19        // The object needs to issue paint invalidations if it contains text or properties dependent on color (e.g., border or outline).
20        TextOrColorChanged = 1 << 4,
21    };
22
23    StyleDifference()
24        : m_paintInvalidationType(NoPaintInvalidation)
25        , m_layoutType(NoLayout)
26        , m_propertySpecificDifferences(0)
27    { }
28
29    bool hasDifference() const { return m_paintInvalidationType || m_layoutType || m_propertySpecificDifferences; }
30
31    bool hasAtMostPropertySpecificDifferences(unsigned propertyDifferences) const
32    {
33        return !m_paintInvalidationType && !m_layoutType && !(m_propertySpecificDifferences & ~propertyDifferences);
34    }
35
36    bool needsPaintInvalidation() const { return m_paintInvalidationType != NoPaintInvalidation; }
37    void clearNeedsPaintInvalidation() { m_paintInvalidationType = NoPaintInvalidation; }
38
39    // The object just needs to issue paint invalidations.
40    bool needsPaintInvalidationObject() const { return m_paintInvalidationType == PaintInvalidationObject; }
41    void setNeedsPaintInvalidationObject()
42    {
43        ASSERT(!needsPaintInvalidationLayer());
44        m_paintInvalidationType = PaintInvalidationObject;
45    }
46
47    // The layer and its descendant layers need to issue paint invalidations.
48    bool needsPaintInvalidationLayer() const { return m_paintInvalidationType == PaintInvalidationLayer; }
49    void setNeedsPaintInvalidationLayer() { m_paintInvalidationType = PaintInvalidationLayer; }
50
51    bool needsLayout() const { return m_layoutType != NoLayout; }
52    void clearNeedsLayout() { m_layoutType = NoLayout; }
53
54    // The offset of this positioned object has been updated.
55    bool needsPositionedMovementLayout() const { return m_layoutType == PositionedMovement; }
56    void setNeedsPositionedMovementLayout()
57    {
58        ASSERT(!needsFullLayout());
59        m_layoutType = PositionedMovement;
60    }
61
62    bool needsFullLayout() const { return m_layoutType == FullLayout; }
63    void setNeedsFullLayout() { m_layoutType = FullLayout; }
64
65    bool transformChanged() const { return m_propertySpecificDifferences & TransformChanged; }
66    void setTransformChanged() { m_propertySpecificDifferences |= TransformChanged; }
67
68    bool opacityChanged() const { return m_propertySpecificDifferences & OpacityChanged; }
69    void setOpacityChanged() { m_propertySpecificDifferences |= OpacityChanged; }
70
71    bool zIndexChanged() const { return m_propertySpecificDifferences & ZIndexChanged; }
72    void setZIndexChanged() { m_propertySpecificDifferences |= ZIndexChanged; }
73
74    bool filterChanged() const { return m_propertySpecificDifferences & FilterChanged; }
75    void setFilterChanged() { m_propertySpecificDifferences |= FilterChanged; }
76
77    bool textOrColorChanged() const { return m_propertySpecificDifferences & TextOrColorChanged; }
78    void setTextOrColorChanged() { m_propertySpecificDifferences |= TextOrColorChanged; }
79
80private:
81    enum PaintInvalidationType {
82        NoPaintInvalidation = 0,
83        PaintInvalidationObject,
84        PaintInvalidationLayer
85    };
86    unsigned m_paintInvalidationType : 2;
87
88    enum LayoutType {
89        NoLayout = 0,
90        PositionedMovement,
91        FullLayout
92    };
93    unsigned m_layoutType : 2;
94
95    unsigned m_propertySpecificDifferences : 5;
96};
97
98} // namespace blink
99
100#endif // StyleDifference_h
101