[Libreoffice-commits] core.git: include/vcl svx/source vcl/qa vcl/source

Miklos Vajna (via logerrit) logerrit at kemper.freedesktop.org
Wed Nov 11 07:34:18 UTC 2020


 include/vcl/filter/PDFiumLibrary.hxx   |    3 +
 include/vcl/pdf/PDFPageObjectType.hxx  |   27 ++++++++++++++++
 svx/source/svdraw/svdpdf.cxx           |   18 +++++------
 vcl/qa/cppunit/PDFiumLibraryTest.cxx   |    2 -
 vcl/qa/cppunit/pdfexport/pdfexport.cxx |   54 +++++++++++++++------------------
 vcl/source/pdf/PDFiumLibrary.cxx       |   22 ++++++++++---
 6 files changed, 82 insertions(+), 44 deletions(-)

New commits:
commit 97e9df169c183ce1fb6530e8f3e806036a25bf68
Author:     Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Tue Nov 10 21:12:29 2020 +0100
Commit:     Miklos Vajna <vmiklos at collabora.com>
CommitDate: Wed Nov 11 08:33:33 2020 +0100

    pdfium: eliminate remaining direct calls to FPDFPageObj_GetType()
    
    And also introduce an enum class for the return type.
    
    Change-Id: I6577c7678889ac5bb8efbf0d0cfeb575aac06e27
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105567
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmiklos at collabora.com>

diff --git a/include/vcl/filter/PDFiumLibrary.hxx b/include/vcl/filter/PDFiumLibrary.hxx
index eb5cf3b9c769..0eb2373a4400 100644
--- a/include/vcl/filter/PDFiumLibrary.hxx
+++ b/include/vcl/filter/PDFiumLibrary.hxx
@@ -28,6 +28,7 @@
 #include <vcl/checksum.hxx>
 #include <vcl/Scanline.hxx>
 #include <vcl/pdf/PDFAnnotationSubType.hxx>
+#include <vcl/pdf/PDFPageObjectType.hxx>
 
 #include <fpdf_doc.h>
 
@@ -149,7 +150,7 @@ public:
 
     FPDF_PAGEOBJECT getPointer() { return mpPageObject; }
 
-    int getType();
+    PDFPageObjectType getType();
     OUString getText(std::unique_ptr<PDFiumTextPage> const& pTextPage);
 
     int getFormObjectCount();
diff --git a/include/vcl/pdf/PDFPageObjectType.hxx b/include/vcl/pdf/PDFPageObjectType.hxx
new file mode 100644
index 000000000000..68e763e64b40
--- /dev/null
+++ b/include/vcl/pdf/PDFPageObjectType.hxx
@@ -0,0 +1,27 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#pragma once
+
+namespace vcl::pdf
+{
+enum class PDFPageObjectType
+{
+    Unknown = 0,
+    Text = 1,
+    Path = 2,
+    Image = 3,
+    Shading = 4,
+    Form = 5
+};
+
+} // namespace vcl::pdf
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx
index 3a8b60951d4a..c7e6f223b10f 100644
--- a/svx/source/svdraw/svdpdf.cxx
+++ b/svx/source/svdraw/svdpdf.cxx
@@ -669,27 +669,27 @@ void ImpSdrPdfImport::ImportPdfObject(
     if (!pPageObject)
         return;
 
-    const int nPageObjectType = pPageObject->getType();
-    switch (nPageObjectType)
+    const vcl::pdf::PDFPageObjectType ePageObjectType = pPageObject->getType();
+    switch (ePageObjectType)
     {
-        case FPDF_PAGEOBJ_TEXT:
+        case vcl::pdf::PDFPageObjectType::Text:
             ImportText(pPageObject, pTextPage, nPageObjectIndex);
             break;
-        case FPDF_PAGEOBJ_PATH:
+        case vcl::pdf::PDFPageObjectType::Path:
             ImportPath(pPageObject, nPageObjectIndex);
             break;
-        case FPDF_PAGEOBJ_IMAGE:
+        case vcl::pdf::PDFPageObjectType::Image:
             ImportImage(pPageObject, nPageObjectIndex);
             break;
-        case FPDF_PAGEOBJ_SHADING:
+        case vcl::pdf::PDFPageObjectType::Shading:
             SAL_WARN("sd.filter", "Got page object SHADING: " << nPageObjectIndex);
             break;
-        case FPDF_PAGEOBJ_FORM:
+        case vcl::pdf::PDFPageObjectType::Form:
             ImportForm(pPageObject, pTextPage, nPageObjectIndex);
             break;
         default:
-            SAL_WARN("sd.filter", "Unknown PDF page object #" << nPageObjectIndex
-                                                              << " of type: " << nPageObjectType);
+            SAL_WARN("sd.filter", "Unknown PDF page object #" << nPageObjectIndex << " of type: "
+                                                              << static_cast<int>(ePageObjectType));
             break;
     }
 }
