diff --git a/autotests/parttest.cpp b/autotests/parttest.cpp index 15c5cf5dc..ec9f055be 100644 --- a/autotests/parttest.cpp +++ b/autotests/parttest.cpp @@ -58,6 +58,7 @@ signals: void urlHandler(const QUrl &url); // NOLINT(readability-inconsistent-declaration-parameter-name) private slots: + void testZoomWithCrop(); void testReload(); void testCanceledReload(); void testTOCReload(); @@ -2031,6 +2032,59 @@ void PartTest::testZoomInFacingPages() QVERIFY(QMetaObject::invokeMethod(part.m_pageView, "slotZoomIn")); QVERIFY(QMetaObject::invokeMethod(part.m_pageView, "slotZoomIn")); QTRY_COMPARE(zoomSelectAction->currentText(), QStringLiteral("66%")); + + // Back to single mode + part.m_pageView->findChild(QStringLiteral("view_render_mode_single"))->trigger(); +} + +void PartTest::testZoomWithCrop() +{ + // We test that all zoom levels can be achieved with cropped pages, bug 342003 + + QVariantList dummyArgs; + Okular::Part part(nullptr, nullptr, dummyArgs); + QVERIFY(openDocument(&part, QStringLiteral(KDESRCDIR "data/file2.pdf"))); + + KActionMenu *cropMenu = part.m_pageView->findChild(QStringLiteral("view_trim_mode")); + KToggleAction *cropAction = cropMenu->menu()->findChild(QStringLiteral("view_trim_margins")); + KSelectAction *zoomSelectAction = part.m_pageView->findChild(QStringLiteral("zoom_to")); + + part.widget()->resize(600, 400); + part.widget()->show(); + QVERIFY(QTest::qWaitForWindowExposed(part.widget())); + + // Activate "Trim Margins" + QVERIFY(!Okular::Settings::trimMargins()); + cropAction->trigger(); + QVERIFY(Okular::Settings::trimMargins()); + + // Wait for the bounding boxes + QTRY_VERIFY(part.m_document->page(0)->isBoundingBoxKnown()); + QTRY_VERIFY(part.m_document->page(1)->isBoundingBoxKnown()); + + // Zoom out + for (int i = 0; i < 20; i++) { + QVERIFY(QMetaObject::invokeMethod(part.m_pageView, "slotZoomOut")); + } + QCOMPARE(zoomSelectAction->currentText(), "12%"); + + // Zoom in and out and check that all zoom levels appear + QSet zooms_ref {"12%", "25%", "33%", "50%", "66%", "75%", "100%", "125%", "150%", "200%", "400%", "800%", "1,600%", "2,500%", "5,000%", "10,000%"}; + + for (int j = 0; j < 2; j++) { + QSet zooms; + for (int i = 0; i < 18; i++) { + zooms << zoomSelectAction->currentText(); + QVERIFY(QMetaObject::invokeMethod(part.m_pageView, j == 0 ? "slotZoomIn" : "slotZoomOut")); + } + + QVERIFY(zooms.contains(zooms_ref)); + } + + // Deactivate "Trim Margins" + QVERIFY(Okular::Settings::trimMargins()); + cropAction->trigger(); + QVERIFY(!Okular::Settings::trimMargins()); } } // namespace Okular diff --git a/part/pageview.cpp b/part/pageview.cpp index 5819cc06e..4d6f0cd94 100644 --- a/part/pageview.cpp +++ b/part/pageview.cpp @@ -3710,8 +3710,12 @@ double PageView::zoomFactorFitMode(ZoomMode mode) // prevent segmentation fault when opening a new document; if (!currentItem) return 0; + + // We need the real width/height of the cropped page. const Okular::Page *okularPage = currentItem->page(); - const double width = okularPage->width(), height = okularPage->height(); + const double width = okularPage->width() * currentItem->crop().width(); + const double height = okularPage->height() * currentItem->crop().height(); + if (mode == ZoomFitWidth) return (double)colWidth / width; if (mode == ZoomFitPage) {