OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
768 // line and all following lines. | 768 // line and all following lines. |
769 LayoutRect logicalVisualOverflow = lineBox.logicalVisualOverflowRect(lineBox
.lineTop(), lineBox.lineBottom()); | 769 LayoutRect logicalVisualOverflow = lineBox.logicalVisualOverflowRect(lineBox
.lineTop(), lineBox.lineBottom()); |
770 LayoutUnit logicalOffset = std::min(lineBox.lineTopWithLeading(), logicalVis
ualOverflow.y()); | 770 LayoutUnit logicalOffset = std::min(lineBox.lineTopWithLeading(), logicalVis
ualOverflow.y()); |
771 LayoutUnit logicalBottom = std::max(lineBox.lineBottomWithLeading(), logical
VisualOverflow.maxY()); | 771 LayoutUnit logicalBottom = std::max(lineBox.lineBottomWithLeading(), logical
VisualOverflow.maxY()); |
772 LayoutUnit lineHeight = logicalBottom - logicalOffset; | 772 LayoutUnit lineHeight = logicalBottom - logicalOffset; |
773 updateMinimumPageHeight(logicalOffset, calculateMinimumPageHeight(styleRef()
, &lineBox, logicalOffset, logicalBottom)); | 773 updateMinimumPageHeight(logicalOffset, calculateMinimumPageHeight(styleRef()
, &lineBox, logicalOffset, logicalBottom)); |
774 logicalOffset += delta; | 774 logicalOffset += delta; |
775 lineBox.setPaginationStrut(0); | 775 lineBox.setPaginationStrut(0); |
776 lineBox.setIsFirstAfterPageBreak(false); | 776 lineBox.setIsFirstAfterPageBreak(false); |
777 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); | 777 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); |
778 bool hasUniformPageLogicalHeight = !flowThread || flowThread->columnSetsHave
UniformLogicalHeight(); | 778 if (!pageLogicalHeight) |
779 // If lineHeight is greater than pageLogicalHeight, but logicalVisualOverflo
w.height() still fits, we are | |
780 // still going to add a strut, so that the visible overflow fits on a single
page. | |
781 if (!pageLogicalHeight || (hasUniformPageLogicalHeight && logicalVisualOverf
low.height() > pageLogicalHeight)) { | |
782 // FIXME: In case the line aligns with the top of the page (or it's slig
htly shifted downwards) it will not be marked as the first line in the page. | |
783 // From here, the fix is not straightforward because it's not easy to al
ways determine when the current line is the first in the page. | |
784 return; | 779 return; |
785 } | |
786 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset, ExcludePageBoundary); | 780 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset, ExcludePageBoundary); |
787 | 781 |
788 int lineIndex = lineCount(&lineBox); | 782 int lineIndex = lineCount(&lineBox); |
789 if (remainingLogicalHeight < lineHeight || (shouldBreakAtLineToAvoidWidow()
&& lineBreakToAvoidWidow() == lineIndex)) { | 783 if (remainingLogicalHeight < lineHeight || (shouldBreakAtLineToAvoidWidow()
&& lineBreakToAvoidWidow() == lineIndex)) { |
790 if (shouldBreakAtLineToAvoidWidow() && lineBreakToAvoidWidow() == lineIn
dex) { | 784 if (shouldBreakAtLineToAvoidWidow() && lineBreakToAvoidWidow() == lineIn
dex) { |
791 clearShouldBreakAtLineToAvoidWidow(); | 785 clearShouldBreakAtLineToAvoidWidow(); |
792 setDidBreakAtLineToAvoidWidow(); | 786 setDidBreakAtLineToAvoidWidow(); |
793 } | 787 } |
794 if (lineHeight > pageLogicalHeight) { | 788 if (lineHeight > pageLogicalHeight) { |
795 // Split the top margin in order to avoid splitting the visible part
of the line. | 789 // Split the top margin in order to avoid splitting the visible part
of the line. |
796 remainingLogicalHeight -= std::min(lineHeight - pageLogicalHeight, s
td::max<LayoutUnit>(0, logicalVisualOverflow.y() - lineBox.lineTopWithLeading())
); | 790 remainingLogicalHeight -= std::min(lineHeight - pageLogicalHeight, s
td::max<LayoutUnit>(0, logicalVisualOverflow.y() - lineBox.lineTopWithLeading())
); |
797 } | 791 } |
798 LayoutUnit totalLogicalHeight = lineHeight + std::max<LayoutUnit>(0, log
icalOffset); | 792 LayoutUnit totalLogicalHeight = lineHeight + std::max<LayoutUnit>(0, log
icalOffset); |
799 LayoutUnit pageLogicalHeightAtNewOffset = hasUniformPageLogicalHeight ?
pageLogicalHeight : pageLogicalHeightForOffset(logicalOffset + remainingLogicalH
eight); | 793 LayoutUnit pageLogicalHeightAtNewOffset = pageLogicalHeightForOffset(log
icalOffset + remainingLogicalHeight); |
800 setPageBreak(logicalOffset, lineHeight - remainingLogicalHeight); | 794 setPageBreak(logicalOffset, lineHeight - remainingLogicalHeight); |
801 if (((lineBox == firstRootBox() && totalLogicalHeight < pageLogicalHeigh
tAtNewOffset) || (!style()->hasAutoOrphans() && style()->orphans() >= lineIndex)
) | 795 if (((lineBox == firstRootBox() && totalLogicalHeight < pageLogicalHeigh
tAtNewOffset) || (!style()->hasAutoOrphans() && style()->orphans() >= lineIndex)
) |
802 && !isOutOfFlowPositioned() && !isTableCell()) { | 796 && !isOutOfFlowPositioned() && !isTableCell()) { |
803 setPaginationStrut(remainingLogicalHeight + std::max<LayoutUnit>(0,
logicalOffset)); | 797 setPaginationStrut(remainingLogicalHeight + std::max<LayoutUnit>(0,
logicalOffset)); |
804 } else { | 798 } else { |
805 delta += remainingLogicalHeight; | 799 delta += remainingLogicalHeight; |
806 lineBox.setPaginationStrut(remainingLogicalHeight); | 800 lineBox.setPaginationStrut(remainingLogicalHeight); |
807 lineBox.setIsFirstAfterPageBreak(true); | 801 lineBox.setIsFirstAfterPageBreak(true); |
808 } | 802 } |
809 } else if (remainingLogicalHeight == pageLogicalHeight) { | 803 } else if (remainingLogicalHeight == pageLogicalHeight) { |
810 // We're at the very top of a page or column. | 804 // We're at the very top of a page or column. |
811 if (lineBox != firstRootBox()) | 805 if (lineBox != firstRootBox()) |
812 lineBox.setIsFirstAfterPageBreak(true); | 806 lineBox.setIsFirstAfterPageBreak(true); |
813 if (lineBox != firstRootBox() || offsetFromLogicalTopOfFirstPage()) | 807 if (lineBox != firstRootBox() || offsetFromLogicalTopOfFirstPage()) |
814 setPageBreak(logicalOffset, lineHeight); | 808 setPageBreak(logicalOffset, lineHeight); |
815 } | 809 } |
816 } | 810 } |
817 | 811 |
818 LayoutUnit LayoutBlockFlow::adjustForUnsplittableChild(LayoutBox& child, LayoutU
nit logicalOffset, bool includeMargins) | 812 LayoutUnit LayoutBlockFlow::adjustForUnsplittableChild(LayoutBox& child, LayoutU
nit logicalOffset, bool includeMargins) |
819 { | 813 { |
820 bool checkColumnBreaks = flowThreadContainingBlock(); | 814 bool checkColumnBreaks = flowThreadContainingBlock(); |
821 bool checkPageBreaks = !checkColumnBreaks && view()->layoutState()->pageLogi
calHeight(); | 815 bool checkPageBreaks = !checkColumnBreaks && view()->layoutState()->pageLogi
calHeight(); |
822 bool isUnsplittable = child.isUnsplittableForPagination() || (checkColumnBre
aks && child.style()->columnBreakInside() == PBAVOID) | 816 bool isUnsplittable = child.isUnsplittableForPagination() || (checkColumnBre
aks && child.style()->columnBreakInside() == PBAVOID) |
823 || (checkPageBreaks && child.style()->pageBreakInside() == PBAVOID); | 817 || (checkPageBreaks && child.style()->pageBreakInside() == PBAVOID); |
824 if (!isUnsplittable) | 818 if (!isUnsplittable) |
825 return logicalOffset; | 819 return logicalOffset; |
826 LayoutUnit childLogicalHeight = logicalHeightForChild(child) + (includeMargi
ns ? marginBeforeForChild(child) + marginAfterForChild(child) : LayoutUnit()); | 820 LayoutUnit childLogicalHeight = logicalHeightForChild(child) + (includeMargi
ns ? marginBeforeForChild(child) + marginAfterForChild(child) : LayoutUnit()); |
827 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); | 821 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); |
828 updateMinimumPageHeight(logicalOffset, childLogicalHeight); | 822 updateMinimumPageHeight(logicalOffset, childLogicalHeight); |
829 if (!pageLogicalHeight || childLogicalHeight > pageLogicalHeight) | 823 if (!pageLogicalHeight) |
830 return logicalOffset; | 824 return logicalOffset; |
831 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset, ExcludePageBoundary); | 825 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset, ExcludePageBoundary); |
832 if (remainingLogicalHeight < childLogicalHeight) | 826 if (remainingLogicalHeight < childLogicalHeight) |
833 return logicalOffset + remainingLogicalHeight; | 827 return logicalOffset + remainingLogicalHeight; |
834 return logicalOffset; | 828 return logicalOffset; |
835 } | 829 } |
836 | 830 |
837 void LayoutBlockFlow::rebuildFloatsFromIntruding() | 831 void LayoutBlockFlow::rebuildFloatsFromIntruding() |
838 { | 832 { |
839 if (m_floatingObjects) | 833 if (m_floatingObjects) |
(...skipping 2238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3078 FrameView* frameView = document().view(); | 3072 FrameView* frameView = document().view(); |
3079 LayoutUnit top = (style()->position() == FixedPosition) ? 0 : frameView->scr
ollOffset().height(); | 3073 LayoutUnit top = (style()->position() == FixedPosition) ? 0 : frameView->scr
ollOffset().height(); |
3080 int visibleHeight = frameView->visibleContentRect(IncludeScrollbars).height(
); | 3074 int visibleHeight = frameView->visibleContentRect(IncludeScrollbars).height(
); |
3081 if (size().height() < visibleHeight) | 3075 if (size().height() < visibleHeight) |
3082 top += (visibleHeight - size().height()) / 2; | 3076 top += (visibleHeight - size().height()) / 2; |
3083 setY(top); | 3077 setY(top); |
3084 dialog->setCentered(top); | 3078 dialog->setCentered(top); |
3085 } | 3079 } |
3086 | 3080 |
3087 } // namespace blink | 3081 } // namespace blink |
OLD | NEW |