Changeset 140894 in webkit


Ignore:
Timestamp:
Jan 25, 2013 5:52:12 PM (11 years ago)
Author:
jchaffraix@webkit.org
Message:

Share code between the different min-content / max-content code paths
https://bugs.webkit.org/show_bug.cgi?id=107740

Reviewed by Tony Chang.

This change enables sharing between the different content based computations
by using function pointers to specialize the behavior as needed.

Refactoring, covered by existing tests.

  • rendering/RenderGrid.cpp:

(WebCore::GridTrack::growUsedBreadth):
(WebCore::GridTrack::usedBreadth):
(WebCore::GridTrack::growMaxBreadth):
Added the previous getters / setters that will be passed to resolveContentBasedTrackSizingFunctionsForItems.

(WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions):
Updated to reuse resolveContentBasedTrackSizingFunctionsForItems instead of duplicating code.
One change is that now, we properly apply the min on all branches, which was an oversight of
the previous patches.

(WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForItems):
Added this function as the core content-sized resolution function. For now, we pass the
current track by direction & index to be able to filter grid items.

  • rendering/RenderGrid.h:

Added resolveContentBasedTrackSizingFunctionsForItems and the function pointers typedef's.

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r140893 r140894  
     12013-01-25  Julien Chaffraix  <jchaffraix@webkit.org>
     2
     3        Share code between the different min-content / max-content code paths
     4        https://bugs.webkit.org/show_bug.cgi?id=107740
     5
     6        Reviewed by Tony Chang.
     7
     8        This change enables sharing between the different content based computations
     9        by using function pointers to specialize the behavior as needed.
     10
     11        Refactoring, covered by existing tests.
     12
     13        * rendering/RenderGrid.cpp:
     14        (WebCore::GridTrack::growUsedBreadth):
     15        (WebCore::GridTrack::usedBreadth):
     16        (WebCore::GridTrack::growMaxBreadth):
     17        Added the previous getters / setters that will be passed to resolveContentBasedTrackSizingFunctionsForItems.
     18
     19        (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions):
     20        Updated to reuse resolveContentBasedTrackSizingFunctionsForItems instead of duplicating code.
     21        One change is that now, we properly apply the min on all branches, which was an oversight of
     22        the previous patches.
     23
     24        (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForItems):
     25        Added this function as the core content-sized resolution function. For now, we pass the
     26        current track by direction & index to be able to filter grid items.
     27
     28        * rendering/RenderGrid.h:
     29        Added resolveContentBasedTrackSizingFunctionsForItems and the function pointers typedef's.
     30
    1312013-01-25  Kentaro Hara  <haraken@chromium.org>
    232
  • trunk/Source/WebCore/rendering/RenderGrid.cpp

    r140583 r140894  
    4444    }
    4545
     46    void growUsedBreadth(LayoutUnit growth)
     47    {
     48        ASSERT(growth >= 0);
     49        m_usedBreadth += growth;
     50    }
     51    LayoutUnit usedBreadth() const { return m_usedBreadth; }
     52
     53    void growMaxBreadth(LayoutUnit growth)
     54    {
     55        if (m_maxBreadth == infinity)
     56            m_maxBreadth = m_usedBreadth + growth;
     57        else
     58            m_maxBreadth += growth;
     59    }
    4660    LayoutUnit maxBreadthIfNotInfinite() const
    4761    {
     
    273287        const Length& minTrackBreadth = trackStyles[i].minTrackBreadth();
    274288        if (minTrackBreadth.isMinContent() || minTrackBreadth.isMaxContent()) {
    275             // FIXME: The specification factors this logic into resolveContentBasedTrackSizingFunctionsForItems
    276             // to reuse code between the branches and also calls distributeSpaceToTracks.
    277             for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
    278                 size_t cellIndex = resolveGridPosition(direction, child);
    279                 if (cellIndex != i)
    280                     continue;
    281 
    282                 LayoutUnit additionalBreadthSpace = minContentForChild(child, direction, columnTracks) - track.m_usedBreadth;
    283                 ASSERT(additionalBreadthSpace >= 0);
    284                 track.m_usedBreadth += additionalBreadthSpace;
    285                 availableLogicalSpace -= additionalBreadthSpace;
    286             }
     289            LayoutUnit oldUsedBreadth = track.m_usedBreadth;
     290            resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks, rowTracks, i, &RenderGrid::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth);
     291            availableLogicalSpace -= (track.m_usedBreadth - oldUsedBreadth);
    287292        }
     293
    288294        if (minTrackBreadth.isMaxContent()) {
    289             for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
    290                 size_t cellIndex = resolveGridPosition((direction == ForColumns) ? child->style()->gridItemColumn() : child->style()->gridItemRow());
    291                 if (cellIndex != i)
    292                     continue;
    293 
    294                 LayoutUnit additionalBreadthSpace = maxContentForChild(child, direction, columnTracks) - track.m_usedBreadth;
    295                 ASSERT(additionalBreadthSpace >= 0);
    296                 track.m_usedBreadth += additionalBreadthSpace;
    297                 availableLogicalSpace -= additionalBreadthSpace;
    298             }
     295            LayoutUnit oldUsedBreadth = track.m_usedBreadth;
     296            resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks, rowTracks, i, &RenderGrid::maxContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth);
     297            availableLogicalSpace -= (track.m_usedBreadth - oldUsedBreadth);
    299298        }
    300299
    301300        const Length& maxTrackBreadth = trackStyles[i].maxTrackBreadth();
    302         if (maxTrackBreadth.isMinContent() || maxTrackBreadth.isMaxContent()) {
    303             for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
    304                 size_t cellIndex = resolveGridPosition(direction, child);
    305                 if (cellIndex != i)
    306                     continue;
    307 
    308                 LayoutUnit additionalBreadthSpace = minContentForChild(child, direction, columnTracks) - track.maxBreadthIfNotInfinite();
    309                 LayoutUnit share = std::min(additionalBreadthSpace, tracks[i].m_maxBreadth - track.maxBreadthIfNotInfinite());
    310                 if (track.m_maxBreadth == infinity)
    311                     track.m_maxBreadth = track.m_usedBreadth + share;
    312                 else
    313                     track.m_maxBreadth += share;
    314             }
    315         }
    316 
    317         if (maxTrackBreadth.isMaxContent()) {
    318             for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
    319                 size_t cellIndex = resolveGridPosition((direction == ForColumns) ? child->style()->gridItemColumn() : child->style()->gridItemRow());
    320                 if (cellIndex != i)
    321                     continue;
    322 
    323                 LayoutUnit additionalBreadthSpace = maxContentForChild(child, direction, columnTracks) - track.maxBreadthIfNotInfinite();
    324                 LayoutUnit share = std::min(additionalBreadthSpace, tracks[i].m_maxBreadth - track.maxBreadthIfNotInfinite());
    325                 if (track.m_maxBreadth == infinity)
    326                     track.m_maxBreadth = track.m_usedBreadth + share;
    327                 else
    328                     track.m_maxBreadth += share;
    329             }
    330         }
     301        if (maxTrackBreadth.isMinContent() || maxTrackBreadth.isMaxContent())
     302            resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks, rowTracks, i, &RenderGrid::minContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth);
     303
     304        if (maxTrackBreadth.isMaxContent())
     305            resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks, rowTracks, i, &RenderGrid::maxContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth);
    331306    }
    332307
    333308    // FIXME: The spec says to update maxBreadth if it is Infinity.
     309}
     310
     311void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDirection direction, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, size_t i, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction)
     312{
     313    // FIXME: The specification re-uses distributeSpaceToTrack, which we should probably do.
     314    GridTrack& track = (direction == ForColumns) ? columnTracks[i] : rowTracks[i];
     315    for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
     316        size_t cellIndex = resolveGridPosition(direction, child);
     317        if (cellIndex != i)
     318            continue;
     319
     320        LayoutUnit contentSize = (this->*sizingFunction)(child, direction, columnTracks);
     321        LayoutUnit additionalBreadthSpace = contentSize - (track.*trackGetter)();
     322        LayoutUnit share = additionalBreadthSpace;
     323        std::min(additionalBreadthSpace, track.m_maxBreadth - (track.*trackGetter)());
     324        (track.*trackGrowthFunction)(share);
     325    }
    334326}
    335327
  • trunk/Source/WebCore/rendering/RenderGrid.h

    r140583 r140894  
    5858    void layoutGridItems();
    5959
     60    typedef LayoutUnit (RenderGrid::* SizingFunction)(RenderBox*, TrackSizingDirection, Vector<GridTrack>&);
     61    typedef LayoutUnit (GridTrack::* AccumulatorGetter)() const;
     62    typedef void (GridTrack::* AccumulatorGrowFunction)(LayoutUnit);
     63    void resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDirection, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, size_t, SizingFunction, AccumulatorGetter, AccumulatorGrowFunction);
     64
    6065    LayoutUnit minContentForChild(RenderBox*, TrackSizingDirection, Vector<GridTrack>& columnTracks);
    6166    LayoutUnit maxContentForChild(RenderBox*, TrackSizingDirection, Vector<GridTrack>& columnTracks);
Note: See TracChangeset for help on using the changeset viewer.