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

Side by Side Diff: third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.h

Issue 2655783006: Top down version of algorithm to position margins and floats in LayoutNG (Closed)
Patch Set: git rebase-update 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 unified diff | Download patch
OLDNEW
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 NGFragmentBuilder_h 5 #ifndef NGFragmentBuilder_h
6 #define NGFragmentBuilder_h 6 #define NGFragmentBuilder_h
7 7
8 #include "core/layout/ng/ng_constraint_space.h" 8 #include "core/layout/ng/ng_constraint_space.h"
9 #include "core/layout/ng/ng_floating_object.h" 9 #include "core/layout/ng/ng_floating_object.h"
10 #include "core/layout/ng/ng_physical_fragment.h" 10 #include "core/layout/ng/ng_physical_fragment.h"
(...skipping 20 matching lines...) Expand all
31 NGFragmentBuilder& SetBlockSize(LayoutUnit); 31 NGFragmentBuilder& SetBlockSize(LayoutUnit);
32 NGLogicalSize Size() const { return size_; } 32 NGLogicalSize Size() const { return size_; }
33 33
34 NGFragmentBuilder& SetInlineOverflow(LayoutUnit); 34 NGFragmentBuilder& SetInlineOverflow(LayoutUnit);
35 NGFragmentBuilder& SetBlockOverflow(LayoutUnit); 35 NGFragmentBuilder& SetBlockOverflow(LayoutUnit);
36 36
37 NGFragmentBuilder& AddChild(NGFragment*, const NGLogicalOffset&); 37 NGFragmentBuilder& AddChild(NGFragment*, const NGLogicalOffset&);
38 NGFragmentBuilder& AddFloatingObject(NGFloatingObject*, 38 NGFragmentBuilder& AddFloatingObject(NGFloatingObject*,
39 const NGLogicalOffset&); 39 const NGLogicalOffset&);
40 40
41 NGFragmentBuilder& SetBfcOffset(const NGLogicalOffset& offset);
42
43 NGFragmentBuilder& AddUnpositionedFloat(NGFloatingObject* floating_object);
44
41 // Builder has non-trivial out-of-flow descendant methods. 45 // Builder has non-trivial out-of-flow descendant methods.
42 // These methods are building blocks for implementation of 46 // These methods are building blocks for implementation of
43 // out-of-flow descendants by layout algorithms. 47 // out-of-flow descendants by layout algorithms.
44 // 48 //
45 // They are intended to be used by layout algorithm like this: 49 // They are intended to be used by layout algorithm like this:
46 // 50 //
47 // Part 1: layout algorithm positions in-flow children. 51 // Part 1: layout algorithm positions in-flow children.
48 // out-of-flow children, and out-of-flow descendants of fragments 52 // out-of-flow children, and out-of-flow descendants of fragments
49 // are stored inside builder. 53 // are stored inside builder.
50 // 54 //
(...skipping 13 matching lines...) Expand all
64 // 68 //
65 // See layout part for builder interaction. 69 // See layout part for builder interaction.
66 NGFragmentBuilder& AddOutOfFlowChildCandidate(NGBlockNode*, NGLogicalOffset); 70 NGFragmentBuilder& AddOutOfFlowChildCandidate(NGBlockNode*, NGLogicalOffset);
67 71
68 void GetAndClearOutOfFlowDescendantCandidates(WeakBoxList*, 72 void GetAndClearOutOfFlowDescendantCandidates(WeakBoxList*,
69 Vector<NGStaticPosition>*); 73 Vector<NGStaticPosition>*);
70 74
71 NGFragmentBuilder& AddOutOfFlowDescendant(NGBlockNode*, 75 NGFragmentBuilder& AddOutOfFlowDescendant(NGBlockNode*,
72 const NGStaticPosition&); 76 const NGStaticPosition&);
73 77
74 NGFragmentBuilder& AddUnpositionedFloat(NGFloatingObject* floating_object);
75
76 void SetBreakToken(NGBreakToken* token) { 78 void SetBreakToken(NGBreakToken* token) {
77 DCHECK(!break_token_); 79 DCHECK(!break_token_);
78 break_token_ = token; 80 break_token_ = token;
79 } 81 }
80 bool HasBreakToken() const { return break_token_; } 82 bool HasBreakToken() const { return break_token_; }
81 83
82 // Sets MarginStrut for the resultant fragment. 84 NGFragmentBuilder& SetEndMarginStrut(const NGMarginStrut& from) {
83 NGFragmentBuilder& SetMarginStrutBlockStart( 85 end_margin_strut_ = from;
84 const NGDeprecatedMarginStrut& from); 86 return *this;
85 NGFragmentBuilder& SetMarginStrutBlockEnd( 87 }
86 const NGDeprecatedMarginStrut& from);
87 88
88 // Offsets are not supposed to be set during fragment construction, so we 89 // Offsets are not supposed to be set during fragment construction, so we
89 // do not provide a setter here. 90 // do not provide a setter here.
90 91
91 // Creates the fragment. Can only be called once. 92 // Creates the fragment. Can only be called once.
92 NGPhysicalBoxFragment* ToBoxFragment(); 93 NGPhysicalBoxFragment* ToBoxFragment();
93 NGPhysicalTextFragment* ToTextFragment(NGInlineNode*, 94 NGPhysicalTextFragment* ToTextFragment(NGInlineNode*,
94 unsigned start_index, 95 unsigned start_index,
95 unsigned end_index); 96 unsigned end_index);
96 97
98 // Mutable list of floats that need to be positioned.
99 HeapVector<Member<NGFloatingObject>>& MutableUnpositionedFloats() {
100 return unpositioned_floats_;
101 }
102
97 // List of floats that need to be positioned. 103 // List of floats that need to be positioned.
98 HeapVector<Member<NGFloatingObject>>& UnpositionedFloats() { 104 const HeapVector<Member<NGFloatingObject>>& UnpositionedFloats() const {
99 return unpositioned_floats_; 105 return unpositioned_floats_;
100 } 106 }
101 107
108 const WTF::Optional<NGLogicalOffset>& BfcOffset() const {
109 return bfc_offset_;
110 }
111
102 DECLARE_VIRTUAL_TRACE(); 112 DECLARE_VIRTUAL_TRACE();
103 113
104 private:
105 // Out-of-flow descendant placement information. 114 // Out-of-flow descendant placement information.
106 // The generated fragment must compute NGStaticPosition for all 115 // The generated fragment must compute NGStaticPosition for all
107 // out-of-flow descendants. 116 // out-of-flow descendants.
108 // The resulting NGStaticPosition gets derived from: 117 // The resulting NGStaticPosition gets derived from:
109 // 1. The offset of fragment's child. 118 // 1. The offset of fragment's child.
110 // 2. The static position of descendant wrt child. 119 // 2. The static position of descendant wrt child.
111 // 120 //
112 // A child can be: 121 // A child can be:
113 // 1. A descendant itself. In this case, descendant position is (0,0). 122 // 1. A descendant itself. In this case, descendant position is (0,0).
114 // 2. A fragment containing a descendant. 123 // 2. A fragment containing a descendant.
115 // 124 //
116 // child_offset is stored as NGLogicalOffset because physical offset cannot 125 // child_offset is stored as NGLogicalOffset because physical offset cannot
117 // be computed until we know fragment's size. 126 // be computed until we know fragment's size.
118 struct OutOfFlowPlacement { 127 struct OutOfFlowPlacement {
119 NGLogicalOffset child_offset; 128 NGLogicalOffset child_offset;
120 NGStaticPosition descendant_position; 129 NGStaticPosition descendant_position;
121 }; 130 };
122 131
123 NGPhysicalFragment::NGFragmentType type_; 132 NGPhysicalFragment::NGFragmentType type_;
124 NGWritingMode writing_mode_; 133 NGWritingMode writing_mode_;
125 TextDirection direction_; 134 TextDirection direction_;
126 135
127 LayoutObject* layout_object_; 136 LayoutObject* layout_object_;
128 137
129 NGLogicalSize size_; 138 NGLogicalSize size_;
130 NGLogicalSize overflow_; 139 NGLogicalSize overflow_;
131 140
132 NGDeprecatedMarginStrut margin_strut_;
133
134 HeapVector<Member<NGPhysicalFragment>> children_; 141 HeapVector<Member<NGPhysicalFragment>> children_;
135 Vector<NGLogicalOffset> offsets_; 142 Vector<NGLogicalOffset> offsets_;
136 143
137 WeakBoxList out_of_flow_descendant_candidates_; 144 WeakBoxList out_of_flow_descendant_candidates_;
138 Vector<OutOfFlowPlacement> out_of_flow_candidate_placements_; 145 Vector<OutOfFlowPlacement> out_of_flow_candidate_placements_;
139 146
140 WeakBoxList out_of_flow_descendants_; 147 WeakBoxList out_of_flow_descendants_;
141 Vector<NGStaticPosition> out_of_flow_positions_; 148 Vector<NGStaticPosition> out_of_flow_positions_;
142 149
143 // Floats that need to be positioned by the next in-flow fragment that can 150 // Floats that need to be positioned by the next in-flow fragment that can
144 // determine its block position in space. 151 // determine its block position in space.
145 HeapVector<Member<NGFloatingObject>> unpositioned_floats_; 152 HeapVector<Member<NGFloatingObject>> unpositioned_floats_;
146 153
147 Vector<NGLogicalOffset> floating_object_offsets_; 154 Vector<NGLogicalOffset> floating_object_offsets_;
148 HeapVector<Member<NGFloatingObject>> positioned_floats_; 155 HeapVector<Member<NGFloatingObject>> positioned_floats_;
149 156
150 Member<NGBreakToken> break_token_; 157 Member<NGBreakToken> break_token_;
158
159 WTF::Optional<NGLogicalOffset> bfc_offset_;
160 NGMarginStrut end_margin_strut_;
151 }; 161 };
152 162
153 } // namespace blink 163 } // namespace blink
154 164
155 #endif // NGFragmentBuilder 165 #endif // NGFragmentBuilder
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698