40
40
#include " qgsbench.h"
41
41
#include " qgslogger.h"
42
42
#include " qgsmaplayerregistry.h"
43
+ #include " qgsmaprendererjob.h"
43
44
#include " qgsproject.h"
44
- #include " qgspallabeling.h"
45
+
46
+ const char *pre[] = { " user" , " sys" , " total" , " wall" };
45
47
46
48
#ifdef Q_OS_WIN
47
49
// slightly adapted from http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/port/getrusage.c?rev=1.18;content-type=text%2Fplain
@@ -117,14 +119,17 @@ int getrusage( int who, struct rusage * rusage )
117
119
#endif
118
120
119
121
QgsBench::QgsBench ( int theWidth, int theHeight, int theIterations )
120
- : QObject(), mWidth( theWidth ), mHeight( theHeight ), mIterations( theIterations ), mSetExtent( false )
122
+ : QObject()
123
+ , mWidth( theWidth )
124
+ , mHeight( theHeight )
125
+ , mIterations( theIterations )
126
+ , mSetExtent( false )
127
+ , mParallel( false )
121
128
{
122
129
QgsDebugMsg ( " entered" );
123
130
124
131
QgsDebugMsg ( QString ( " mIterations = %1" ).arg ( mIterations ) );
125
132
126
- mMapRenderer = new QgsMapRenderer;
127
-
128
133
connect ( QgsProject::instance (), SIGNAL ( readProject ( const QDomDocument & ) ),
129
134
this , SLOT ( readProject ( const QDomDocument & ) ) );
130
135
}
@@ -153,7 +158,7 @@ void QgsBench::readProject( const QDomDocument &doc )
153
158
if ( nodes.count () )
154
159
{
155
160
QDomNode node = nodes.item ( 0 );
156
- mMapRenderer -> readXML ( node );
161
+ mMapSettings . readXML ( node );
157
162
}
158
163
else
159
164
{
@@ -171,17 +176,17 @@ void QgsBench::render()
171
176
{
172
177
QgsDebugMsg ( " entered" );
173
178
174
- QgsDebugMsg ( " extent: " + mMapRenderer -> extent ().toString () );
179
+ QgsDebugMsg ( " extent: " + mMapSettings . extent ().toString () );
175
180
176
181
QMap<QString, QgsMapLayer*> layersMap = QgsMapLayerRegistry::instance ()->mapLayers ();
177
182
178
183
QStringList layers ( layersMap.keys () );
179
184
180
- mMapRenderer -> setLayerSet ( layers );
185
+ mMapSettings . setLayers ( layers );
181
186
182
187
if ( mSetExtent )
183
188
{
184
- mMapRenderer -> setExtent ( mExtent );
189
+ mMapSettings . setExtent ( mExtent );
185
190
}
186
191
187
192
// Maybe in future
@@ -190,27 +195,34 @@ void QgsBench::render()
190
195
// mMapRenderer->setDestinationCrs( outputCRS );
191
196
192
197
// TODO: this should be probably set according to project
193
- mMapRenderer -> setProjectionsEnabled ( true );
198
+ mMapSettings . setCrsTransformEnabled ( true );
194
199
195
200
// Enable labeling
196
- mMapRenderer ->setLabelingEngine ( new QgsPalLabeling () );
197
-
198
- mImage = new QImage ( mWidth , mHeight , QImage::Format_ARGB32_Premultiplied );
199
- mImage ->fill ( 0 );
201
+ mMapSettings .setFlag ( QgsMapSettings::DrawLabeling );
200
202
201
- mMapRenderer -> setOutputSize ( QSize ( mWidth , mHeight ), mImage -> logicalDpiX ( ) );
203
+ mMapSettings . setOutputSize ( QSize ( mWidth , mHeight ) );
202
204
203
- QPainter painter ( mImage );
204
-
205
- painter.setRenderHints ( mRendererHints );
205
+ // TODO: do we need the other QPainter flags?
206
+ mMapSettings .setFlag ( QgsMapSettings::Antialiasing, mRendererHints .testFlag ( QPainter::Antialiasing ) );
206
207
207
208
for ( int i = 0 ; i < mIterations ; i++ )
208
209
{
210
+ QgsMapRendererQImageJob* job;
211
+ if ( mParallel )
212
+ job = new QgsMapRendererParallelJob ( mMapSettings );
213
+ else
214
+ job = new QgsMapRendererSequentialJob ( mMapSettings );
215
+
209
216
start ();
210
- mMapRenderer ->render ( &painter );
217
+ job->start ();
218
+ job->waitForFinished ();
211
219
elapsed ();
220
+
221
+ mImage = job->renderedImage ();
222
+ delete job;
212
223
}
213
224
225
+
214
226
mLogMap .insert ( " iterations" , mTimes .size () );
215
227
mLogMap .insert ( " revision" , QGSVERSION );
216
228
@@ -247,8 +259,6 @@ void QgsBench::render()
247
259
stdev[t] = sqrt ( stdev[t] / mTimes .size () );
248
260
}
249
261
250
- const char *pre[] = { " user" , " sys" , " total" , " wall" };
251
-
252
262
QMap<QString, QVariant> map;
253
263
254
264
map.insert ( " min" , min[t] );
@@ -265,19 +275,30 @@ void QgsBench::render()
265
275
void QgsBench::saveSnapsot ( const QString & fileName )
266
276
{
267
277
// If format is 0, QImage will attempt to guess the format by looking at fileName's suffix.
268
- mImage -> save ( fileName );
278
+ mImage . save ( fileName );
269
279
}
270
280
271
- void QgsBench::printLog ()
281
+ void QgsBench::printLog ( const QString& printTime )
272
282
{
273
283
std::cout << " iterations: " << mLogMap [" iterations" ].toString ().toAscii ().constData () << std::endl;
274
284
285
+ bool validPrintTime = false ;
286
+ for ( int x = 0 ; x < 4 ; ++x )
287
+ if ( printTime == pre[x] )
288
+ validPrintTime = true ;
289
+
290
+ if ( !validPrintTime )
291
+ {
292
+ std::cout << " invalid --print option: " << printTime.toAscii ().data () << std::endl;
293
+ return ;
294
+ }
295
+
275
296
QMap<QString, QVariant> timesMap = mLogMap [" times" ].toMap ();
276
- QMap<QString, QVariant> totalMap = timesMap[" total " ].toMap ();
297
+ QMap<QString, QVariant> totalMap = timesMap[printTime ].toMap ();
277
298
QMap<QString, QVariant>::iterator i = totalMap.begin ();
278
299
while ( i != totalMap.end () )
279
300
{
280
- QString s = " total_ " + i.key () + " : " + i.value ().toString ();
301
+ QString s = printTime + " _ " + i.key () + " : " + i.value ().toString ();
281
302
std::cout << s.toAscii ().constData () << std::endl;
282
303
++i;
283
304
}
0 commit comments