Changeset 69025 in webkit


Ignore:
Timestamp:
Oct 4, 2010 12:05:25 PM (14 years ago)
Author:
hyatt@apple.com
Message:

https://bugs.webkit.org/show_bug.cgi?id=47100

Reviewed by Dan Bernstein.

Convert clearFloats() to be block-flow-aware. Helpers that it calls have not been patched though.

  • rendering/RenderBlock.cpp:

(WebCore::RenderBlock::clearFloats):

  • rendering/RenderBlock.h:

(WebCore::RenderBlock::logicalTopForFloat):
(WebCore::RenderBlock::logicalLeftForFloat):
(WebCore::RenderBlock::logicalWidthForFloat):

Location:
trunk/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r69024 r69025  
     12010-10-04  David Hyatt  <hyatt@apple.com>
     2
     3        Reviewed by Dan Bernstein.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=47100
     6
     7        Convert clearFloats() to be block-flow-aware.  Helpers that it calls have not been patched though.
     8
     9        * rendering/RenderBlock.cpp:
     10        (WebCore::RenderBlock::clearFloats):
     11        * rendering/RenderBlock.h:
     12        (WebCore::RenderBlock::logicalTopForFloat):
     13        (WebCore::RenderBlock::logicalLeftForFloat):
     14        (WebCore::RenderBlock::logicalWidthForFloat):
     15
    1162010-10-04  Diego Gonzalez  <diegohcg@webkit.org>
    217
  • trunk/WebCore/rendering/RenderBlock.cpp

    r68957 r69025  
    36353635    // to avoid floats.
    36363636    bool parentHasFloats = false;
     3637    RenderBlock* parentBlock = toRenderBlock(parent());
    36373638    RenderObject* prev = previousSibling();
    36383639    while (prev && (prev->isFloatingOrPositioned() || !prev->isBox() || !prev->isRenderBlock() || toRenderBlock(prev)->avoidsFloats())) {
     
    36433644
    36443645    // First add in floats from the parent.
    3645     int offset = y();
    3646     if (parentHasFloats) {
    3647         RenderBlock* parentBlock = toRenderBlock(parent());
    3648         addIntrudingFloats(parentBlock, parentBlock->borderLeft() + parentBlock->paddingLeft(), offset);
    3649     }
    3650    
    3651     int xoffset = 0;
     3646    int logicalTopOffset = logicalTop();
     3647    if (parentHasFloats)
     3648        addIntrudingFloats(parentBlock, parentBlock->logicalLeftOffsetForContent(), logicalTopOffset);
     3649   
     3650    int logicalLeftOffset = 0;
    36523651    if (prev)
    3653         offset -= toRenderBox(prev)->y();
    3654     else if (parent()->isBox()) {
    3655         prev = parent();
    3656         xoffset += toRenderBox(prev)->borderLeft() + toRenderBox(prev)->paddingLeft();
     3652        logicalTopOffset -= toRenderBox(prev)->logicalTop();
     3653    else {
     3654        prev = parentBlock;
     3655        logicalLeftOffset += parentBlock->logicalLeftOffsetForContent();
    36573656    }
    36583657
     
    36623661   
    36633662    RenderBlock* block = toRenderBlock(prev);
    3664     if (block->m_floatingObjects && block->lowestFloatLogicalBottom() > offset)
    3665         addIntrudingFloats(block, xoffset, offset);
     3663    if (block->m_floatingObjects && block->lowestFloatLogicalBottom() > logicalTopOffset)
     3664        addIntrudingFloats(block, logicalLeftOffset, logicalTopOffset);
    36663665
    36673666    if (childrenInline()) {
    3668         int changeTop = numeric_limits<int>::max();
    3669         int changeBottom = numeric_limits<int>::min();
     3667        int changeLogicalTop = numeric_limits<int>::max();
     3668        int changeLogicalBottom = numeric_limits<int>::min();
    36703669        if (m_floatingObjects) {
    36713670            for (FloatingObject* f = m_floatingObjects->first(); f; f = m_floatingObjects->next()) {
    36723671                FloatingObject* oldFloatingObject = floatMap.get(f->m_renderer);
     3672                int logicalBottom = logicalBottomForFloat(f);
    36733673                if (oldFloatingObject) {
    3674                     if (f->width() != oldFloatingObject->width() || f->left() != oldFloatingObject->left()) {
    3675                         changeTop = 0;
    3676                         changeBottom = max(changeBottom, max(f->bottom(), oldFloatingObject->bottom()));
    3677                     } else if (f->bottom() != oldFloatingObject->bottom()) {
    3678                         changeTop = min(changeTop, min(f->bottom(), oldFloatingObject->bottom()));
    3679                         changeBottom = max(changeBottom, max(f->bottom(), oldFloatingObject->bottom()));
     3674                    int oldLogicalBottom = logicalBottomForFloat(oldFloatingObject);
     3675                    if (logicalWidthForFloat(f) != logicalWidthForFloat(oldFloatingObject) || logicalLeftForFloat(f) != logicalLeftForFloat(oldFloatingObject)) {
     3676                        changeLogicalTop = 0;
     3677                        changeLogicalBottom = max(changeLogicalBottom, max(logicalBottom, oldLogicalBottom));
     3678                    } else if (logicalBottom != oldLogicalBottom) {
     3679                        changeLogicalTop = min(changeLogicalTop, min(logicalBottom, oldLogicalBottom));
     3680                        changeLogicalBottom = max(changeLogicalBottom, max(logicalBottom, oldLogicalBottom));
    36803681                    }
    36813682
     
    36833684                    delete oldFloatingObject;
    36843685                } else {
    3685                     changeTop = 0;
    3686                     changeBottom = max(changeBottom, f->bottom());
     3686                    changeLogicalTop = 0;
     3687                    changeLogicalBottom = max(changeLogicalBottom, logicalBottom);
    36873688                }
    36883689            }
     
    36933694            FloatingObject* floatingObject = (*it).second;
    36943695            if (!floatingObject->m_isDescendant) {
    3695                 changeTop = 0;
    3696                 changeBottom = max(changeBottom, floatingObject->bottom());
     3696                changeLogicalTop = 0;
     3697                changeLogicalBottom = max(changeLogicalBottom, logicalBottomForFloat(floatingObject));
    36973698            }
    36983699        }
    36993700        deleteAllValues(floatMap);
    37003701
    3701         markLinesDirtyInVerticalRange(changeTop, changeBottom);
     3702        markLinesDirtyInVerticalRange(changeLogicalTop, changeLogicalBottom);
    37023703    }
    37033704}
  • trunk/WebCore/rendering/RenderBlock.h

    r68957 r69025  
    398398    };
    399399
     400    int logicalTopForFloat(FloatingObject* child) const { return style()->isVerticalBlockFlow() ? child->top() : child->left(); }
    400401    int logicalBottomForFloat(FloatingObject* child) const { return style()->isVerticalBlockFlow() ? child->bottom() : child->right(); }
     402    int logicalLeftForFloat(FloatingObject* child) const { return style()->isVerticalBlockFlow() ? child->left() : child->top(); }
     403    int logicalWidthForFloat(FloatingObject* child) const { return style()->isVerticalBlockFlow() ? child->width() : child->height(); }
    401404   
    402405    // The following functions' implementations are in RenderBlockLineLayout.cpp.
Note: See TracChangeset for help on using the changeset viewer.