[Libreoffice-commits] core.git: Branch 'feature/gtkbmptiledviewer2' - 2 commits - desktop/Library_sofficeapp.mk desktop/source include/vcl sw/inc sw/source

Andrzej Hunt andrzej.hunt at collabora.com
Fri Jun 13 09:33:40 PDT 2014


 desktop/Library_sofficeapp.mk     |    1 
 desktop/source/lib/init.cxx       |   64 ++++++++++++++------------------------
 include/vcl/ITiledRenderable.hxx  |   48 ++++++++++++++++++++++++++++
 sw/inc/unotxdoc.hxx               |   14 +++++++-
 sw/source/uibase/uno/unotxdoc.cxx |   18 ++++++++++
 5 files changed, 103 insertions(+), 42 deletions(-)

New commits:
commit 9b28bfce4a49cc23cea91e4e14b0ecb99cda272c
Author: Andrzej Hunt <andrzej.hunt at collabora.com>
Date:   Fri Jun 13 17:32:44 2014 +0100

    Use ITiledRenderable for LIBLOK.
    
    Means that no changes should be required here once calc/impress/draw
    support tiled rendering.
    
    Change-Id: I0987d94303f39ba37e29b9ae7b2276e82dc0ccbf

diff --git a/desktop/Library_sofficeapp.mk b/desktop/Library_sofficeapp.mk
index 671ff12..8a592cc 100644
--- a/desktop/Library_sofficeapp.mk
+++ b/desktop/Library_sofficeapp.mk
@@ -14,7 +14,6 @@ $(eval $(call gb_Library_set_include,sofficeapp,\
     -I$(SRCDIR)/desktop/inc \
     -I$(SRCDIR)/desktop/source/inc \
     -I$(SRCDIR)/desktop/source/deployment/inc \
-    -I$(SRCDIR)/sw/inc \
     -I$(SRCDIR)/vcl/inc \
 ))
 
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 1c23bb8..d43f61c 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -39,16 +39,10 @@
 #include <vcl/graphicfilter.hxx>
 #include <vcl/sysdata.hxx>
 #include <vcl/virdev.hxx>
+#include <vcl/ITiledRenderable.hxx>
 #include <unotools/syslocaleoptions.hxx>
 #include <unotools/mediadescriptor.hxx>
 
-// Dirty hack -- we go directly into sw -- ideally we need some sort of
-// layer to get the writer shell for tiled rendering
-#include <doc.hxx>
-#include <docsh.hxx>
-#include <unotxdoc.hxx>
-#include <viewsh.hxx>
-
 #include <salinst.hxx>
 
 // And let's also grab the SvpSalInstance and SvpSalVirtualDevice
