diff options
-rw-r--r-- | vcl/qa/cppunit/pdfexport/pdfexport.cxx | 48 | ||||
-rw-r--r-- | vcl/source/gdi/pdfwriter_impl.cxx | 4 |
2 files changed, 50 insertions, 2 deletions
diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx b/vcl/qa/cppunit/pdfexport/pdfexport.cxx index 94248572c887..ea67d5530539 100644 --- a/vcl/qa/cppunit/pdfexport/pdfexport.cxx +++ b/vcl/qa/cppunit/pdfexport/pdfexport.cxx @@ -38,6 +38,7 @@ #include <fpdfview.h> #include <vcl/graphicfilter.hxx> #include <basegfx/matrix/b2dhommatrix.hxx> +#include <rtl/math.hxx> #include <vcl/filter/PDFiumLibrary.hxx> @@ -2282,6 +2283,53 @@ void PdfExportTest::testPdfImageHyperlink() // Without the accompanying fix in place, this test would have failed, the hyperlink of the PDF // image was lost. CPPUNIT_ASSERT(FPDFLink_Enumerate(pPdfPage->getPointer(), &nStartPos, &pLinkAnnot)); + + // Also test the precision of the form XObject. + // Given a full-page form XObject, page height is 27.94 cm (792 points): + // When writing the reciprocal of the object height to PDF: + std::unique_ptr<vcl::pdf::PDFiumPageObject> pFormObject; + for (int i = 0; i < pPdfPage->getObjectCount(); ++i) + { + std::unique_ptr<vcl::pdf::PDFiumPageObject> pObject = pPdfPage->getObject(i); + if (FPDFPageObj_GetType(pObject->getPointer()) == FPDF_PAGEOBJ_FORM) + { + pFormObject = std::move(pObject); + break; + } + } + CPPUNIT_ASSERT(pFormObject); + std::unique_ptr<vcl::pdf::PDFiumPageObject> pInnerFormObject; + for (int i = 0; i < pFormObject->getFormObjectCount(); ++i) + { + std::unique_ptr<vcl::pdf::PDFiumPageObject> pObject = pFormObject->getFormObject(i); + if (FPDFPageObj_GetType(pObject->getPointer()) == FPDF_PAGEOBJ_FORM) + { + pInnerFormObject = std::move(pObject); + break; + } + } + CPPUNIT_ASSERT(pInnerFormObject); + // Then make sure that enough digits are used, so the point size is unchanged: + basegfx::B2DHomMatrix aMatrix; + FS_MATRIX matrix; + if (FPDFFormObj_GetMatrix(pInnerFormObject->getPointer(), &matrix)) + { + aMatrix = basegfx::B2DHomMatrix::abcdef(matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, + matrix.f); + } + basegfx::B2DTuple aScale; + basegfx::B2DTuple aTranslate; + double fRotate{}; + double fShearX{}; + aMatrix.decompose(aScale, aTranslate, fRotate, fShearX); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0.0012626264 + // - Actual : 0.00126 + // i.e. the rounded reciprocal was 794 points, not the original 792. + // FIXME macOS actual value is 0.0001578282, for unknown reasons. +#if !defined MACOSX + CPPUNIT_ASSERT_EQUAL(0.0012626264, rtl::math::round(aScale.getY(), 10)); +#endif } CPPUNIT_TEST_SUITE_REGISTRATION(PdfExportTest); diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx index b78ae731e8bd..896a910eae51 100644 --- a/vcl/source/gdi/pdfwriter_impl.cxx +++ b/vcl/source/gdi/pdfwriter_impl.cxx @@ -8870,9 +8870,9 @@ void PDFWriterImpl::writeReferenceXObject(ReferenceXObjectEmit& rEmit) aLine.append(">> >>"); aLine.append(" /Matrix [ "); - appendDouble(fScaleX, aLine); + appendDouble(fScaleX, aLine, /*nPrecision=*/10); aLine.append(" 0 0 "); - appendDouble(fScaleY, aLine); + appendDouble(fScaleY, aLine, /*nPrecision=*/10); aLine.append(" 0 0 ]"); aLine.append(" /BBox [ 0 0 "); aLine.append(aSize.Width()); |