OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef NGConstraintSpace_h | 5 #ifndef NGConstraintSpace_h |
6 #define NGConstraintSpace_h | 6 #define NGConstraintSpace_h |
7 | 7 |
8 #include "core/CoreExport.h" | 8 #include "core/CoreExport.h" |
9 #include "core/layout/ng/ng_macros.h" | 9 #include "core/layout/ng/ng_macros.h" |
10 #include "core/layout/ng/ng_physical_constraint_space.h" | 10 #include "core/layout/ng/ng_units.h" |
11 #include "core/layout/ng/ng_writing_mode.h" | 11 #include "core/layout/ng/ng_writing_mode.h" |
12 #include "platform/heap/Handle.h" | 12 #include "platform/heap/Handle.h" |
13 #include "wtf/text/WTFString.h" | 13 #include "wtf/text/WTFString.h" |
14 #include "wtf/Vector.h" | 14 #include "wtf/Vector.h" |
15 | 15 |
16 namespace blink { | 16 namespace blink { |
17 | 17 |
18 class ComputedStyle; | 18 class ComputedStyle; |
19 class LayoutBox; | 19 class LayoutBox; |
20 class NGFragment; | 20 class NGFragment; |
21 class NGLayoutOpportunityIterator; | 21 class NGLayoutOpportunityIterator; |
22 | 22 |
23 // TODO(glebl@): unused, delete. | |
24 enum NGExclusionType { | |
25 NGClearNone = 0, | |
26 NGClearFloatLeft = 1, | |
27 NGClearFloatRight = 2, | |
28 NGClearFragment = 4 | |
29 }; | |
30 | |
31 enum NGFragmentationType { | |
32 FragmentNone, | |
33 FragmentPage, | |
34 FragmentColumn, | |
35 FragmentRegion | |
36 }; | |
37 | |
23 // The NGConstraintSpace represents a set of constraints and available space | 38 // The NGConstraintSpace represents a set of constraints and available space |
24 // which a layout algorithm may produce a NGFragment within. It is a view on | 39 // which a layout algorithm may produce a NGFragment within. |
25 // top of a NGPhysicalConstraintSpace and provides accessor methods in the | |
26 // logical coordinate system defined by the writing mode given. | |
27 class CORE_EXPORT NGConstraintSpace final | 40 class CORE_EXPORT NGConstraintSpace final |
28 : public GarbageCollected<NGConstraintSpace> { | 41 : public GarbageCollectedFinalized<NGConstraintSpace> { |
29 public: | 42 public: |
30 // Constructs a constraint space based on an existing backing | |
31 // NGPhysicalConstraintSpace. Sets this constraint space's size to the | |
32 // physical constraint space's available size, converted to logical | |
33 // coordinates. | |
34 NGConstraintSpace(NGWritingMode, TextDirection, NGPhysicalConstraintSpace*); | |
35 | |
36 // This should live on NGBlockNode or another layout bridge and probably take | 43 // This should live on NGBlockNode or another layout bridge and probably take |
37 // a root | 44 // a root NGConstraintSpace. |
38 // NGConstraintSpace or a NGPhysicalConstraintSpace. | |
39 static NGConstraintSpace* CreateFromLayoutObject(const LayoutBox&); | 45 static NGConstraintSpace* CreateFromLayoutObject(const LayoutBox&); |
40 | 46 |
41 // Mutable Getters. | 47 const std::shared_ptr<NGExclusions>& Exclusions() const { |
42 // TODO(layout-dev): remove const constraint from MutablePhysicalSpace method | 48 return exclusions_; |
43 NGPhysicalConstraintSpace* MutablePhysicalSpace() const { | |
44 return physical_space_; | |
45 } | |
46 | |
47 // Read-only Getters. | |
48 const NGPhysicalConstraintSpace* PhysicalSpace() const { | |
49 return physical_space_; | |
50 } | |
51 | |
52 const Vector<std::unique_ptr<const NGExclusion>>& Exclusions() const { | |
53 WRITING_MODE_IGNORED( | |
54 "Exclusions are stored directly in physical constraint space."); | |
55 return PhysicalSpace()->Exclusions(); | |
56 } | 49 } |
57 | 50 |
58 TextDirection Direction() const { | 51 TextDirection Direction() const { |
59 return static_cast<TextDirection>(direction_); | 52 return static_cast<TextDirection>(direction_); |
60 } | 53 } |
61 | 54 |
62 NGWritingMode WritingMode() const { | 55 NGWritingMode WritingMode() const { |
63 return static_cast<NGWritingMode>(writing_mode_); | 56 return static_cast<NGWritingMode>(writing_mode_); |
64 } | 57 } |
65 | 58 |
66 // Adds the exclusion in the physical constraint space. | 59 void AddExclusion(const NGExclusion& exclusion); |
67 void AddExclusion(const NGExclusion& exclusion) const; | |
68 const NGExclusion* LastLeftFloatExclusion() const; | |
69 const NGExclusion* LastRightFloatExclusion() const; | |
70 | 60 |
71 // The size to use for percentage resolution. | 61 // The size to use for percentage resolution. |
72 // See: https://drafts.csswg.org/css-sizing/#percentage-sizing | 62 // See: https://drafts.csswg.org/css-sizing/#percentage-sizing |
73 NGLogicalSize PercentageResolutionSize() const; | 63 NGLogicalSize PercentageResolutionSize() const { |
64 return percentage_resolution_size_; | |
65 } | |
74 | 66 |
75 // The available space size. | 67 // The available space size. |
76 // See: https://drafts.csswg.org/css-sizing/#available | 68 // See: https://drafts.csswg.org/css-sizing/#available |
77 NGLogicalSize AvailableSize() const; | 69 NGLogicalSize AvailableSize() const { return available_size_; } |
78 | 70 |
79 // Offset relative to the root constraint space. | 71 // Offset relative to the root constraint space. |
80 NGLogicalOffset Offset() const { return offset_; } | 72 NGLogicalOffset Offset() const { return offset_; } |
81 void SetOffset(const NGLogicalOffset& offset) { offset_ = offset; } | 73 void SetOffset(const NGLogicalOffset& offset) { offset_ = offset; } |
ikilpatrick
2016/11/29 00:10:27
.nit? (up to you)
TODO: remove.
Gleb Lanbin
2016/12/01 20:41:53
Done.
| |
82 | 74 |
83 // Whether the current constraint space is for the newly established | 75 // Whether the current constraint space is for the newly established |
84 // Formatting Context. | 76 // Formatting Context. |
85 bool IsNewFormattingContext() const; | 77 bool IsNewFormattingContext() const { return is_new_fc_; } |
86 | 78 |
87 // Whether exceeding the AvailableSize() triggers the presence of a scrollbar | 79 // Whether exceeding the AvailableSize() triggers the presence of a scrollbar |
88 // for the indicated direction. | 80 // for the indicated direction. |
89 // If exceeded the current layout should be aborted and invoked again with a | 81 // If exceeded the current layout should be aborted and invoked again with a |
90 // constraint space modified to reserve space for a scrollbar. | 82 // constraint space modified to reserve space for a scrollbar. |
91 bool InlineTriggersScrollbar() const; | 83 bool IsInlineDirectionTriggersScrollbar() const { |
92 bool BlockTriggersScrollbar() const; | 84 return is_inline_direction_triggers_scrollbar_; |
85 } | |
86 | |
87 bool IsBlockDirectionTriggersScrollbar() const { | |
88 return is_block_direction_triggers_scrollbar_; | |
89 } | |
93 | 90 |
94 // Some layout modes “stretch” their children to a fixed size (e.g. flex, | 91 // Some layout modes “stretch” their children to a fixed size (e.g. flex, |
95 // grid). These flags represented whether a layout needs to produce a | 92 // grid). These flags represented whether a layout needs to produce a |
96 // fragment that satisfies a fixed constraint in the inline and block | 93 // fragment that satisfies a fixed constraint in the inline and block |
97 // direction respectively. | 94 // direction respectively. |
98 bool FixedInlineSize() const; | 95 bool IsFixedSizeInline() const { return is_fixed_size_inline_; } |
99 bool FixedBlockSize() const; | 96 |
97 bool IsFixedSizeBlock() const { return is_fixed_size_block_; } | |
100 | 98 |
101 // If specified a layout should produce a Fragment which fragments at the | 99 // If specified a layout should produce a Fragment which fragments at the |
102 // blockSize if possible. | 100 // blockSize if possible. |
103 NGFragmentationType BlockFragmentationType() const; | 101 NGFragmentationType BlockFragmentationType() const; |
104 | 102 |
105 // Modifies constraint space to account for a placed fragment. Depending on | 103 // Modifies constraint space to account for a placed fragment. Depending on |
106 // the shape of the fragment this will either modify the inline or block | 104 // the shape of the fragment this will either modify the inline or block |
107 // size, or add an exclusion. | 105 // size, or add an exclusion. |
108 void Subtract(const NGFragment*); | 106 void Subtract(const NGFragment*); |
109 | 107 |
110 NGLayoutOpportunityIterator* LayoutOpportunities( | 108 NGLayoutOpportunityIterator* LayoutOpportunities( |
111 unsigned clear = NGClearNone, | 109 unsigned clear = NGClearNone, |
112 bool for_inline_or_bfc = false); | 110 bool for_inline_or_bfc = false); |
113 | 111 |
114 DEFINE_INLINE_VIRTUAL_TRACE() { visitor->trace(physical_space_); } | 112 DEFINE_INLINE_VIRTUAL_TRACE() {} |
115 | 113 |
116 NGConstraintSpace* ChildSpace(const ComputedStyle* style) const; | 114 NGConstraintSpace* ChildSpace(const ComputedStyle* style) const; |
117 | |
118 String ToString() const; | 115 String ToString() const; |
119 | 116 |
120 private: | 117 private: |
121 Member<NGPhysicalConstraintSpace> physical_space_; | 118 friend class NGConstraintSpaceBuilder; |
119 // Default constructor. | |
120 NGConstraintSpace(NGWritingMode, | |
121 TextDirection, | |
122 NGLogicalSize available_size, | |
123 NGLogicalSize percentage_resolution_size, | |
124 bool is_fixed_size_inline, | |
125 bool is_fixed_size_block, | |
126 bool is_inline_direction_triggers_scrollbar, | |
127 bool is_block_direction_triggers_scrollbar, | |
128 NGFragmentationType block_direction_fragmentation_type, | |
129 bool is_new_fc, | |
130 const std::shared_ptr<NGExclusions>& exclusions_); | |
131 | |
132 NGLogicalSize available_size_; | |
133 NGLogicalSize percentage_resolution_size_; | |
134 | |
135 unsigned is_fixed_size_inline_ : 1; | |
136 unsigned is_fixed_size_block_ : 1; | |
137 | |
138 unsigned is_inline_direction_triggers_scrollbar_ : 1; | |
139 unsigned is_block_direction_triggers_scrollbar_ : 1; | |
140 | |
141 unsigned block_direction_fragmentation_type_ : 2; | |
142 | |
143 // Whether the current constraint space is for the newly established | |
144 // formatting Context | |
145 unsigned is_new_fc_ : 1; | |
146 | |
122 NGLogicalOffset offset_; | 147 NGLogicalOffset offset_; |
123 unsigned writing_mode_ : 3; | 148 unsigned writing_mode_ : 3; |
124 unsigned direction_ : 1; | 149 unsigned direction_ : 1; |
150 | |
151 const std::shared_ptr<NGExclusions> exclusions_; | |
125 }; | 152 }; |
126 | 153 |
127 inline std::ostream& operator<<(std::ostream& stream, | 154 inline std::ostream& operator<<(std::ostream& stream, |
128 const NGConstraintSpace& value) { | 155 const NGConstraintSpace& value) { |
129 return stream << value.ToString(); | 156 return stream << value.ToString(); |
130 } | 157 } |
131 | 158 |
132 } // namespace blink | 159 } // namespace blink |
133 | 160 |
134 #endif // NGConstraintSpace_h | 161 #endif // NGConstraintSpace_h |
OLD | NEW |