[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