include/vcl/graph.hxx             |    1 
 sd/qa/unit/data/pdf/multipage.pdf |binary
 sd/qa/unit/import-tests.cxx       |   73 ++++++++++++++++++++++++++++++++++++--
 vcl/inc/impgraph.hxx              |    1 
 vcl/source/gdi/graph.cxx          |    5 ++
 vcl/source/gdi/impgraph.cxx       |    5 ++
 6 files changed, 82 insertions(+), 3 deletions(-)

New commits:
commit c48f16b7afcad39462b454bdfbdbe412056c2619
Author:     Ashod Nakashian <ashod.nakash...@collabora.co.uk>
AuthorDate: Tue Apr 2 11:32:42 2019 -0400
Commit:     Ashod Nakashian <ashnak...@gmail.com>
CommitDate: Sat Apr 13 16:43:57 2019 +0200

    sd: unit-test to check that PDF stream is shared among Graphic instances
    
    Change-Id: Iebd85e5e60c76e6d0756d15e1fa6107a3fcc837d
    Reviewed-on: https://gerrit.libreoffice.org/70162
    Reviewed-by: Ashod Nakashian <ashnak...@gmail.com>
    Tested-by: Ashod Nakashian <ashnak...@gmail.com>

diff --git a/include/vcl/graph.hxx b/include/vcl/graph.hxx
index cb7b04e2aa4a..32d3863f8b1d 100644
--- a/include/vcl/graph.hxx
+++ b/include/vcl/graph.hxx
@@ -217,6 +217,7 @@ private:
 public:
     void            SetLink( const GfxLink& );
     void            SetSharedLink(const std::shared_ptr<GfxLink>& pGfxLink);
+    std::shared_ptr<GfxLink> GetSharedLink() const;
     GfxLink         GetLink() const;
     bool            IsLink() const;
 
diff --git a/sd/qa/unit/data/pdf/multipage.pdf 
b/sd/qa/unit/data/pdf/multipage.pdf
new file mode 100644
index 000000000000..5cd8b4e4e569
Binary files /dev/null and b/sd/qa/unit/data/pdf/multipage.pdf differ
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index c8fcc4584be3..327232ef9fa7 100644
--- a/sd/qa/unit/import-tests.cxx
+++ b/sd/qa/unit/import-tests.cxx
@@ -77,6 +77,7 @@
 #include <stlpool.hxx>
 #include <comphelper/processfactory.hxx>
 #include <comphelper/sequenceashashmap.hxx>
+#include <comphelper/lok.hxx>
 #include <vcl/pngread.hxx>
 #include <vcl/bitmapaccess.hxx>
 #include <vcl/dibtools.hxx>
@@ -132,10 +133,13 @@ public:
     void testTableBorderLineStyle();
     void testBnc862510_6();
     void testBnc862510_7();
-#if ENABLE_PDFIMPORT && defined(IMPORT_PDF_ELEMENTS)
+#if ENABLE_PDFIMPORT
+    void testPDFImportShared();
+#if defined(IMPORT_PDF_ELEMENTS)
     void testPDFImport();
     void testPDFImportSkipImages();
 #endif
+#endif
     void testBulletSuffix();
     void testBnc910045();
     void testRowHeight();
@@ -212,10 +216,13 @@ public:
     CPPUNIT_TEST(testTableBorderLineStyle);
     CPPUNIT_TEST(testBnc862510_6);
     CPPUNIT_TEST(testBnc862510_7);
-#if ENABLE_PDFIMPORT && defined(IMPORT_PDF_ELEMENTS)
+#if ENABLE_PDFIMPORT
+    CPPUNIT_TEST(testPDFImportShared);
+#if defined(IMPORT_PDF_ELEMENTS)
     CPPUNIT_TEST(testPDFImport);
     CPPUNIT_TEST(testPDFImportSkipImages);
 #endif
+#endif
     CPPUNIT_TEST(testBulletSuffix);
     CPPUNIT_TEST(testBnc910045);
     CPPUNIT_TEST(testRowHeight);
@@ -1134,7 +1141,66 @@ void SdImportTest::testBnc862510_7()
     xDocShRef->DoClose();
 }
 
