Changeset 117484 in webkit


Ignore:
Timestamp:
May 17, 2012 1:01:50 PM (12 years ago)
Author:
mitz@apple.com
Message:

In vertical writing modes, pagination may split a line after a block shifts
https://bugs.webkit.org/show_bug.cgi?id=86763

Reviewed by Sam Weinig.

Source/WebCore:

Test: fast/multicol/pageLogicalOffset-vertical.html

LayoutState::pageLogicalOffset() was returning bogus results in vertical writing modes,
because it was always using physical heights. Changed it to take a RenderBox and use its
writing mode to choose between heights and widths.

  • rendering/LayoutState.cpp:

(WebCore::LayoutState::pageLogicalOffset):
(WebCore::LayoutState::addForcedColumnBreak):

  • rendering/LayoutState.h:

(LayoutState):

  • rendering/RenderBlock.cpp:

(WebCore::RenderBlock::layoutBlock):
(WebCore::RenderBlock::markForPaginationRelayoutIfNeeded):
(WebCore::RenderBlock::layoutColumns):
(WebCore::RenderBlock::applyBeforeBreak):
(WebCore::RenderBlock::applyAfterBreak):

  • rendering/RenderDeprecatedFlexibleBox.cpp:

(WebCore::RenderDeprecatedFlexibleBox::layoutBlock):

  • rendering/RenderTable.cpp:

(WebCore::RenderTable::layout):

  • rendering/RenderTableRow.cpp:

(WebCore::RenderTableRow::layout):

  • rendering/RenderTableSection.cpp:

(WebCore::RenderTableSection::layoutRows):

LayoutTests:

  • fast/multicol/pageLogicalOffset-vertical-expected.html: Added.
  • fast/multicol/pageLogicalOffset-vertical.html: Added.
