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;
25 QPainter *painter;
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 QPicture *page = new QPicture;
56 page->d_func()->in_memory_only = true;
57 d->painter = new QPainter(page);
58 d->engine = d->painter->paintEngine();
59 *d->painter->d_func()->state = *painter()->d_func()->state;
60 d->pages.append(page);
61 d->state = QPrinter::Active;
62 return true;
63}
64
65bool QPreviewPaintEngine::end()
66{
67 Q_D(QPreviewPaintEngine);
68
69 delete d->painter;
70 d->painter = nullptr;
71 d->engine = nullptr;
72 d->state = QPrinter::Idle;
73 return true;
74}
75
76void QPreviewPaintEngine::updateState(const QPaintEngineState &state)
77{
78 Q_D(QPreviewPaintEngine);
79 d->engine->updateState(state);
80}
81
82void QPreviewPaintEngine::drawPath(const QPainterPath &path)
83{
84 Q_D(QPreviewPaintEngine);
85 d->engine->drawPath(path);
86}
87
88void QPreviewPaintEngine::drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode)
89{
90 Q_D(QPreviewPaintEngine);
91 d->engine->drawPolygon(points, pointCount, mode);
92}
93
94void QPreviewPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem)
95{
96 Q_D(QPreviewPaintEngine);
97 d->engine->drawTextItem(p, textItem);
98}
99
100void QPreviewPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr)
101{
102 Q_D(QPreviewPaintEngine);
103 d->engine->drawPixmap(r, pm, sr);
104}
105
106void QPreviewPaintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &p)
107{
108 Q_D(QPreviewPaintEngine);
109 d->engine->drawTiledPixmap(r, pm, p);
110}
111
112bool QPreviewPaintEngine::newPage()
113{
114 Q_D(QPreviewPaintEngine);
115
116 QPicture *page = new QPicture;
117 page->d_func()->in_memory_only = true;
118 QPainter *tmp_painter = new QPainter(page);
119 QPaintEngine *tmp_engine = tmp_painter->paintEngine();
120
121 // copy the painter state from the original painter
122 Q_ASSERT(painter()->d_func()->state && tmp_painter->d_func()->state);
123 *tmp_painter->d_func()->state = *painter()->d_func()->state;
124
125 // composition modes aren't supported on a QPrinter and yields a
126 // warning, so ignore it for now
127 tmp_engine->setDirty(DirtyFlags(AllDirty & ~DirtyCompositionMode));
128 tmp_engine->syncState();
129
130 delete d->painter;
131 d->painter = tmp_painter;
132 d->pages.append(page);
133 d->engine = tmp_engine;
134 return true;
135}
136
137bool QPreviewPaintEngine::abort()
138{
139 Q_D(QPreviewPaintEngine);
140 end();
141 qDeleteAll(d->pages);
142 d->state = QPrinter::Aborted;
143
144 return true;
145}
146
147QList<const QPicture *> QPreviewPaintEngine::pages()
148{
149 Q_D(QPreviewPaintEngine);
150 return d->pages;
151}
152
153void QPreviewPaintEngine::setProxyEngines(QPrintEngine *printEngine, QPaintEngine *paintEngine)
154{
155 Q_D(QPreviewPaintEngine);
156 d->proxy_print_engine = printEngine;
157 d->proxy_paint_engine = paintEngine;
158}
159
160void QPreviewPaintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &value)
161{
162 Q_D(QPreviewPaintEngine);
163 d->proxy_print_engine->setProperty(key, value);
164}
165
166QVariant QPreviewPaintEngine::property(PrintEnginePropertyKey key) const
167{
168 Q_D(const QPreviewPaintEngine);
169 return d->proxy_print_engine->property(key);
170}
171
172int QPreviewPaintEngine::metric(QPaintDevice::PaintDeviceMetric id) const
173{
174 Q_D(const QPreviewPaintEngine);
175 return d->proxy_print_engine->metric(id);
176}
177
178QPrinter::PrinterState QPreviewPaintEngine::printerState() const
179{
180 Q_D(const QPreviewPaintEngine);
181 return d->state;
182}
183
184QT_END_NAMESPACE