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