| 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 | 
|  |