-#if ENABLE_PDFIMPORT && defined(IMPORT_PDF_ELEMENTS)
+#if ENABLE_PDFIMPORT
+
+void SdImportTest::testPDFImportShared()
+{
+    comphelper::LibreOfficeKit::setActive();
+    sd::DrawDocShellRef xDocShRef = 
loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/pdf/multipage.pdf"), PDF);
+    SdDrawDocument *pDoc = xDocShRef->GetDoc();
+    CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != nullptr );
+
+    // This test is to verify that we share the PDF stream linked to each
+    // Graphic instance in the imported document.
+    // Since we import PDFs as images, we support attaching the original
+    // PDF with each image to allow for advanced editing.
+    // Here we iterate over all Graphic instances embedded in the pages
+    // and verify that they all point to the same object in memory.
+    std::vector<std::shared_ptr<std::vector<sal_Int8>>> aPdfSeqSharedPtrs;
+    std::vector<std::shared_ptr<GfxLink>> aGfxLinkSharedPtrs;
+
+    for (int nPageIndex = 0; nPageIndex < pDoc->GetPageCount(); ++nPageIndex)
+    {
+        const SdrPage* pPage = GetPage(nPageIndex, xDocShRef);
+        if (pPage == nullptr)
+            break;
+
+        for (size_t nObjIndex = 0; nObjIndex < pPage->GetObjCount(); 
++nObjIndex)
+        {
+            SdrObject* pObject = pPage->GetObj(nObjIndex);
+            if (pObject == nullptr)
+                continue;
+
+            SdrGrafObj* pSdrGrafObj = dynamic_cast<SdrGrafObj*>(pObject);
+            if (pSdrGrafObj == nullptr)
+                continue;
+
+            const GraphicObject& rGraphicObject = 
pSdrGrafObj->GetGraphicObject().GetGraphic();
+            const Graphic& rGraphic = rGraphicObject.GetGraphic();
+            aPdfSeqSharedPtrs.push_back(rGraphic.getPdfData());
+            aGfxLinkSharedPtrs.push_back(rGraphic.GetSharedLink());
+        }
+    }
+
+    CPPUNIT_ASSERT_MESSAGE("Expected more than one page.", 
aPdfSeqSharedPtrs.size() > 1);
+    CPPUNIT_ASSERT_MESSAGE("Expected as many PDF streams as GfxLinks.",
+                           aPdfSeqSharedPtrs.size() == 
aGfxLinkSharedPtrs.size());
+
+    const std::shared_ptr<std::vector<sal_Int8>> pPdfSeq = 
aPdfSeqSharedPtrs[0];
+    const std::shared_ptr<GfxLink> pGfxLink = aGfxLinkSharedPtrs[0];
+    for (size_t i = 0; i < aPdfSeqSharedPtrs.size(); ++i)
+    {
+        CPPUNIT_ASSERT_MESSAGE("Expected all PDF streams to be identical.",
+                               aPdfSeqSharedPtrs[i].get() == pPdfSeq.get());
+        CPPUNIT_ASSERT_MESSAGE("Expected all GfxLinks to be identical.",
+                               aGfxLinkSharedPtrs[i].get() == pGfxLink.get());
+    }
+
+    xDocShRef->DoClose();
+    comphelper::LibreOfficeKit::setActive(false);
+}
+
+#if defined(IMPORT_PDF_ELEMENTS)
 
 void SdImportTest::testPDFImport()
 {
@@ -1173,6 +1239,7 @@ void SdImportTest::testPDFImportSkipImages()
 }
 
 #endif
+#endif
 
 void SdImportTest::testBulletSuffix()
 {
diff --git a/vcl/inc/impgraph.hxx b/vcl/inc/impgraph.hxx
index fdae47ced329..6b26cef4baee 100644
--- a/vcl/inc/impgraph.hxx
+++ b/vcl/inc/impgraph.hxx
@@ -162,6 +162,7 @@ private:
     bool                ImplIsDummyContext() const { return mbDummyContext; }
     void                ImplSetLink( const GfxLink& );
     void                ImplSetSharedLink(const std::shared_ptr<GfxLink>& 
pGfxLink);
+    std::shared_ptr<GfxLink> ImplGetSharedLink() const;
     GfxLink             ImplGetLink();
     bool                ImplIsLink() const;
 
diff --git a/vcl/source/gdi/graph.cxx b/vcl/source/gdi/graph.cxx
index 2e6b70e10f53..a591d0996cc5 100644
--- a/vcl/source/gdi/graph.cxx
+++ b/vcl/source/gdi/graph.cxx
@@ -575,6 +575,11 @@ void Graphic::SetSharedLink(const 
std::shared_ptr<GfxLink>& pGfxLink)
     mxImpGraphic->ImplSetSharedLink(pGfxLink);
 }
 
+std::shared_ptr<GfxLink> Graphic::GetSharedLink() const
+{
+    return mxImpGraphic->ImplGetSharedLink();
+}
+
 GfxLink Graphic::GetLink() const
 {
     return mxImpGraphic->ImplGetLink();
diff --git a/vcl/source/gdi/impgraph.cxx b/vcl/source/gdi/impgraph.cxx
index cd3d5b9a0c32..37531f5fc2e0 100644
--- a/vcl/source/gdi/impgraph.cxx
+++ b/vcl/source/gdi/impgraph.cxx
@@ -1408,6 +1408,11 @@ void ImpGraphic::ImplSetSharedLink(const 
std::shared_ptr<GfxLink>& pGfxLink)
     }
 }
 
+std::shared_ptr<GfxLink> ImpGraphic::ImplGetSharedLink() const
+{
+    return mpGfxLink;
+}
+
 GfxLink ImpGraphic::ImplGetLink()
 {
     return( mpGfxLink ? *mpGfxLink : GfxLink() );
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to