1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the QtGui module of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
42 #include <private/qpaintengine_preview_p.h>
43 #include <private/qpainter_p.h>
44 #include <private/qpaintengine_p.h>
45 #include <private/qpicture_p.h>
47 #include <QtGui/qprintengine.h>
48 #include <QtGui/qpainter.h>
49 #include <QtGui/qpicture.h>
51 #ifndef QT_NO_PRINTPREVIEWWIDGET
54 class QPreviewPaintEnginePrivate : public QPaintEnginePrivate
56 Q_DECLARE_PUBLIC(QPreviewPaintEngine)
58 QPreviewPaintEnginePrivate() : state(QPrinter::Idle) {}
59 ~QPreviewPaintEnginePrivate() {}
61 QList<const QPicture *> pages;
64 QPrinter::PrinterState state;
66 QPaintEngine *proxy_paint_engine;
67 QPrintEngine *proxy_print_engine;
71 QPreviewPaintEngine::QPreviewPaintEngine()
72 : QPaintEngine(*(new QPreviewPaintEnginePrivate), PaintEngineFeatures(AllFeatures & ~ObjectBoundingModeGradients))
74 Q_D(QPreviewPaintEngine);
75 d->proxy_print_engine = 0;
76 d->proxy_paint_engine = 0;
79 QPreviewPaintEngine::~QPreviewPaintEngine()
81 Q_D(QPreviewPaintEngine);
86 bool QPreviewPaintEngine::begin(QPaintDevice *)
88 Q_D(QPreviewPaintEngine);
93 QPicture *page = new QPicture;
94 page->d_func()->in_memory_only = true;
95 d->painter = new QPainter(page);
96 d->engine = d->painter->paintEngine();
97 d->pages.append(page);
98 d->state = QPrinter::Active;
102 bool QPreviewPaintEngine::end()
104 Q_D(QPreviewPaintEngine);
109 d->state = QPrinter::Idle;
113 void QPreviewPaintEngine::updateState(const QPaintEngineState &state)
115 Q_D(QPreviewPaintEngine);
116 d->engine->updateState(state);
119 void QPreviewPaintEngine::drawPath(const QPainterPath &path)
121 Q_D(QPreviewPaintEngine);
122 d->engine->drawPath(path);
125 void QPreviewPaintEngine::drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode)
127 Q_D(QPreviewPaintEngine);
128 d->engine->drawPolygon(points, pointCount, mode);
131 void QPreviewPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem)
133 Q_D(QPreviewPaintEngine);
134 d->engine->drawTextItem(p, textItem);
137 void QPreviewPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr)
139 Q_D(QPreviewPaintEngine);
140 d->engine->drawPixmap(r, pm, sr);
143 void QPreviewPaintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &p)
145 Q_D(QPreviewPaintEngine);
146 d->engine->drawTiledPixmap(r, pm, p);
149 bool QPreviewPaintEngine::newPage()
151 Q_D(QPreviewPaintEngine);
153 QPicture *page = new QPicture;
154 page->d_func()->in_memory_only = true;
155 QPainter *tmp_painter = new QPainter(page);
156 QPaintEngine *tmp_engine = tmp_painter->paintEngine();
158 // copy the painter state from the original painter
159 Q_ASSERT(painter()->d_func()->state && tmp_painter->d_func()->state);
160 *tmp_painter->d_func()->state = *painter()->d_func()->state;
162 // composition modes aren't supported on a QPrinter and yields a
163 // warning, so ignore it for now
164 tmp_engine->setDirty(DirtyFlags(AllDirty & ~DirtyCompositionMode));
165 tmp_engine->syncState();
168 d->painter = tmp_painter;
169 d->pages.append(page);
170 d->engine = tmp_engine;
174 bool QPreviewPaintEngine::abort()
176 Q_D(QPreviewPaintEngine);
178 qDeleteAll(d->pages);
179 d->state = QPrinter::Aborted;
184 QList<const QPicture *> QPreviewPaintEngine::pages()
186 Q_D(QPreviewPaintEngine);
190 void QPreviewPaintEngine::setProxyEngines(QPrintEngine *printEngine, QPaintEngine *paintEngine)
192 Q_D(QPreviewPaintEngine);
193 d->proxy_print_engine = printEngine;
194 d->proxy_paint_engine = paintEngine;
197 void QPreviewPaintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &value)
199 Q_D(QPreviewPaintEngine);
200 d->proxy_print_engine->setProperty(key, value);
203 QVariant QPreviewPaintEngine::property(PrintEnginePropertyKey key) const
205 Q_D(const QPreviewPaintEngine);
206 return d->proxy_print_engine->property(key);
209 int QPreviewPaintEngine::metric(QPaintDevice::PaintDeviceMetric id) const
211 Q_D(const QPreviewPaintEngine);
212 return d->proxy_print_engine->metric(id);
215 QPrinter::PrinterState QPreviewPaintEngine::printerState() const
217 Q_D(const QPreviewPaintEngine);