summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/RenderGrid.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/rendering/RenderGrid.h
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/rendering/RenderGrid.h')
-rw-r--r--Source/WebCore/rendering/RenderGrid.h218
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())