sumatrapdf icon indicating copy to clipboard operation
sumatrapdf copied to clipboard

Avoid always rendering first page

Open kjk opened this issue 6 months ago • 1 comments

Related to #4584.

Even when load a pdf with remembered page, we always render page 1 which slows down showing the actual page.

Callstacks when rendering page 1:

SumatraPDF.exe;RenderCache::RequestRendering() Ln 426;7FF6AAD19D26
SumatraPDF.exe;ControllerCallbackHandler::RequestRendering();7FF6AAD39891
SumatraPDF.exe;DisplayModel::RenderVisibleParts();7FF6AAC7381D
SumatraPDF.exe;DisplayModel::GoToPage();7FF6AAC7470D
SumatraPDF.exe;DisplayModel::GoToPage();7FF6AAC6D4D1
SumatraPDF.exe;DisplayModel::SetScrollState();7FF6AAC721DC
SumatraPDF.exe;DisplayModel::SetViewPortSize();7FF6AAC6E38C
SumatraPDF.exe;MainWindow::UpdateCanvasSize();7FF6AACF531B
SumatraPDF.exe;WndProcCanvas();7FF6AAC4AE9C
...
SumatraPDF.exe;WndProcCanvasFixedPageUI();7FF6AAC50B3B
SumatraPDF.exe;WndProcCanvas();7FF6AAC4AF7B
...
SumatraPDF.exe;WndProcCanvasFixedPageUI();7FF6AAC50B1E
SumatraPDF.exe;WndProcCanvas();7FF6AAC4AF7B
...
SumatraPDF.exe;DeferWinPosHelper::End();7FF6AB17CE62
SumatraPDF.exe;RelayoutFrame();7FF6AAD404A0
SumatraPDF.exe;SetSidebarVisibility();7FF6AAD336E6
SumatraPDF.exe;ReplaceDocumentInCurrentTab();7FF6AAD3B403
SumatraPDF.exe;LoadDocumentFinish();7FF6AAD350D4
SumatraPDF.exe;LoadDocument();7FF6AAD34E57
SumatraPDF.exe;ReloadDocument();7FF6AAD33DD6
SumatraPDF.exe;WinMain();7FF6AAD51762

Followed by rendering of restored page from last time:

SumatraPDF.exe;RenderCache::RequestRendering() Ln 426;7FF7DAC39D26
SumatraPDF.exe;ControllerCallbackHandler::RequestRendering();7FF7DAC59891
SumatraPDF.exe;DisplayModel::RenderVisibleParts();7FF7DAB9381D
SumatraPDF.exe;DisplayModel::GoToPage();7FF7DAB9470D
SumatraPDF.exe;DisplayModel::GoToPage();7FF7DAB8D4D1
SumatraPDF.exe;DisplayModel::SetScrollState();7FF7DAB921DC
SumatraPDF.exe;ReplaceDocumentInCurrentTab();7FF7DAC5B451
SumatraPDF.exe;LoadDocumentFinish();7FF7DAC550D4
SumatraPDF.exe;LoadDocument();7FF7DAC54E57
SumatraPDF.exe;ReloadDocument();7FF7DAC53DD6
SumatraPDF.exe;WinMain();7FF7DAC71762

kjk avatar Jun 14 '25 14:06 kjk

Maybe:

diff --git a/src/SumatraPDF.cpp b/src/SumatraPDF.cpp
index be3ef650a..261e2abf8 100644
--- a/src/SumatraPDF.cpp
+++ b/src/SumatraPDF.cpp
@@ -1286,10 +1286,16 @@ static void ReplaceDocumentInCurrentTab(LoadArgs* args, DocController* ctrl, Fil
     // cf. https://code.google.com/p/sumatrapdf/issues/detail?id=2541
     // ReportIf(win->IsDocLoaded() && args->showWin && win->canvasRc.IsEmpty() && !win->AsChm());

-    SetSidebarVisibility(win, showToc, gGlobalPrefs->showFavorites);
-    // restore scroll state after the canvas size has been restored
-    if ((args->showWin || ss.page != 1) && win->AsFixed()) {
+    DisplayModel* dm = win->AsFixed();
+    bool restoreScroll = (args->showWin || ss.page != 1) && dm;
+    if (restoreScroll) {
+        dm->pauseRendering = true;
+        SetSidebarVisibility(win, showToc, gGlobalPrefs->showFavorites);
+        dm->pauseRendering = false;
+        // restore scroll state after the canvas size has been restored
         win->AsFixed()->SetScrollState(ss);
+    } else {
+        SetSidebarVisibility(win, showToc, gGlobalPrefs->showFavorites);
     }

     win->RedrawAll(true);

kjk avatar Jun 14 '25 21:06 kjk