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

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

Issue 2654533003: [css-grid] Move the track sizing algorithm to its own class (Closed)
Patch Set: Build fixes 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
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef GridTrackSizingAlgorithm_h
6 #define GridTrackSizingAlgorithm_h
7
8 #include "core/style/GridPositionsResolver.h"
9 #include "core/style/GridTrackSize.h"
10 #include "platform/LayoutUnit.h"
11 #include "wtf/HashSet.h"
12 #include "wtf/Optional.h"
13 #include <memory>
14
15 namespace blink {
16
17 static const int infinity = -1;
18
19 class Grid;
20 class GridTrackSizingAlgorithmStrategy;
21 class LayoutGrid;
22
23 enum SizingOperation { TrackSizing, IntrinsicSizeComputation };
24
25 enum TrackSizeComputationPhase {
26 ResolveIntrinsicMinimums,
27 ResolveContentBasedMinimums,
28 ResolveMaxContentMinimums,
29 ResolveIntrinsicMaximums,
30 ResolveMaxContentMaximums,
31 MaximizeTracks,
32 };
33
34 class GridTrack {
35 public:
36 GridTrack() : m_infinitelyGrowable(false) {}
37
38 LayoutUnit baseSize() const;
39 void setBaseSize(LayoutUnit);
40
41 LayoutUnit growthLimit() const;
42 void setGrowthLimit(LayoutUnit);
43
44 bool infiniteGrowthPotential() const;
45
46 LayoutUnit plannedSize() const { return m_plannedSize; }
47 void setPlannedSize(LayoutUnit);
48
49 LayoutUnit sizeDuringDistribution() const { return m_sizeDuringDistribution; }
50 void setSizeDuringDistribution(LayoutUnit);
51
52 void growSizeDuringDistribution(LayoutUnit);
53
54 bool infinitelyGrowable() const { return m_infinitelyGrowable; }
55 void setInfinitelyGrowable(bool);
56
57 Optional<LayoutUnit> growthLimitCap() const { return m_growthLimitCap; }
58 void setGrowthLimitCap(Optional<LayoutUnit>);
59
60 private:
61 bool growthLimitIsInfinite() const { return m_growthLimit == infinity; }
62 bool isGrowthLimitBiggerThanBaseSize() const;
63 void ensureGrowthLimitIsBiggerThanBaseSize();
64
65 LayoutUnit m_baseSize;
66 LayoutUnit m_growthLimit;
67 LayoutUnit m_plannedSize;
68 LayoutUnit m_sizeDuringDistribution;
69 Optional<LayoutUnit> m_growthLimitCap;
70 bool m_infinitelyGrowable;
71 };
72
73 class GridTrackSizingAlgorithm final {
74 public:
75 GridTrackSizingAlgorithm(const LayoutGrid* layoutGrid, Grid& grid)
76 : m_grid(grid),
77 m_layoutGrid(layoutGrid),
78 m_sizingState(ColumnSizingFirstIteration) {}
79
80 // setup() must be run before calling run() as it configures the behaviour of
81 // the algorithm.
82 void setup(GridTrackSizingDirection,
83 size_t numTracks,
84 SizingOperation,
85 LayoutUnit availableSpace,
86 LayoutUnit freeSpace);
87 void run();
88 void reset();
89
90 // Required by LayoutGrid. Try to minimize the exposed surface.
91 const Grid& grid() const { return m_grid; }
92 GridTrackSize gridTrackSize(GridTrackSizingDirection,
93 size_t translatedIndex,
94 SizingOperation) const;
95 LayoutUnit minContentSize() const { return m_minContentSize; };
96 LayoutUnit maxContentSize() const { return m_maxContentSize; };
97
98 Vector<GridTrack>& tracks(GridTrackSizingDirection);
99 const Vector<GridTrack>& tracks(GridTrackSizingDirection) const;
100
101 LayoutUnit& freeSpace(GridTrackSizingDirection);
102
103 #if DCHECK_IS_ON()
104 bool tracksAreWiderThanMinTrackBreadth() const;
105 #endif
106
107 private:
108 GridTrackSize gridTrackSize(GridTrackSizingDirection,
109 size_t translatedIndex) const;
110 GridTrackSize rawGridTrackSize(GridTrackSizingDirection,
111 size_t translatedIndex) const;
112 LayoutUnit assumedRowsSizeForOrthogonalChild(const LayoutBox&) const;
113 LayoutUnit computeTrackBasedSize() const;
114
115 // Helper methods for step 1. initializeTrackSizes().
116 LayoutUnit initialBaseSize(const GridTrackSize&) const;
117 LayoutUnit initialGrowthLimit(const GridTrackSize&,
118 LayoutUnit baseSize) const;
119
120 // Helper methods for step 2. resolveIntrinsicTrackSizes().
121 void sizeTrackToFitNonSpanningItem(const GridSpan&,
122 LayoutBox& gridItem,
123 GridTrack&);
124 bool spanningItemCrossesFlexibleSizedTracks(const GridSpan&) const;
125 typedef struct GridItemsSpanGroupRange GridItemsSpanGroupRange;
126 template <TrackSizeComputationPhase phase>
127 void increaseSizesToAccommodateSpanningItems(
128 const GridItemsSpanGroupRange& gridItemsWithSpan);
129 LayoutUnit itemSizeForTrackSizeComputationPhase(TrackSizeComputationPhase,
130 LayoutBox&) const;
131 template <TrackSizeComputationPhase phase>
132 void distributeSpaceToTracks(Vector<GridTrack*>& tracks,
133 Vector<GridTrack*>* growBeyondGrowthLimitsTracks,
134 LayoutUnit& availableLogicalSpace) const;
135 LayoutUnit gridAreaBreadthForChild(const LayoutBox&,
136 GridTrackSizingDirection);
137
138 void computeGridContainerIntrinsicSizes();
139
140 // Helper methods for step 4. Strech flexible tracks.
141 typedef HashSet<size_t,
142 DefaultHash<size_t>::Hash,
143 WTF::UnsignedWithZeroKeyHashTraits<size_t>>
144 TrackIndexSet;
145 double computeFlexFactorUnitSize(
146 const Vector<GridTrack>& tracks,
147 double flexFactorSum,
148 LayoutUnit& leftOverSpace,
149 const Vector<size_t, 8>& flexibleTracksIndexes,
150 std::unique_ptr<TrackIndexSet> tracksToTreatAsInflexible = nullptr) const;
151 void computeFlexSizedTracksGrowth(double flexFraction,
152 Vector<LayoutUnit>& increments,
153 LayoutUnit& totalGrowth) const;
154 double findFrUnitSize(const GridSpan& tracksSpan,
155 LayoutUnit leftOverSpace) const;
156
157 // Track sizing algorithm steps. Note that the "Maximize Tracks" step is done
158 // entirely inside the strategies, that's why we don't need an additional
159 // method at thise level.
160 void initializeTrackSizes();
161 void resolveIntrinsicTrackSizes();
162 void stretchFlexibleTracks(LayoutUnit freeSpace);
163
164 // State machine.
165 void advanceNextState();
166 bool isValidTransition() const;
167
168 // Data.
169 bool m_needsSetup{true};
170 LayoutUnit m_availableSpace;
171
172 LayoutUnit m_freeSpaceColumns;
173 LayoutUnit m_freeSpaceRows;
174
175 // We need to keep both alive in order to properly size grids with orthogonal
176 // writing modes.
177 Vector<GridTrack> m_columns;
178 Vector<GridTrack> m_rows;
179 Vector<size_t> m_contentSizedTracksIndex;
180 Vector<size_t> m_flexibleSizedTracksIndex;
181
182 GridTrackSizingDirection m_direction;
183 SizingOperation m_sizingOperation;
184
185 Grid& m_grid;
186
187 const LayoutGrid* m_layoutGrid;
188 std::unique_ptr<GridTrackSizingAlgorithmStrategy> m_strategy;
189
190 // The track sizing algorithm is used for both layout and intrinsic size
191 // computation. We're normally just interested in intrinsic inline sizes
192 // (a.k.a widths in most of the cases) for the computeIntrinsicLogicalWidths()
193 // computations. That's why we don't need to keep around different values for
194 // rows/columns.
195 LayoutUnit m_minContentSize;
196 LayoutUnit m_maxContentSize;
197
198 enum SizingState {
199 ColumnSizingFirstIteration,
200 RowSizingFirstIteration,
201 ColumnSizingSecondIteration,
202 RowSizingSecondIteration
203 };
204 SizingState m_sizingState;
205
206 // This is a RAII class used to ensure that the track sizing algorithm is
207 // executed as it is suppossed to be, i.e., first resolve columns and then
208 // rows. Only if required a second iteration is run following the same order,
209 // first columns and then rows.
210 class MachineState {
211 public:
212 MachineState(GridTrackSizingAlgorithm&);
213 ~MachineState();
214
215 private:
216 GridTrackSizingAlgorithm& m_algorithm;
217 };
218
219 friend class GridTrackSizingAlgorithmStrategy;
220 };
221
222 class GridTrackSizingAlgorithmStrategy {
223 WTF_MAKE_NONCOPYABLE(GridTrackSizingAlgorithmStrategy);
224 USING_FAST_MALLOC(GridTrackSizingAlgorithmStrategy);
225
226 public:
227 LayoutUnit minContentForChild(LayoutBox&) const;
228 LayoutUnit maxContentForChild(LayoutBox&) const;
229 LayoutUnit minSizeForChild(LayoutBox&) const;
230
231 virtual void maximizeTracks(Vector<GridTrack>&, LayoutUnit& freeSpace);
232 virtual double findUsedFlexFraction(Vector<size_t>& flexibleSizedTracksIndex,
233 GridTrackSizingDirection,
234 LayoutUnit initialFreeSpace) const;
235 virtual bool recomputeUsedFlexFractionIfNeeded(
236 Vector<size_t>& flexibleSizedTracksIndex,
237 double& flexFraction,
238 Vector<LayoutUnit>& increments,
239 LayoutUnit& totalGrowth) const;
240
241 protected:
242 GridTrackSizingAlgorithmStrategy(GridTrackSizingAlgorithm& algorithm)
243 : m_algorithm(algorithm) {}
244
245 virtual bool canPerformLayout() const = 0;
246 virtual LayoutUnit minLogicalWidthForChild(
247 LayoutBox&,
248 Length childMinSize,
249 GridTrackSizingDirection) const = 0;
250 virtual void layoutGridItemForMinSizeComputation(
251 LayoutBox&,
252 bool overrideSizeHasChanged) const = 0;
253
254 LayoutUnit logicalHeightForChild(LayoutBox&) const;
255
256 bool updateOverrideContainingBlockContentSizeForChild(
257 LayoutBox&,
258 GridTrackSizingDirection) const;
259 LayoutUnit computeTrackBasedSize() const;
260 GridTrackSizingDirection direction() const { return m_algorithm.m_direction; }
261 double findFrUnitSize(const GridSpan& tracksSpan,
262 LayoutUnit leftOverSpace) const;
263 void distributeSpaceToTracks(Vector<GridTrack*>& tracks,
264 LayoutUnit& availableLogicalSpace) const;
265 const LayoutGrid* layoutGrid() const { return m_algorithm.m_layoutGrid; }
266
267 GridTrackSizingAlgorithm& m_algorithm;
268 };
269 }
270
271 #endif // GridTrackSizingAlgorithm_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698