Index: Source/core/layout/LayoutBlockFlow.cpp |
diff --git a/Source/core/layout/LayoutBlockFlow.cpp b/Source/core/layout/LayoutBlockFlow.cpp |
index 93c4967ebe1022c2efde2c5671861a14a9fe3b98..9870fd2ee5b364d6e02f24fcfed8e7a462904e0c 100644 |
--- a/Source/core/layout/LayoutBlockFlow.cpp |
+++ b/Source/core/layout/LayoutBlockFlow.cpp |
@@ -728,52 +728,33 @@ LayoutUnit LayoutBlockFlow::adjustBlockChildForPagination(LayoutUnit logicalTopA |
return result; |
} |
-static inline LayoutUnit calculateMinimumPageHeight(const ComputedStyle& style, RootInlineBox* lastLine, LayoutUnit lineTop, LayoutUnit lineBottom) |
+static inline LayoutUnit calculateMinimumPageHeight(const ComputedStyle& style, const RootInlineBox& lastLine) |
{ |
// We may require a certain minimum number of lines per page in order to satisfy |
// orphans and widows, and that may affect the minimum page height. |
unsigned lineCount = std::max<unsigned>(style.hasAutoOrphans() ? 1 : style.orphans(), style.widows()); |
- if (lineCount > 1) { |
- RootInlineBox* line = lastLine; |
- for (unsigned i = 1; i < lineCount && line->prevRootBox(); i++) |
- line = line->prevRootBox(); |
- |
- // FIXME: Paginating using line overflow isn't all fine. See FIXME in |
- // adjustLinePositionForPagination() for more details. |
- LayoutRect overflow = line->logicalVisualOverflowRect(line->lineTop(), line->lineBottom()); |
- lineTop = std::min(line->lineTopWithLeading(), overflow.y()); |
- } |
- return lineBottom - lineTop; |
+ const RootInlineBox* firstLine = &lastLine; |
+ for (unsigned i = 1; i < lineCount && firstLine->prevRootBox(); i++) |
+ firstLine = firstLine->prevRootBox(); |
+ return lastLine.lineBottomWithLeading() - firstLine->lineTopWithLeading(); |
} |
void LayoutBlockFlow::adjustLinePositionForPagination(RootInlineBox& lineBox, LayoutUnit& delta) |
{ |
- // FIXME: For now we paginate using line overflow. This ensures that lines don't overlap at all when we |
- // put a strut between them for pagination purposes. However, this really isn't the desired layout, since |
- // the line on the top of the next page will appear too far down relative to the same kind of line at the top |
- // of the first column. |
- // |
- // The layout we would like to see is one where the lineTopWithLeading is at the top of the column, and any line overflow |
- // simply spills out above the top of the column. This effect would match what happens at the top of the first column. |
- // We can't achieve this layout, however, until we stop columns from clipping to the column bounds (thus allowing |
- // for overflow to occur), and then cache visible overflow for each column rect. |
- // |
- // Furthermore, the paint we have to do when a column has overflow has to be special. We need to exclude |
+ // TODO(mstensho): Pay attention to line overflow. It should be painted in the same column as |
+ // the rest of the line, possibly overflowing the column. We currently only allow overflow above |
+ // the first column. We clip at all other column boundaries, and that's how it has to be for |
+ // now. The paint we have to do when a column has overflow has to be special. We need to exclude |
// content that paints in a previous column (and content that paints in the following column). |
// |
- // For now we'll at least honor the lineTopWithLeading when paginating if it is above the logical top overflow. This will |
- // at least make positive leading work in typical cases. |
- // |
// FIXME: Another problem with simply moving lines is that the available line width may change (because of floats). |
// Technically if the location we move the line to has a different line width than our old position, then we need to dirty the |
// line and all following lines. |
- LayoutRect logicalVisualOverflow = lineBox.logicalVisualOverflowRect(lineBox.lineTop(), lineBox.lineBottom()); |
- LayoutUnit logicalOffset = std::min(lineBox.lineTopWithLeading(), logicalVisualOverflow.y()); |
- LayoutUnit logicalBottom = std::max(lineBox.lineBottomWithLeading(), logicalVisualOverflow.maxY()); |
- LayoutUnit lineHeight = logicalBottom - logicalOffset; |
- updateMinimumPageHeight(logicalOffset, calculateMinimumPageHeight(styleRef(), &lineBox, logicalOffset, logicalBottom)); |
+ LayoutUnit logicalOffset = lineBox.lineTopWithLeading(); |
+ LayoutUnit lineHeight = lineBox.lineBottomWithLeading() - logicalOffset; |
+ updateMinimumPageHeight(logicalOffset, calculateMinimumPageHeight(styleRef(), lineBox)); |
logicalOffset += delta; |
- lineBox.setPaginationStrut(0); |
+ lineBox.setPaginationStrut(LayoutUnit()); |
lineBox.setIsFirstAfterPageBreak(false); |
LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); |
if (!pageLogicalHeight) |
@@ -786,10 +767,6 @@ void LayoutBlockFlow::adjustLinePositionForPagination(RootInlineBox& lineBox, La |
clearShouldBreakAtLineToAvoidWidow(); |
setDidBreakAtLineToAvoidWidow(); |
} |
- if (lineHeight > pageLogicalHeight) { |
- // Split the top margin in order to avoid splitting the visible part of the line. |
- remainingLogicalHeight -= std::min(lineHeight - pageLogicalHeight, std::max<LayoutUnit>(0, logicalVisualOverflow.y() - lineBox.lineTopWithLeading())); |
- } |
LayoutUnit totalLogicalHeight = lineHeight + std::max<LayoutUnit>(0, logicalOffset); |
LayoutUnit pageLogicalHeightAtNewOffset = pageLogicalHeightForOffset(logicalOffset + remainingLogicalHeight); |
setPageBreak(logicalOffset, lineHeight - remainingLogicalHeight); |