diff --git a/vcl/qa/cppunit/PDFiumLibraryTest.cxx b/vcl/qa/cppunit/PDFiumLibraryTest.cxx
index 6b4dbedff185..577f73ed1130 100644
--- a/vcl/qa/cppunit/PDFiumLibraryTest.cxx
+++ b/vcl/qa/cppunit/PDFiumLibraryTest.cxx
@@ -136,7 +136,7 @@ void PDFiumLibraryTest::testPageObjects()
     auto pPageObject = pPage->getObject(0);
     auto pTextPage = pPage->getTextPage();
 
-    CPPUNIT_ASSERT_EQUAL(1, pPageObject->getType()); // FPDF_PAGEOBJ_TEXT
+    CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFPageObjectType::Text, pPageObject->getType());
 
     CPPUNIT_ASSERT_EQUAL(OUString("The quick, brown fox jumps over a lazy dog. DJs flock by when "
                                   "MTV ax quiz prog. Junk MTV quiz "),
diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx b/vcl/qa/cppunit/pdfexport/pdfexport.cxx
index 762bdf0dbce1..484e2c355461 100644
--- a/vcl/qa/cppunit/pdfexport/pdfexport.cxx
+++ b/vcl/qa/cppunit/pdfexport/pdfexport.cxx
@@ -257,7 +257,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf105461)
     for (int i = 0; i < nPageObjectCount; ++i)
     {
         std::unique_ptr<vcl::pdf::PDFiumPageObject> pPdfPageObject = pPdfPage->getObject(i);
-        if (pPdfPageObject->getType() != FPDF_PAGEOBJ_PATH)
+        if (pPdfPageObject->getType() != vcl::pdf::PDFPageObjectType::Path)
             continue;
 
         if (pPdfPageObject->getFillColor() == COL_YELLOW)
@@ -313,7 +313,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf107868)
     for (int i = 0; i < nPageObjectCount; ++i)
     {
         std::unique_ptr<vcl::pdf::PDFiumPageObject> pPdfPageObject = pPdfPage->getObject(i);
-        if (pPdfPageObject->getType() != FPDF_PAGEOBJ_PATH)
+        if (pPdfPageObject->getType() != vcl::pdf::PDFPageObjectType::Path)
             continue;
 
         if (pPdfPageObject->getFillColor() == COL_WHITE)
@@ -577,7 +577,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testSofthyphenPos)
     for (int i = 0; i < nPageObjectCount; ++i)
     {
         std::unique_ptr<vcl::pdf::PDFiumPageObject> pPdfPageObject = pPdfPage->getObject(i);
-        CPPUNIT_ASSERT_EQUAL(FPDF_PAGEOBJ_TEXT, pPdfPageObject->getType());
+        CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFPageObjectType::Text, pPdfPageObject->getType());
         haveText = true;
         double const size = pPdfPageObject->getFontSize();
         CPPUNIT_ASSERT_DOUBLES_EQUAL(11.05, size, 1E-06);
