diff options
Diffstat (limited to 'Source/WebCore/rendering/RenderGrid.h')
-rw-r--r-- | Source/WebCore/rendering/RenderGrid.h | 218 |
1 files changed, 120 insertions, 98 deletions
diff --git a/Source/WebCore/rendering/RenderGrid.h b/Source/WebCore/rendering/RenderGrid.h index 8a82a2993..a1cb0c0c7 100644 --- a/Source/WebCore/rendering/RenderGrid.h +++ b/Source/WebCore/rendering/RenderGrid.h @@ -1,6 +1,6 @@ /* * Copyright (C) 2011 Apple Inc. All rights reserved. - * Copyright (C) 2013 Igalia S.L. All rights reserved. + * Copyright (C) 2013, 2014 Igalia S.L. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -14,7 +14,7 @@ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR @@ -24,121 +24,143 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef RenderGrid_h -#define RenderGrid_h +#pragma once -#include "OrderIterator.h" +#include "Grid.h" +#include "GridTrackSizingAlgorithm.h" #include "RenderBlock.h" namespace WebCore { -class GridCoordinate; +class GridArea; class GridSpan; -class GridTrack; + +struct ContentAlignmentData; + +enum GridAxisPosition {GridAxisStart, GridAxisEnd, GridAxisCenter}; class RenderGrid final : public RenderBlock { public: - RenderGrid(Element&, PassRef<RenderStyle>); + RenderGrid(Element&, RenderStyle&&); virtual ~RenderGrid(); - Element& element() const { return toElement(nodeForNonAnonymous()); } + Element& element() const { return downcast<Element>(nodeForNonAnonymous()); } + + void styleDidChange(StyleDifference, const RenderStyle* oldStyle) override; + void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) override; + + bool avoidsFloats() const override { return true; } + bool canDropAnonymousBlockChild() const override { return false; } - virtual void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) override; + void dirtyGrid(); + Vector<LayoutUnit> trackSizesForComputedStyle(GridTrackSizingDirection) const; - virtual bool avoidsFloats() const override { return true; } - virtual bool canCollapseAnonymousBlockChild() const override { return false; } + const Vector<LayoutUnit>& columnPositions() const { return m_columnPositions; } + const Vector<LayoutUnit>& rowPositions() const { return m_rowPositions; } - enum GridPositionSide { - ColumnStartSide, - ColumnEndSide, - RowStartSide, - RowEndSide - }; + unsigned autoRepeatCountForDirection(GridTrackSizingDirection direction) const { return m_grid.autoRepeatTracks(direction); } + // Required by GridTrackSizingAlgorithm. Keep them under control. + bool isOrthogonalChild(const RenderBox&) const; + LayoutUnit guttersSize(const Grid&, GridTrackSizingDirection, unsigned startLine, unsigned span) const; private: - virtual const char* renderName() const override; - virtual bool isRenderGrid() const override { return true; } - virtual void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const override; - virtual void computePreferredLogicalWidths() override; - - class GridIterator; - class GridSizingData; - enum TrackSizingDirection { ForColumns, ForRows }; - void computedUsedBreadthOfGridTracks(TrackSizingDirection, GridSizingData&); - void computedUsedBreadthOfGridTracks(TrackSizingDirection, GridSizingData&, LayoutUnit& availableLogicalSpace); - LayoutUnit computeUsedBreadthOfMinLength(TrackSizingDirection, const GridLength&) const; - LayoutUnit computeUsedBreadthOfMaxLength(TrackSizingDirection, const GridLength&, LayoutUnit usedBreadth) const; - LayoutUnit computeUsedBreadthOfSpecifiedLength(TrackSizingDirection, const Length&) const; - void resolveContentBasedTrackSizingFunctions(TrackSizingDirection, GridSizingData&); - - void growGrid(TrackSizingDirection); - void insertItemIntoGrid(RenderBox*, size_t rowTrack, size_t columnTrack); - void insertItemIntoGrid(RenderBox*, const GridCoordinate&); - void placeItemsOnGrid(); - void populateExplicitGridAndOrderIterator(); - void placeSpecifiedMajorAxisItemsOnGrid(Vector<RenderBox*>); - void placeAutoMajorAxisItemsOnGrid(Vector<RenderBox*>); - void placeAutoMajorAxisItemOnGrid(RenderBox*); - TrackSizingDirection autoPlacementMajorAxisDirection() const; - TrackSizingDirection autoPlacementMinorAxisDirection() const; + const char* renderName() const override; + bool isRenderGrid() const override { return true; } + void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const override; + + void addChild(RenderObject* newChild, RenderObject* beforeChild) final; + void removeChild(RenderObject&) final; + + bool explicitGridDidResize(const RenderStyle&) const; + bool namedGridLinesDefinitionDidChange(const RenderStyle&) const; + + std::optional<LayoutUnit> computeIntrinsicLogicalContentHeightUsing(Length logicalHeightLength, std::optional<LayoutUnit> intrinsicContentHeight, LayoutUnit borderAndPadding) const override; + + unsigned computeAutoRepeatTracksCount(GridTrackSizingDirection, SizingOperation) const; + + std::unique_ptr<OrderedTrackIndexSet> computeEmptyTracksForAutoRepeat(Grid&, GridTrackSizingDirection) const; + + void placeItemsOnGrid(Grid&, SizingOperation) const; + void populateExplicitGridAndOrderIterator(Grid&) const; + std::unique_ptr<GridArea> createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(Grid&, const RenderBox&, GridTrackSizingDirection, const GridSpan&) const; + void placeSpecifiedMajorAxisItemsOnGrid(Grid&, const Vector<RenderBox*>&) const; + void placeAutoMajorAxisItemsOnGrid(Grid&, const Vector<RenderBox*>&) const; + typedef std::pair<unsigned, unsigned> AutoPlacementCursor; + void placeAutoMajorAxisItemOnGrid(Grid&, RenderBox&, AutoPlacementCursor&) const; + GridTrackSizingDirection autoPlacementMajorAxisDirection() const; + GridTrackSizingDirection autoPlacementMinorAxisDirection() const; + + bool canPerformSimplifiedLayout() const final; + void prepareChildForPositionedLayout(RenderBox&); + void layoutPositionedObject(RenderBox&, bool relayoutChildren, bool fixedPositionObjectsOnly) override; + void offsetAndBreadthForPositionedChild(const RenderBox&, GridTrackSizingDirection, LayoutUnit& offset, LayoutUnit& breadth); + + void computeTrackSizesForDefiniteSize(GridTrackSizingDirection, LayoutUnit availableSpace); + void computeTrackSizesForIndefiniteSize(GridTrackSizingAlgorithm&, GridTrackSizingDirection, Grid&, LayoutUnit& minIntrinsicSize, LayoutUnit& maxIntrinsicSize) const; + LayoutUnit computeTrackBasedLogicalHeight() const; + + void repeatTracksSizingIfNeeded(LayoutUnit availableSpaceForColumns, LayoutUnit availableSpaceForRows); void layoutGridItems(); - void clearGrid(); - - typedef LayoutUnit (RenderGrid::* SizingFunction)(RenderBox*, TrackSizingDirection, Vector<GridTrack>&); - typedef LayoutUnit (GridTrack::* AccumulatorGetter)() const; - typedef void (GridTrack::* AccumulatorGrowFunction)(LayoutUnit); - typedef bool (GridTrackSize::* FilterFunction)() const; - void resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDirection, GridSizingData&, RenderBox*, FilterFunction, SizingFunction, AccumulatorGetter, AccumulatorGrowFunction); - void distributeSpaceToTracks(Vector<GridTrack*>&, Vector<GridTrack*>* tracksForGrowthAboveMaxBreadth, AccumulatorGetter, AccumulatorGrowFunction, GridSizingData&, LayoutUnit& availableLogicalSpace); - - double computeNormalizedFractionBreadth(Vector<GridTrack>&, TrackSizingDirection, LayoutUnit availableLogicalSpace) const; - - const GridTrackSize& gridTrackSize(TrackSizingDirection, size_t) const; - size_t explicitGridColumnCount() const; - size_t explicitGridRowCount() const; - size_t explicitGridSizeForSide(GridPositionSide) const; - - LayoutUnit logicalContentHeightForChild(RenderBox*, Vector<GridTrack>&); - LayoutUnit minContentForChild(RenderBox*, TrackSizingDirection, Vector<GridTrack>& columnTracks); - LayoutUnit maxContentForChild(RenderBox*, TrackSizingDirection, Vector<GridTrack>& columnTracks); - LayoutPoint findChildLogicalPosition(RenderBox*, const GridSizingData&); - GridCoordinate cachedGridCoordinate(const RenderBox*) const; - - GridSpan resolveGridPositionsFromAutoPlacementPosition(const RenderBox*, TrackSizingDirection, size_t) const; - PassOwnPtr<GridSpan> resolveGridPositionsFromStyle(const RenderBox*, TrackSizingDirection) const; - size_t resolveNamedGridLinePositionFromStyle(const GridPosition&, GridPositionSide) const; - size_t resolveGridPositionFromStyle(const GridPosition&, GridPositionSide) const; - PassOwnPtr<GridSpan> resolveGridPositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&, GridPositionSide) const; - PassOwnPtr<GridSpan> resolveNamedGridLinePositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&, GridPositionSide) const; - PassOwnPtr<GridSpan> resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&, const Vector<size_t>&) const; - PassOwnPtr<GridSpan> resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&, const Vector<size_t>&) const; - - LayoutUnit gridAreaBreadthForChild(const RenderBox* child, TrackSizingDirection, const Vector<GridTrack>&) const; - - virtual void paintChildren(PaintInfo& forSelf, const LayoutPoint& paintOffset, PaintInfo& forChild, bool usePrintRect) override final; - -#ifndef NDEBUG - bool tracksAreWiderThanMinTrackBreadth(TrackSizingDirection, const Vector<GridTrack>&); - bool gridWasPopulated() const { return !m_grid.isEmpty() && !m_grid[0].isEmpty(); } -#endif - - size_t gridColumnCount() const - { - ASSERT(gridWasPopulated()); - return m_grid[0].size(); - } - size_t gridRowCount() const - { - ASSERT(gridWasPopulated()); - return m_grid.size(); - } - - Vector<Vector<Vector<RenderBox*, 1>>> m_grid; - HashMap<const RenderBox*, GridCoordinate> m_gridItemCoordinate; - OrderIterator m_orderIterator; + void populateGridPositionsForDirection(GridTrackSizingDirection); + + GridAxisPosition columnAxisPositionForChild(const RenderBox&) const; + GridAxisPosition rowAxisPositionForChild(const RenderBox&) const; + LayoutUnit columnAxisOffsetForChild(const RenderBox&) const; + LayoutUnit rowAxisOffsetForChild(const RenderBox&) const; + ContentAlignmentData computeContentPositionAndDistributionOffset(GridTrackSizingDirection, const LayoutUnit& availableFreeSpace, unsigned numberOfGridTracks) const; + LayoutPoint findChildLogicalPosition(const RenderBox&) const; + GridArea cachedGridArea(const RenderBox&) const; + GridSpan cachedGridSpan(const RenderBox&, GridTrackSizingDirection) const; + + LayoutUnit gridAreaBreadthForChildIncludingAlignmentOffsets(const RenderBox&, GridTrackSizingDirection) const; + + void applyStretchAlignmentToTracksIfNeeded(GridTrackSizingDirection); + + void paintChildren(PaintInfo& forSelf, const LayoutPoint& paintOffset, PaintInfo& forChild, bool usePrintRect) override; + bool needToStretchChildLogicalHeight(const RenderBox&) const; + LayoutUnit marginLogicalHeightForChild(const RenderBox&) const; + LayoutUnit computeMarginLogicalSizeForChild(GridTrackSizingDirection, const RenderBox&) const; + LayoutUnit availableAlignmentSpaceForChildBeforeStretching(LayoutUnit gridAreaBreadthForChild, const RenderBox&) const; + StyleSelfAlignmentData justifySelfForChild(const RenderBox&) const; + StyleSelfAlignmentData alignSelfForChild(const RenderBox&) const; + void applyStretchAlignmentToChildIfNeeded(RenderBox&); + bool hasAutoSizeInColumnAxis(const RenderBox& child) const { return isHorizontalWritingMode() ? child.style().height().isAuto() : child.style().width().isAuto(); } + bool hasAutoSizeInRowAxis(const RenderBox& child) const { return isHorizontalWritingMode() ? child.style().width().isAuto() : child.style().height().isAuto(); } + bool allowedToStretchChildAlongColumnAxis(const RenderBox& child) const { return alignSelfForChild(child).position() == ItemPositionStretch && hasAutoSizeInColumnAxis(child) && !hasAutoMarginsInColumnAxis(child); } + bool allowedToStretchChildAlongRowAxis(const RenderBox& child) const { return justifySelfForChild(child).position() == ItemPositionStretch && hasAutoSizeInRowAxis(child) && !hasAutoMarginsInRowAxis(child); } + bool hasAutoMarginsInColumnAxis(const RenderBox&) const; + bool hasAutoMarginsInRowAxis(const RenderBox&) const; + void resetAutoMarginsAndLogicalTopInColumnAxis(RenderBox& child); + void updateAutoMarginsInColumnAxisIfNeeded(RenderBox&); + void updateAutoMarginsInRowAxisIfNeeded(RenderBox&); + + int baselinePosition(FontBaseline, bool firstLine, LineDirectionMode, LinePositionMode = PositionOnContainingLine) const final; + std::optional<int> firstLineBaseline() const final; + std::optional<int> inlineBlockBaseline(LineDirectionMode) const final; + bool isInlineBaselineAlignedChild(const RenderBox&) const; + + LayoutUnit gridGapForDirection(GridTrackSizingDirection) const; + + unsigned numTracks(GridTrackSizingDirection, const Grid&) const; + + LayoutUnit translateRTLCoordinate(LayoutUnit) const; + + GridTrackSizingDirection flowAwareDirectionForChild(const RenderBox&, GridTrackSizingDirection) const; + + Grid m_grid; + + GridTrackSizingAlgorithm m_trackSizingAlgorithm; + + Vector<LayoutUnit> m_columnPositions; + Vector<LayoutUnit> m_rowPositions; + LayoutUnit m_offsetBetweenColumns; + LayoutUnit m_offsetBetweenRows; + + std::optional<LayoutUnit> m_minContentHeight; + std::optional<LayoutUnit> m_maxContentHeight; }; } // namespace WebCore -#endif // RenderGrid_h +SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(RenderGrid, isRenderGrid()) |