/* * Copyright (C) 2011 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * 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 * 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 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef RenderGrid_h #define RenderGrid_h #include "core/rendering/OrderIterator.h" #include "core/rendering/RenderBlock.h" namespace WebCore { struct GridCoordinate; struct GridSpan; class GridTrack; enum GridTrackSizingDirection { ForColumns, ForRows }; class RenderGrid FINAL : public RenderBlock { public: RenderGrid(Element*); virtual ~RenderGrid(); virtual const char* renderName() const OVERRIDE; virtual void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) OVERRIDE; virtual bool avoidsFloats() const OVERRIDE { return true; } virtual bool canCollapseAnonymousBlockChild() const OVERRIDE { return false; } void dirtyGrid(); const Vector& columnPositions() const { return m_columnPositions; } const Vector& rowPositions() const { return m_rowPositions; } private: virtual bool isRenderGrid() const OVERRIDE { return true; } virtual void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const OVERRIDE; virtual void computePreferredLogicalWidths() OVERRIDE; virtual void addChild(RenderObject* newChild, RenderObject* beforeChild = 0) OVERRIDE; virtual void removeChild(RenderObject*) OVERRIDE; virtual void styleDidChange(StyleDifference, const RenderStyle*) OVERRIDE; bool explicitGridDidResize(const RenderStyle*) const; bool namedGridLinesDefinitionDidChange(const RenderStyle*) const; class GridIterator; struct GridSizingData; void computedUsedBreadthOfGridTracks(GridTrackSizingDirection, GridSizingData&); void computedUsedBreadthOfGridTracks(GridTrackSizingDirection, GridSizingData&, LayoutUnit& availableLogicalSpace); LayoutUnit computeUsedBreadthOfMinLength(GridTrackSizingDirection, const GridLength&) const; LayoutUnit computeUsedBreadthOfMaxLength(GridTrackSizingDirection, const GridLength&, LayoutUnit usedBreadth) const; LayoutUnit computeUsedBreadthOfSpecifiedLength(GridTrackSizingDirection, const Length&) const; void resolveContentBasedTrackSizingFunctions(GridTrackSizingDirection, GridSizingData&, LayoutUnit& availableLogicalSpace); void growGrid(GridTrackSizingDirection); void insertItemIntoGrid(RenderBox*, size_t rowTrack, size_t columnTrack); void insertItemIntoGrid(RenderBox*, const GridCoordinate&); void placeItemsOnGrid(); void populateExplicitGridAndOrderIterator(); void placeSpecifiedMajorAxisItemsOnGrid(const Vector&); void placeAutoMajorAxisItemsOnGrid(const Vector&); void placeAutoMajorAxisItemOnGrid(RenderBox*); GridTrackSizingDirection autoPlacementMajorAxisDirection() const; GridTrackSizingDirection autoPlacementMinorAxisDirection() const; void layoutGridItems(); void populateGridPositions(const GridSizingData&); virtual bool supportsPartialLayout() const OVERRIDE { return false; } typedef LayoutUnit (RenderGrid::* SizingFunction)(RenderBox*, GridTrackSizingDirection, Vector&); typedef LayoutUnit (GridTrack::* AccumulatorGetter)() const; typedef void (GridTrack::* AccumulatorGrowFunction)(LayoutUnit); typedef bool (GridTrackSize::* FilterFunction)() const; void resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection, GridSizingData&, RenderBox*, FilterFunction, SizingFunction, AccumulatorGetter, AccumulatorGrowFunction); void distributeSpaceToTracks(Vector&, Vector* tracksForGrowthAboveMaxBreadth, AccumulatorGetter, AccumulatorGrowFunction, GridSizingData&, LayoutUnit& availableLogicalSpace); double computeNormalizedFractionBreadth(Vector&, GridTrackSizingDirection, LayoutUnit availableLogicalSpace) const; const GridTrackSize& gridTrackSize(GridTrackSizingDirection, size_t) const; size_t explicitGridColumnCount() const; size_t explicitGridRowCount() const; size_t explicitGridSizeForSide(GridPositionSide) const; LayoutUnit logicalContentHeightForChild(RenderBox*, Vector&); LayoutUnit minContentForChild(RenderBox*, GridTrackSizingDirection, Vector& columnTracks); LayoutUnit maxContentForChild(RenderBox*, GridTrackSizingDirection, Vector& columnTracks); LayoutPoint findChildLogicalPosition(RenderBox*, const GridSizingData&); GridCoordinate cachedGridCoordinate(const RenderBox*) const; GridSpan resolveGridPositionsFromAutoPlacementPosition(const RenderBox*, GridTrackSizingDirection, size_t) const; PassOwnPtr resolveGridPositionsFromStyle(const RenderBox*, GridTrackSizingDirection) const; size_t resolveNamedGridLinePositionFromStyle(const GridPosition&, GridPositionSide) const; size_t resolveGridPositionFromStyle(const GridPosition&, GridPositionSide) const; PassOwnPtr resolveGridPositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&, GridPositionSide) const; PassOwnPtr resolveNamedGridLinePositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&, GridPositionSide) const; PassOwnPtr resolveBeforeStartNamedGridLinePositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&, const Vector&) const; PassOwnPtr resolveAfterEndNamedGridLinePositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&, const Vector&) const; LayoutUnit gridAreaBreadthForChild(const RenderBox* child, GridTrackSizingDirection, const Vector&) const; virtual void paintChildren(PaintInfo&, const LayoutPoint&) OVERRIDE FINAL; void paintChildrenSlowCase(PaintInfo&, const LayoutPoint&); bool gridIsDirty() const { return m_gridIsDirty; } #ifndef NDEBUG bool tracksAreWiderThanMinTrackBreadth(GridTrackSizingDirection, const Vector&); #endif size_t gridColumnCount() const { ASSERT(!gridIsDirty()); return m_grid[0].size(); } size_t gridRowCount() const { ASSERT(!gridIsDirty()); return m_grid.size(); } typedef Vector GridCell; typedef Vector > GridRepresentation; GridRepresentation m_grid; bool m_gridIsDirty; Vector m_rowPositions; Vector m_columnPositions; HashMap m_gridItemCoordinate; OrderIterator m_orderIterator; bool m_gridItemOverflowGridArea; }; DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderGrid, isRenderGrid()); } // namespace WebCore #endif // RenderGrid_h