diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2020-09-18 17:52:41 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2020-09-18 21:24:38 +0200 |
commit | 01024ee24c6e89044c68051f6fd5f1264905e90c (patch) | |
tree | 4fbfc06d643f72cab1cf5525c921565d2fb90c65 /vcl | |
parent | ccf35ce98771cac805aafa58a1bcfaba17c59a12 (diff) |
[API CHANGE] tdf#136836 emfio: set size hint on inner PDF if used as shape fill
The bugdoc has a shape, its bitmap fill is an EMF, which is actually a
PDF. The PDF is has a height of 5cm, but the shape has a height of 14
cm.
Inform vcl::RenderPDFBitmaps() about the size of the shape, so the
result won't be blurry. This approach makes sure that we don't
unconditionally render at higher resolution, i.e. the "load a PDF of 100
pages into Online" use-case won't use more memory than before.
API CHANGE, because the EMF reader is only available via UNO, though
it's likely that no actual external code would ever invoke it directly.
Change-Id: If1d8def0136d408a31a0cc54777a7f26430a0ff3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102996
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/filter/ipdf/pdfread.cxx | 21 | ||||
-rw-r--r-- | vcl/source/gdi/vectorgraphicdata.cxx | 12 |
2 files changed, 29 insertions, 4 deletions
diff --git a/vcl/source/filter/ipdf/pdfread.cxx b/vcl/source/filter/ipdf/pdfread.cxx index d89283e902ac..39c2933be8d5 100644 --- a/vcl/source/filter/ipdf/pdfread.cxx +++ b/vcl/source/filter/ipdf/pdfread.cxx @@ -24,6 +24,7 @@ #include <unotools/datetime.hxx> #include <vcl/filter/PDFiumLibrary.hxx> +#include <sal/log.hxx> using namespace com::sun::star; @@ -147,9 +148,10 @@ VectorGraphicDataArray createVectorGraphicDataArray(SvStream& rStream) namespace vcl { size_t RenderPDFBitmaps(const void* pBuffer, int nSize, std::vector<Bitmap>& rBitmaps, - const size_t nFirstPage, int nPages, const double fResolutionDPI) + const size_t nFirstPage, int nPages, const basegfx::B2DTuple* pSizeHint) { #if HAVE_FEATURE_PDFIUM + const double fResolutionDPI = 96; auto pPdfium = vcl::pdf::PDFiumLibrary::get(); // Load the buffer using pdfium. @@ -168,9 +170,19 @@ size_t RenderPDFBitmaps(const void* pBuffer, int nSize, std::vector<Bitmap>& rBi if (!pPdfPage) break; + // Calculate the bitmap size in points. + size_t nPageWidthPoints = FPDF_GetPageWidth(pPdfPage); + size_t nPageHeightPoints = FPDF_GetPageHeight(pPdfPage); + if (pSizeHint && pSizeHint->getX() && pSizeHint->getY()) + { + // Have a size hint, prefer that over the logic size from the PDF. + nPageWidthPoints = convertMm100ToTwip(pSizeHint->getX()) / 20; + nPageHeightPoints = convertMm100ToTwip(pSizeHint->getY()) / 20; + } + // Returned unit is points, convert that to pixel. - const size_t nPageWidth = pointToPixel(FPDF_GetPageWidth(pPdfPage), fResolutionDPI); - const size_t nPageHeight = pointToPixel(FPDF_GetPageHeight(pPdfPage), fResolutionDPI); + const size_t nPageWidth = pointToPixel(nPageWidthPoints, fResolutionDPI); + const size_t nPageHeight = pointToPixel(nPageHeightPoints, fResolutionDPI); FPDF_BITMAP pPdfBitmap = FPDFBitmap_Create(nPageWidth, nPageHeight, /*alpha=*/1); if (!pPdfBitmap) break; @@ -217,7 +229,10 @@ bool ImportPDF(SvStream& rStream, Graphic& rGraphic) { VectorGraphicDataArray aPdfDataArray = createVectorGraphicDataArray(rStream); if (!aPdfDataArray.hasElements()) + { + SAL_WARN("vcl.filter", "ImportPDF: empty PDF data array"); return false; + } auto aVectorGraphicDataPtr = std::make_shared<VectorGraphicData>(aPdfDataArray, OUString(), VectorGraphicDataType::Pdf); diff --git a/vcl/source/gdi/vectorgraphicdata.cxx b/vcl/source/gdi/vectorgraphicdata.cxx index bfaa544bc7d4..d0d1e3ca6412 100644 --- a/vcl/source/gdi/vectorgraphicdata.cxx +++ b/vcl/source/gdi/vectorgraphicdata.cxx @@ -150,7 +150,9 @@ void VectorGraphicData::ensurePdfReplacement() sal_Int32 nUsePageIndex = 0; if (mnPageIndex >= 0) nUsePageIndex = mnPageIndex; - vcl::RenderPDFBitmaps(maVectorGraphicDataArray.getConstArray(), maVectorGraphicDataArray.getLength(), aBitmaps, nUsePageIndex, 1/*, fResolutionDPI*/); + vcl::RenderPDFBitmaps(maVectorGraphicDataArray.getConstArray(), + maVectorGraphicDataArray.getLength(), aBitmaps, nUsePageIndex, 1, + &maSizeHint); if (!aBitmaps.empty()) maReplacement = aBitmaps[0]; } @@ -212,7 +214,15 @@ void VectorGraphicData::ensureSequenceAndRange() } if (myInputStream.is()) + { + // Pass the size hint of the graphic to the EMF parser. + geometry::RealPoint2D aSizeHint; + aSizeHint.X = maSizeHint.getX(); + aSizeHint.Y = maSizeHint.getY(); + xEmfParser->setSizeHint(aSizeHint); + maSequence = comphelper::sequenceToContainer<std::deque<css::uno::Reference< css::graphic::XPrimitive2D >>>(xEmfParser->getDecomposition(myInputStream, maPath, aSequence)); + } break; } |