[Libreoffice-commits] core.git: sc/inc sc/source

Tomaž Vajngerl tomaz.vajngerl at collabora.co.uk
Mon Dec 4 07:04:47 UTC 2017


 sc/inc/docuno.hxx              |    2 ++
 sc/source/ui/inc/printfun.hxx  |    3 +++
 sc/source/ui/unoobj/docuno.cxx |   25 +++++++++++++++++++------
 sc/source/ui/view/printfun.cxx |   35 +++++++++++++++++++++++++++++++++++
 4 files changed, 59 insertions(+), 6 deletions(-)

New commits:
commit f1f1dd3885cdbf00032a362275f36e408ef5ac9f
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Fri Dec 1 22:28:48 2017 +0900

    Use print state when rendering a Calc document
    
    When rendering a Calc document with UNO rendering API for printing,
    PDF export, some data (like print X, Y sizes) can be passed from one
    ScPrintFunc call to the other to save us from some unnecessay
    recalculation and increase performance. This was used previously for
    preview, but not when rendering.
    This implements some missing functions in ScPrintFunc and implements
    the use of print state when rendering with UNO rendering API.
    
    Change-Id: Ic69dee99223961befb9b5dddf8ec5c268630bf79
    Reviewed-on: https://gerrit.libreoffice.org/45687
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>

diff --git a/sc/inc/docuno.hxx b/sc/inc/docuno.hxx
index 0004b03935e7..ecb7cf494763 100644
--- a/sc/inc/docuno.hxx
+++ b/sc/inc/docuno.hxx
@@ -59,6 +59,7 @@ class ScDocShell;
 class ScAnnotationObj;
 class ScMarkData;
 class ScPrintFuncCache;
+struct ScPrintState;
 class ScPrintSelectionStatus;
 class ScTableColumnObj;
 class ScTableRowObj;
@@ -92,6 +93,7 @@ private:
     ScDocShell*             pDocShell;
     ScPrintFuncCache*       pPrintFuncCache;
     ScPrintUIOptions*       pPrinterOptions;
+    std::unique_ptr<ScPrintState> m_pPrintState;
     css::uno::Reference<css::uno::XAggregation> xNumberAgg;
     css::uno::Reference<css::uno::XInterface> xDrawGradTab;
     css::uno::Reference<css::uno::XInterface> xDrawHatchTab;
diff --git a/sc/source/ui/inc/printfun.hxx b/sc/source/ui/inc/printfun.hxx
index 8adedc168cc6..6926a0b5b9fe 100644
--- a/sc/source/ui/inc/printfun.hxx
+++ b/sc/source/ui/inc/printfun.hxx
@@ -224,6 +224,9 @@ public:
                                  const ScPrintOptions* pOptions = nullptr,
                                  ScPageBreakData* pData = nullptr );
 
+                    ScPrintFunc( ScDocShell* pShell, SfxPrinter* pNewPrinter,
+                                const ScPrintState& rState, const ScPrintOptions* pOptions );
+
                     // ctors for device other than printer - for preview and pdf:
 
                     ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell, SCTAB nTab,
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index 496ef70e036c..933b29cb198a 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -25,6 +25,7 @@
 #include <editeng/editview.hxx>
 #include <editeng/outliner.hxx>
 #include <o3tl/any.hxx>
+#include <o3tl/make_unique.hxx>
 #include <svx/fmdpage.hxx>
 #include <svx/fmview.hxx>
 #include <svx/svditer.hxx>
