void TextAutosizer::updatePageInfo() { if (m_updatePageInfoDeferred || !m_document->page() || !m_document->settings()) return; PageInfo previousPageInfo(m_pageInfo); m_pageInfo.m_settingEnabled = m_document->settings()->textAutosizingEnabled(); if (!m_pageInfo.m_settingEnabled || m_document->printing()) { m_pageInfo.m_pageNeedsAutosizing = false; } else { LayoutView* layoutView = m_document->layoutView(); bool horizontalWritingMode = isHorizontalWritingMode(layoutView->style()->writingMode()); // FIXME: With out-of-process iframes, the top frame can be remote and // doesn't have sizing information. Just return if this is the case. Frame* frame = m_document->frame()->tree().top(); if (frame->isRemoteFrame()) return; LocalFrame* mainFrame = toLocalFrame(frame); IntSize frameSize = m_document->settings()->textAutosizingWindowSizeOverride(); if (frameSize.isEmpty()) frameSize = windowSize(); m_pageInfo.m_frameWidth = horizontalWritingMode ? frameSize.width() : frameSize.height(); IntSize layoutSize = mainFrame->view()->layoutSize(); m_pageInfo.m_layoutWidth = horizontalWritingMode ? layoutSize.width() : layoutSize.height(); // Compute the base font scale multiplier based on device and accessibility settings. m_pageInfo.m_baseMultiplier = m_document->settings()->accessibilityFontScaleFactor(); // If the page has a meta viewport or @viewport, don't apply the device scale adjustment. const ViewportDescription& viewportDescription = mainFrame->document()->viewportDescription(); if (!viewportDescription.isSpecifiedByAuthor()) { float deviceScaleAdjustment = m_document->settings()->deviceScaleAdjustment(); m_pageInfo.m_baseMultiplier *= deviceScaleAdjustment; } m_pageInfo.m_pageNeedsAutosizing = !!m_pageInfo.m_frameWidth && (m_pageInfo.m_baseMultiplier * (static_cast<float>(m_pageInfo.m_layoutWidth) / m_pageInfo.m_frameWidth) > 1.0f); } if (m_pageInfo.m_pageNeedsAutosizing) { // If page info has changed, multipliers may have changed. Force a layout to recompute them. if (m_pageInfo.m_frameWidth != previousPageInfo.m_frameWidth || m_pageInfo.m_layoutWidth != previousPageInfo.m_layoutWidth || m_pageInfo.m_baseMultiplier != previousPageInfo.m_baseMultiplier || m_pageInfo.m_settingEnabled != previousPageInfo.m_settingEnabled) setAllTextNeedsLayout(); } else if (previousPageInfo.m_hasAutosized) { // If we are no longer autosizing the page, we won't do anything during the next layout. // Set all the multipliers back to 1 now. resetMultipliers(); m_pageInfo.m_hasAutosized = false; } }
void PrintContext::computePageRectsWithPageSizeInternal(const FloatSize& pageSizeInPixels) { if (!m_frame->document() || !m_frame->view() || !m_frame->document()->layoutView()) return; LayoutView* view = m_frame->document()->layoutView(); IntRect docRect = view->documentRect(); int pageWidth = pageSizeInPixels.width(); int pageHeight = pageSizeInPixels.height(); 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) { int pageLogicalTop = blockDirectionEnd > blockDirectionStart ? blockDirectionStart + i * pageLogicalHeight : blockDirectionStart - (i + 1) * pageLogicalHeight; int pageLogicalLeft = inlineDirectionEnd > inlineDirectionStart ? inlineDirectionStart : inlineDirectionStart - pageLogicalWidth; IntRect pageRect(pageLogicalLeft, pageLogicalTop, pageLogicalWidth, pageLogicalHeight); if (!isHorizontal) pageRect = pageRect.transposedRect(); m_pageRects.append(pageRect); } }