266e6b7676
When inserting a PDF file as an image or pasting PDF data from the clipboard on a Retina iMac the resulting rendered image did not look sharp. Using a surprisingly large extra scaling factor helps. The exact reasons for this are unknown. It isn't enough to use a scaling factor of just 2 (which is the HiDI ("Retina") scale factor on my iMac). Possibly the fuzziness is related to what Pdfium uses to render text. Also, look at CountDPIScaleFactor() in vcl/source/window/window.cxx. The GetDPIScaleFactor() function lies on macOS even more than it does on other platforms. It claims that the DPI scale percentage is always 100. But in fact most Macs nowadays have a Retina display so it would make more sense, in theory, to at least always return 200 instead. That wouldn't be any more wrong. But that causes regressions in the UI rendering, like needlessly large icons in the toolbars. Change-Id: Idc694f742c4ac32a5a134f8d206cf4eee467c39a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129369 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
107 lines
3.7 KiB
C++
107 lines
3.7 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
|
|
/*
|
|
* 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/.
|
|
*/
|
|
|
|
#ifndef INCLUDED_VCL_SOURCE_FILTER_IPDF_PDFREAD_HXX
|
|
#define INCLUDED_VCL_SOURCE_FILTER_IPDF_PDFREAD_HXX
|
|
|
|
#include <vector>
|
|
#include <tools/gen.hxx>
|
|
#include <tools/stream.hxx>
|
|
#include <tools/color.hxx>
|
|
#include <vcl/graph.hxx>
|
|
#include <basegfx/range/b2drectangle.hxx>
|
|
#include <com/sun/star/util/DateTime.hpp>
|
|
|
|
#include <vcl/pdf/PDFAnnotationSubType.hxx>
|
|
#include <vcl/pdf/PDFAnnotationMarker.hxx>
|
|
|
|
namespace com::sun::star::uno
|
|
{
|
|
template <typename> class Sequence;
|
|
}
|
|
class Bitmap;
|
|
|
|
namespace vcl
|
|
{
|
|
/// Fills the rBitmaps vector with rendered pages.
|
|
VCL_DLLPUBLIC size_t RenderPDFBitmaps(const void* pBuffer, int nSize,
|
|
std::vector<BitmapEx>& rBitmaps, size_t nFirstPage = 0,
|
|
int nPages = 1, const basegfx::B2DTuple* pSizeHint = nullptr);
|
|
|
|
/// Imports a PDF stream as a VectorGraphicData.
|
|
VCL_DLLPUBLIC bool
|
|
importPdfVectorGraphicData(SvStream& rStream,
|
|
std::shared_ptr<VectorGraphicData>& rVectorGraphicData);
|
|
|
|
/// Imports a PDF stream into rGraphic.
|
|
VCL_DLLPUBLIC bool ImportPDF(SvStream& rStream, Graphic& rGraphic);
|
|
|
|
// When inserting a PDF file as an image or pasting PDF data from the clipboard, at least on a
|
|
// Retina iMac, the resulting rendered image does not look sharp without this surprisingly large
|
|
// extra scaling factor. Exact reasons unknown. And it isn't enough to have it be just 2 (which is
|
|
// the actual Retina factor on my iMac). Possibly the fuzziness is related to what Pdfium uses to
|
|
// render text.
|
|
|
|
// Also, look at CountDPIScaleFactor() in vcl/source/window/window.cxx. The GetDPIScaleFactor() API
|
|
// lies on macOS even more than it does on other platforms, it claims that the DPI scale factor is
|
|
// always 1. But in fact most Macs nowadays have a HiDPI ("Retina") display. But we can't just "fix"
|
|
// things by making GetDPIScaleFactor() always return 2 on macOS, even if that wouldn't be any more
|
|
// wrong, because that then causes other regressions that I have no time to look into now.
|
|
|
|
#ifdef MACOSX
|
|
constexpr int PDF_INSERT_MAGIC_SCALE_FACTOR = 8;
|
|
#else
|
|
constexpr int PDF_INSERT_MAGIC_SCALE_FACTOR = 1;
|
|
#endif
|
|
|
|
struct PDFGraphicAnnotation
|
|
{
|
|
OUString maAuthor;
|
|
OUString maText;
|
|
|
|
basegfx::B2DRectangle maRectangle; // In HMM
|
|
css::util::DateTime maDateTime;
|
|
|
|
Color maColor;
|
|
|
|
pdf::PDFAnnotationSubType meSubType;
|
|
std::shared_ptr<pdf::PDFAnnotationMarker> mpMarker;
|
|
};
|
|
|
|
class PDFGraphicResult
|
|
{
|
|
Graphic maGraphic;
|
|
// Size in HMM
|
|
Size maSize;
|
|
|
|
std::vector<PDFGraphicAnnotation> maAnnotations;
|
|
|
|
public:
|
|
PDFGraphicResult(Graphic aGraphic, Size const& rSize,
|
|
std::vector<PDFGraphicAnnotation> aAnnotations)
|
|
: maGraphic(std::move(aGraphic))
|
|
, maSize(rSize)
|
|
, maAnnotations(std::move(aAnnotations))
|
|
{
|
|
}
|
|
|
|
const Graphic& GetGraphic() const { return maGraphic; }
|
|
const Size& GetSize() const { return maSize; }
|
|
const std::vector<PDFGraphicAnnotation>& GetAnnotations() const { return maAnnotations; }
|
|
};
|
|
|
|
/// Import PDF as Graphic images (1 per page), but not loaded yet.
|
|
/// Returns the number of pages read.
|
|
VCL_DLLPUBLIC size_t ImportPDFUnloaded(const OUString& rURL,
|
|
std::vector<PDFGraphicResult>& rGraphics);
|
|
}
|
|
|
|
#endif // INCLUDED_VCL_SOURCE_FILTER_IPDF_PDFREAD_HXX
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|