[Libreoffice-commits] core.git: Branch 'libreoffice-5-4' - vcl/qa vcl/source
Vasily Melenchuk
Vasily.Melenchuk at cib.de
Thu Jun 15 22:57:59 UTC 2017
vcl/qa/cppunit/pdfexport/data/tdf99680-2.odt |binary
vcl/qa/cppunit/pdfexport/data/tdf99680.odt |binary
vcl/qa/cppunit/pdfexport/pdfexport.cxx | 83 +++++++++++++++++++++++++++
vcl/source/gdi/pdfwriter_impl.cxx | 11 +--
4 files changed, 89 insertions(+), 5 deletions(-)
New commits:
commit f6726209329fefe9decca8fda8e136b8472a95a2
Author: Vasily Melenchuk <Vasily.Melenchuk at cib.de>
Date: Thu May 25 13:44:52 2017 +0300
tdf#99680 modified clipping for PDF export
If clipping is requested, but no clipping region is defined,
clipping is ignored.
This squashes the following 3 commits:
Change-Id: I793c1de1f4f6b0203727c0ff6aa8adecc43ad413
Reviewed-on: https://gerrit.libreoffice.org/38021
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
Change-Id: Id4565858b0135b3177044558db87a68ef828955b
Reviewed-on: https://gerrit.libreoffice.org/38403
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
Change-Id: I102722140e216cb9ad29107aae3bdaa70472d471
Reviewed-on: https://gerrit.libreoffice.org/38694
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
Reviewed-on: https://gerrit.libreoffice.org/38825
Tested-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
diff --git a/vcl/qa/cppunit/pdfexport/data/tdf99680-2.odt b/vcl/qa/cppunit/pdfexport/data/tdf99680-2.odt
new file mode 100644
index 000000000000..47c370004d86
Binary files /dev/null and b/vcl/qa/cppunit/pdfexport/data/tdf99680-2.odt differ
diff --git a/vcl/qa/cppunit/pdfexport/data/tdf99680.odt b/vcl/qa/cppunit/pdfexport/data/tdf99680.odt
new file mode 100644
index 000000000000..de12f9baa180
Binary files /dev/null and b/vcl/qa/cppunit/pdfexport/data/tdf99680.odt differ
diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx b/vcl/qa/cppunit/pdfexport/pdfexport.cxx
index b3661281d473..1a88b97e5364 100644
--- a/vcl/qa/cppunit/pdfexport/pdfexport.cxx
+++ b/vcl/qa/cppunit/pdfexport/pdfexport.cxx
@@ -66,6 +66,8 @@ public:
void testTdf107013();
void testTdf107018();
void testTdf107089();
+ void testTdf99680();
+ void testTdf99680_2();
#endif
CPPUNIT_TEST_SUITE(PdfExportTest);
@@ -81,6 +83,8 @@ public:
CPPUNIT_TEST(testTdf107013);
CPPUNIT_TEST(testTdf107018);
CPPUNIT_TEST(testTdf107089);
+ CPPUNIT_TEST(testTdf99680);
+ CPPUNIT_TEST(testTdf99680_2);
#endif
CPPUNIT_TEST_SUITE_END();
};
@@ -591,6 +595,85 @@ void PdfExportTest::testTdf107089()
// This failed, 'Hello' was part only a mixed compressed/uncompressed stream, i.e. garbage.
CPPUNIT_ASSERT(it != pEnd);
}
+
+void PdfExportTest::testTdf99680()
+{
+ vcl::filter::PDFDocument aDocument;
+ load("tdf99680.odt", aDocument);
+
+ // The document has one page.
+ std::vector<vcl::filter::PDFObjectElement*> aPages = aDocument.GetPages();
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aPages.size());
+
+ // The page 1 has a stream.
+ vcl::filter::PDFObjectElement* pContents = aPages[0]->LookupObject("Contents");
+ CPPUNIT_ASSERT(pContents);
+ vcl::filter::PDFStreamElement* pStream = pContents->GetStream();
+ CPPUNIT_ASSERT(pStream);
+ SvMemoryStream& rObjectStream = pStream->GetMemory();
+
+ // Uncompress it.
+ SvMemoryStream aUncompressed;
+ ZCodec aZCodec;
+ aZCodec.BeginCompression();
+ rObjectStream.Seek(0);
+ aZCodec.Decompress(rObjectStream, aUncompressed);
+ CPPUNIT_ASSERT(aZCodec.EndCompression());
+
+ // Make sure there are no empty clipping regions.
+ OString aEmptyReqion("0 0 m h W* n");
+ auto pStart = static_cast<const char*>(aUncompressed.GetData());
+ const char* pEnd = pStart + aUncompressed.GetSize();
+ auto it = std::search(pStart, pEnd, aEmptyReqion.getStr(), aEmptyReqion.getStr() + aEmptyReqion.getLength());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Empty clipping region detected!", it, pEnd);
+
+ // Count save graphic state (q) and restore (Q) operators
+ // and ensure their amount is equal
+ size_t nSaveCount = std::count(pStart, pEnd, 'q');
+ size_t nRestoreCount = std::count(pStart, pEnd, 'Q');
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Save/restore graphic state operators count mistmatch!", nSaveCount, nRestoreCount);
+}
+
+void PdfExportTest::testTdf99680_2()
+{
+ vcl::filter::PDFDocument aDocument;
+ load("tdf99680-2.odt", aDocument);
+
+ // For each document page
+ std::vector<vcl::filter::PDFObjectElement*> aPages = aDocument.GetPages();
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aPages.size());
+ for (size_t nPageNr = 0; nPageNr < aPages.size(); nPageNr++)
+ {
+ // Get page contents and stream.
+ vcl::filter::PDFObjectElement* pContents = aPages[nPageNr]->LookupObject("Contents");
+ CPPUNIT_ASSERT(pContents);
+ vcl::filter::PDFStreamElement* pStream = pContents->GetStream();
+ CPPUNIT_ASSERT(pStream);
+ SvMemoryStream& rObjectStream = pStream->GetMemory();
+
+ // Uncompress the stream.
+ SvMemoryStream aUncompressed;
+ ZCodec aZCodec;
+ aZCodec.BeginCompression();
+ rObjectStream.Seek(0);
+ aZCodec.Decompress(rObjectStream, aUncompressed);
+ CPPUNIT_ASSERT(aZCodec.EndCompression());
+
+ // Make sure there are no empty clipping regions.
+ OString aEmptyRegion("0 0 m h W* n");
+ auto pStart = static_cast<const char*>(aUncompressed.GetData());
+ const char* pEnd = pStart + aUncompressed.GetSize();
+ auto it = std::search(pStart, pEnd, aEmptyRegion.getStr(), aEmptyRegion.getStr() + aEmptyRegion.getLength());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Empty clipping region detected!", it, pEnd);
+
+ // Count save graphic state (q) and restore (Q) operators
+ // and ensure their amount is equal
+ size_t nSaveCount = std::count(pStart, pEnd, 'q');
+ size_t nRestoreCount = std::count(pStart, pEnd, 'Q');
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Save/restore graphic state operators count mistmatch!", nSaveCount, nRestoreCount);
+ }
+}
+
#endif
CPPUNIT_TEST_SUITE_REGISTRATION(PdfExportTest);
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index a4a49436b820..17ed3e07ff3a 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -12142,12 +12142,13 @@ void PDFWriterImpl::updateGraphicsState(Mode const mode)
getReferenceDevice()->SetMapMode( rNewState.m_aMapMode );
m_aCurrentPDFState.m_aMapMode = rNewState.m_aMapMode;
- aLine.append( "q " );
- if( rNewState.m_aClipRegion.count() )
+ aLine.append("q ");
+ if ( rNewState.m_aClipRegion.count() )
+ {
m_aPages.back().appendPolyPolygon( rNewState.m_aClipRegion, aLine );
- else
- aLine.append( "0 0 m h " ); // NULL clip, i.e. nothing visible
- aLine.append( "W* n\n" );
+ aLine.append( "W* n\n" );
+ }
+
rNewState.m_aMapMode = aNewMapMode;
getReferenceDevice()->SetMapMode( rNewState.m_aMapMode );
m_aCurrentPDFState.m_aMapMode = rNewState.m_aMapMode;
More information about the Libreoffice-commits
mailing list