Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qpaintengine_preview.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#include <private/qpaintengine_preview_p.h>
6#include <private/qpainter_p.h>
7#include <private/qpaintengine_p.h>
8#include <private/qpicture_p.h>
9
10#include <QtPrintSupport/qprintengine.h>
11#include <QtGui/qpainter.h>
12#include <QtGui/qpicture.h>
13
14QT_BEGIN_NAMESPACE
15
16class QPreviewPaintEnginePrivate : public QPaintEnginePrivate
17{
18 Q_DECLARE_PUBLIC(QPreviewPaintEngine)
19public:
20 QPreviewPaintEnginePrivate() : state(QPrinter::Idle) {}
21 ~QPreviewPaintEnginePrivate() {}
22
23 QList<const QPicture *> pages;
24 QPaintEngine *engine = nullptr;
25 QPainter *painter = nullptr;
26 QPrinter::PrinterState state;
27
28 QPaintEngine *proxy_paint_engine;
29 QPrintEngine *proxy_print_engine;
30};
31
32
33QPreviewPaintEngine::QPreviewPaintEngine()
34 : QPaintEngine(*(new QPreviewPaintEnginePrivate), PaintEngineFeatures(AllFeatures & ~ObjectBoundingModeGradients))
35{
36 Q_D(QPreviewPaintEngine);
37 d->proxy_print_engine = nullptr;
38 d->proxy_paint_engine = nullptr;
39}
40
41QPreviewPaintEngine::~QPreviewPaintEngine()
42{
43 Q_D(QPreviewPaintEngine);
44
45 qDeleteAll(d->pages);
46}
47
48bool QPreviewPaintEngine::begin(QPaintDevice *)
49{
50 Q_D(QPreviewPaintEngine);
51
52 qDeleteAll(d->pages);
53 d->pages.clear();
54
55 startPage();
56 d->state = QPrinter::Active;
57 return true;
58}
59
60bool QPreviewPaintEngine::end()
61{
62 Q_D(QPreviewPaintEngine);
63
64 delete d->painter;
65 d->painter = nullptr;
66 d->engine = nullptr;
67 d->state = QPrinter::Idle;
68 return true;
69}
70
71void QPreviewPaintEngine::updateState(const QPaintEngineState &state)
72{
73 Q_D(QPreviewPaintEngine);
74 d->engine->updateState(state);
75}
76
77void QPreviewPaintEngine::drawPath(const QPainterPath &path)
78{
79 Q_D(QPreviewPaintEngine);
80 d->engine->drawPath(path);
81}
82
83void QPreviewPaintEngine::drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode)
84{
85 Q_D(QPreviewPaintEngine);
86 d->engine->drawPolygon(points, pointCount, mode);
87}
88
89void QPreviewPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem)
90{
91 Q_D(QPreviewPaintEngine);
92 d->engine->drawTextItem(p, textItem);
93}
94
95void QPreviewPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr)
96{
97 Q_D(QPreviewPaintEngine);
98 d->engine->drawPixmap(r, pm, sr);
99}
100
101void QPreviewPaintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &p)
102{
103 Q_D(QPreviewPaintEngine);
104 d->engine->drawTiledPixmap(r, pm, p);
105}
106
107void QPreviewPaintEngine::startPage()
108{
109 Q_D(QPreviewPaintEngine);
110
111 QPicture *page = new QPicture;
112 page->d_func()->in_memory_only = true;
113 QPainter *pagePainter = new QPainter(page);
114 QPaintEngine *pageEngine = pagePainter->paintEngine();
115
116 Q_ASSERT(painter()->d_func()->state && pagePainter->d_func()->state);
117 *pagePainter->d_func()->state = *painter()->d_func()->state;
118
119 // composition modes aren't supported on a QPrinter and yields a
120 // warning, so ignore it for now
121 pageEngine->setDirty(DirtyFlags(AllDirty & ~DirtyCompositionMode));
122 pageEngine->syncState();
123
124 delete d->painter;
125 d->painter = pagePainter;
126 d->pages.append(page);
127 d->engine = pageEngine;
128}
129
130bool QPreviewPaintEngine::newPage()
131{
132 startPage();
133 return true;
134}
135
136bool QPreviewPaintEngine::abort()
137{
138 Q_D(QPreviewPaintEngine);
139 end();
140 qDeleteAll(d->pages);
141 d->state = QPrinter::Aborted;
142
143 return true;
144}
145
146QList<const QPicture *> QPreviewPaintEngine::pages()
147{
148 Q_D(QPreviewPaintEngine);
149 return d->pages;
150}
151
152void QPreviewPaintEngine::setProxyEngines(QPrintEngine *printEngine, QPaintEngine *paintEngine)
153{
154 Q_D(QPreviewPaintEngine);
155 d->proxy_print_engine = printEngine;
156 d->proxy_paint_engine = paintEngine;
157}
158
159void QPreviewPaintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &value)
160{
161 Q_D(QPreviewPaintEngine);
162 d->proxy_print_engine->setProperty(key, value);
163}
164
165QVariant QPreviewPaintEngine::property(PrintEnginePropertyKey key) const
166{
167 Q_D(const QPreviewPaintEngine);
168 return d->proxy_print_engine->property(key);
169}
170
171int QPreviewPaintEngine::metric(QPaintDevice::PaintDeviceMetric id) const
172{
173 Q_D(const QPreviewPaintEngine);
174 return d->proxy_print_engine->metric(id);
175}
176
177QPrinter::PrinterState QPreviewPaintEngine::printerState() const
178{
179 Q_D(const QPreviewPaintEngine);
180 return d->state;
181}
182
183QT_END_NAMESPACE