@@ -819,7 +819,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf108963)
     for (int i = 0; i < nPageObjectCount; ++i)
     {
         std::unique_ptr<vcl::pdf::PDFiumPageObject> pPdfPageObject = pPdfPage->getObject(i);
-        if (pPdfPageObject->getType() != FPDF_PAGEOBJ_PATH)
+        if (pPdfPageObject->getType() != vcl::pdf::PDFPageObjectType::Path)
             continue;
 
         if (pPdfPageObject->getFillColor() == COL_YELLOW)
@@ -1445,7 +1445,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf128630)
     for (int i = 0; i < nPageObjectCount; ++i)
     {
         std::unique_ptr<vcl::pdf::PDFiumPageObject> pPageObject = pPdfPage->getObject(i);
-        if (pPageObject->getType() != FPDF_PAGEOBJ_IMAGE)
+        if (pPageObject->getType() != vcl::pdf::PDFPageObjectType::Image)
             continue;
 
         std::unique_ptr<vcl::pdf::PDFiumBitmap> pBitmap = pPageObject->getImageBitmap();
@@ -1479,7 +1479,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf106702)
     for (int i = 0; i < nPageObjectCount; ++i)
     {
         std::unique_ptr<vcl::pdf::PDFiumPageObject> pPageObject = pPdfPage->getObject(i);
-        if (pPageObject->getType() != FPDF_PAGEOBJ_IMAGE)
+        if (pPageObject->getType() != vcl::pdf::PDFPageObjectType::Image)
             continue;
 
         float fLeft = 0, fBottom = 0, fRight = 0, fTop = 0;
@@ -1496,7 +1496,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf106702)
     for (int i = 0; i < nPageObjectCount; ++i)
     {
         std::unique_ptr<vcl::pdf::PDFiumPageObject> pPageObject = pPdfPage->getObject(i);
-        if (pPageObject->getType() != FPDF_PAGEOBJ_IMAGE)
+        if (pPageObject->getType() != vcl::pdf::PDFPageObjectType::Image)
             continue;
 
         float fLeft = 0, fBottom = 0, fRight = 0, fTop = 0;
@@ -1537,7 +1537,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf113143)
     for (int i = 0; i < nPageObjectCount; ++i)
     {
         std::unique_ptr<vcl::pdf::PDFiumPageObject> pPageObject = pPdfPage->getObject(i);
-        if (pPageObject->getType() != FPDF_PAGEOBJ_IMAGE)
+        if (pPageObject->getType() != vcl::pdf::PDFPageObjectType::Image)
             continue;
 
         float fLeft = 0, fBottom = 0, fRight = 0, fTop = 0;
@@ -1554,7 +1554,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf113143)
     for (int i = 0; i < nPageObjectCount; ++i)
     {
         std::unique_ptr<vcl::pdf::PDFiumPageObject> pPageObject = pPdfPage->getObject(i);
-        if (pPageObject->getType() != FPDF_PAGEOBJ_IMAGE)
+        if (pPageObject->getType() != vcl::pdf::PDFPageObjectType::Image)
             continue;
 
         float fLeft = 0, fBottom = 0, fRight = 0, fTop = 0;
@@ -1602,11 +1602,11 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf115262)
         float fLeft = 0, fBottom = 0, fRight = 0, fTop = 0;
         FPDFPageObj_GetBounds(pPageObject->getPointer(), &fLeft, &fBottom, &fRight, &fTop);
 
-        if (pPageObject->getType() == FPDF_PAGEOBJ_IMAGE)
+        if (pPageObject->getType() == vcl::pdf::PDFPageObjectType::Image)
         {
             nFirstImageTop = fTop;
         }