Location:
trunk
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r117482 r117484  
     12012-05-17  Dan Bernstein  <mitz@apple.com>
     2
     3        In vertical writing modes, pagination may split a line after a block shifts
     4        https://bugs.webkit.org/show_bug.cgi?id=86763
     5
     6        Reviewed by Sam Weinig.
     7
     8        * fast/multicol/pageLogicalOffset-vertical-expected.html: Added.
     9        * fast/multicol/pageLogicalOffset-vertical.html: Added.
     10
    1112012-05-17  Abhishek Arya  <inferno@chromium.org>
    212
  • trunk/Source/WebCore/ChangeLog

    r117482 r117484  
     12012-05-17  Dan Bernstein  <mitz@apple.com>
     2
     3        In vertical writing modes, pagination may split a line after a block shifts
     4        https://bugs.webkit.org/show_bug.cgi?id=86763
     5
     6        Reviewed by Sam Weinig.
     7
     8        Test: fast/multicol/pageLogicalOffset-vertical.html
     9
     10        LayoutState::pageLogicalOffset() was returning bogus results in vertical writing modes,
     11        because it was always using physical heights. Changed it to take a RenderBox and use its
     12        writing mode to choose between heights and widths.
     13
     14        * rendering/LayoutState.cpp:
     15        (WebCore::LayoutState::pageLogicalOffset):
     16        (WebCore::LayoutState::addForcedColumnBreak):
     17        * rendering/LayoutState.h:
     18        (LayoutState):
     19        * rendering/RenderBlock.cpp:
     20        (WebCore::RenderBlock::layoutBlock):
     21        (WebCore::RenderBlock::markForPaginationRelayoutIfNeeded):
     22        (WebCore::RenderBlock::layoutColumns):
     23        (WebCore::RenderBlock::applyBeforeBreak):
     24        (WebCore::RenderBlock::applyAfterBreak):
     25        * rendering/RenderDeprecatedFlexibleBox.cpp:
     26        (WebCore::RenderDeprecatedFlexibleBox::layoutBlock):
     27        * rendering/RenderTable.cpp:
     28        (WebCore::RenderTable::layout):
     29        * rendering/RenderTableRow.cpp:
     30        (WebCore::RenderTableRow::layout):
     31        * rendering/RenderTableSection.cpp:
     32        (WebCore::RenderTableSection::layoutRows):
     33
    1342012-05-17  Abhishek Arya  <inferno@chromium.org>
    235
  • trunk/Source/WebCore/rendering/LayoutState.cpp

    r109378 r117484  
    197197}
    198198
    199 LayoutUnit LayoutState::pageLogicalOffset(LayoutUnit childLogicalOffset) const
    200 {
    201     return m_layoutOffset.height() + childLogicalOffset - m_pageOffset.height();
    202 }
    203 
    204 void LayoutState::addForcedColumnBreak(LayoutUnit childLogicalOffset)
     199LayoutUnit LayoutState::pageLogicalOffset(RenderBox* child, LayoutUnit childLogicalOffset) const
     200{
     201    if (child->isHorizontalWritingMode())
     202        return m_layoutOffset.height() + childLogicalOffset - m_pageOffset.height();
     203    return m_layoutOffset.width() + childLogicalOffset - m_pageOffset.width();
     204}
     205
     206void LayoutState::addForcedColumnBreak(RenderBox* child, LayoutUnit childLogicalOffset)
    205207{
    206208    if (!m_columnInfo || m_columnInfo->columnHeight())
    207209        return;
    208     m_columnInfo->addForcedBreak(pageLogicalOffset(childLogicalOffset));
     210    m_columnInfo->addForcedBreak(pageLogicalOffset(child, childLogicalOffset));
    209211}
    210212
  • trunk/Source/WebCore/rendering/LayoutState.h

    r107160 r117484  
    7575    // The page logical offset is the object's offset from the top of the page in the page progression
    7676    // direction (so an x-offset in vertical text and a y-offset for horizontal text).
    77     LayoutUnit pageLogicalOffset(LayoutUnit childLogicalOffset) const;
     77    LayoutUnit pageLogicalOffset(RenderBox*, LayoutUnit childLogicalOffset) const;
    7878
    79     void addForcedColumnBreak(LayoutUnit childLogicalOffset);
     79    void addForcedColumnBreak(RenderBox*, LayoutUnit childLogicalOffset);
    8080   
    8181    LayoutUnit pageLogicalHeight() const { return m_pageLogicalHeight; }
  • trunk/Source/WebCore/rendering/RenderBlock.cpp

    r117482 r117484  
    15191519
    15201520    if (renderView->layoutState()->m_pageLogicalHeight)
    1521         setPageLogicalOffset(renderView->layoutState()->pageLogicalOffset(logicalTop()));
     1521        setPageLogicalOffset(renderView->layoutState()->pageLogicalOffset(this, logicalTop()));
    15221522
    15231523    updateLayerTransform();
     
    25312531        return;
    25322532
    2533     if (view()->layoutState()->pageLogicalHeightChanged() || (view()->layoutState()->pageLogicalHeight() && view()->layoutState()->pageLogicalOffset(logicalTop()) != pageLogicalOffset()))
     2533    if (view()->layoutState()->pageLogicalHeightChanged() || (view()->layoutState()->pageLogicalHeight() && view()->layoutState()->pageLogicalOffset(this, logicalTop()) != pageLogicalOffset()))
    25342534        setChildNeedsLayout(true, MarkOnlyThis);
    25352535}
     
    49914991            if (!pageLogicalHeight) {
    49924992                LayoutUnit distanceBetweenBreaks = max<LayoutUnit>(colInfo->maximumDistanceBetweenForcedBreaks(),
    4993                                                                    view()->layoutState()->pageLogicalOffset(borderBefore() + paddingBefore() + contentLogicalHeight()) - colInfo->forcedBreakOffset());
     4993                                                                   view()->layoutState()->pageLogicalOffset(this, borderBefore() + paddingBefore() + contentLogicalHeight()) - colInfo->forcedBreakOffset());
    49944994                columnHeight = max(colInfo->minimumColumnHeight(), distanceBetweenBreaks);
    49954995            }
     
    66556655    if (checkBeforeAlways && inNormalFlow(child) && hasNextPage(logicalOffset, IncludePageBoundary)) {
    66566656        if (checkColumnBreaks)
    6657             view()->layoutState()->addForcedColumnBreak(logicalOffset);
     6657            view()->layoutState()->addForcedColumnBreak(child, logicalOffset);
    66586658        return nextPageLogicalTop(logicalOffset, IncludePageBoundary);
    66596659    }
     
    66726672        marginInfo.setMarginAfterQuirk(true); // Cause margins to be discarded for any following content.
    66736673        if (checkColumnBreaks)
    6674             view()->layoutState()->addForcedColumnBreak(logicalOffset);
     6674            view()->layoutState()->addForcedColumnBreak(child, logicalOffset);
    66756675        return nextPageLogicalTop(logicalOffset, IncludePageBoundary);
    66766676    }
  • trunk/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp

    r115846 r117484  
    302302
    303303    if (view()->layoutState()->pageLogicalHeight())
    304         setPageLogicalOffset(view()->layoutState()->pageLogicalOffset(logicalTop()));
     304        setPageLogicalOffset(view()->layoutState()->pageLogicalOffset(this, logicalTop()));
    305305
    306306    // Update our scrollbars if we're overflow:auto/scroll/hidden now that we know if
  • trunk/Source/WebCore/rendering/RenderTable.cpp

    r117339 r117484  
    457457
    458458    if (view()->layoutState()->pageLogicalHeight())
    459         setPageLogicalOffset(view()->layoutState()->pageLogicalOffset(logicalTop()));
     459        setPageLogicalOffset(view()->layoutState()->pageLogicalOffset(this, logicalTop()));
    460460
    461461    bool didFullRepaint = repainter.repaintAfterLayout();
  • trunk/Source/WebCore/rendering/RenderTableRow.cpp

    r116174 r117484  
    149149        if (child->isTableCell()) {
    150150            RenderTableCell* cell = toRenderTableCell(child);
    151             if (!cell->needsLayout() && paginated && view()->layoutState()->pageLogicalHeight() && view()->layoutState()->pageLogicalOffset(cell->logicalTop()) != cell->pageLogicalOffset())
     151            if (!cell->needsLayout() && paginated && view()->layoutState()->pageLogicalHeight() && view()->layoutState()->pageLogicalOffset(cell, cell->logicalTop()) != cell->pageLogicalOffset())
    152152                cell->setChildNeedsLayout(true, MarkOnlyThis);
    153153
  • trunk/Source/WebCore/rendering/RenderTableSection.cpp

    r117477 r117484  
    663663                cell->setNeedsLayout(true, MarkOnlyThis);
    664664
    665             if (!cell->needsLayout() && view()->layoutState()->pageLogicalHeight() && view()->layoutState()->pageLogicalOffset(cell->logicalTop()) != cell->pageLogicalOffset())
     665            if (!cell->needsLayout() && view()->layoutState()->pageLogicalHeight() && view()->layoutState()->pageLogicalOffset(cell, cell->logicalTop()) != cell->pageLogicalOffset())
    666666                cell->setChildNeedsLayout(true, MarkOnlyThis);
    667667
Note: See TracChangeset for help on using the changeset viewer.