static GridSpan definiteGridSpanWithNamedLineSpanAgainstOpposite(int oppositeLine, const GridPosition& position, GridPositionSide side, unsigned lastLine, NamedLineCollection& linesCollection) { int start, end; if (side == RowStartSide || side == ColumnStartSide) { start = lookBackForNamedGridLine(oppositeLine - 1, position.spanPosition(), lastLine, linesCollection); end = oppositeLine; } else { start = oppositeLine; end = lookAheadForNamedGridLine(oppositeLine + 1, position.spanPosition(), lastLine, linesCollection); } return GridSpan::untranslatedDefiniteGridSpan(start, end); }
static GridSpan resolveNamedGridLinePositionAgainstOppositePosition(const RenderStyle& gridContainerStyle, int oppositeLine, const GridPosition& position, GridPositionSide side, unsigned autoRepeatTracksCount) { ASSERT(position.isSpan()); ASSERT(!position.namedGridLine().isNull()); // Negative positions are not allowed per the specification and should have been handled during parsing. ASSERT(position.spanPosition() > 0); unsigned lastLine = explicitGridSizeForSide(gridContainerStyle, side, autoRepeatTracksCount); NamedLineCollection linesCollection(gridContainerStyle, position.namedGridLine(), directionFromSide(side), lastLine, autoRepeatTracksCount); return definiteGridSpanWithNamedLineSpanAgainstOpposite(oppositeLine, position, side, lastLine, linesCollection); }
std::unique_ptr<GridSpan> GridResolvedPosition::resolveGridPositionAgainstOppositePosition(const RenderStyle& gridContainerStyle, const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, GridPositionSide side) { if (position.isAuto()) return std::make_unique<GridSpan>(resolvedOppositePosition, resolvedOppositePosition); ASSERT(position.isSpan()); ASSERT(position.spanPosition() > 0); if (!position.namedGridLine().isNull()) { // span 2 'c' -> we need to find the appropriate grid line before / after our opposite position. return resolveNamedGridLinePositionAgainstOppositePosition(gridContainerStyle, resolvedOppositePosition, position, side); } // 'span 1' is contained inside a single grid track regardless of the direction. // That's why the CSS span value is one more than the offset we apply. size_t positionOffset = position.spanPosition() - 1; if (isStartSide(side)) { size_t initialResolvedPosition = std::max<int>(0, resolvedOppositePosition.toInt() - positionOffset); return std::make_unique<GridSpan>(initialResolvedPosition, resolvedOppositePosition); } return std::make_unique<GridSpan>(resolvedOppositePosition, resolvedOppositePosition.toInt() + positionOffset); }
static GridSpan resolveGridPositionAgainstOppositePosition(const RenderStyle& gridContainerStyle, int oppositeLine, const GridPosition& position, GridPositionSide side, unsigned autoRepeatTracksCount) { if (position.isAuto()) { if (isStartSide(side)) return GridSpan::untranslatedDefiniteGridSpan(oppositeLine - 1, oppositeLine); return GridSpan::untranslatedDefiniteGridSpan(oppositeLine, oppositeLine + 1); } ASSERT(position.isSpan()); ASSERT(position.spanPosition() > 0); if (!position.namedGridLine().isNull()) { // span 2 'c' -> we need to find the appropriate grid line before / after our opposite position. return resolveNamedGridLinePositionAgainstOppositePosition(gridContainerStyle, oppositeLine, position, side, autoRepeatTracksCount); } // 'span 1' is contained inside a single grid track regardless of the direction. // That's why the CSS span value is one more than the offset we apply. unsigned positionOffset = position.spanPosition(); if (isStartSide(side)) return GridSpan::untranslatedDefiniteGridSpan(oppositeLine - positionOffset, oppositeLine); return GridSpan::untranslatedDefiniteGridSpan(oppositeLine, oppositeLine + positionOffset); }
PassOwnPtr<GridSpan> GridResolvedPosition::resolveGridPositionAgainstOppositePosition(const RenderStyle& gridContainerStyle, const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, GridPositionSide side) { if (position.isAuto()) return GridSpan::create(resolvedOppositePosition, resolvedOppositePosition); ASSERT(position.isSpan()); ASSERT(position.spanPosition() > 0); if (!position.namedGridLine().isNull()) { // span 2 'c' -> we need to find the appropriate grid line before / after our opposite position. return resolveNamedGridLinePositionAgainstOppositePosition(gridContainerStyle, resolvedOppositePosition, position, side); } return GridSpan::createWithSpanAgainstOpposite(resolvedOppositePosition, position, side); }
unsigned GridPositionsResolver::spanSizeForAutoPlacedItem(const RenderStyle& gridContainerStyle, const RenderBox& gridItem, GridTrackSizingDirection direction) { GridPosition initialPosition, finalPosition; adjustGridPositionsFromStyle(gridContainerStyle, gridItem, direction, initialPosition, finalPosition); // This method will only be used when both positions need to be resolved against the opposite one. ASSERT(initialPosition.shouldBeResolvedAgainstOppositePosition() && finalPosition.shouldBeResolvedAgainstOppositePosition()); if (initialPosition.isAuto() && finalPosition.isAuto()) return 1; GridPosition position = initialPosition.isSpan() ? initialPosition : finalPosition; ASSERT(position.isSpan()); ASSERT(position.spanPosition()); return position.spanPosition(); }
PassOwnPtr<GridSpan> GridResolvedPosition::resolveNamedGridLinePositionAgainstOppositePosition(const RenderStyle& gridContainerStyle, const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, GridPositionSide side) { ASSERT(position.isSpan()); ASSERT(!position.namedGridLine().isNull()); // Negative positions are not allowed per the specification and should have been handled during parsing. ASSERT(position.spanPosition() > 0); const NamedGridLinesMap& gridLinesNames = (side == ColumnStartSide || side == ColumnEndSide) ? gridContainerStyle.namedGridColumnLines() : gridContainerStyle.namedGridRowLines(); NamedGridLinesMap::const_iterator it = gridLinesNames.find(position.namedGridLine()); // If there is no named grid line of that name, we resolve the position to 'auto' (which is equivalent to 'span 1' in this case). // See http://lists.w3.org/Archives/Public/www-style/2013Jun/0394.html. if (it == gridLinesNames.end()) return GridSpan::create(resolvedOppositePosition, resolvedOppositePosition); return GridSpan::createWithNamedSpanAgainstOpposite(resolvedOppositePosition, position, side, it->value); }
GridSpan GridResolvedPosition::resolveGridPositionAgainstOppositePosition(const ComputedStyle& gridContainerStyle, const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, GridPositionSide side) { if (position.isAuto()) { if ((side == ColumnStartSide || side == RowStartSide) && resolvedOppositePosition.toInt()) return GridSpan::definiteGridSpan(resolvedOppositePosition.prev(), resolvedOppositePosition); return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition.next()); } ASSERT(position.isSpan()); ASSERT(position.spanPosition() > 0); if (!position.namedGridLine().isNull()) { // span 2 'c' -> we need to find the appropriate grid line before / after our opposite position. return resolveNamedGridLinePositionAgainstOppositePosition(gridContainerStyle, resolvedOppositePosition, position, side); } return GridSpan::definiteGridSpanWithSpanAgainstOpposite(resolvedOppositePosition, position, side); }
std::unique_ptr<GridSpan> GridResolvedPosition::resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition(const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, const Vector<size_t>& gridLines) { size_t firstLineAfterOppositePositionIndex = gridLines.size() - 1; const size_t* firstLineAfterOppositePosition = std::upper_bound(gridLines.begin(), gridLines.end(), resolvedOppositePosition); if (firstLineAfterOppositePosition != gridLines.end()) firstLineAfterOppositePositionIndex = firstLineAfterOppositePosition - gridLines.begin(); size_t gridLineIndex = std::min(gridLines.size() - 1, firstLineAfterOppositePositionIndex + position.spanPosition() - 1); GridResolvedPosition resolvedGridLinePosition = GridResolvedPosition::adjustGridPositionForRowEndColumnEndSide(gridLines[gridLineIndex]); if (resolvedGridLinePosition < resolvedOppositePosition) resolvedGridLinePosition = resolvedOppositePosition; return std::make_unique<GridSpan>(resolvedOppositePosition, resolvedGridLinePosition); }
std::unique_ptr<GridSpan> GridResolvedPosition::resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition(const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, const Vector<size_t>& gridLines) { size_t gridLineIndex = std::max<int>(0, firstNamedGridLineBeforePosition(resolvedOppositePosition.toInt(), gridLines) - position.spanPosition() + 1); GridResolvedPosition resolvedGridLinePosition = GridResolvedPosition(gridLines[gridLineIndex]); if (resolvedGridLinePosition > resolvedOppositePosition) resolvedGridLinePosition = resolvedOppositePosition; return std::make_unique<GridSpan>(resolvedGridLinePosition, resolvedOppositePosition); }