-        else if (pPageObject->getType() == FPDF_PAGEOBJ_TEXT)
+        else if (pPageObject->getType() == vcl::pdf::PDFPageObjectType::Text)
         {
             OUString sText = pPageObject->getText(pTextPage);
             if (sText == "400")
@@ -1637,7 +1637,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf121962)
     for (int i = 0; i < nPageObjectCount; ++i)
     {
         std::unique_ptr<vcl::pdf::PDFiumPageObject> pPageObject = pPdfPage->getObject(i);
-        if (pPageObject->getType() != FPDF_PAGEOBJ_TEXT)
+        if (pPageObject->getType() != vcl::pdf::PDFPageObjectType::Text)
             continue;
         OUString sText = pPageObject->getText(pTextPage);
         CPPUNIT_ASSERT(sText != "** Expression is faulty **");
@@ -1664,7 +1664,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf115967)
     for (int i = 0; i < nPageObjectCount; ++i)
     {
         std::unique_ptr<vcl::pdf::PDFiumPageObject> pPageObject = pPdfPage->getObject(i);
-        if (pPageObject->getType() != FPDF_PAGEOBJ_TEXT)
+        if (pPageObject->getType() != vcl::pdf::PDFPageObjectType::Text)
             continue;
         OUString sChar = pPageObject->getText(pTextPage);
         sText += sChar.trim();
@@ -1785,7 +1785,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testReduceSmallImage)
     CPPUNIT_ASSERT(pPdfPage);
     CPPUNIT_ASSERT_EQUAL(1, pPdfPage->getObjectCount());
     std::unique_ptr<vcl::pdf::PDFiumPageObject> pPageObject = pPdfPage->getObject(0);
-    CPPUNIT_ASSERT_EQUAL(FPDF_PAGEOBJ_IMAGE, pPageObject->getType());
+    CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFPageObjectType::Image, pPageObject->getType());
 
     // Make sure we don't scale down a tiny bitmap.
     std::unique_ptr<vcl::pdf::PDFiumBitmap> pBitmap = pPageObject->getImageBitmap();
@@ -1840,7 +1840,7 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testReduceImage)
     CPPUNIT_ASSERT(pPdfPage);
     CPPUNIT_ASSERT_EQUAL(1, pPdfPage->getObjectCount());
     std::unique_ptr<vcl::pdf::PDFiumPageObject> pPageObject = pPdfPage->getObject(0);
-    CPPUNIT_ASSERT_EQUAL(FPDF_PAGEOBJ_IMAGE, pPageObject->getType());
+    CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFPageObjectType::Image, pPageObject->getType());
 
     // Make sure we don't scale down a bitmap.
     std::unique_ptr<vcl::pdf::PDFiumBitmap> pBitmap = pPageObject->getImageBitmap();
@@ -1947,27 +1947,25 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testPdfImageResourceInlineXObjectRef)
     CPPUNIT_ASSERT(pPdfPage);
     CPPUNIT_ASSERT_EQUAL(1, pPdfPage->getObjectCount());
     std::unique_ptr<vcl::pdf::PDFiumPageObject> pPageObject = pPdfPage->getObject(0);
-    CPPUNIT_ASSERT_EQUAL(FPDF_PAGEOBJ_FORM, pPageObject->getType());
+    CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFPageObjectType::Form, pPageObject->getType());
     // 2: white background and the actual object.
-    CPPUNIT_ASSERT_EQUAL(2, FPDFFormObj_CountObjects(pPageObject->getPointer()));
-    FPDF_PAGEOBJECT pFormObject = FPDFFormObj_GetObject(pPageObject->getPointer(), 1);
-    CPPUNIT_ASSERT_EQUAL(FPDF_PAGEOBJ_FORM, FPDFPageObj_GetType(pFormObject));
+    CPPUNIT_ASSERT_EQUAL(2, pPageObject->getFormObjectCount());
+    std::unique_ptr<vcl::pdf::PDFiumPageObject> pFormObject = pPageObject->getFormObject(1);
+    CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFPageObjectType::Form, pFormObject->getType());
     // Without the accompanying fix in place, this test would have failed with:
     // - Expected: 1
     // - Actual  : 0
     // i.e. the sub-form was missing its image.
-    CPPUNIT_ASSERT_EQUAL(1, FPDFFormObj_CountObjects(pFormObject));
+    CPPUNIT_ASSERT_EQUAL(1, pFormObject->getFormObjectCount());
 
     // Check if the inner form object (original page object in the pdf image) has the correct
     // rotation.