@@ -428,38 +422,32 @@ void doc_paintTile (LibreOfficeKitDocument* pThis,
 {
     LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis);
 
+    ::vcl::ITiledRenderable* pDoc = dynamic_cast< ::vcl::ITiledRenderable* >( pDocument->mxComponent.get() );
+    if (!pDoc)
+    {
+        gImpl->maLastExceptionMsg = "Document doesn't support tiled rendering";
+        return;
+    }
 
     Application::AcquireSolarMutex(1);
-    switch (doc_getDocumentType(pThis))
     {
-    case LOK_DOCTYPE_TEXT:
-        {
-            SwXTextDocument* pTxtDoc = dynamic_cast< SwXTextDocument* >( pDocument->mxComponent.get() );
-            SwDocShell* pDocShell = pTxtDoc->GetDocShell();
-            SwDoc* pDoc = pDocShell->GetDoc();
-            SwViewShell* pViewShell = pDoc->GetCurrentViewShell();
-
-            ImplSVData* pSVData = ImplGetSVData();
-            SvpSalInstance* pSalInstance = static_cast< SvpSalInstance* >(pSVData->mpDefInst);
-            pSalInstance->setBitCountFormatMapping( 32, ::basebmp::FORMAT_THIRTYTWO_BIT_TC_MASK_RGBA );
+        ImplSVData* pSVData = ImplGetSVData();
+        SvpSalInstance* pSalInstance = static_cast< SvpSalInstance* >(pSVData->mpDefInst);
+        pSalInstance->setBitCountFormatMapping( 32, ::basebmp::FORMAT_THIRTYTWO_BIT_TC_MASK_RGBA );
 
-            VirtualDevice aDevice(0, (sal_uInt16)32);
-            boost::shared_array< sal_uInt8 > aBuffer( pBuffer, NoDelete< sal_uInt8 >() );
-            aDevice.SetOutputSizePixelScaleOffsetAndBuffer(
-                        Size(nCanvasWidth, nCanvasHeight), Fraction(1.0), Point(),
-                        aBuffer, true );
+        VirtualDevice aDevice(0, (sal_uInt16)32);
+        boost::shared_array< sal_uInt8 > aBuffer( pBuffer, NoDelete< sal_uInt8 >() );
+        aDevice.SetOutputSizePixelScaleOffsetAndBuffer(
+                    Size(nCanvasWidth, nCanvasHeight), Fraction(1.0), Point(),
+                    aBuffer, true );
 
-            pViewShell->PaintTile(aDevice, nCanvasWidth, nCanvasHeight,
-                                    nTilePosX, nTilePosY, nTileWidth, nTileHeight);
+        pDoc->paintTile(aDevice, nCanvasWidth, nCanvasHeight,
+                        nTilePosX, nTilePosY, nTileWidth, nTileHeight);
 
-            SvpSalVirtualDevice* pSalDev = static_cast< SvpSalVirtualDevice* >(aDevice.getSalVirtualDevice());
-            basebmp::BitmapDeviceSharedPtr pBmpDev = pSalDev->getBitmapDevice();
+        SvpSalVirtualDevice* pSalDev = static_cast< SvpSalVirtualDevice* >(aDevice.getSalVirtualDevice());
+        basebmp::BitmapDeviceSharedPtr pBmpDev = pSalDev->getBitmapDevice();
 
-            *pRowStride = pBmpDev->getScanlineStride();
-        }
-        break;
-    default:
-        break;
+        *pRowStride = pBmpDev->getScanlineStride();
     }
     Application::ReleaseSolarMutex();
 }
@@ -470,20 +458,16 @@ static void doc_getDocumentSize(LibreOfficeKitDocument* pThis,
 {
     LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis);
 
-    if (doc_getDocumentType(pThis) == LOK_DOCTYPE_TEXT)
+    ::vcl::ITiledRenderable* pDoc = dynamic_cast< ::vcl::ITiledRenderable* >( pDocument->mxComponent.get() );
+    if (pDoc)
     {
-        SwXTextDocument* pTxtDoc = dynamic_cast< SwXTextDocument* >( pDocument->mxComponent.get() );
-        SwDocShell* pDocShell = pTxtDoc->GetDocShell();
-        SwDoc* pDoc = pDocShell->GetDoc();
-        SwViewShell* pViewShell = pDoc->GetCurrentViewShell();
-        Size aDocumentSize = pViewShell->GetDocSize();
+        Size aDocumentSize = pDoc->getDocumentSize();
         *pWidth = aDocumentSize.Width();
         *pHeight = aDocumentSize.Height();
     }
     else
     {
-        pWidth = 0;
-        pHeight = 0;
+        gImpl->maLastExceptionMsg = "Document doesn't support tiled rendering";
     }
 }
 
commit dfef2b8aa3867a8d27a044b07e203686d8507b26
Author: Andrzej Hunt <andrzej.hunt at collabora.com>
Date:   Fri Jun 13 17:31:42 2014 +0100

    Add ITiledRenderable.
    
    We want to have a simple interface that allows access to tiled
    rendering without digging into the internals of writer
    (and in the future calc/impress/draw).
    
    Change-Id: Ia9c278a48c919333186e5361ff25bb1ab603b846

