Skip to content

Commit bc45b98

Browse files
committed
Implementation of sequential rendering to QImage
1 parent fd10fae commit bc45b98

File tree

6 files changed

+56
-49
lines changed

6 files changed

+56
-49
lines changed

src/app/maprenderertest.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "qgsmaplayerregistry.h"
1111

1212
#include "qgsmapcanvas.h"
13+
#include "qgsmapoverviewcanvas.h"
1314
#include "qgsmaptoolpan.h"
1415

1516
int main(int argc, char* argv[])
@@ -39,23 +40,30 @@ int main(int argc, char* argv[])
3940
QgsMapLayerRegistry::instance()->addMapLayer(layer2);
4041

4142
// open a window and do the rendering!
42-
/*TestWidget l(layer);
43+
TestWidget l(layer);
4344
l.resize(360,360);
44-
l.show();*/
45+
l.show();
4546

47+
/*
4648
QgsMapCanvas canvas;
4749
canvas.setCanvasColor(Qt::white);
4850
canvas.setExtent(layer->extent());
51+
canvas.show();
52+
53+
// test overview
54+
QgsMapOverviewCanvas overview( 0, &canvas );
55+
overview.resize(200,200);
56+
canvas.enableOverviewMode( &overview );
57+
overview.show();
4958
5059
QList<QgsMapCanvasLayer> layers;
51-
layers.append(QgsMapCanvasLayer(layer2));
60+
layers.append(QgsMapCanvasLayer(layer2, false, true));
5261
layers.append(QgsMapCanvasLayer(layer));
5362
canvas.setLayerSet(layers);
5463
5564
QgsMapTool* pan = new QgsMapToolPan(&canvas);
5665
canvas.setMapTool(pan);
57-
58-
canvas.show();
66+
*/
5967

6068
return app.exec();
6169
}

src/app/maprenderertest.h

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,17 @@ class TestWidget : public QLabel
1717
public:
1818
TestWidget(QgsMapLayer* layer)
1919
{
20-
//p = QPixmap(200,200);
21-
//p.fill(Qt::red);
22-
23-
i = QImage(size(), QImage::Format_ARGB32_Premultiplied);
24-
i.fill(Qt::gray);
25-
2620
job = 0;
2721

2822
// init renderer
2923
ms.setLayers(QStringList(layer->id()));
3024
ms.setExtent(layer->extent());
31-
ms.setOutputSize(i.size());
25+
ms.setOutputSize(size());
3226
ms.setOutputDpi(120);
3327

3428
if (ms.hasValidSettings())
3529
qDebug("map renderer settings valid");
3630

37-
setPixmap(QPixmap::fromImage(i));
38-
3931
connect(&timer, SIGNAL(timeout()), SLOT(onMapUpdateTimeout()));
4032
timer.setInterval(100);
4133
}
@@ -65,13 +57,11 @@ class TestWidget : public QLabel
6557
job = 0;
6658
}
6759

68-
i.fill(Qt::gray);
69-
70-
painter = new QPainter(&i);
71-
72-
job = new QgsMapRendererCustomPainterJob(ms, painter);
60+
job = new QgsMapRendererSequentialJob(ms);
7361
connect(job, SIGNAL(finished()), SLOT(f()));
7462

63+
job->start();
64+
7565
timer.start();
7666
}
7767
}
@@ -81,29 +71,23 @@ protected slots:
8171
{
8272
qDebug("finished!");
8373

84-
painter->end();
85-
delete painter;
86-
8774
timer.stop();
8875

89-
//update();
90-
91-
setPixmap(QPixmap::fromImage(i));
76+
if (job)
77+
setPixmap(QPixmap::fromImage( job->renderedImage() ));
9278
}
9379

9480
void onMapUpdateTimeout()
9581
{
9682
qDebug("update timer!");
9783

98-
setPixmap(QPixmap::fromImage(i));
84+
if (job)
85+
setPixmap(QPixmap::fromImage( job->renderedImage() ));
9986
}
10087

10188
protected:
102-
//QPixmap p;
103-
QImage i;
104-
QPainter* painter;
10589
QgsMapSettings ms;
106-
QgsMapRendererJob* job;
90+
QgsMapRendererQImageJob* job;
10791
QTimer timer;
10892
};
10993

