Changeset 157393 in webkit for trunk/Source/WebCore/rendering/RenderGrid.cpp
- Timestamp:
- Oct 14, 2013, 3:36:39 AM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/rendering/RenderGrid.cpp
r157389 r157393 1 1 /* 2 2 * Copyright (C) 2011 Apple Inc. All rights reserved. 3 * Copyright (C) 2013 Igalia S.L. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 68 69 }; 69 70 71 struct GridTrackForNormalization { 72 GridTrackForNormalization(const GridTrack& track, double flex) 73 : m_track(&track) 74 , m_flex(flex) 75 , m_normalizedFlexValue(track.m_usedBreadth / flex) 76 { 77 } 78 79 const GridTrack* m_track; 80 double m_flex; 81 LayoutUnit m_normalizedFlexValue; 82 }; 83 70 84 class RenderGrid::GridIterator { 71 85 WTF_MAKE_NONCOPYABLE(GridIterator); … … 230 244 } 231 245 232 LayoutUnit RenderGrid::computePreferredTrackWidth(const Length& length, size_t trackIndex) const 233 { 246 LayoutUnit RenderGrid::computePreferredTrackWidth(const GridLength& gridLength, size_t trackIndex) const 247 { 248 if (gridLength.isFlex()) 249 return 0; 250 251 const Length& length = gridLength.length(); 252 234 253 if (length.isFixed()) { 235 254 // Grid areas don't have borders, margins or paddings so we don't need to account for them. … … 269 288 GridTrack& track = tracks[i]; 270 289 const GridTrackSize& trackSize = gridTrackSize(direction, i); 271 const Length& minTrackBreadth = trackSize.minTrackBreadth();272 const Length& maxTrackBreadth = trackSize.maxTrackBreadth();290 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); 291 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth(); 273 292 274 293 track.m_usedBreadth = computeUsedBreadthOfMinLength(direction, minTrackBreadth); 275 track.m_maxBreadth = computeUsedBreadthOfMaxLength(direction, maxTrackBreadth );294 track.m_maxBreadth = computeUsedBreadthOfMaxLength(direction, maxTrackBreadth, track.m_usedBreadth); 276 295 277 296 track.m_maxBreadth = std::max(track.m_maxBreadth, track.m_usedBreadth); … … 290 309 291 310 distributeSpaceToTracks(tracksForDistribution, 0, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth, availableLogicalSpace); 292 } 293 294 LayoutUnit RenderGrid::computeUsedBreadthOfMinLength(TrackSizingDirection direction, const Length& trackLength) const 295 { 311 312 // 4. Grow all Grid tracks having a fraction as the MaxTrackSizingFunction. 313 314 // FIXME: Handle the case where RemainingSpace is not defined. 315 double normalizedFractionBreadth = computeNormalizedFractionBreadth(tracks, direction, availableLogicalSpace); 316 for (size_t i = 0; i < tracksSize; ++i) { 317 const GridTrackSize& trackSize = gridTrackSize(direction, i); 318 if (!trackSize.maxTrackBreadth().isFlex()) 319 continue; 320 321 tracks[i].m_usedBreadth = std::max<LayoutUnit>(tracks[i].m_usedBreadth, normalizedFractionBreadth * trackSize.maxTrackBreadth().flex()); 322 } 323 } 324 325 LayoutUnit RenderGrid::computeUsedBreadthOfMinLength(TrackSizingDirection direction, const GridLength& gridLength) const 326 { 327 if (gridLength.isFlex()) 328 return 0; 329 330 const Length& trackLength = gridLength.length(); 331 ASSERT(!trackLength.isAuto()); 296 332 if (trackLength.isFixed() || trackLength.isPercent() || trackLength.isViewportPercentage()) 297 333 return computeUsedBreadthOfSpecifiedLength(direction, trackLength); 298 334 299 ASSERT(trackLength.isMinContent() || trackLength.isMaxContent() || trackLength.isAuto());335 ASSERT(trackLength.isMinContent() || trackLength.isMaxContent()); 300 336 return 0; 301 337 } 302 338 303 LayoutUnit RenderGrid::computeUsedBreadthOfMaxLength(TrackSizingDirection direction, const Length& trackLength) const 304 { 339 LayoutUnit RenderGrid::computeUsedBreadthOfMaxLength(TrackSizingDirection direction, const GridLength& gridLength, LayoutUnit usedBreadth) const 340 { 341 if (gridLength.isFlex()) 342 return usedBreadth; 343 344 const Length& trackLength = gridLength.length(); 345 ASSERT(!trackLength.isAuto()); 305 346 if (trackLength.isFixed() || trackLength.isPercent() || trackLength.isViewportPercentage()) { 306 347 LayoutUnit computedBreadth = computeUsedBreadthOfSpecifiedLength(direction, trackLength); … … 309 350 } 310 351 311 ASSERT(trackLength.isMinContent() || trackLength.isMaxContent() || trackLength.isAuto());352 ASSERT(trackLength.isMinContent() || trackLength.isMaxContent()); 312 353 return infinity; 313 354 } … … 318 359 ASSERT(trackLength.isFixed() || trackLength.isPercent() || trackLength.isViewportPercentage()); 319 360 return valueForLength(trackLength, direction == ForColumns ? logicalWidth() : computeContentLogicalHeight(style()->logicalHeight())); 361 } 362 363 double RenderGrid::computeNormalizedFractionBreadth(Vector<GridTrack>& tracks, TrackSizingDirection direction, LayoutUnit availableLogicalSpace) const 364 { 365 // |availableLogicalSpace| already accounts for the used breadths so no need to remove it here. 366 367 Vector<GridTrackForNormalization> tracksForNormalization; 368 for (size_t i = 0; i < tracks.size(); ++i) { 369 const GridTrackSize& trackSize = gridTrackSize(direction, i); 370 if (!trackSize.maxTrackBreadth().isFlex()) 371 continue; 372 373 tracksForNormalization.append(GridTrackForNormalization(tracks[i], trackSize.maxTrackBreadth().flex())); 374 } 375 376 // FIXME: Ideally we shouldn't come here without any <flex> grid track. 377 if (tracksForNormalization.isEmpty()) 378 return LayoutUnit(); 379 380 std::sort(tracksForNormalization.begin(), tracksForNormalization.end(), 381 [](const GridTrackForNormalization& track1, const GridTrackForNormalization& track2) { 382 return track1.m_normalizedFlexValue < track2.m_normalizedFlexValue; 383 }); 384 385 // These values work together: as we walk over our grid tracks, we increase fractionValueBasedOnGridItemsRatio 386 // to match a grid track's usedBreadth to <flex> ratio until the total fractions sized grid tracks wouldn't 387 // fit into availableLogicalSpaceIgnoringFractionTracks. 388 double accumulatedFractions = 0; 389 LayoutUnit fractionValueBasedOnGridItemsRatio = 0; 390 LayoutUnit availableLogicalSpaceIgnoringFractionTracks = availableLogicalSpace; 391 392 for (size_t i = 0; i < tracksForNormalization.size(); ++i) { 393 const GridTrackForNormalization& track = tracksForNormalization[i]; 394 if (track.m_normalizedFlexValue > fractionValueBasedOnGridItemsRatio) { 395 // If the normalized flex value (we ordered |tracksForNormalization| by increasing normalized flex value) 396 // will make us overflow our container, then stop. We have the previous step's ratio is the best fit. 397 if (track.m_normalizedFlexValue * accumulatedFractions > availableLogicalSpaceIgnoringFractionTracks) 398 break; 399 400 fractionValueBasedOnGridItemsRatio = track.m_normalizedFlexValue; 401 } 402 403 accumulatedFractions += track.m_flex; 404 // This item was processed so we re-add its used breadth to the available space to accurately count the remaining space. 405 availableLogicalSpaceIgnoringFractionTracks += track.m_track->m_usedBreadth; 406 } 407 408 return availableLogicalSpaceIgnoringFractionTracks / accumulatedFractions; 320 409 } 321 410 … … 413 502 void RenderGrid::resolveContentBasedTrackSizingFunctions(TrackSizingDirection direction, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, LayoutUnit& availableLogicalSpace) 414 503 { 415 // FIXME: Split the grid tracks once we support fractions (step 1 of the algorithm).504 // FIXME: Split the grid tracks into groups that doesn't overlap a <flex> grid track. 416 505 417 506 Vector<GridTrack>& tracks = (direction == ForColumns) ? columnTracks : rowTracks; … … 476 565 LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tracksSize - i); 477 566 LayoutUnit trackBreadth = (tracks[i]->*trackGetter)(); 478 LayoutUnit growthShare = std::min(availableLogicalSpaceShare, track.m_maxBreadth - trackBreadth); 567 LayoutUnit growthShare = std::max(LayoutUnit(), std::min(availableLogicalSpaceShare, track.m_maxBreadth - trackBreadth)); 568 // We should never shrink any grid track or else we can't guarantee we abide by our min-sizing function. 479 569 updatedTrackBreadths[i] = trackBreadth + growthShare; 480 570 availableLogicalSpace -= growthShare; … … 502 592 for (size_t i = 0; i < tracks.size(); ++i) { 503 593 const GridTrackSize& trackSize = gridTrackSize(direction, i); 504 const Length& minTrackBreadth = trackSize.minTrackBreadth();594 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); 505 595 if (computeUsedBreadthOfMinLength(direction, minTrackBreadth) > tracks[i].m_usedBreadth) 506 596 return false;
Note:
See TracChangeset
for help on using the changeset viewer.