Changeset 69025 in webkit
- Timestamp:
- Oct 4, 2010 12:05:25 PM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r69024 r69025 1 2010-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 1 16 2010-10-04 Diego Gonzalez <diegohcg@webkit.org> 2 17 -
trunk/WebCore/rendering/RenderBlock.cpp
r68957 r69025 3635 3635 // to avoid floats. 3636 3636 bool parentHasFloats = false; 3637 RenderBlock* parentBlock = toRenderBlock(parent()); 3637 3638 RenderObject* prev = previousSibling(); 3638 3639 while (prev && (prev->isFloatingOrPositioned() || !prev->isBox() || !prev->isRenderBlock() || toRenderBlock(prev)->avoidsFloats())) { … … 3643 3644 3644 3645 // 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; 3652 3651 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(); 3657 3656 } 3658 3657 … … 3662 3661 3663 3662 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); 3666 3665 3667 3666 if (childrenInline()) { 3668 int change Top = numeric_limits<int>::max();3669 int change Bottom = numeric_limits<int>::min();3667 int changeLogicalTop = numeric_limits<int>::max(); 3668 int changeLogicalBottom = numeric_limits<int>::min(); 3670 3669 if (m_floatingObjects) { 3671 3670 for (FloatingObject* f = m_floatingObjects->first(); f; f = m_floatingObjects->next()) { 3672 3671 FloatingObject* oldFloatingObject = floatMap.get(f->m_renderer); 3672 int logicalBottom = logicalBottomForFloat(f); 3673 3673 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)); 3680 3681 } 3681 3682 … … 3683 3684 delete oldFloatingObject; 3684 3685 } else { 3685 change Top = 0;3686 change Bottom = max(changeBottom, f->bottom());3686 changeLogicalTop = 0; 3687 changeLogicalBottom = max(changeLogicalBottom, logicalBottom); 3687 3688 } 3688 3689 } … … 3693 3694 FloatingObject* floatingObject = (*it).second; 3694 3695 if (!floatingObject->m_isDescendant) { 3695 change Top = 0;3696 change Bottom = max(changeBottom, floatingObject->bottom());3696 changeLogicalTop = 0; 3697 changeLogicalBottom = max(changeLogicalBottom, logicalBottomForFloat(floatingObject)); 3697 3698 } 3698 3699 } 3699 3700 deleteAllValues(floatMap); 3700 3701 3701 markLinesDirtyInVerticalRange(change Top, changeBottom);3702 markLinesDirtyInVerticalRange(changeLogicalTop, changeLogicalBottom); 3702 3703 } 3703 3704 } -
trunk/WebCore/rendering/RenderBlock.h
r68957 r69025 398 398 }; 399 399 400 int logicalTopForFloat(FloatingObject* child) const { return style()->isVerticalBlockFlow() ? child->top() : child->left(); } 400 401 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(); } 401 404 402 405 // The following functions' implementations are in RenderBlockLineLayout.cpp.
Note: See TracChangeset
for help on using the changeset viewer.