src/core/qgsmaprendererjob.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,15 @@ QgsMapRendererSequentialJob::QgsMapRendererSequentialJob(const QgsMapSettings& s
2222
{
2323
}
2424

25+
QgsMapRendererSequentialJob::~QgsMapRendererSequentialJob()
26+
{
27+
delete mInternalJob;
28+
}
29+
2530

2631
void QgsMapRendererSequentialJob::start()
2732
{
33+
mImage = QImage(mSettings.outputSize(), QImage::Format_ARGB32_Premultiplied);
2834
mImage.fill(Qt::blue);
2935

3036
// 1. create an image where we will output all rendering
@@ -40,7 +46,8 @@ void QgsMapRendererSequentialJob::start()
4046

4147
void QgsMapRendererSequentialJob::cancel()
4248
{
43-
mInternalJob->cancel();
49+
if (mInternalJob)
50+
mInternalJob->cancel();
4451
}
4552

4653

@@ -58,6 +65,8 @@ void QgsMapRendererSequentialJob::internalFinished()
5865

5966
delete mInternalJob;
6067
mInternalJob = 0;
68+
69+
emit finished();
6170
}
6271

6372

@@ -72,6 +81,11 @@ QgsMapRendererCustomPainterJob::QgsMapRendererCustomPainterJob(const QgsMapSetti
7281
connect(&mFutureWatcher, SIGNAL(finished()), SLOT(futureFinished()));
7382
}
7483

84+
QgsMapRendererCustomPainterJob::~QgsMapRendererCustomPainterJob()
85+
{
86+
cancel();
87+
}
88+
7589
void QgsMapRendererCustomPainterJob::start()
7690
{
7791
qDebug("run!");
@@ -83,10 +97,13 @@ void QgsMapRendererCustomPainterJob::start()
8397

8498
void QgsMapRendererCustomPainterJob::cancel()
8599
{
86-
mRenderContext.setRenderingStopped(true);
100+
if (mFuture.isRunning())
101+
{
102+
mRenderContext.setRenderingStopped(true);
87103

88-
mFutureWatcher.waitForFinished();
89-
qApp->processEvents( QEventLoop::ExcludeUserInputEvents | QEventLoop::ExcludeSocketNotifiers ); // TODO: necessary?
104+
mFutureWatcher.waitForFinished();
105+
qApp->processEvents( QEventLoop::ExcludeUserInputEvents | QEventLoop::ExcludeSocketNotifiers ); // TODO: necessary?
106+
}
90107
}
91108

92109

src/core/qgsmaprendererjob.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class QgsMapRendererSequentialJob : public QgsMapRendererQImageJob
7878
Q_OBJECT
7979
public:
8080
QgsMapRendererSequentialJob(const QgsMapSettings& settings);
81+
~QgsMapRendererSequentialJob();
8182

8283
virtual void start();
8384
virtual void cancel();
@@ -115,6 +116,7 @@ class QgsMapRendererCustomPainterJob : public QgsMapRendererJob
115116
Q_OBJECT
116117
public:
117118
QgsMapRendererCustomPainterJob(const QgsMapSettings& settings, QPainter* painter);
119+
~QgsMapRendererCustomPainterJob();
118120

119121
virtual void start();
120122
virtual void cancel();

src/gui/qgsmapcanvas.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -328,9 +328,9 @@ void QgsMapCanvas::enableOverviewMode( QgsMapOverviewCanvas* overview )
328328
if ( mMapOverview )
329329
{
330330
// disconnect old map overview if exists
331-
disconnect( mMapRenderer, SIGNAL( hasCrsTransformEnabled( bool ) ),
331+
disconnect( this, SIGNAL( hasCrsTransformEnabled( bool ) ),
332332
mMapOverview, SLOT( hasCrsTransformEnabled( bool ) ) );
333-
disconnect( mMapRenderer, SIGNAL( destinationSrsChanged() ),
333+
disconnect( this, SIGNAL( destinationSrsChanged() ),
334334
mMapOverview, SLOT( destinationSrsChanged() ) );
335335

336336
// map overview is not owned by map canvas so don't delete it...
@@ -341,9 +341,9 @@ void QgsMapCanvas::enableOverviewMode( QgsMapOverviewCanvas* overview )
341341
if ( overview )
342342
{
343343
// connect to the map render to copy its projection settings
344-
connect( mMapRenderer, SIGNAL( hasCrsTransformEnabled( bool ) ),
344+
connect( this, SIGNAL( hasCrsTransformEnabled( bool ) ),
345345
overview, SLOT( hasCrsTransformEnabled( bool ) ) );
346-
connect( mMapRenderer, SIGNAL( destinationSrsChanged() ),
346+
connect( this, SIGNAL( destinationSrsChanged() ),
347347
overview, SLOT( destinationSrsChanged() ) );
348348
}
349349
}

src/gui/qgsmapoverviewcanvas.cpp

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ void QgsMapOverviewCanvas::paintEvent( QPaintEvent* pe )
107107

108108
void QgsMapOverviewCanvas::drawExtentRect()
109109
{
110-
if ( !mMapCanvas || !mMapRenderer ) return;
110+
if ( !mMapCanvas ) return;
111111

112112
const QgsRectangle& extent = mMapCanvas->extent();
113113

@@ -294,22 +294,18 @@ void QgsMapOverviewCanvas::setBackgroundColor( const QColor& color )
294294
void QgsMapOverviewCanvas::setLayerSet( const QStringList& layerSet )
295295
{
296296
QgsDebugMsg( "layerSet: " + layerSet.join( ", " ) );
297-
if ( !mMapRenderer ) return;
298297
mMapRenderer->setLayerSet( layerSet );
299-
mMapRenderer->updateFullExtent();
300298
updateFullExtent();
301299
}
302300

303301
void QgsMapOverviewCanvas::updateFullExtent()
304302
{
305-
if ( !mMapRenderer ) return;
306303
QgsRectangle rect;
307-
if ( !mMapRenderer->layerSet().isEmpty() )
308-
{
309-
rect = mMapRenderer->fullExtent();
310-
// expand a bit to keep features on margin
311-
rect.scale( 1.1 );
312-
}
304+
305+
rect = mMapCanvas->fullExtent();
306+
// expand a bit to keep features on margin
307+
rect.scale( 1.1 );
308+
313309
mMapRenderer->setExtent( rect );
314310
drawExtentRect();
315311
}
@@ -321,7 +317,7 @@ void QgsMapOverviewCanvas::hasCrsTransformEnabled( bool flag )
321317

322318
void QgsMapOverviewCanvas::destinationSrsChanged()
323319
{
324-
const QgsCoordinateReferenceSystem& srs = mMapCanvas->mapRenderer()->destinationCrs();
320+
const QgsCoordinateReferenceSystem& srs = mMapCanvas->mapSettings().destinationCrs();
325321
mMapRenderer->setDestinationCrs( srs );
326322
}
327323

0 commit comments

Comments
 (0)