Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1789)

Unified Diff: Source/core/rendering/style/StyleDifference.h

Issue 236203020: Separate repaint and layout requirements of StyleDifference (Step 1) (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase, Fix break Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/rendering/style/SVGRenderStyle.cpp ('k') | Source/core/rendering/svg/RenderSVGBlock.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/style/StyleDifference.h
diff --git a/Source/core/rendering/style/StyleDifference.h b/Source/core/rendering/style/StyleDifference.h
new file mode 100644
index 0000000000000000000000000000000000000000..38ff6a18d84d128a8f24e85a0a97eefd2d622948
--- /dev/null
+++ b/Source/core/rendering/style/StyleDifference.h
@@ -0,0 +1,134 @@
+// 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
+
+// FIXME: Remove this include after we finish migrating from StyleDifferenceLegacy.
+#include "core/rendering/style/RenderStyleConstants.h"
+
+namespace WebCore {
+
+// This class represents the difference between two computed styles (RenderStyle).
+// The difference can be of 3 types:
+// - Layout difference
+// - Repaint difference
+// - Recompositing difference
+class StyleDifference {
+public:
+ StyleDifference()
+ : m_needsRecompositeLayer(false)
+ , m_repaintType(NoRepaint)
+ , m_layoutType(NoLayout) { }
+
+ // Temporary constructor to convert StyleDifferenceLegacy to new StyleDifference.
+ // At this step, implicit requirements (e.g. StyleDifferenceLayout implies StyleDifferenceRepaint),
+ // is not handled by StyleDifference but need to be handled by the callers.
+ StyleDifference(StyleDifferenceLegacy legacyDiff)
+ : m_needsRecompositeLayer(false)
+ , m_repaintType(NoRepaint)
+ , m_layoutType(NoLayout)
+ {
+ switch (legacyDiff) {
+ case StyleDifferenceEqual:
+ break;
+ case StyleDifferenceRecompositeLayer:
+ m_needsRecompositeLayer = true;
+ break;
+ case StyleDifferenceRepaint:
+ m_repaintType = RepaintObjectOnly;
+ break;
+ case StyleDifferenceRepaintLayer:
+ m_repaintType = RepaintLayer;
+ break;
+ case StyleDifferenceLayoutPositionedMovementOnly:
+ m_layoutType = PositionedMovement;
+ break;
+ case StyleDifferenceSimplifiedLayout:
+ m_layoutType = SimplifiedLayout;
+ break;
+ case StyleDifferenceSimplifiedLayoutAndPositionedMovement:
+ m_layoutType = PositionedMovement | SimplifiedLayout;
+ break;
+ case StyleDifferenceLayout:
+ m_layoutType = FullLayout;
+ break;
+ }
+ }
+
+ // The two styles are identical.
+ bool hasNoChange() const { return !m_needsRecompositeLayer && !m_repaintType && !m_layoutType; }
+
+ // The layer needs its position and transform updated. Implied by other repaint and layout flags.
+ bool needsRecompositeLayer() const { return m_needsRecompositeLayer || needsRepaint() || needsLayout(); }
+ void setNeedsRecompositeLayer() { m_needsRecompositeLayer = true; }
+
+ bool needsRepaint() const { return m_repaintType != NoRepaint; }
+ void clearNeedsRepaint() { m_repaintType = NoRepaint; }
+
+ // The object just needs to be repainted.
+ bool needsRepaintObjectOnly() const { return m_repaintType == RepaintObjectOnly; }
+ void setNeedsRepaintObject()
+ {
+ if (!needsRepaintLayer())
+ m_repaintType = RepaintObjectOnly;
+ }
+
+ // The layer and its descendant layers need to be repainted.
+ bool needsRepaintLayer() const { return m_repaintType == RepaintLayer; }
+ void setNeedsRepaintLayer() { m_repaintType = RepaintLayer; }
+
+ 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()
+ {
+ if (!needsFullLayout())
+ m_layoutType |= PositionedMovement;
+ // FIXME: This is temporary to keep the StyleDifferenceLegacy behavior.
+ m_repaintType = NoRepaint;
+ }
+
+ // Only overflow needs to be recomputed.
+ bool needsSimplifiedLayout() const { return m_layoutType & SimplifiedLayout; }
+ void setNeedsSimplifiedLayout()
+ {
+ if (!needsFullLayout())
+ m_layoutType |= SimplifiedLayout;
+ // FIXME: This is temporary to keep the StyleDifferenceLegacy behavior.
+ m_repaintType = NoRepaint;
+ }
+
+ bool needsFullLayout() const { return m_layoutType == FullLayout; }
+ void setNeedsFullLayout()
+ {
+ m_layoutType = FullLayout;
+ // FIXME: This is temporary to keep the StyleDifferenceLegacy behavior.
+ m_repaintType = NoRepaint;
+ }
+
+private:
+ unsigned m_needsRecompositeLayer : 1;
+
+ enum RepaintType {
+ NoRepaint = 0,
+ RepaintObjectOnly,
+ RepaintLayer
+ };
+ unsigned m_repaintType : 2;
+
+ enum LayoutType {
+ NoLayout = 0,
+ PositionedMovement = 1 << 0,
+ SimplifiedLayout = 1 << 1,
+ FullLayout = 1 << 2
+ };
+ unsigned m_layoutType : 3;
+};
+
+} // namespace WebCore
+
+#endif // StyleDifference_h
« no previous file with comments | « Source/core/rendering/style/SVGRenderStyle.cpp ('k') | Source/core/rendering/svg/RenderSVGBlock.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698