1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtGui module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39
40 #include <private/qpaintengine_preview_p.h>
41 #include <private/qpainter_p.h>
42 #include <private/qpaintengine_p.h>
43 #include <private/qpicture_p.h>
44
45 #include <QtPrintSupport/qprintengine.h>
46 #include <QtGui/qpainter.h>
47 #include <QtGui/qpicture.h>
48
49 QT_BEGIN_NAMESPACE
50
51 class QPreviewPaintEnginePrivate : public QPaintEnginePrivate
52 {
53 Q_DECLARE_PUBLIC(QPreviewPaintEngine)
54 public:
QPreviewPaintEnginePrivate()55 QPreviewPaintEnginePrivate() : state(QPrinter::Idle) {}
~QPreviewPaintEnginePrivate()56 ~QPreviewPaintEnginePrivate() {}
57
58 QList<const QPicture *> pages;
59 QPaintEngine *engine;
60 QPainter *painter;
61 QPrinter::PrinterState state;
62
63 QPaintEngine *proxy_paint_engine;
64 QPrintEngine *proxy_print_engine;
65 };
66
67
QPreviewPaintEngine()68 QPreviewPaintEngine::QPreviewPaintEngine()
69 : QPaintEngine(*(new QPreviewPaintEnginePrivate), PaintEngineFeatures(AllFeatures & ~ObjectBoundingModeGradients))
70 {
71 Q_D(QPreviewPaintEngine);
72 d->proxy_print_engine = nullptr;
73 d->proxy_paint_engine = nullptr;
74 }
75
~QPreviewPaintEngine()76 QPreviewPaintEngine::~QPreviewPaintEngine()
77 {
78 Q_D(QPreviewPaintEngine);
79
80 qDeleteAll(d->pages);
81 }
82
begin(QPaintDevice *)83 bool QPreviewPaintEngine::begin(QPaintDevice *)
84 {
85 Q_D(QPreviewPaintEngine);
86
87 qDeleteAll(d->pages);
88 d->pages.clear();
89
90 QPicture *page = new QPicture;
91 page->d_func()->in_memory_only = true;
92 d->painter = new QPainter(page);
93 d->engine = d->painter->paintEngine();
94 *d->painter->d_func()->state = *painter()->d_func()->state;
95 d->pages.append(page);
96 d->state = QPrinter::Active;
97 return true;
98 }
99
end()100 bool QPreviewPaintEngine::end()
101 {
102 Q_D(QPreviewPaintEngine);
103
104 delete d->painter;
105 d->painter = nullptr;
106 d->engine = nullptr;
107 d->state = QPrinter::Idle;
108 return true;
109 }
110
updateState(const QPaintEngineState & state)111 void QPreviewPaintEngine::updateState(const QPaintEngineState &state)
112 {
113 Q_D(QPreviewPaintEngine);
114 d->engine->updateState(state);
115 }
116
drawPath(const QPainterPath & path)117 void QPreviewPaintEngine::drawPath(const QPainterPath &path)
118 {
119 Q_D(QPreviewPaintEngine);
120 d->engine->drawPath(path);
121 }
122
drawPolygon(const QPointF * points,int pointCount,PolygonDrawMode mode)123 void QPreviewPaintEngine::drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode)
124 {
125 Q_D(QPreviewPaintEngine);
126 d->engine->drawPolygon(points, pointCount, mode);
127 }
128
drawTextItem(const QPointF & p,const QTextItem & textItem)129 void QPreviewPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem)
130 {
131 Q_D(QPreviewPaintEngine);
132 d->engine->drawTextItem(p, textItem);
133 }
134
drawPixmap(const QRectF & r,const QPixmap & pm,const QRectF & sr)135 void QPreviewPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr)
136 {
137 Q_D(QPreviewPaintEngine);
138 d->engine->drawPixmap(r, pm, sr);
139 }
140
drawTiledPixmap(const QRectF & r,const QPixmap & pm,const QPointF & p)141 void QPreviewPaintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &p)
142 {
143 Q_D(QPreviewPaintEngine);
144 d->engine->drawTiledPixmap(r, pm, p);
145 }
146
newPage()147 bool QPreviewPaintEngine::newPage()
148 {
149 Q_D(QPreviewPaintEngine);
150
151 QPicture *page = new QPicture;
152 page->d_func()->in_memory_only = true;
153 QPainter *tmp_painter = new QPainter(page);
154 QPaintEngine *tmp_engine = tmp_painter->paintEngine();
155
156 // copy the painter state from the original painter
157 Q_ASSERT(painter()->d_func()->state && tmp_painter->d_func()->state);
158 *tmp_painter->d_func()->state = *painter()->d_func()->state;
159
160 // composition modes aren't supported on a QPrinter and yields a
161 // warning, so ignore it for now
162 tmp_engine->setDirty(DirtyFlags(AllDirty & ~DirtyCompositionMode));
163 tmp_engine->syncState();
164
165 delete d->painter;
166 d->painter = tmp_painter;
167 d->pages.append(page);
168 d->engine = tmp_engine;
169 return true;
170 }
171
abort()172 bool QPreviewPaintEngine::abort()
173 {
174 Q_D(QPreviewPaintEngine);
175 end();
176 qDeleteAll(d->pages);
177 d->state = QPrinter::Aborted;
178
179 return true;
180 }
181
pages()182 QList<const QPicture *> QPreviewPaintEngine::pages()
183 {
184 Q_D(QPreviewPaintEngine);
185 return d->pages;
186 }
187
setProxyEngines(QPrintEngine * printEngine,QPaintEngine * paintEngine)188 void QPreviewPaintEngine::setProxyEngines(QPrintEngine *printEngine, QPaintEngine *paintEngine)
189 {
190 Q_D(QPreviewPaintEngine);
191 d->proxy_print_engine = printEngine;
192 d->proxy_paint_engine = paintEngine;
193 }
194
setProperty(PrintEnginePropertyKey key,const QVariant & value)195 void QPreviewPaintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &value)
196 {
197 Q_D(QPreviewPaintEngine);
198 d->proxy_print_engine->setProperty(key, value);
199 }
200
property(PrintEnginePropertyKey key) const201 QVariant QPreviewPaintEngine::property(PrintEnginePropertyKey key) const
202 {
203 Q_D(const QPreviewPaintEngine);
204 return d->proxy_print_engine->property(key);
205 }
206
metric(QPaintDevice::PaintDeviceMetric id) const207 int QPreviewPaintEngine::metric(QPaintDevice::PaintDeviceMetric id) const
208 {
209 Q_D(const QPreviewPaintEngine);
210 return d->proxy_print_engine->metric(id);
211 }
212
printerState() const213 QPrinter::PrinterState QPreviewPaintEngine::printerState() const
214 {
215 Q_D(const QPreviewPaintEngine);
216 return d->state;
217 }
218
219 QT_END_NAMESPACE
220