Changeset 83165 in webkit


Ignore:
Timestamp:
Apr 7, 2011 6:05:35 AM (13 years ago)
Author:
rniwa@webkit.org
Message:

2011-04-07 Ryosuke Niwa <rniwa@webkit.org>

Reviewed by Eric Seidel.

Add functions to update left and right offsets to LineOffsets
https://bugs.webkit.org/show_bug.cgi?id=58028

Added update() and shrinkWidthForNewFloatIfNeeded(FloatingObject*) to LineOffsets,
which are used to update m_left and m_right. Also added m_block and m_isFirstLine
member variables to LineOffsets so that users of LineOffsets don't have to pass them around.

  • rendering/RenderBlock.h:
  • rendering/RenderBlockLineLayout.cpp: (WebCore::RenderBlock::skipLeadingWhitespace): No longer passes firstLine to positionNewFloatOnLine. (WebCore::LineOffsets::LineOffsets): Takes RenderBlock* and isFirstLine instead of left and right offsets. (WebCore::LineOffsets::update): Extracted from findNextLineBreak and positionNewFloatOnLine. (WebCore::LineOffsets::shrinkWidthForNewFloatIfNeeded): Extracted from positionNewFloatOnLine. (WebCore::RenderBlock::findNextLineBreak): Calls skipLeadingWhitespace and positionNewFloatOnLine. (WebCore::RenderBlock::positionNewFloatOnLine): Calls shrinkWidthForNewFloatIfNeeded and update and no longer passes firstLine around.
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r83164 r83165  
     12011-04-07  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        Reviewed by Eric Seidel.
     4
     5        Add functions to update left and right offsets to LineOffsets
     6        https://bugs.webkit.org/show_bug.cgi?id=58028
     7
     8        Added update() and shrinkWidthForNewFloatIfNeeded(FloatingObject*) to LineOffsets,
     9        which are used to update m_left and m_right. Also added m_block and m_isFirstLine
     10        member variables to LineOffsets so that users of LineOffsets don't have to pass them around.
     11
     12        * rendering/RenderBlock.h:
     13        * rendering/RenderBlockLineLayout.cpp:
     14        (WebCore::RenderBlock::skipLeadingWhitespace): No longer passes firstLine to positionNewFloatOnLine.
     15        (WebCore::LineOffsets::LineOffsets): Takes RenderBlock* and isFirstLine instead of left and right offsets.
     16        (WebCore::LineOffsets::update): Extracted from findNextLineBreak and positionNewFloatOnLine.
     17        (WebCore::LineOffsets::shrinkWidthForNewFloatIfNeeded): Extracted from positionNewFloatOnLine.
     18        (WebCore::RenderBlock::findNextLineBreak): Calls skipLeadingWhitespace and positionNewFloatOnLine.
     19        (WebCore::RenderBlock::positionNewFloatOnLine): Calls shrinkWidthForNewFloatIfNeeded and update and
     20        no longer passes firstLine around.
     21
    1222011-04-06  Pavel Feldman  <pfeldman@google.com>
    223
  • trunk/Source/WebCore/rendering/RenderBlock.h

    r83076 r83165  
    495495
    496496    void skipTrailingWhitespace(InlineIterator&, bool isLineEmpty, bool previousLineBrokeCleanly);
    497     void skipLeadingWhitespace(InlineBidiResolver&, bool firstLine, bool isLineEmpty, bool previousLineBrokeCleanly, FloatingObject* lastFloatFromPreviousLine, LineOffsets&);
     497    void skipLeadingWhitespace(InlineBidiResolver&, bool isLineEmpty, bool previousLineBrokeCleanly, FloatingObject* lastFloatFromPreviousLine, LineOffsets&);
    498498    void fitBelowFloats(float widthToFit, float totalOverhangWidth, bool firstLine, float& availableWidth);
    499499    typedef std::pair<RenderText*, LazyLineBreakIterator> LineBreakIteratorInfo;
     
    510510    // Positions new floats and also adjust all floats encountered on the line if any of them
    511511    // have to move to the next page/column.
    512     bool positionNewFloatOnLine(FloatingObject* newFloat, FloatingObject* lastFloatFromPreviousLine, bool firstLine, LineOffsets&);
     512    bool positionNewFloatOnLine(FloatingObject* newFloat, FloatingObject* lastFloatFromPreviousLine, LineOffsets&);
    513513
    514514    // End of functions defined in RenderBlockLineLayout.cpp.
     
    785785    // (calling moveChildTo, moveAllChildrenTo, and makeChildrenNonInline).
    786786    friend class RenderRubyBase;
     787    friend class LineOffsets; // Needs to know FloatingObject
    787788};
    788789
  • trunk/Source/WebCore/rendering/RenderBlockLineLayout.cpp

    r83098 r83165  
    14541454}
    14551455
    1456 void RenderBlock::skipLeadingWhitespace(InlineBidiResolver& resolver, bool firstLine, bool isLineEmpty, bool previousLineBrokeCleanly,
     1456void RenderBlock::skipLeadingWhitespace(InlineBidiResolver& resolver, bool isLineEmpty, bool previousLineBrokeCleanly,
    14571457    FloatingObject* lastFloatFromPreviousLine, LineOffsets& lineOffsets)
    14581458{
     
    14601460        RenderObject* object = resolver.position().m_obj;
    14611461        if (object->isFloating())
    1462             positionNewFloatOnLine(insertFloatingObject(toRenderBox(object)), lastFloatFromPreviousLine, firstLine, lineOffsets);
     1462            positionNewFloatOnLine(insertFloatingObject(toRenderBox(object)), lastFloatFromPreviousLine, lineOffsets);
    14631463        else if (object->isPositioned())
    14641464            setStaticPositions(this, toRenderBox(object));
     
    15631563class LineOffsets {
    15641564public:
    1565     LineOffsets(int leftOffset, int rightOffset)
    1566     : m_left(leftOffset)
    1567     , m_right(rightOffset)
    1568     {
    1569     }
     1565    LineOffsets(RenderBlock*, bool isFirstLine);
    15701566    int width() const { return max(0, m_right - m_left); }
    1571     void setLeft(int left) { m_left = left; }
    1572     void setRight(int right) { m_right = right; }
     1567    void update();
     1568    void shrinkWidthForNewFloatIfNeeded(RenderBlock::FloatingObject*);
     1569
    15731570private:
     1571    RenderBlock* m_block;
    15741572    int m_left;
    15751573    int m_right;
     1574    bool m_isFirstLine;
    15761575};
     1576
     1577inline LineOffsets::LineOffsets(RenderBlock* block, bool isFirstLine)
     1578    : m_block(block)
     1579    , m_left(0)
     1580    , m_right(0)
     1581    , m_isFirstLine(isFirstLine)
     1582{
     1583    ASSERT(block);
     1584    update();
     1585}
     1586
     1587inline void LineOffsets::update()
     1588{
     1589    int height = m_block->logicalHeight();
     1590    m_left = m_block->logicalLeftOffsetForLine(height, m_isFirstLine);
     1591    m_right = m_block->logicalRightOffsetForLine(height, m_isFirstLine);
     1592}
     1593
     1594inline void LineOffsets::shrinkWidthForNewFloatIfNeeded(RenderBlock::FloatingObject* newFloat)
     1595{
     1596    int height = m_block->logicalHeight();
     1597    if (height < m_block->logicalTopForFloat(newFloat) || height >= m_block->logicalBottomForFloat(newFloat))
     1598        return;
     1599
     1600    if (newFloat->type() == RenderBlock::FloatingObject::FloatLeft)
     1601        m_left = m_block->logicalRightForFloat(newFloat);
     1602    else
     1603        m_right = m_block->logicalLeftForFloat(newFloat);
     1604}
    15771605
    15781606InlineIterator RenderBlock::findNextLineBreak(InlineBidiResolver& resolver, bool firstLine, bool& isLineEmpty, LineBreakIteratorInfo& lineBreakIteratorInfo, bool& previousLineBrokeCleanly,
     
    15831611    bool appliedStartWidth = resolver.position().m_pos > 0;
    15841612    LineMidpointState& lineMidpointState = resolver.midpointState();
    1585    
    1586     int blockOffset = logicalHeight();
    1587     LineOffsets lineOffsets(logicalLeftOffsetForLine(blockOffset, firstLine), logicalRightOffsetForLine(blockOffset, firstLine));
    1588 
    1589     skipLeadingWhitespace(resolver, firstLine, isLineEmpty, previousLineBrokeCleanly, lastFloatFromPreviousLine, lineOffsets);
     1613
     1614    LineOffsets lineOffsets(this, firstLine);
     1615
     1616    skipLeadingWhitespace(resolver, isLineEmpty, previousLineBrokeCleanly, lastFloatFromPreviousLine, lineOffsets);
    15901617
    15911618    float width = lineOffsets.width();
     
    16831710                // it after moving to next line (in newLine() func)
    16841711                if (floatsFitOnLine && logicalWidthForFloat(f) + w + tmpW <= width) {
    1685                     positionNewFloatOnLine(f, lastFloatFromPreviousLine, firstLine, lineOffsets);
     1712                    positionNewFloatOnLine(f, lastFloatFromPreviousLine, lineOffsets);
    16861713                    width = lineOffsets.width() + totalOverhangWidth;
    16871714                    if (lBreak.m_obj == o) {
     
    22702297}
    22712298
    2272 bool RenderBlock::positionNewFloatOnLine(FloatingObject* newFloat, FloatingObject* lastFloatFromPreviousLine, bool firstLine, LineOffsets& lineOffsets)
    2273 {
    2274     bool didPosition = positionNewFloats();
    2275     if (!didPosition)
    2276         return didPosition;
    2277 
    2278     int blockOffset = logicalHeight();
    2279     if (blockOffset >= logicalTopForFloat(newFloat) && blockOffset < logicalBottomForFloat(newFloat)) {
    2280         if (newFloat->type() == FloatingObject::FloatLeft)
    2281             lineOffsets.setLeft(logicalRightForFloat(newFloat));
    2282         else
    2283             lineOffsets.setRight(logicalLeftForFloat(newFloat));
    2284     }
     2299bool RenderBlock::positionNewFloatOnLine(FloatingObject* newFloat, FloatingObject* lastFloatFromPreviousLine, LineOffsets& lineOffsets)
     2300{
     2301    if (!positionNewFloats())
     2302        return false;
     2303
     2304    lineOffsets.shrinkWidthForNewFloatIfNeeded(newFloat);
    22852305
    22862306    if (!newFloat->m_paginationStrut)
    2287         return didPosition;
     2307        return true;
    22882308
    22892309    FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
     
    22942314
    22952315    if (floatLogicalTop - paginationStrut != logicalHeight())
    2296         return didPosition;
     2316        return true;
    22972317
    22982318    FloatingObjectSetIterator it = floatingObjectSet.end();
     
    23162336    }
    23172337
    2318     setLogicalHeight(blockOffset + paginationStrut);
    2319     lineOffsets.setLeft(logicalLeftOffsetForLine(logicalHeight(), firstLine));
    2320     lineOffsets.setRight(logicalRightOffsetForLine(logicalHeight(), firstLine));
    2321 
    2322     return didPosition;
    2323 }
    2324 
    2325 }
     2338    setLogicalHeight(logicalHeight() + paginationStrut);
     2339    lineOffsets.update();
     2340
     2341    return true;
     2342}
     2343
     2344}
Note: See TracChangeset for help on using the changeset viewer.