summaryrefslogtreecommitdiff
path: root/sd/qa
diff options
context:
space:
mode:
authorAshod Nakashian <ashod.nakashian@collabora.co.uk>2019-04-02 11:32:42 -0400
committerAshod Nakashian <ashnakash@gmail.com>2019-08-25 13:44:31 +0200
commit5a3f794219dade812ec29ea9971680058b4bade9 (patch)
treef0911db1b74bc985917c5ed737e9242dc88c423c /sd/qa
parent5c5ab9c1291235671261db39503e239117a952dd (diff)
sd: unit-test to check that PDF stream is shared among Graphic instances
Reviewed-on: https://gerrit.libreoffice.org/70162 Reviewed-by: Ashod Nakashian <ashnakash@gmail.com> Tested-by: Ashod Nakashian <ashnakash@gmail.com> (cherry picked from commit d3a9bdd982ad1ed17cb6fef91885fc4dcf442fdb) Change-Id: Iebd85e5e60c76e6d0756d15e1fa6107a3fcc837d Reviewed-on: https://gerrit.libreoffice.org/77693 Tested-by: Jenkins Reviewed-by: Ashod Nakashian <ashnakash@gmail.com>
Diffstat (limited to 'sd/qa')
-rw-r--r--sd/qa/unit/data/pdf/multipage.pdfbin0 -> 9121 bytes
-rw-r--r--sd/qa/unit/import-tests.cxx73
2 files changed, 70 insertions, 3 deletions
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
--- /dev/null
+++ b/sd/qa/unit/data/pdf/multipage.pdf
Binary files differ
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index 4e23ad69f227..941e27aa2db9 100644
--- a/sd/qa/unit/import-tests.cxx
+++ b/sd/qa/unit/import-tests.cxx
@@ -92,6 +92,7 @@
#include <comphelper/processfactory.hxx>
#include <comphelper/sequenceashashmap.hxx>
#include <comphelper/graphicmimetype.hxx>
+#include <comphelper/lok.hxx>
#include <vcl/pngread.hxx>
#include <vcl/bitmapaccess.hxx>
#include <vcl/dibtools.hxx>
@@ -149,10 +150,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();
@@ -242,10 +246,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);
@@ -1193,7 +1200,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.GetSharedGfxLink());
+ }
+ }
+
+ CPPUNIT_ASSERT_MESSAGE("Expected more than one page.", aPdfSeqSharedPtrs.size() > 1);
+ CPPUNIT_ASSERT_EQUAL_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_EQUAL_MESSAGE("Expected all PDF streams to be identical.",
+ aPdfSeqSharedPtrs[i].get(), pPdfSeq.get());
+ CPPUNIT_ASSERT_EQUAL_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()
{
@@ -1231,6 +1297,7 @@ void SdImportTest::testPDFImportSkipImages()
}
#endif
+#endif
void SdImportTest::testBulletSuffix()
{