diff --git a/include/vcl/ITiledRenderable.hxx b/include/vcl/ITiledRenderable.hxx
new file mode 100644
index 0000000..fecfd6c
--- /dev/null
+++ b/include/vcl/ITiledRenderable.hxx
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#ifndef INCLUDED_VCL_ITILEDRENDERABLE_HXX
+#define INCLUDED_VCL_ITILEDRENDERABLE_HXX
+
+#include <tools/gen.hxx>
+#include <vcl/virdev.hxx>
+
+namespace vcl
+{
+
+class VCL_DLLPUBLIC ITiledRenderable
+{
+public:
+    virtual ~ITiledRenderable() {};
+
+    /**
+     * Paint a tile to a given VirtualDevice.
+     *
+     * Output parameters are measured in pixels, tile parameters are in
+     * twips.
+     */
+    virtual void paintTile( VirtualDevice &rDevice,
+                            int nOutputWidth,
+                            int nOutputHeight,
+                            int nTilePosX,
+                            int nTilePosY,
+                            long nTileWidth,
+                            long nTileHeight ) = 0;
+
+    /**
+     * Get the document size in twips.
+     */
+    virtual Size getDocumentSize() = 0;
+
+};
+
+} // namespace vcl
+
+#endif // INCLUDED_VCL_ITILEDRENDERABLE_HXX
diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx
index e43ea2b..a48a8f3 100644
--- a/sw/inc/unotxdoc.hxx
+++ b/sw/inc/unotxdoc.hxx
@@ -67,6 +67,7 @@
 #include <cppuhelper/weak.hxx>
 #include <cppuhelper/implbase2.hxx>
 #include <cppuhelper/implbase4.hxx>
+#include <vcl/ITiledRenderable.hxx>
 
 #include <unobaseclass.hxx>
 #include <viewopt.hxx>
@@ -161,7 +162,8 @@ SwXTextDocumentBaseClass;
 
 class SW_DLLPUBLIC SwXTextDocument : public SwXTextDocumentBaseClass,
     public SvxFmMSFactory,
-    public SfxBaseModel
+    public SfxBaseModel,
+    public ::vcl::ITiledRenderable
 {
 private:
     class Impl;
@@ -428,6 +430,16 @@ public:
     // ::com::sun::star::util::XCloneable
     virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloneable > SAL_CALL createClone(  ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
 
+    // ITiledRenderable
+    virtual void paintTile( VirtualDevice &rDevice,
+                            int nOutputWidth,
+                            int nOutputHeight,
+                            int nTilePosX,
+                            int nTilePosY,
+                            long nTileWidth,
+                            long nTileHeight ) SAL_OVERRIDE;
+    virtual Size getDocumentSize() SAL_OVERRIDE;
+
     void                        Invalidate();
     void                        Reactivate(SwDocShell* pNewDocShell);
     SwXDocumentPropertyHelper * GetPropertyHelper ();
diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx
index 73d687a..9caffe9 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -3120,6 +3120,24 @@ uno::Reference< util::XCloneable > SwXTextDocument::createClone(  ) throw (uno::
     return uno::Reference< util::XCloneable >( xNewModel, UNO_QUERY );
 }
 
+void SwXTextDocument::paintTile( VirtualDevice &rDevice,
+                                 int nOutputWidth, int nOutputHeight,
+                                 int nTilePosX, int nTilePosY,
+                                 long nTileWidth, long nTileHeight )
+{
+    SwDoc* pDoc = pDocShell->GetDoc();
+    SwViewShell* pViewShell = pDoc->GetCurrentViewShell();
+    pViewShell->PaintTile(rDevice, nOutputWidth, nOutputHeight,
+                          nTilePosX, nTilePosY, nTileWidth, nTileHeight);
+}
+
+Size SwXTextDocument::getDocumentSize()
+{
+    SwDoc* pDoc = pDocShell->GetDoc();
+    SwViewShell* pViewShell = pDoc->GetCurrentViewShell();
+    return pViewShell->GetDocSize();
+}
+
 void * SAL_CALL SwXTextDocument::operator new( size_t t) throw()
 {
     return SwXTextDocumentBaseClass::operator new(t);


More information about the Libreoffice-commits mailing list