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

Unified Diff: third_party/WebKit/Source/core/layout/BaselineAlignment.h

Issue 1407633003: [css-grid] Implementation of Baseline Self-Alignment (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Get advantage of recomputing the intrinsic size to solve the issues with orthogonal flows. Created 3 years, 10 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
Index: third_party/WebKit/Source/core/layout/BaselineAlignment.h
diff --git a/third_party/WebKit/Source/core/layout/BaselineAlignment.h b/third_party/WebKit/Source/core/layout/BaselineAlignment.h
new file mode 100644
index 0000000000000000000000000000000000000000..c8bc11f4a243d2f4876cc7a01140c67c03edbbaa
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/BaselineAlignment.h
@@ -0,0 +1,84 @@
+// Copyright (c) 2016 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 BaselineAlignment_h
+#define BaselineAlignment_h
+
+#include "core/layout/LayoutBox.h"
+
+namespace blink {
+
+// These classes are used to implement the Baseline Alignment logica, as
+// described in the CSS Box Alignment specification.
+// https://drafts.csswg.org/css-align/#baseline-terms
+
+// A baseline-sharing group is composed of boxes that participate in
+// baseline alignment together. This is possible only if they:
+//
+// * Share an alignment context along an axis perpendicular to their
+// baseline alignment axis.
+// * Have compatible baseline alignment preferences (i.e., the baselines
+// that want to align are on the same side of the alignment context).
+class BaselineGroup {
+ public:
+ void update(const LayoutBox&, LayoutUnit ascent, LayoutUnit descent);
+ LayoutUnit maxAscent() const { return m_maxAscent; }
+ LayoutUnit maxDescent() const { return m_maxDescent; }
+ int size() const { return m_items.size(); }
+
+ private:
+ friend class BaselineContext;
+ BaselineGroup(WritingMode blockFlow, ItemPosition childPreference);
+ bool isCompatible(WritingMode, ItemPosition) const;
+ bool isOppositeBlockFlow(WritingMode blockFlow) const;
+ bool isOrthogonalBlockFlow(WritingMode blockFlow) const;
+
+ WritingMode m_blockFlow;
+ ItemPosition m_preference;
+ LayoutUnit m_maxAscent;
+ LayoutUnit m_maxDescent;
+ HashSet<const LayoutBox*> m_items;
+};
+
+// Boxes share an alignment context along a particular axis when they
+// are:
+//
+// * table cells in the same row, along the table's row (inline) axis
+// * table cells in the same column, along the table's column (block)
+// axis
+// * grid items in the same row, along the grid's row (inline) axis
+// * grid items in the same column, along the grid's colum (block) axis
+// * flex items in the same flex line, along the flex container's main
+// axis
+class BaselineContext {
+ public:
+ BaselineContext(const LayoutBox& child,
+ ItemPosition preference,
+ LayoutUnit ascent,
+ LayoutUnit descent);
+ Vector<BaselineGroup>& sharedGroups() { return m_sharedGroups; }
+ const BaselineGroup& getSharedGroup(const LayoutBox& child,
+ ItemPosition preference) const;
+ void updateSharedGroup(const LayoutBox& child,
+ ItemPosition preference,
+ LayoutUnit ascent,
+ LayoutUnit descent);
+
+ private:
+ // TODO Properly implement baseline-group compatibility
+ // See https://github.com/w3c/csswg-drafts/issues/721
+ BaselineGroup& findCompatibleSharedGroup(const LayoutBox& child,
+ ItemPosition preference);
+
+ Vector<BaselineGroup> m_sharedGroups;
+};
+
+static inline bool isBaselinePosition(ItemPosition position) {
+ return position == ItemPositionBaseline ||
+ position == ItemPositionLastBaseline;
+}
+
+} // namespace blink
+
+#endif // BaselineContext_h

Powered by Google App Engine
This is Rietveld 408576698