summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/page/PrintContext.cpp
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-05-25 08:15:24 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-05-25 08:15:24 -0700
commitfa91a01aee5d4a80ca6c80f722116b850f09996c (patch)
treef72740e60d3c3d4f0ab144e88c03d1f134944ce3 /Source/WebCore/page/PrintContext.cpp
parent96f37d6d1b390f6690858789706ee6ec25bc1677 (diff)
parentfeebf8e7a79ad68b04a1a948e2b8078d6e5f0048 (diff)
downloadexternal_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.cpp106
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;