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