diff options
author | Vasily Melenchuk <Vasily.Melenchuk@cib.de> | 2017-05-25 13:44:52 +0300 |
---|---|---|
committer | Thorsten Behrens <Thorsten.Behrens@CIB.de> | 2017-06-16 00:57:35 +0200 |
commit | f6726209329fefe9decca8fda8e136b8472a95a2 (patch) | |
tree | 942d842181b800bb50e8ee1ec8da95939e304aaa | |
parent | 63399341002c8a88ab58add99707fbef24210576 (diff) |
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@libreoffice.org>
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Change-Id: Id4565858b0135b3177044558db87a68ef828955b
Reviewed-on: https://gerrit.libreoffice.org/38403
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Change-Id: I102722140e216cb9ad29107aae3bdaa70472d471
Reviewed-on: https://gerrit.libreoffice.org/38694
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Reviewed-on: https://gerrit.libreoffice.org/38825
Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
-rw-r--r-- | vcl/qa/cppunit/pdfexport/data/tdf99680-2.odt | bin | 0 -> 215797 bytes | |||
-rw-r--r-- | vcl/qa/cppunit/pdfexport/data/tdf99680.odt | bin | 0 -> 30257 bytes | |||
-rw-r--r-- | vcl/qa/cppunit/pdfexport/pdfexport.cxx | 83 | ||||
-rw-r--r-- | vcl/source/gdi/pdfwriter_impl.cxx | 11 |
4 files changed, 89 insertions, 5 deletions
diff --git a/vcl/qa/cppunit/pdfexport/data/tdf99680-2.odt b/vcl/qa/cppunit/pdfexport/data/tdf99680-2.odt Binary files differnew file mode 100644 index 000000000000..47c370004d86 --- /dev/null +++ b/vcl/qa/cppunit/pdfexport/data/tdf99680-2.odt diff --git a/vcl/qa/cppunit/pdfexport/data/tdf99680.odt b/vcl/qa/cppunit/pdfexport/data/tdf99680.odt Binary files differnew file mode 100644 index 000000000000..de12f9baa180 --- /dev/null +++ b/vcl/qa/cppunit/pdfexport/data/tdf99680.odt 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; |