Changeset 140894 in webkit
- Timestamp:
- Jan 25, 2013 5:52:12 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r140893 r140894 1 2013-01-25 Julien Chaffraix <jchaffraix@webkit.org> 2 3 Share code between the different min-content / max-content code paths 4 https://bugs.webkit.org/show_bug.cgi?id=107740 5 6 Reviewed by Tony Chang. 7 8 This change enables sharing between the different content based computations 9 by using function pointers to specialize the behavior as needed. 10 11 Refactoring, covered by existing tests. 12 13 * rendering/RenderGrid.cpp: 14 (WebCore::GridTrack::growUsedBreadth): 15 (WebCore::GridTrack::usedBreadth): 16 (WebCore::GridTrack::growMaxBreadth): 17 Added the previous getters / setters that will be passed to resolveContentBasedTrackSizingFunctionsForItems. 18 19 (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions): 20 Updated to reuse resolveContentBasedTrackSizingFunctionsForItems instead of duplicating code. 21 One change is that now, we properly apply the min on all branches, which was an oversight of 22 the previous patches. 23 24 (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForItems): 25 Added this function as the core content-sized resolution function. For now, we pass the 26 current track by direction & index to be able to filter grid items. 27 28 * rendering/RenderGrid.h: 29 Added resolveContentBasedTrackSizingFunctionsForItems and the function pointers typedef's. 30 1 31 2013-01-25 Kentaro Hara <haraken@chromium.org> 2 32 -
trunk/Source/WebCore/rendering/RenderGrid.cpp
r140583 r140894 44 44 } 45 45 46 void growUsedBreadth(LayoutUnit growth) 47 { 48 ASSERT(growth >= 0); 49 m_usedBreadth += growth; 50 } 51 LayoutUnit usedBreadth() const { return m_usedBreadth; } 52 53 void growMaxBreadth(LayoutUnit growth) 54 { 55 if (m_maxBreadth == infinity) 56 m_maxBreadth = m_usedBreadth + growth; 57 else 58 m_maxBreadth += growth; 59 } 46 60 LayoutUnit maxBreadthIfNotInfinite() const 47 61 { … … 273 287 const Length& minTrackBreadth = trackStyles[i].minTrackBreadth(); 274 288 if (minTrackBreadth.isMinContent() || minTrackBreadth.isMaxContent()) { 275 // FIXME: The specification factors this logic into resolveContentBasedTrackSizingFunctionsForItems 276 // to reuse code between the branches and also calls distributeSpaceToTracks. 277 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { 278 size_t cellIndex = resolveGridPosition(direction, child); 279 if (cellIndex != i) 280 continue; 281 282 LayoutUnit additionalBreadthSpace = minContentForChild(child, direction, columnTracks) - track.m_usedBreadth; 283 ASSERT(additionalBreadthSpace >= 0); 284 track.m_usedBreadth += additionalBreadthSpace; 285 availableLogicalSpace -= additionalBreadthSpace; 286 } 289 LayoutUnit oldUsedBreadth = track.m_usedBreadth; 290 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks, rowTracks, i, &RenderGrid::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); 291 availableLogicalSpace -= (track.m_usedBreadth - oldUsedBreadth); 287 292 } 293 288 294 if (minTrackBreadth.isMaxContent()) { 289 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { 290 size_t cellIndex = resolveGridPosition((direction == ForColumns) ? child->style()->gridItemColumn() : child->style()->gridItemRow()); 291 if (cellIndex != i) 292 continue; 293 294 LayoutUnit additionalBreadthSpace = maxContentForChild(child, direction, columnTracks) - track.m_usedBreadth; 295 ASSERT(additionalBreadthSpace >= 0); 296 track.m_usedBreadth += additionalBreadthSpace; 297 availableLogicalSpace -= additionalBreadthSpace; 298 } 295 LayoutUnit oldUsedBreadth = track.m_usedBreadth; 296 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks, rowTracks, i, &RenderGrid::maxContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); 297 availableLogicalSpace -= (track.m_usedBreadth - oldUsedBreadth); 299 298 } 300 299 301 300 const Length& maxTrackBreadth = trackStyles[i].maxTrackBreadth(); 302 if (maxTrackBreadth.isMinContent() || maxTrackBreadth.isMaxContent()) { 303 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { 304 size_t cellIndex = resolveGridPosition(direction, child); 305 if (cellIndex != i) 306 continue; 307 308 LayoutUnit additionalBreadthSpace = minContentForChild(child, direction, columnTracks) - track.maxBreadthIfNotInfinite(); 309 LayoutUnit share = std::min(additionalBreadthSpace, tracks[i].m_maxBreadth - track.maxBreadthIfNotInfinite()); 310 if (track.m_maxBreadth == infinity) 311 track.m_maxBreadth = track.m_usedBreadth + share; 312 else 313 track.m_maxBreadth += share; 314 } 315 } 316 317 if (maxTrackBreadth.isMaxContent()) { 318 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { 319 size_t cellIndex = resolveGridPosition((direction == ForColumns) ? child->style()->gridItemColumn() : child->style()->gridItemRow()); 320 if (cellIndex != i) 321 continue; 322 323 LayoutUnit additionalBreadthSpace = maxContentForChild(child, direction, columnTracks) - track.maxBreadthIfNotInfinite(); 324 LayoutUnit share = std::min(additionalBreadthSpace, tracks[i].m_maxBreadth - track.maxBreadthIfNotInfinite()); 325 if (track.m_maxBreadth == infinity) 326 track.m_maxBreadth = track.m_usedBreadth + share; 327 else 328 track.m_maxBreadth += share; 329 } 330 } 301 if (maxTrackBreadth.isMinContent() || maxTrackBreadth.isMaxContent()) 302 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks, rowTracks, i, &RenderGrid::minContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); 303 304 if (maxTrackBreadth.isMaxContent()) 305 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks, rowTracks, i, &RenderGrid::maxContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); 331 306 } 332 307 333 308 // FIXME: The spec says to update maxBreadth if it is Infinity. 309 } 310 311 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDirection direction, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, size_t i, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction) 312 { 313 // FIXME: The specification re-uses distributeSpaceToTrack, which we should probably do. 314 GridTrack& track = (direction == ForColumns) ? columnTracks[i] : rowTracks[i]; 315 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { 316 size_t cellIndex = resolveGridPosition(direction, child); 317 if (cellIndex != i) 318 continue; 319 320 LayoutUnit contentSize = (this->*sizingFunction)(child, direction, columnTracks); 321 LayoutUnit additionalBreadthSpace = contentSize - (track.*trackGetter)(); 322 LayoutUnit share = additionalBreadthSpace; 323 std::min(additionalBreadthSpace, track.m_maxBreadth - (track.*trackGetter)()); 324 (track.*trackGrowthFunction)(share); 325 } 334 326 } 335 327 -
trunk/Source/WebCore/rendering/RenderGrid.h
r140583 r140894 58 58 void layoutGridItems(); 59 59 60 typedef LayoutUnit (RenderGrid::* SizingFunction)(RenderBox*, TrackSizingDirection, Vector<GridTrack>&); 61 typedef LayoutUnit (GridTrack::* AccumulatorGetter)() const; 62 typedef void (GridTrack::* AccumulatorGrowFunction)(LayoutUnit); 63 void resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDirection, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, size_t, SizingFunction, AccumulatorGetter, AccumulatorGrowFunction); 64 60 65 LayoutUnit minContentForChild(RenderBox*, TrackSizingDirection, Vector<GridTrack>& columnTracks); 61 66 LayoutUnit maxContentForChild(RenderBox*, TrackSizingDirection, Vector<GridTrack>& columnTracks);
Note: See TracChangeset
for help on using the changeset viewer.