@@ -1781,9 +1782,13 @@ uno::Sequence<beans::PropertyValue> SAL_CALL ScModelObj::getRenderer( sal_Int32
     }
     else
     {
-        ScPrintFunc aFunc( pDocShell, pDocShell->GetPrinter(), nTab,
-                pPrintFuncCache->GetFirstAttr(nTab), nTotalPages, pSelRange, &aStatus.GetOptions() );
-        aFunc.SetRenderFlag( true );
+        std::unique_ptr<ScPrintFunc, o3tl::default_delete<ScPrintFunc>> pPrintFunc;
+        if (m_pPrintState)
+            pPrintFunc.reset(new ScPrintFunc(pDocShell, pDocShell->GetPrinter(), *m_pPrintState, &aStatus.GetOptions()));
+        else
+            pPrintFunc.reset(new ScPrintFunc(pDocShell, pDocShell->GetPrinter(), nTab,
+                                             pPrintFuncCache->GetFirstAttr(nTab), nTotalPages, pSelRange, &aStatus.GetOptions()));
+        pPrintFunc->SetRenderFlag( true );
 
         Range aPageRange( nRenderer+1, nRenderer+1 );
         MultiSelection aPage( aPageRange );
@@ -1793,10 +1798,17 @@ uno::Sequence<beans::PropertyValue> SAL_CALL ScModelObj::getRenderer( sal_Int32
         long nDisplayStart = pPrintFuncCache->GetDisplayStart( nTab );
         long nTabStart = pPrintFuncCache->GetTabStart( nTab );
 
-        (void)aFunc.DoPrint( aPage, nTabStart, nDisplayStart, false, nullptr );
+        (void)pPrintFunc->DoPrint( aPage, nTabStart, nDisplayStart, false, nullptr );
+
+        bWasCellRange = pPrintFunc->GetLastSourceRange( aCellRange );
+        Size aTwips = pPrintFunc->GetPageSize();
+
+        if (!m_pPrintState)
+        {
+            m_pPrintState.reset(new ScPrintState());
+            pPrintFunc->GetPrintState(*m_pPrintState);
+        }
 
-        bWasCellRange = aFunc.GetLastSourceRange( aCellRange );
-        Size aTwips = aFunc.GetPageSize();
         aPageSize.Width = TwipsToHMM( aTwips.Width());
         aPageSize.Height = TwipsToHMM( aTwips.Height());
     }
@@ -1916,6 +1928,7 @@ void SAL_CALL ScModelObj::render( sal_Int32 nSelRenderer, const uno::Any& aSelec
     //  to increase performance, ScPrintState might be used here for subsequent
     //  pages of the same sheet
 
+
     ScPrintFunc aFunc( pDev, pDocShell, nTab, pPrintFuncCache->GetFirstAttr(nTab), nTotalPages, pSelRange, &aStatus.GetOptions() );
     aFunc.SetDrawView( aDrawViewKeeper.mpDrawView );
     aFunc.SetRenderFlag( true );
diff --git a/sc/source/ui/view/printfun.cxx b/sc/source/ui/view/printfun.cxx
index aa83de67fbed..8ee6dd233ab8 100644
--- a/sc/source/ui/view/printfun.cxx
+++ b/sc/source/ui/view/printfun.cxx
@@ -248,6 +248,41 @@ ScPrintFunc::ScPrintFunc( ScDocShell* pShell, SfxPrinter* pNewPrinter, SCTAB nTa
     Construct( pOptions );
 }
 
+ScPrintFunc::ScPrintFunc(ScDocShell* pShell, SfxPrinter* pNewPrinter,
+                         const ScPrintState& rState, const ScPrintOptions* pOptions)
+    :   pDocShell           ( pShell ),
+        pPrinter            ( pNewPrinter ),
+        pDrawView           ( nullptr ),
+        pUserArea           ( nullptr ),
+        bSourceRangeValid   ( false ),
+        bPrintCurrentTable  ( false ),
+        bMultiArea          ( false ),
+        mbHasPrintRange(true),
+        nPagesX(0),
+        nPagesY(0),
+        nTotalY(0),
+        pPageData           ( nullptr )
+{
+    pDev = pPrinter.get();
+
+    nPrintTab   = rState.nPrintTab;
+    nStartCol   = rState.nStartCol;
+    nStartRow   = rState.nStartRow;
+    nEndCol     = rState.nEndCol;
+    nEndRow     = rState.nEndRow;
+    nZoom       = rState.nZoom;
+    nPagesX     = rState.nPagesX;
+    nPagesY     = rState.nPagesY;
+    nTabPages   = rState.nTabPages;
+    nTotalPages = rState.nTotalPages;
+    nPageStart  = rState.nPageStart;
+    nDocPages   = rState.nDocPages;
+    bState      = true;
+
+    aSrcOffset = pPrinter->PixelToLogic(pPrinter->GetPageOffsetPixel(), MapMode(MapUnit::Map100thMM));
+    Construct( pOptions );
+}
+
 ScPrintFunc::ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell, SCTAB nTab,
                             long nPage, long nDocP, const ScRange* pArea,
                             const ScPrintOptions* pOptions )


More information about the Libreoffice-commits mailing list