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

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: Win build fix 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 friend class GridTrackSizingAlgorithmStrategy;
75
76 public:
77 GridTrackSizingAlgorithm(const LayoutGrid* layoutGrid, Grid& grid)
78 : m_grid(grid),
79 m_layoutGrid(layoutGrid),
80 m_sizingState(ColumnSizingFirstIteration) {}
81
82 // setup() must be run before calling run() as it configures the behaviour of
83 // the algorithm.
84 void setup(GridTrackSizingDirection,
85 size_t numTracks,
86 SizingOperation,
87 LayoutUnit availableSpace,
88 LayoutUnit freeSpace);
89 void run();
90 void reset();
91
92 // Required by LayoutGrid. Try to minimize the exposed surface.
93 const Grid& grid() const { return m_grid; }
94 GridTrackSize gridTrackSize(GridTrackSizingDirection,
95 size_t translatedIndex,
96 SizingOperation) const;
97 LayoutUnit minContentSize() const { return m_minContentSize; };
98 LayoutUnit maxContentSize() const { return m_maxContentSize; };
99
100 Vector<GridTrack>& tracks(GridTrackSizingDirection);
101 const Vector<GridTrack>& tracks(GridTrackSizingDirection) const;
102
103 LayoutUnit& freeSpace(GridTrackSizingDirection);
104
105 #if DCHECK_IS_ON()
106 bool tracksAreWiderThanMinTrackBreadth() const;
107 #endif
108
109 private:
110 GridTrackSize gridTrackSize(GridTrackSizingDirection,
111 size_t translatedIndex) const;
112 GridTrackSize rawGridTrackSize(GridTrackSizingDirection,
113 size_t translatedIndex) const;
114 LayoutUnit assumedRowsSizeForOrthogonalChild(const LayoutBox&) const;
115 LayoutUnit computeTrackBasedSize() const;
116
117 // Helper methods for step 1. initializeTrackSizes().
118 LayoutUnit initialBaseSize(const GridTrackSize&) const;
119 LayoutUnit initialGrowthLimit(const GridTrackSize&,
120 LayoutUnit baseSize) const;
121
122 // Helper methods for step 2. resolveIntrinsicTrackSizes().
123 void sizeTrackToFitNonSpanningItem(const GridSpan&,
124 LayoutBox& gridItem,
125 GridTrack&);
126 bool spanningItemCrossesFlexibleSizedTracks(const GridSpan&) const;
127 typedef struct GridItemsSpanGroupRange GridItemsSpanGroupRange;
128 template <TrackSizeComputationPhase phase>
129 void increaseSizesToAccommodateSpanningItems(
130 const GridItemsSpanGroupRange& gridItemsWithSpan);
131 LayoutUnit itemSizeForTrackSizeComputationPhase(TrackSizeComputationPhase,
132 LayoutBox&) const;
133 template <TrackSizeComputationPhase phase>
134 void distributeSpaceToTracks(Vector<GridTrack*>& tracks,
135 Vector<GridTrack*>* growBeyondGrowthLimitsTracks,
136 LayoutUnit& availableLogicalSpace) const;
137 LayoutUnit gridAreaBreadthForChild(const LayoutBox&,
138 GridTrackSizingDirection);
139
140 void computeGridContainerIntrinsicSizes();
141
142 // Helper methods for step 4. Strech flexible tracks.
143 typedef HashSet<size_t,
144 DefaultHash<size_t>::Hash,
145 WTF::UnsignedWithZeroKeyHashTraits<size_t>>
146 TrackIndexSet;
147 double computeFlexFactorUnitSize(
148 const Vector<GridTrack>& tracks,
149 double flexFactorSum,
150 LayoutUnit& leftOverSpace,
151 const Vector<size_t, 8>& flexibleTracksIndexes,
152 std::unique_ptr<TrackIndexSet> tracksToTreatAsInflexible = nullptr) const;
153 void computeFlexSizedTracksGrowth(double flexFraction,
154 Vector<LayoutUnit>& increments,
155 LayoutUnit& totalGrowth) const;
156 double findFrUnitSize(const GridSpan& tracksSpan,
157 LayoutUnit leftOverSpace) const;
158
159 // Track sizing algorithm steps. Note that the "Maximize Tracks" step is done
160 // entirely inside the strategies, that's why we don't need an additional
161 // method at thise level.
162 void initializeTrackSizes();
163 void resolveIntrinsicTrackSizes();
164 void stretchFlexibleTracks(LayoutUnit freeSpace);
165
166 // State machine.
167 void advanceNextState();
168 bool isValidTransition() const;
169
170 // Data.
171 bool m_needsSetup{true};
172 LayoutUnit m_availableSpace;
173
174 LayoutUnit m_freeSpaceColumns;
175 LayoutUnit m_freeSpaceRows;
176
177 // We need to keep both alive in order to properly size grids with orthogonal
178 // writing modes.
179 Vector<GridTrack> m_columns;
180 Vector<GridTrack> m_rows;
181 Vector<size_t> m_contentSizedTracksIndex;
182 Vector<size_t> m_flexibleSizedTracksIndex;
183
184 GridTrackSizingDirection m_direction;
185 SizingOperation m_sizingOperation;
186
187 Grid& m_grid;
188
189 const LayoutGrid* m_layoutGrid;
190 std::unique_ptr<GridTrackSizingAlgorithmStrategy> m_strategy;
191
192 // The track sizing algorithm is used for both layout and intrinsic size
193 // computation. We're normally just interested in intrinsic inline sizes
194 // (a.k.a widths in most of the cases) for the computeIntrinsicLogicalWidths()
195 // computations. That's why we don't need to keep around different values for
196 // rows/columns.
197 LayoutUnit m_minContentSize;
198 LayoutUnit m_maxContentSize;
199
200 enum SizingState {
201 ColumnSizingFirstIteration,
202 RowSizingFirstIteration,
203 ColumnSizingSecondIteration,
204 RowSizingSecondIteration
205 };
206 SizingState m_sizingState;
207
208 // This is a RAII class used to ensure that the track sizing algorithm is
209 // executed as it is suppossed to be, i.e., first resolve columns and then
210 // rows. Only if required a second iteration is run following the same order,
211 // first columns and then rows.
212 class StateMachine {
213 public:
214 StateMachine(GridTrackSizingAlgorithm&);
215 ~StateMachine();
216
217 private:
218 GridTrackSizingAlgorithm& m_algorithm;
219 };
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) = 0;
232 virtual double findUsedFlexFraction(Vector<size_t>& flexibleSizedTracksIndex,
233 GridTrackSizingDirection,
234 LayoutUnit initialFreeSpace) const = 0;
235 virtual bool recomputeUsedFlexFractionIfNeeded(
236 Vector<size_t>& flexibleSizedTracksIndex,
237 double& flexFraction,
238 Vector<LayoutUnit>& increments,
239 LayoutUnit& totalGrowth) const = 0;
240
241 protected:
242 GridTrackSizingAlgorithmStrategy(GridTrackSizingAlgorithm& algorithm)
243 : m_algorithm(algorithm) {}
244
245 virtual LayoutUnit minLogicalWidthForChild(
246 LayoutBox&,
247 Length childMinSize,
248 GridTrackSizingDirection) const = 0;
249 virtual void layoutGridItemForMinSizeComputation(
250 LayoutBox&,
251 bool overrideSizeHasChanged) const = 0;
252
253 LayoutUnit logicalHeightForChild(LayoutBox&) const;
254
255 bool updateOverrideContainingBlockContentSizeForChild(
256 LayoutBox&,
257 GridTrackSizingDirection) const;
258 LayoutUnit computeTrackBasedSize() const;
259 GridTrackSizingDirection direction() const { return m_algorithm.m_direction; }
260 double findFrUnitSize(const GridSpan& tracksSpan,
261 LayoutUnit leftOverSpace) const;
262 void distributeSpaceToTracks(Vector<GridTrack*>& tracks,
263 LayoutUnit& availableLogicalSpace) const;
264 const LayoutGrid* layoutGrid() const { return m_algorithm.m_layoutGrid; }
265
266 GridTrackSizingAlgorithm& m_algorithm;
267 };
268 }
269
270 #endif // GridTrackSizingAlgorithm_h
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/Grid.cpp ('k') | third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698