PDF4QT/PdfForQtLib/sources/pdfrenderer.h

162 lines
6.6 KiB
C
Raw Normal View History

2020-01-18 11:38:54 +01:00
// Copyright (C) 2019-2020 Jakub Melka
2019-02-09 18:40:56 +01:00
//
// This file is part of PdfForQt.
//
// PdfForQt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// PdfForQt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with PDFForQt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFRENDERER_H
#define PDFRENDERER_H
#include "pdfpage.h"
2019-04-29 17:03:19 +02:00
#include "pdfexception.h"
2019-09-28 18:26:31 +02:00
#include "pdfmeshqualitysettings.h"
2019-02-09 18:40:56 +01:00
2019-12-15 16:45:49 +01:00
#include <QSurfaceFormat>
2019-02-14 19:45:07 +01:00
class QPainter;
2019-12-15 16:45:49 +01:00
class QOpenGLContext;
class QOffscreenSurface;
class QOpenGLFramebufferObject;
2019-02-09 18:40:56 +01:00
namespace pdf
{
2019-12-25 17:56:17 +01:00
class PDFCMS;
2019-04-12 19:17:19 +02:00
class PDFFontCache;
2019-12-14 14:39:43 +01:00
class PDFPrecompiledPage;
class PDFOptionalContentActivity;
2019-02-09 18:40:56 +01:00
/// Renders the PDF page on the painter, or onto an image.
2020-02-03 19:45:17 +01:00
class PDFFORQTLIBSHARED_EXPORT PDFRenderer
2019-02-09 18:40:56 +01:00
{
public:
enum Feature
{
2019-07-06 15:55:37 +02:00
Antialiasing = 0x0001, ///< Antialiasing for lines, shapes, etc.
TextAntialiasing = 0x0002, ///< Antialiasing for drawing text
SmoothImages = 0x0004, ///< Adjust images to the device space using smooth transformation (slower, but better image quality)
IgnoreOptionalContent = 0x0008, ///< Ignore optional content (so all is drawn ignoring settings of optional content)
ClipToCropBox = 0x0010, ///< Clip page content to crop box (items outside crop box will not be visible)
DisplayTimes = 0x0020, ///< Display page compile/draw time
2019-12-29 17:25:18 +01:00
DebugTextBlocks = 0x0040, ///< Debug text block layout algorithm
2020-01-28 19:17:45 +01:00
DebugTextLines = 0x0080, ///< Debug text line layout algorithm
InvertColors = 0x0100, ///< Invert colors
2019-02-09 18:40:56 +01:00
};
Q_DECLARE_FLAGS(Features, Feature)
2019-12-25 17:56:17 +01:00
explicit PDFRenderer(const PDFDocument* document,
const PDFFontCache* fontCache,
const PDFCMS* cms,
const PDFOptionalContentActivity* optionalContentActivity,
Features features,
const PDFMeshQualitySettings& meshQualitySettings);
2019-07-06 15:55:37 +02:00
2019-02-09 18:40:56 +01:00
/// Paints desired page onto the painter. Page is painted in the rectangle using best-fit method.
/// If the page doesn't exist, then error is returned. No exception is thrown. Rendering errors
/// are reported and returned in the error list. If no error occured, empty list is returned.
/// \param painter Painter
/// \param rectangle Paint area for the page
/// \param pageIndex Index of the page to be painted
QList<PDFRenderError> render(QPainter* painter, const QRectF& rectangle, size_t pageIndex) const;
2019-02-24 17:48:37 +01:00
/// Paints desired page onto the painter. Page is painted using \p matrix, which maps page coordinates
/// to the device coordinates. If the page doesn't exist, then error is returned. No exception is thrown.
/// Rendering errors are reported and returned in the error list. If no error occured, empty list is returned.
QList<PDFRenderError> render(QPainter* painter, const QMatrix& matrix, size_t pageIndex) const;
2019-12-14 14:39:43 +01:00
/// Compiles page (i.e. prepares compiled page). \p page should be empty page, onto which
/// are graphics commands written. No exception is thrown. Rendering errors are reported and written
/// to the compiled page.
/// \param precompiledPage Precompiled page pointer
/// \param pageIndex Index of page to be compiled
void compile(PDFPrecompiledPage* precompiledPage, size_t pageIndex) const;
/// Creates page point to device point matrix for the given rectangle. It creates transformation
/// from page's media box to the target rectangle.
/// \param page Page, for which we want to create matrix
/// \param rectangle Page rectangle, to which is page media box transformed
static QMatrix createPagePointToDevicePointMatrix(const PDFPage* page, const QRectF& rectangle);
2019-12-14 14:39:43 +01:00
2019-07-06 15:55:37 +02:00
/// Returns default renderer features
static constexpr Features getDefaultFeatures() { return Antialiasing | TextAntialiasing | ClipToCropBox; }
2019-07-06 15:55:37 +02:00
2019-02-09 18:40:56 +01:00
private:
const PDFDocument* m_document;
2019-04-12 19:17:19 +02:00
const PDFFontCache* m_fontCache;
2019-12-25 17:56:17 +01:00
const PDFCMS* m_cms;
const PDFOptionalContentActivity* m_optionalContentActivity;
2019-02-09 18:40:56 +01:00
Features m_features;
2019-09-28 18:26:31 +02:00
PDFMeshQualitySettings m_meshQualitySettings;
2019-02-09 18:40:56 +01:00
};
2019-12-15 16:45:49 +01:00
/// Renders PDF pages to bitmap images (QImage). It can use OpenGL for painting,
/// if it is enabled, if this is the case, offscreen rendering to framebuffer
/// is used.
class PDFRasterizer : public QObject
{
Q_OBJECT
private:
using BaseClass = QObject;
public:
explicit PDFRasterizer(QObject* parent);
~PDFRasterizer();
/// Resets the renderer. This function must be called from main GUI thread,
/// it cannot be called from deferred threads, because it can create hidden
/// window (offscreen surface).
/// \param useOpenGL Use OpenGL for rendering
/// \param surfaceFormat Surface format to render
void reset(bool useOpenGL, const QSurfaceFormat& surfaceFormat);
enum Feature
{
UseOpenGL = 0x0001, ///< Use OpenGL for rendering
ValidOpenGL = 0x0002, ///< OpenGL is initialized and valid
FailedOpenGL = 0x0004, ///< OpenGL creation has failed
};
Q_DECLARE_FLAGS(Features, Feature)
/// Renders page to the image of given size. If some error occurs, then
/// empty image is returned. Warning: this function can modify this object,
/// so it is not const and is not thread safe.
/// \param page Page
/// \param compiledPage Compiled page contents
/// \param size Size of the target image
/// \param features Renderer features
QImage render(const PDFPage* page,
const PDFPrecompiledPage* compiledPage,
QSize size,
PDFRenderer::Features features);
private:
void initializeOpenGL();
void releaseOpenGL();
Features m_features;
QSurfaceFormat m_surfaceFormat;
QOffscreenSurface* m_surface;
QOpenGLContext* m_context;
QOpenGLFramebufferObject* m_fbo;
};
2019-02-09 18:40:56 +01:00
} // namespace pdf
Q_DECLARE_OPERATORS_FOR_FLAGS(pdf::PDFRenderer::Features)
#endif // PDFRENDERER_H