Commit 1ac0ca97 authored by rego's avatar rego Committed by Commit bot

[css-grid] Refactor GridSpan to avoid pointers

Add new boolean to know if a GridSpan is definite or indefinite.
That way we don't need to use pointers and we can always have two
GridSpans in GridCoordinate, if the position is "auto" the GridSpan will
be marked as indefinite. This will allow in a follow-up patch to avoid
repeated calls to methods that resolve positions.

Most operations in GridSpan are restricted to definite GridSpans (access
to positions, iterator, etc.). For indefinite GridSpans we only need to
know that they're indefinite we shouldn't use the rest of the data.

No new tests, no change of behavior.

BUG=444011

Review URL: https://codereview.chromium.org/1459373002

Cr-Commit-Position: refs/heads/master@{#361119}
parent cdc9400e
......@@ -51,13 +51,13 @@ static String stringForPosition(const NamedGridAreaMap& gridAreaMap, size_t row,
for (const auto& item : gridAreaMap) {
const GridCoordinate& coordinate = item.value;
if (row >= coordinate.rows.resolvedInitialPosition.toInt() && row < coordinate.rows.resolvedFinalPosition.toInt())
if (row >= coordinate.rows.resolvedInitialPosition().toInt() && row < coordinate.rows.resolvedFinalPosition().toInt())
candidates.append(item.key);
}
for (const auto& item : gridAreaMap) {
const GridCoordinate& coordinate = item.value;
if (column >= coordinate.columns.resolvedInitialPosition.toInt() && column < coordinate.columns.resolvedFinalPosition.toInt() && candidates.contains(item.key))
if (column >= coordinate.columns.resolvedInitialPosition().toInt() && column < coordinate.columns.resolvedFinalPosition().toInt() && candidates.contains(item.key))
return item.key;
}
......
......@@ -2954,24 +2954,24 @@ bool CSSPropertyParser::parseGridTemplateAreasRow(NamedGridAreaMap& gridAreaMap,
NamedGridAreaMap::iterator gridAreaIt = gridAreaMap.find(gridAreaName);
if (gridAreaIt == gridAreaMap.end()) {
gridAreaMap.add(gridAreaName, GridCoordinate(GridSpan(rowCount, rowCount + 1), GridSpan(currentCol, lookAheadCol)));
gridAreaMap.add(gridAreaName, GridCoordinate(GridSpan::definiteGridSpan(rowCount, rowCount + 1), GridSpan::definiteGridSpan(currentCol, lookAheadCol)));
} else {
GridCoordinate& gridCoordinate = gridAreaIt->value;
// The following checks test that the grid area is a single filled-in rectangle.
// 1. The new row is adjacent to the previously parsed row.
if (rowCount != gridCoordinate.rows.resolvedFinalPosition.toInt())
if (rowCount != gridCoordinate.rows.resolvedFinalPosition().toInt())
return false;
// 2. The new area starts at the same position as the previously parsed area.
if (currentCol != gridCoordinate.columns.resolvedInitialPosition.toInt())
if (currentCol != gridCoordinate.columns.resolvedInitialPosition().toInt())
return false;
// 3. The new area ends at the same position as the previously parsed area.
if (lookAheadCol != gridCoordinate.columns.resolvedFinalPosition.toInt())
if (lookAheadCol != gridCoordinate.columns.resolvedFinalPosition().toInt())
return false;
++gridCoordinate.rows.resolvedFinalPosition;
gridCoordinate.rows = GridSpan::definiteGridSpan(gridCoordinate.rows.resolvedInitialPosition(), gridCoordinate.rows.resolvedFinalPosition().next());
}
currentCol = lookAheadCol - 1;
}
......
......@@ -521,12 +521,12 @@ void StyleBuilderConverter::createImplicitNamedGridLinesFromGridArea(const Named
GridSpan areaSpan = direction == ForRows ? namedGridAreaEntry.value.rows : namedGridAreaEntry.value.columns;
{
NamedGridLinesMap::AddResult startResult = namedGridLines.add(namedGridAreaEntry.key + "-start", Vector<size_t>());
startResult.storedValue->value.append(areaSpan.resolvedInitialPosition.toInt());
startResult.storedValue->value.append(areaSpan.resolvedInitialPosition().toInt());
std::sort(startResult.storedValue->value.begin(), startResult.storedValue->value.end());
}
{
NamedGridLinesMap::AddResult endResult = namedGridLines.add(namedGridAreaEntry.key + "-end", Vector<size_t>());
endResult.storedValue->value.append(areaSpan.resolvedFinalPosition.toInt());
endResult.storedValue->value.append(areaSpan.resolvedFinalPosition().toInt());
std::sort(endResult.storedValue->value.begin(), endResult.storedValue->value.end());
}
}
......
......@@ -25,7 +25,7 @@ static GridSpan dirtiedGridAreas(const Vector<LayoutUnit>& coordinates, LayoutUn
--endGridAreaIndex;
// GridSpan stores lines' indexes (not tracks' indexes).
return GridSpan(startGridAreaIndex, endGridAreaIndex + 1);
return GridSpan::definiteGridSpan(startGridAreaIndex, endGridAreaIndex + 1);
}
class GridItemsSorter {
......
......@@ -49,37 +49,43 @@ const size_t kGridMaxTracks = 1000000;
struct GridSpan {
USING_FAST_MALLOC(GridSpan);
public:
static PassOwnPtr<GridSpan> create(const GridResolvedPosition& resolvedInitialPosition, const GridResolvedPosition& resolvedFinalPosition)
static GridSpan definiteGridSpan(const GridResolvedPosition& resolvedInitialPosition, const GridResolvedPosition& resolvedFinalPosition)
{
return GridSpan(resolvedInitialPosition, resolvedFinalPosition, Definite);
}
static GridSpan indefiniteGridSpan()
{
return adoptPtr(new GridSpan(resolvedInitialPosition, resolvedFinalPosition));
return GridSpan(0, 1, Indefinite);
}
static PassOwnPtr<GridSpan> createWithSpanAgainstOpposite(const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, GridPositionSide side)
static GridSpan definiteGridSpanWithSpanAgainstOpposite(const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, GridPositionSide side)
{
size_t positionOffset = position.spanPosition();
if (side == ColumnStartSide || side == RowStartSide) {
if (resolvedOppositePosition == 0)
return GridSpan::create(resolvedOppositePosition, resolvedOppositePosition.next());
return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition.next());
GridResolvedPosition initialResolvedPosition = GridResolvedPosition(std::max<int>(0, resolvedOppositePosition.toInt() - positionOffset));
return GridSpan::create(initialResolvedPosition, resolvedOppositePosition);
return GridSpan::definiteGridSpan(initialResolvedPosition, resolvedOppositePosition);
}
return GridSpan::create(resolvedOppositePosition, GridResolvedPosition(resolvedOppositePosition.toInt() + positionOffset));
return GridSpan::definiteGridSpan(resolvedOppositePosition, GridResolvedPosition(resolvedOppositePosition.toInt() + positionOffset));
}
static PassOwnPtr<GridSpan> createWithNamedSpanAgainstOpposite(const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, GridPositionSide side, const Vector<size_t>& gridLines)
static GridSpan definiteGridSpanWithNamedSpanAgainstOpposite(const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, GridPositionSide side, const Vector<size_t>& gridLines)
{
if (side == RowStartSide || side == ColumnStartSide)
return createWithInitialNamedSpanAgainstOpposite(resolvedOppositePosition, position, gridLines);
return definiteGridSpanWithInitialNamedSpanAgainstOpposite(resolvedOppositePosition, position, gridLines);
return createWithFinalNamedSpanAgainstOpposite(resolvedOppositePosition, position, gridLines);
return definiteGridSpanWithFinalNamedSpanAgainstOpposite(resolvedOppositePosition, position, gridLines);
}
static PassOwnPtr<GridSpan> createWithInitialNamedSpanAgainstOpposite(const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, const Vector<size_t>& gridLines)
static GridSpan definiteGridSpanWithInitialNamedSpanAgainstOpposite(const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, const Vector<size_t>& gridLines)
{
if (resolvedOppositePosition == 0)
return GridSpan::create(resolvedOppositePosition, resolvedOppositePosition.next());
return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition.next());
size_t firstLineBeforeOppositePositionIndex = 0;
const size_t* firstLineBeforeOppositePosition = std::lower_bound(gridLines.begin(), gridLines.end(), resolvedOppositePosition.toInt());
......@@ -89,10 +95,10 @@ public:
GridResolvedPosition resolvedGridLinePosition = GridResolvedPosition(gridLines[gridLineIndex]);
if (resolvedGridLinePosition >= resolvedOppositePosition)
resolvedGridLinePosition = resolvedOppositePosition.prev();
return GridSpan::create(resolvedGridLinePosition, resolvedOppositePosition);
return GridSpan::definiteGridSpan(resolvedGridLinePosition, resolvedOppositePosition);
}
static PassOwnPtr<GridSpan> createWithFinalNamedSpanAgainstOpposite(const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, const Vector<size_t>& gridLines)
static GridSpan definiteGridSpanWithFinalNamedSpanAgainstOpposite(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.toInt());
......@@ -103,40 +109,66 @@ public:
if (resolvedGridLinePosition <= resolvedOppositePosition)
resolvedGridLinePosition = resolvedOppositePosition.next();
return GridSpan::create(resolvedOppositePosition, resolvedGridLinePosition);
return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedGridLinePosition);
}
GridSpan(const GridResolvedPosition& resolvedInitialPosition, const GridResolvedPosition& resolvedFinalPosition)
: resolvedInitialPosition(std::min(resolvedInitialPosition.toInt(), kGridMaxTracks - 1))
, resolvedFinalPosition(std::min(resolvedFinalPosition.toInt(), kGridMaxTracks))
bool operator==(const GridSpan& o) const
{
ASSERT(resolvedInitialPosition < resolvedFinalPosition);
return m_type == o.m_type && m_resolvedInitialPosition == o.m_resolvedInitialPosition && m_resolvedFinalPosition == o.m_resolvedFinalPosition;
}
bool operator==(const GridSpan& o) const
size_t integerSpan() const
{
return resolvedInitialPosition == o.resolvedInitialPosition && resolvedFinalPosition == o.resolvedFinalPosition;
ASSERT(isDefinite());
return m_resolvedFinalPosition.toInt() - m_resolvedInitialPosition.toInt();
}
size_t integerSpan() const
const GridResolvedPosition& resolvedInitialPosition() const
{
return resolvedFinalPosition.toInt() - resolvedInitialPosition.toInt();
ASSERT(isDefinite());
return m_resolvedInitialPosition;
}
GridResolvedPosition resolvedInitialPosition;
GridResolvedPosition resolvedFinalPosition;
const GridResolvedPosition& resolvedFinalPosition() const
{
ASSERT(isDefinite());
return m_resolvedFinalPosition;
}
typedef GridResolvedPosition iterator;
iterator begin() const
{
return resolvedInitialPosition;
ASSERT(isDefinite());
return m_resolvedInitialPosition;
}
iterator end() const
{
return resolvedFinalPosition;
ASSERT(isDefinite());
return m_resolvedFinalPosition;
}
bool isDefinite() const
{
return m_type == Definite;
}
private:
enum GridSpanType {Definite, Indefinite};
GridSpan(const GridResolvedPosition& resolvedInitialPosition, const GridResolvedPosition& resolvedFinalPosition, GridSpanType type)
: m_resolvedInitialPosition(std::min(resolvedInitialPosition.toInt(), kGridMaxTracks - 1))
, m_resolvedFinalPosition(std::min(resolvedFinalPosition.toInt(), kGridMaxTracks))
, m_type(type)
{
ASSERT(resolvedInitialPosition < resolvedFinalPosition);
}
GridResolvedPosition m_resolvedInitialPosition;
GridResolvedPosition m_resolvedFinalPosition;
GridSpanType m_type;
};
// This represents a grid area that spans in both rows' and columns' direction.
......@@ -145,8 +177,8 @@ struct GridCoordinate {
public:
// HashMap requires a default constuctor.
GridCoordinate()
: columns(0, 1)
, rows(0, 1)
: columns(GridSpan::indefiniteGridSpan())
, rows(GridSpan::indefiniteGridSpan())
{
}
......@@ -170,13 +202,13 @@ public:
{
switch (side) {
case ColumnStartSide:
return columns.resolvedInitialPosition;
return columns.resolvedInitialPosition();
case ColumnEndSide:
return columns.resolvedFinalPosition;
return columns.resolvedFinalPosition();
case RowStartSide:
return rows.resolvedInitialPosition;
return rows.resolvedInitialPosition();
case RowEndSide:
return rows.resolvedFinalPosition;
return rows.resolvedFinalPosition();
}
ASSERT_NOT_REACHED();
return 0;
......
......@@ -75,14 +75,14 @@ GridSpan GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(con
GridResolvedPosition resolvedFinalPosition = resolvedInitialPosition.next();
if (initialPosition.isSpan())
return *resolveGridPositionAgainstOppositePosition(gridContainerStyle, resolvedInitialPosition, initialPosition, finalSide);
return resolveGridPositionAgainstOppositePosition(gridContainerStyle, resolvedInitialPosition, initialPosition, finalSide);
if (finalPosition.isSpan())
return *resolveGridPositionAgainstOppositePosition(gridContainerStyle, resolvedInitialPosition, finalPosition, finalSide);
return resolveGridPositionAgainstOppositePosition(gridContainerStyle, resolvedInitialPosition, finalPosition, finalSide);
return GridSpan(resolvedInitialPosition, resolvedFinalPosition);
return GridSpan::definiteGridSpan(resolvedInitialPosition, resolvedFinalPosition);
}
PassOwnPtr<GridSpan> GridResolvedPosition::resolveGridPositionsFromStyle(const ComputedStyle& gridContainerStyle, const LayoutBox& gridItem, GridTrackSizingDirection direction)
GridSpan GridResolvedPosition::resolveGridPositionsFromStyle(const ComputedStyle& gridContainerStyle, const LayoutBox& gridItem, GridTrackSizingDirection direction)
{
GridPosition initialPosition, finalPosition;
initialAndFinalPositionsFromStyle(gridContainerStyle, gridItem, direction, initialPosition, finalPosition);
......@@ -92,7 +92,7 @@ PassOwnPtr<GridSpan> GridResolvedPosition::resolveGridPositionsFromStyle(const C
if (initialPosition.shouldBeResolvedAgainstOppositePosition() && finalPosition.shouldBeResolvedAgainstOppositePosition()) {
// We can't get our grid positions without running the auto placement algorithm.
return nullptr;
return GridSpan::indefiniteGridSpan();
}
if (initialPosition.shouldBeResolvedAgainstOppositePosition()) {
......@@ -114,7 +114,7 @@ PassOwnPtr<GridSpan> GridResolvedPosition::resolveGridPositionsFromStyle(const C
if (resolvedFinalPosition <= resolvedInitialPosition)
resolvedFinalPosition = resolvedInitialPosition.next();
return adoptPtr(new GridSpan(resolvedInitialPosition, resolvedFinalPosition));
return GridSpan::definiteGridSpan(resolvedInitialPosition, resolvedFinalPosition);
}
size_t GridResolvedPosition::explicitGridColumnCount(const ComputedStyle& gridContainerStyle)
......@@ -210,12 +210,12 @@ GridResolvedPosition GridResolvedPosition::resolveGridPositionFromStyle(const Co
return GridResolvedPosition(0);
}
PassOwnPtr<GridSpan> GridResolvedPosition::resolveGridPositionAgainstOppositePosition(const ComputedStyle& gridContainerStyle, const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, GridPositionSide side)
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::create(resolvedOppositePosition.prev(), resolvedOppositePosition);
return GridSpan::create(resolvedOppositePosition, resolvedOppositePosition.next());
return GridSpan::definiteGridSpan(resolvedOppositePosition.prev(), resolvedOppositePosition);
return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition.next());
}
ASSERT(position.isSpan());
......@@ -226,10 +226,10 @@ PassOwnPtr<GridSpan> GridResolvedPosition::resolveGridPositionAgainstOppositePos
return resolveNamedGridLinePositionAgainstOppositePosition(gridContainerStyle, resolvedOppositePosition, position, side);
}
return GridSpan::createWithSpanAgainstOpposite(resolvedOppositePosition, position, side);
return GridSpan::definiteGridSpanWithSpanAgainstOpposite(resolvedOppositePosition, position, side);
}
PassOwnPtr<GridSpan> GridResolvedPosition::resolveNamedGridLinePositionAgainstOppositePosition(const ComputedStyle& gridContainerStyle, const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, GridPositionSide side)
GridSpan GridResolvedPosition::resolveNamedGridLinePositionAgainstOppositePosition(const ComputedStyle& gridContainerStyle, const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, GridPositionSide side)
{
ASSERT(position.isSpan());
ASSERT(!position.namedGridLine().isNull());
......@@ -243,11 +243,11 @@ PassOwnPtr<GridSpan> GridResolvedPosition::resolveNamedGridLinePositionAgainstOp
// See http://lists.w3.org/Archives/Public/www-style/2013Jun/0394.html.
if (it == gridLinesNames.end()) {
if ((side == ColumnStartSide || side == RowStartSide) && resolvedOppositePosition.toInt())
return GridSpan::create(resolvedOppositePosition.prev(), resolvedOppositePosition);
return GridSpan::create(resolvedOppositePosition, resolvedOppositePosition.next());
return GridSpan::definiteGridSpan(resolvedOppositePosition.prev(), resolvedOppositePosition);
return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition.next());
}
return GridSpan::createWithNamedSpanAgainstOpposite(resolvedOppositePosition, position, side, it->value);
return GridSpan::definiteGridSpanWithNamedSpanAgainstOpposite(resolvedOppositePosition, position, side, it->value);
}
} // namespace blink
......@@ -37,11 +37,11 @@ public:
static GridPositionSide finalPositionSide(GridTrackSizingDirection);
static void initialAndFinalPositionsFromStyle(const ComputedStyle&, const LayoutBox&, GridTrackSizingDirection, GridPosition &initialPosition, GridPosition &finalPosition);
static GridSpan resolveGridPositionsFromAutoPlacementPosition(const ComputedStyle&, const LayoutBox&, GridTrackSizingDirection, const GridResolvedPosition&);
static PassOwnPtr<GridSpan> resolveGridPositionsFromStyle(const ComputedStyle&, const LayoutBox&, GridTrackSizingDirection);
static GridSpan resolveGridPositionsFromStyle(const ComputedStyle&, const LayoutBox&, GridTrackSizingDirection);
static GridResolvedPosition resolveNamedGridLinePositionFromStyle(const ComputedStyle&, const GridPosition&, GridPositionSide);
static GridResolvedPosition resolveGridPositionFromStyle(const ComputedStyle&, const GridPosition&, GridPositionSide);
static PassOwnPtr<GridSpan> resolveGridPositionAgainstOppositePosition(const ComputedStyle&, const GridResolvedPosition& resolvedOppositePosition, const GridPosition&, GridPositionSide);
static PassOwnPtr<GridSpan> resolveNamedGridLinePositionAgainstOppositePosition(const ComputedStyle&, const GridResolvedPosition& resolvedOppositePosition, const GridPosition&, GridPositionSide);
static GridSpan resolveGridPositionAgainstOppositePosition(const ComputedStyle&, const GridResolvedPosition& resolvedOppositePosition, const GridPosition&, GridPositionSide);
static GridSpan resolveNamedGridLinePositionAgainstOppositePosition(const ComputedStyle&, const GridResolvedPosition& resolvedOppositePosition, const GridPosition&, GridPositionSide);
GridResolvedPosition(size_t position)
: m_integerPosition(position)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment