blob: 1d3e610ea4a1bfda53cf0220001923984fe2baac [file] [log] [blame]
// 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