diff options
author | Steve Block <steveblock@google.com> | 2011-05-25 08:15:24 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-05-25 08:15:24 -0700 |
commit | fa91a01aee5d4a80ca6c80f722116b850f09996c (patch) | |
tree | f72740e60d3c3d4f0ab144e88c03d1f134944ce3 /Source/WebCore/page/PrintContext.cpp | |
parent | 96f37d6d1b390f6690858789706ee6ec25bc1677 (diff) | |
parent | feebf8e7a79ad68b04a1a948e2b8078d6e5f0048 (diff) | |
download | external_webkit-fa91a01aee5d4a80ca6c80f722116b850f09996c.zip external_webkit-fa91a01aee5d4a80ca6c80f722116b850f09996c.tar.gz external_webkit-fa91a01aee5d4a80ca6c80f722116b850f09996c.tar.bz2 |
Merge changes I78ff6a85,Ic85c6405,Ibf903baa,I3a0459db,I35140385,I54790419,I6bfe5d24,Ia9f39b83,I5bcecd5a,I1de96683,I543c6810,I8a5b0878,I0ae670bf,Ide4d58dc,I28ebaf3d,I499d6631,Ie5090e0d,I6d3e5f1f
* changes:
Merge WebKit at r78450: Update ThirdPartyProject.prop
Merge WebKit at r78450: Add new Font::canExpandAroundIdeographsInComplexText()
Merge WebKit at r78450: Add new ChromeClient::selectItemAlignmentFollowsMenuWritingDirection()
Merge WebKit at r78450: FrameLoaderClient::didRunInsecureContent() signature changed
Merge WebKit at r78450: HTMLAreaElement::getRect() renamed
Merge WebKit at r78450: FrameLoader::url() removed
Merge WebKit at r78450: HTMLParserQuirks removed
Merge WebKit at r78450: TextRun::padding() renamed
Merge WebKit at r78450: Use new FontMetrics
Merge WebKit at r78450: GraphicsContext current path removed
Merge WebKit at r78450: TransformationMatrix multiply methods renamed and meaning changed
Merge WebKit at r78450: FontCustomPlatformData::fontPlatformData() signature changed
Merge WebKit at r78450: IntRect::bottom()/right() renamed
Merge WebKit at r78450: Fix remaining conflicts
Merge WebKit at r78450: Fix conflicts due to new ENABLE_WEB_ARCHIVE guard
Merge WebKit at r78450: Fix conflicts in media controls
Merge WebKit at r78450: Fix Makefiles
Merge WebKit at r78450: Initial merge by git.
Diffstat (limited to 'Source/WebCore/page/PrintContext.cpp')
-rw-r--r-- | Source/WebCore/page/PrintContext.cpp | 106 |
1 files changed, 79 insertions, 27 deletions
diff --git a/Source/WebCore/page/PrintContext.cpp b/Source/WebCore/page/PrintContext.cpp index e82420d..da29f0e 100644 --- a/Source/WebCore/page/PrintContext.cpp +++ b/Source/WebCore/page/PrintContext.cpp @@ -55,16 +55,6 @@ PrintContext::~PrintContext() end(); } -size_t PrintContext::pageCount() const -{ - return m_pageRects.size(); -} - -const IntRect& PrintContext::pageRect(size_t pageNumber) const -{ - return m_pageRects[pageNumber]; -} - void PrintContext::computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight, bool allowHorizontalTiling) { m_pageRects.clear(); @@ -80,10 +70,20 @@ void PrintContext::computePageRects(const FloatRect& printRect, float headerHeig RenderView* view = toRenderView(m_frame->document()->renderer()); - float ratio = printRect.height() / printRect.width(); + bool isHorizontal = view->style()->isHorizontalWritingMode(); + + float pageWidth; + float pageHeight; + if (isHorizontal) { + float ratio = printRect.height() / printRect.width(); + pageWidth = view->docWidth(); + pageHeight = floorf(pageWidth * ratio); + } else { + float ratio = printRect.width() / printRect.height(); + pageHeight = view->docHeight(); + pageWidth = floorf(pageHeight * ratio); + } - float pageWidth = view->docWidth(); - float pageHeight = floorf(pageWidth * ratio); outPageHeight = pageHeight; // this is the height of the page adjusted by margins pageHeight -= headerHeight + footerHeight; @@ -101,7 +101,7 @@ void PrintContext::computePageRectsWithPageSize(const FloatSize& pageSizeInPixel computePageRectsWithPageSizeInternal(pageSizeInPixels, allowHorizontalTiling); } -void PrintContext::computePageRectsWithPageSizeInternal(const FloatSize& pageSizeInPixels, bool allowHorizontalTiling) +void PrintContext::computePageRectsWithPageSizeInternal(const FloatSize& pageSizeInPixels, bool allowInlineDirectionTiling) { if (!m_frame->document() || !m_frame->view() || !m_frame->document()->renderer()) return; @@ -113,13 +113,60 @@ void PrintContext::computePageRectsWithPageSizeInternal(const FloatSize& pageSiz int pageWidth = pageSizeInPixels.width(); int pageHeight = pageSizeInPixels.height(); - unsigned pageCount = ceilf((float)docRect.height() / pageHeight); + bool isHorizontal = view->style()->isHorizontalWritingMode(); + + int docLogicalHeight = isHorizontal ? docRect.height() : docRect.width(); + int pageLogicalHeight = isHorizontal ? pageHeight : pageWidth; + int pageLogicalWidth = isHorizontal ? pageWidth : pageHeight; + + int inlineDirectionStart; + int inlineDirectionEnd; + int blockDirectionStart; + int blockDirectionEnd; + if (isHorizontal) { + if (view->style()->isFlippedBlocksWritingMode()) { + blockDirectionStart = docRect.maxY(); + blockDirectionEnd = docRect.y(); + } else { + blockDirectionStart = docRect.y(); + blockDirectionEnd = docRect.maxY(); + } + inlineDirectionStart = view->style()->isLeftToRightDirection() ? docRect.x() : docRect.maxX(); + inlineDirectionEnd = view->style()->isLeftToRightDirection() ? docRect.maxX() : docRect.x(); + } else { + if (view->style()->isFlippedBlocksWritingMode()) { + blockDirectionStart = docRect.maxX(); + blockDirectionEnd = docRect.x(); + } else { + blockDirectionStart = docRect.x(); + blockDirectionEnd = docRect.maxX(); + } + inlineDirectionStart = view->style()->isLeftToRightDirection() ? docRect.y() : docRect.maxY(); + inlineDirectionEnd = view->style()->isLeftToRightDirection() ? docRect.maxY() : docRect.y(); + } + + unsigned pageCount = ceilf((float)docLogicalHeight / pageLogicalHeight); for (unsigned i = 0; i < pageCount; ++i) { - if (allowHorizontalTiling) { - for (int currentX = docRect.x(); currentX < docRect.right(); currentX += pageWidth) - m_pageRects.append(IntRect(currentX, docRect.y() + i * pageHeight, pageWidth, pageHeight)); - } else - m_pageRects.append(IntRect(docRect.x(), docRect.y() + i * pageHeight, pageWidth, pageHeight)); + int pageLogicalTop = blockDirectionEnd > blockDirectionStart ? + blockDirectionStart + i * pageLogicalHeight : + blockDirectionStart - (i + 1) * pageLogicalHeight; + if (allowInlineDirectionTiling) { + for (int currentInlinePosition = inlineDirectionStart; + inlineDirectionEnd > inlineDirectionStart ? currentInlinePosition < inlineDirectionEnd : currentInlinePosition > inlineDirectionEnd; + currentInlinePosition += (inlineDirectionEnd > inlineDirectionStart ? pageLogicalWidth : -pageLogicalWidth)) { + int pageLogicalLeft = inlineDirectionEnd > inlineDirectionStart ? currentInlinePosition : currentInlinePosition - pageLogicalWidth; + IntRect pageRect(pageLogicalLeft, pageLogicalTop, pageLogicalWidth, pageLogicalHeight); + if (!isHorizontal) + pageRect = pageRect.transposedRect(); + m_pageRects.append(pageRect); + } + } else { + int pageLogicalLeft = inlineDirectionEnd > inlineDirectionStart ? inlineDirectionStart : inlineDirectionStart - pageLogicalWidth; + IntRect pageRect(pageLogicalLeft, pageLogicalTop, pageLogicalWidth, pageLogicalHeight); + if (!isHorizontal) + pageRect = pageRect.transposedRect(); + m_pageRects.append(pageRect); + } } } @@ -135,22 +182,27 @@ void PrintContext::begin(float width, float height) m_frame->setPrinting(true, FloatSize(minLayoutWidth, minLayoutHeight), printingMaximumShrinkFactor / printingMinimumShrinkFactor, Frame::AdjustViewSize); } -float PrintContext::computeAutomaticScaleFactor(float availablePaperWidth) +float PrintContext::computeAutomaticScaleFactor(const FloatSize& availablePaperSize) { if (!m_frame->view()) return 1; - float viewWidth = m_frame->view()->contentsWidth(); - if (viewWidth < 1) + bool useViewWidth = true; + if (m_frame->document() && m_frame->document()->renderView()) + useViewWidth = m_frame->document()->renderView()->style()->isHorizontalWritingMode(); + + float viewLogicalWidth = useViewWidth ? m_frame->view()->contentsWidth() : m_frame->view()->contentsHeight(); + if (viewLogicalWidth < 1) return 1; float maxShrinkToFitScaleFactor = 1 / printingMaximumShrinkFactor; - float shrinkToFitScaleFactor = availablePaperWidth / viewWidth; + float shrinkToFitScaleFactor = (useViewWidth ? availablePaperSize.width() : availablePaperSize.height()) / viewLogicalWidth; return max(maxShrinkToFitScaleFactor, shrinkToFitScaleFactor); } void PrintContext::spoolPage(GraphicsContext& ctx, int pageNumber, float width) { + // FIXME: Not correct for vertical text. IntRect pageRect = m_pageRects[pageNumber]; float scale = width / pageRect.width(); @@ -164,9 +216,9 @@ void PrintContext::spoolPage(GraphicsContext& ctx, int pageNumber, float width) void PrintContext::spoolRect(GraphicsContext& ctx, const IntRect& rect) { + // FIXME: Not correct for vertical text. ctx.save(); - ctx.scale(FloatSize(1, -1)); - ctx.translate(0, -rect.height()); + ctx.translate(-rect.x(), -rect.y()); ctx.clip(rect); m_frame->view()->paintContents(&ctx, rect); ctx.restore(); @@ -212,7 +264,7 @@ int PrintContext::pageNumberForElement(Element* element, const FloatSize& pageSi size_t pageNumber = 0; for (; pageNumber < printContext.pageCount(); pageNumber++) { const IntRect& page = printContext.pageRect(pageNumber); - if (page.x() <= left && left < page.right() && page.y() <= top && top < page.bottom()) + if (page.x() <= left && left < page.maxX() && page.y() <= top && top < page.maxY()) return pageNumber; } return -1; |