-    FPDF_PAGEOBJECT pInnerFormObject = FPDFFormObj_GetObject(pFormObject, 0);
-    CPPUNIT_ASSERT_EQUAL(FPDF_PAGEOBJ_FORM, FPDFPageObj_GetType(pInnerFormObject));
-    CPPUNIT_ASSERT_EQUAL(1, FPDFFormObj_CountObjects(pInnerFormObject));
-    FPDF_PAGEOBJECT pImage = FPDFFormObj_GetObject(pInnerFormObject, 0);
-    CPPUNIT_ASSERT_EQUAL(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(pImage));
-    FS_MATRIX aMatrix;
-    FPDFFormObj_GetMatrix(pInnerFormObject, &aMatrix);
-    basegfx::B2DHomMatrix aMat{ aMatrix.a, aMatrix.c, aMatrix.e, aMatrix.b, aMatrix.d, aMatrix.f };
+    std::unique_ptr<vcl::pdf::PDFiumPageObject> pInnerFormObject = pFormObject->getFormObject(0);
+    CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFPageObjectType::Form, pInnerFormObject->getType());
+    CPPUNIT_ASSERT_EQUAL(1, pInnerFormObject->getFormObjectCount());
+    std::unique_ptr<vcl::pdf::PDFiumPageObject> pImage = pInnerFormObject->getFormObject(0);
+    CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFPageObjectType::Image, pImage->getType());
+    basegfx::B2DHomMatrix aMat = pInnerFormObject->getMatrix();
     basegfx::B2DTuple aScale;
     basegfx::B2DTuple aTranslate;
     double fRotate = 0;
diff --git a/vcl/source/pdf/PDFiumLibrary.cxx b/vcl/source/pdf/PDFiumLibrary.cxx
index 69facd1bf001..ae1588e4a268 100644
--- a/vcl/source/pdf/PDFiumLibrary.cxx
+++ b/vcl/source/pdf/PDFiumLibrary.cxx
@@ -26,6 +26,19 @@
 
 #include <bitmapwriteaccess.hxx>
 
+static_assert(static_cast<int>(vcl::pdf::PDFPageObjectType::Unknown) == FPDF_PAGEOBJ_UNKNOWN,
+              "PDFPageObjectType::Unknown value mismatch");
+static_assert(static_cast<int>(vcl::pdf::PDFPageObjectType::Text) == FPDF_PAGEOBJ_TEXT,
+              "PDFPageObjectType::Text value mismatch");
+static_assert(static_cast<int>(vcl::pdf::PDFPageObjectType::Path) == FPDF_PAGEOBJ_PATH,
+              "PDFPageObjectType::Path value mismatch");
+static_assert(static_cast<int>(vcl::pdf::PDFPageObjectType::Image) == FPDF_PAGEOBJ_IMAGE,
+              "PDFPageObjectType::Image value mismatch");
+static_assert(static_cast<int>(vcl::pdf::PDFPageObjectType::Shading) == FPDF_PAGEOBJ_SHADING,
+              "PDFPageObjectType::Shading value mismatch");
+static_assert(static_cast<int>(vcl::pdf::PDFPageObjectType::Form) == FPDF_PAGEOBJ_FORM,
+              "PDFPageObjectType::Form value mismatch");
+
 namespace
 {
 /// Callback class to be used with FPDF_SaveWithVersion().
@@ -310,14 +323,13 @@ OUString PDFiumPageObject::getText(std::unique_ptr<PDFiumTextPage> const& pTextP
     return sReturnText;
 }
 
-int PDFiumPageObject::getType() { return FPDFPageObj_GetType(mpPageObject); }
-
-int PDFiumPageObject::getFormObjectCount()
+PDFPageObjectType PDFiumPageObject::getType()
 {
-    return FPDFFormObj_CountObjects(mpPageObject);
-    ;
+    return static_cast<PDFPageObjectType>(FPDFPageObj_GetType(mpPageObject));
 }
 
+int PDFiumPageObject::getFormObjectCount() { return FPDFFormObj_CountObjects(mpPageObject); }
+
 std::unique_ptr<PDFiumPageObject> PDFiumPageObject::getFormObject(int nIndex)
 {
     std::unique_ptr<PDFiumPageObject> pPDFiumFormObject;


More information about the Libreoffice-commits mailing list