diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2022-02-07 19:58:20 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2022-02-08 13:42:45 +0100 |
commit | 4df75c2a2f9abbf2621a9aacd0c4f9fe8841b051 (patch) | |
tree | 02a699fd5f9ace78352fd5b16b46829cb99bba4e | |
parent | dbf92d1825bed9f79925f232a5be7cd9f3a330f3 (diff) |
sw: fix size of inserted PDF image
We used to multiply the pixel size with the DPI, which resulted in some
large enough mm100 width that the inserted image was as wide as the body
frame allowed it.
Change-Id: I97b81f23166889006363b9241a572f6afde99ee3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129640
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
-rw-r--r-- | filter/qa/data/picture.pdf | bin | 0 -> 13829 bytes | |||
-rw-r--r-- | filter/qa/pdf.cxx | 39 | ||||
-rw-r--r-- | filter/source/pdf/pdfdecomposer.cxx | 8 |
3 files changed, 43 insertions, 4 deletions
diff --git a/filter/qa/data/picture.pdf b/filter/qa/data/picture.pdf Binary files differnew file mode 100644 index 000000000000..79af2b349dd2 --- /dev/null +++ b/filter/qa/data/picture.pdf diff --git a/filter/qa/pdf.cxx b/filter/qa/pdf.cxx index 07025c1b1c2e..8eb64b08cc7a 100644 --- a/filter/qa/pdf.cxx +++ b/filter/qa/pdf.cxx @@ -14,6 +14,9 @@ #include <com/sun/star/document/XFilter.hpp> #include <com/sun/star/frame/Desktop.hpp> #include <com/sun/star/xml/crypto/SEInitializer.hpp> +#include <com/sun/star/drawing/XDrawPageSupplier.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/graphic/XGraphic.hpp> #include <comphelper/propertyvalue.hxx> #include <tools/stream.hxx> @@ -52,6 +55,8 @@ void Test::tearDown() test::BootstrapFixture::tearDown(); } +constexpr OUStringLiteral DATA_DIRECTORY = u"/filter/qa/data/"; + CPPUNIT_TEST_FIXTURE(Test, testSignCertificateSubjectName) { uno::Reference<xml::crypto::XSEInitializer> xSEInitializer @@ -101,6 +106,40 @@ CPPUNIT_TEST_FIXTURE(Test, testSignCertificateSubjectName) CPPUNIT_ASSERT(pPdfDocument); CPPUNIT_ASSERT_EQUAL(1, pPdfDocument->getSignatureCount()); } + +CPPUNIT_TEST_FIXTURE(Test, testPdfDecompositionSize) +{ + // Given an empty Writer document: + getComponent().set( + loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument")); + + // When inserting a 267 points wide PDF image into the document: + uno::Sequence<beans::PropertyValue> aArgs = { + comphelper::makePropertyValue("FileName", + m_directories.getURLFromSrc(DATA_DIRECTORY) + "picture.pdf"), + }; + dispatchCommand(getComponent(), ".uno:InsertGraphic", aArgs); + + // Then make sure that its size is correct: + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + auto xGraphic = xShape->getPropertyValue("Graphic").get<uno::Reference<graphic::XGraphic>>(); + CPPUNIT_ASSERT(xGraphic.is()); + Graphic aGraphic(xGraphic); + basegfx::B2DRange aRange = aGraphic.getVectorGraphicData()->getRange(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 9419 + // - Actual : 34176 + // i.e. the width was too large, it used all width of the body frame. + // 9419 mm100 is 267 points from the file. +#if defined MACOSX + // TODO the bitmap size is larger (75486) on macOS, but that should not affect the logic size. + (void)aRange; +#else + CPPUNIT_ASSERT_EQUAL(static_cast<double>(9419), aRange.getWidth()); +#endif +} } CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/filter/source/pdf/pdfdecomposer.cxx b/filter/source/pdf/pdfdecomposer.cxx index f861b4eaf86e..7a032bf3688a 100644 --- a/filter/source/pdf/pdfdecomposer.cxx +++ b/filter/source/pdf/pdfdecomposer.cxx @@ -82,12 +82,12 @@ XPdfDecomposer::getDecomposition(const uno::Reference<util::XBinaryDataContainer BitmapEx aReplacement(aBitmaps[0]); // short form for scale and translate transformation - const Size aDPI( - Application::GetDefaultDevice()->LogicToPixel(Size(1, 1), MapMode(MapUnit::MapInch))); const Size aBitmapSize(aReplacement.GetSizePixel()); + // ImpGraphic::getPrefMapMode() requires mm100 for bitmaps rendered from vector graphic data. + const Size aMM100( + Application::GetDefaultDevice()->PixelToLogic(aBitmapSize, MapMode(MapUnit::Map100thMM))); const basegfx::B2DHomMatrix aBitmapTransform(basegfx::utils::createScaleTranslateB2DHomMatrix( - aBitmapSize.getWidth() * aDPI.getWidth(), aBitmapSize.getHeight() * aDPI.getHeight(), 0, - 0)); + aMM100.getWidth(), aMM100.getHeight(), 0, 0)); // create primitive return drawinglayer::primitive2d::Primitive2DContainer{ |