source: trunk/src/gui/painting/qprintengine_qws.cpp@ 746

Last change on this file since 746 was 651, checked in by Dmitry A. Kuminov, 16 years ago

trunk: Merged in qt 4.6.2 sources.

  • Property svn:eol-style set to native
File size: 23.4 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtGui module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include <private/qprintengine_qws_p.h>
43
44#ifndef QT_NO_PRINTER
45
46#include <private/qpaintengine_raster_p.h>
47#include <qimage.h>
48#include <qfile.h>
49#include <qdebug.h>
50#include <QCopChannel>
51
52QT_BEGIN_NAMESPACE
53
54#define MM(n) int((n * 720 + 127) / 254)
55#define IN(n) int(n * 72)
56
57extern QSizeF qt_paperSizeToQSizeF(QPrinter::PaperSize size);
58
59QtopiaPrintEngine::QtopiaPrintEngine(QPrinter::PrinterMode mode)
60 : QPaintEngine(*(new QtopiaPrintEnginePrivate( mode )))
61{
62 d_func()->initialize();
63}
64
65bool QtopiaPrintEngine::begin(QPaintDevice *)
66{
67 Q_D(QtopiaPrintEngine);
68 Q_ASSERT_X(d->printerState == QPrinter::Idle, "QtopiaPrintEngine", "printer already active");
69
70 // Create a new off-screen monochrome image to handle the drawing process.
71 QSize size = paperRect().size();
72 if ( d->pageImage )
73 delete d->pageImage;
74 d->pageImage = new QImage( size, QImage::Format_RGB32 );
75 if ( !(d->pageImage) )
76 return false;
77
78 // Recreate the paint engine on the new image.
79 delete d->_paintEngine;
80 d->_paintEngine = 0;
81 d->paintEngine()->state = state;
82
83 // Begin the paint process on the image.
84 if (!d->paintEngine()->begin(d->pageImage))
85 return false;
86
87 // Clear the first page to all-white.
88 clearPage();
89
90 // Clear the print buffer and output the image header.
91 d->buffer.clear();
92 d->writeG3FaxHeader();
93
94 // The print engine is currently active.
95 d->printerState = QPrinter::Active;
96 return true;
97}
98
99bool QtopiaPrintEngine::end()
100{
101 Q_D(QtopiaPrintEngine);
102
103 d->paintEngine()->end();
104
105 // Flush the last page.
106 flushPage();
107
108 // Output the fax data to a file (TODO: send to the print queuing daemon).
109 QString filename;
110 if ( !d->outputFileName.isEmpty() )
111 filename = QString::fromLocal8Bit(qgetenv("HOME").constData()) + QLatin1String("/Documents/") + d->outputFileName;
112 else
113 filename = QString::fromLocal8Bit(qgetenv("HOME").constData()) + QLatin1String("/tmp/qwsfax.tiff");
114
115 setProperty(QPrintEngine::PPK_OutputFileName, filename);
116 QFile file( filename );
117 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) ) {
118 qDebug( "Failed to open %s for printer output",
119 filename.toLatin1().constData() );
120 } else {
121 file.write( d->buffer.data() );
122 file.close();
123 }
124
125 // Free up the memory for the image buffer.
126 d->buffer.clear();
127
128 // Finalize the print job.
129 d->printerState = QPrinter::Idle;
130
131 // call qcop service
132 QMap<QString, QVariant> map;
133 for ( int x = 0; x <= QPrintEngine::PPK_Duplex; x++ )
134 map.insert( QString::number(x), property((QPrintEngine::PrintEnginePropertyKey)(x)));
135 QVariant variant(map);
136
137 QByteArray data;
138 QDataStream out(&data, QIODevice::WriteOnly);
139 out << variant;
140 QCopChannel::send(QLatin1String("QPE/Service/Print"), QLatin1String("print(QVariant)"), data);
141
142 return true;
143}
144
145QPaintEngine *QtopiaPrintEngine::paintEngine() const
146{
147 return const_cast<QtopiaPrintEnginePrivate *>(d_func())->paintEngine();
148}
149
150void QtopiaPrintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr)
151{
152 Q_D(QtopiaPrintEngine);
153 Q_ASSERT(d->printerState == QPrinter::Active);
154 d->paintEngine()->drawPixmap(r, pm, sr);
155}
156
157void QtopiaPrintEngine::drawTextItem(const QPointF &p, const QTextItem &ti)
158{
159 Q_D(QtopiaPrintEngine);
160 Q_ASSERT(d->printerState == QPrinter::Active);
161 d->paintEngine()->drawTextItem(p, ti);
162}
163
164void QtopiaPrintEngine::updateState(const QPaintEngineState &state)
165{
166 Q_D(QtopiaPrintEngine);
167 d->paintEngine()->updateState(state);
168}
169
170QRect QtopiaPrintEngine::paperRect() const
171{
172 QSizeF s = qt_paperSizeToQSizeF(d_func()->paperSize);
173 s.rwidth() = MM(s.width());
174 s.rheight() = MM(s.height());
175 int w = qRound(s.width()*d_func()->resolution/72.);
176 int h = qRound(s.height()*d_func()->resolution/72.);
177 if (d_func()->orientation == QPrinter::Portrait)
178 return QRect(0, 0, w, h);
179 else
180 return QRect(0, 0, h, w);
181}
182
183QRect QtopiaPrintEngine::pageRect() const
184{
185 QRect r = paperRect();
186 if (d_func()->fullPage)
187 return r;
188 // would be nice to get better margins than this.
189 return QRect(d_func()->resolution/3, d_func()->resolution/3, r.width()-2*d_func()->resolution/3, r.height()-2*d_func()->resolution/3);
190}
191
192bool QtopiaPrintEngine::newPage()
193{
194 flushPage();
195 clearPage();
196 ++(d_func()->pageNumber);
197 return true;
198}
199
200bool QtopiaPrintEngine::abort()
201{
202 return false;
203}
204
205QPrinter::PrinterState QtopiaPrintEngine::printerState() const
206{
207 return d_func()->printerState;
208}
209
210int QtopiaPrintEngine::metric(QPaintDevice::PaintDeviceMetric metricType) const
211{
212 int val;
213 QRect r = d_func()->fullPage ? paperRect() : pageRect();
214 switch (metricType) {
215 case QPaintDevice::PdmWidth:
216 val = r.width();
217 break;
218 case QPaintDevice::PdmHeight:
219 val = r.height();
220 break;
221 case QPaintDevice::PdmDpiX:
222 val = d_func()->resolution;
223 break;
224 case QPaintDevice::PdmDpiY:
225 val = d_func()->resolution;
226 break;
227 case QPaintDevice::PdmPhysicalDpiX:
228 case QPaintDevice::PdmPhysicalDpiY:
229 val = QT_QWS_PRINTER_DEFAULT_DPI;
230 break;
231 case QPaintDevice::PdmWidthMM:
232 val = qRound(r.width()*25.4/d_func()->resolution);
233 break;
234 case QPaintDevice::PdmHeightMM:
235 val = qRound(r.height()*25.4/d_func()->resolution);
236 break;
237 case QPaintDevice::PdmNumColors:
238 val = 2;
239 break;
240 case QPaintDevice::PdmDepth:
241 val = 1;
242 break;
243 default:
244 qWarning("QtopiaPrintEngine::metric: Invalid metric command");
245 return 0;
246 }
247 return val;