@@ -227,7 +227,7 @@ void QgsMapRendererCustomPainterJob::cancel()
227
227
qDebug (" QPAINTER cancelling" );
228
228
disconnect (&mFutureWatcher , SIGNAL (finished ()), this , SLOT (futureFinished ()));
229
229
230
- mRenderContext .setRenderingStopped (true );
230
+ mLabelingRenderContext .setRenderingStopped (true );
231
231
for ( LayerRenderJobs::iterator it = mLayerJobs .begin (); it != mLayerJobs .end (); ++it )
232
232
{
233
233
it->context .setRenderingStopped ( true );
@@ -322,32 +322,45 @@ void QgsMapRendererCustomPainterJob::doRender()
322
322
323
323
QgsDebugMsg ( " Done rendering map layers" );
324
324
325
+ if ( mSettings .testFlag ( QgsMapSettings::DrawLabeling ) && !mLabelingRenderContext .renderingStopped () )
326
+ drawLabeling ( mSettings , mLabelingRenderContext , mLabelingEngine , mPainter );
327
+
328
+ QgsDebugMsg ( " Rendering completed in (seconds): " + QString ( " %1" ).arg ( renderTime.elapsed () / 1000.0 ) );
329
+ }
330
+
331
+
332
+ void QgsMapRendererJob::drawLabeling ( const QgsMapSettings& settings, QgsRenderContext& renderContext, QgsPalLabeling* labelingEngine, QPainter* painter )
333
+ {
334
+ qDebug (" Draw labeling start" );
335
+
336
+ QTime t;
337
+ t.start ();
338
+
325
339
// Reset the composition mode before rendering the labels
326
- mPainter ->setCompositionMode ( QPainter::CompositionMode_SourceOver );
340
+ painter ->setCompositionMode ( QPainter::CompositionMode_SourceOver );
327
341
328
- mRenderContext = QgsRenderContext::fromMapSettings ( mSettings );
329
- mRenderContext .setPainter ( mPainter );
330
- mRenderContext .setLabelingEngine ( mLabelingEngine );
342
+ // TODO: this is not ideal - we could override rendering stopped flag that has been set in meanwhile
343
+ renderContext = QgsRenderContext::fromMapSettings ( settings );
344
+ renderContext.setPainter ( painter );
345
+ renderContext.setLabelingEngine ( labelingEngine );
331
346
332
347
// old labeling - to be removed at some point...
333
- drawOldLabeling ();
348
+ drawOldLabeling ( settings, renderContext );
334
349
335
- drawNewLabeling ();
350
+ drawNewLabeling ( settings, renderContext, labelingEngine );
336
351
337
- QgsDebugMsg ( " Rendering completed in (seconds): " + QString ( " %1 " ). arg ( renderTime. elapsed () / 1000.0 ) );
352
+ qDebug ( " Draw labeling took (seconds): %f " , t. elapsed () / 1000 .);
338
353
}
339
354
340
355
341
- void QgsMapRendererCustomPainterJob ::drawOldLabeling ()
356
+ void QgsMapRendererJob ::drawOldLabeling ( const QgsMapSettings& settings, QgsRenderContext& renderContext )
342
357
{
343
- if ( mSettings .testFlag ( QgsMapSettings::DrawLabeling ) )
344
- {
345
358
// render all labels for vector layers in the stack, starting at the base
346
- QListIterator<QString> li ( mSettings .layers () );
359
+ QListIterator<QString> li ( settings .layers () );
347
360
li.toBack ();
348
361
while ( li.hasPrevious () )
349
362
{
350
- if ( mRenderContext .renderingStopped () )
363
+ if ( renderContext .renderingStopped () )
351
364
{
352
365
break ;
353
366
}
@@ -361,43 +374,42 @@ void QgsMapRendererCustomPainterJob::drawOldLabeling()
361
374
362
375
// only make labels if the layer is visible
363
376
// after scale dep viewing settings are checked
364
- if ( ml->hasScaleBasedVisibility () && ( mSettings .scale () < ml->minimumScale () || mSettings .scale () > ml->maximumScale () ) )
377
+ if ( ml->hasScaleBasedVisibility () && ( settings .scale () < ml->minimumScale () || settings .scale () > ml->maximumScale () ) )
365
378
continue ;
366
379
367
380
bool split = false ;
368
381
const QgsCoordinateTransform* ct = 0 ;
369
- QgsRectangle r1 = mSettings .visibleExtent (), r2;
382
+ QgsRectangle r1 = settings .visibleExtent (), r2;
370
383
371
- if ( mSettings .hasCrsTransformEnabled () )
384
+ if ( settings .hasCrsTransformEnabled () )
372
385
{
373
- ct = QgsCoordinateTransformCache::instance ()->transform ( ml->crs ().authid (), mSettings .destinationCrs ().authid () );
386
+ ct = QgsCoordinateTransformCache::instance ()->transform ( ml->crs ().authid (), settings .destinationCrs ().authid () );
374
387
split = reprojectToLayerExtent ( ct, ml->crs ().geographicFlag (), r1, r2 );
375
388
}
376
389
377
- mRenderContext .setCoordinateTransform ( ct );
378
- mRenderContext .setExtent ( r1 );
390
+ renderContext .setCoordinateTransform ( ct );
391
+ renderContext .setExtent ( r1 );
379
392
380
- ml->drawLabels ( mRenderContext );
393
+ ml->drawLabels ( renderContext );
381
394
if ( split )
382
395
{
383
- mRenderContext .setExtent ( r2 );
384
- ml->drawLabels ( mRenderContext );
396
+ renderContext .setExtent ( r2 );
397
+ ml->drawLabels ( renderContext );
385
398
}
386
399
}
387
- }
388
400
}
389
401
390
402
391
- void QgsMapRendererCustomPainterJob ::drawNewLabeling ()
403
+ void QgsMapRendererJob ::drawNewLabeling ( const QgsMapSettings& settings, QgsRenderContext& renderContext, QgsPalLabeling* labelingEngine )
392
404
{
393
- if ( mLabelingEngine && !mRenderContext .renderingStopped () )
405
+ if ( labelingEngine && !renderContext .renderingStopped () )
394
406
{
395
407
// set correct extent
396
- mRenderContext .setExtent ( mSettings .visibleExtent () );
397
- mRenderContext .setCoordinateTransform ( NULL );
408
+ renderContext .setExtent ( settings .visibleExtent () );
409
+ renderContext .setCoordinateTransform ( NULL );
398
410
399
- mLabelingEngine ->drawLabeling ( mRenderContext );
400
- mLabelingEngine ->exit ();
411
+ labelingEngine ->drawLabeling ( renderContext );
412
+ labelingEngine ->exit ();
401
413
}
402
414
}
403
415
@@ -611,6 +623,8 @@ void QgsMapRendererJob::cleanupJobs( LayerRenderJobs& jobs )
611
623
612
624
QgsMapRendererParallelJob::QgsMapRendererParallelJob (const QgsMapSettings& settings)
613
625
: QgsMapRendererQImageJob( settings )
626
+ , mStatus( Idle )
627
+ , mLabelingEngine( 0 )
614
628
{
615
629
}
616
630
@@ -620,16 +634,30 @@ QgsMapRendererParallelJob::~QgsMapRendererParallelJob()
620
634
{
621
635
cancel ();
622
636
}
637
+
638
+ delete mLabelingEngine ;
639
+ mLabelingEngine = 0 ;
623
640
}
624
641
625
642
void QgsMapRendererParallelJob::start ()
626
643
{
627
644
if ( isActive () )
628
645
return ;
629
646
630
- // TODO: create labeling engine
647
+ mStatus = RenderingLayers;
631
648
632
- mLayerJobs = prepareJobs ( 0 , 0 );
649
+ delete mLabelingEngine ;
650
+ mLabelingEngine = 0 ;
651
+
652
+ if ( mSettings .testFlag ( QgsMapSettings::DrawLabeling ) )
653
+ {
654
+ mLabelingEngine = new QgsPalLabeling;
655
+ mLabelingEngine ->loadEngineSettings ();
656
+ mLabelingEngine ->init ( mSettings );
657
+ }
658
+
659
+
660
+ mLayerJobs = prepareJobs ( 0 , mLabelingEngine );
633
661
634
662
// start async job
635
663
@@ -644,62 +672,122 @@ void QgsMapRendererParallelJob::cancel()
644
672
if ( !isActive () )
645
673
return ;
646
674
647
- disconnect (& mFutureWatcher , SIGNAL ( finished ()), this , SLOT ( renderLayersFinished ()) );
675
+ qDebug ( " PARALLEL cancel at status %d " , mStatus );
648
676
677
+ mLabelingRenderContext .setRenderingStopped ( true );
649
678
for ( LayerRenderJobs::iterator it = mLayerJobs .begin (); it != mLayerJobs .end (); ++it )
650
679
{
651
680
it->context .setRenderingStopped ( true );
652
681
}
653
682
654
- mFutureWatcher .waitForFinished ();
683
+ if ( mStatus == RenderingLayers )
684
+ {
685
+ disconnect (&mFutureWatcher , SIGNAL (finished ()), this , SLOT (renderLayersFinished ()));
655
686
656
- renderLayersFinished ();
687
+ mFutureWatcher .waitForFinished ();
688
+
689
+ renderLayersFinished ();
690
+ }
691
+
692
+ if ( mStatus == RenderingLabels )
693
+ {
694
+ disconnect (&mLabelingFutureWatcher , SIGNAL (finished ()), this , SLOT (renderingFinished ()));
695
+
696
+ mLabelingFutureWatcher .waitForFinished ();
697
+
698
+ renderingFinished ();
699
+ }
700
+
701
+ Q_ASSERT ( mStatus == Idle );
657
702
}
658
703
659
704
void QgsMapRendererParallelJob::waitForFinished ()
660
705
{
661
706
if ( !isActive () )
662
707
return ;
663
708
664
- disconnect (&mFutureWatcher , SIGNAL (finished ()), this , SLOT (renderLayersFinished ()));
709
+ if ( mStatus == RenderingLayers )
710
+ {
711
+ disconnect (&mFutureWatcher , SIGNAL (finished ()), this , SLOT (renderLayersFinished ()));
712
+
713
+ QTime t;
714
+ t.start ();
665
715
666
- QTime t;
667
- t.start ();
716
+ mFutureWatcher .waitForFinished ();
668
717
669
- mFutureWatcher . waitForFinished ( );
718
+ qDebug ( " waitForFinished (1): %f ms " , t. elapsed () / 1000.0 );
670
719
671
- qDebug (" waitForFinished: %f ms" , t.elapsed () / 1000.0 );
720
+ renderLayersFinished ();
721
+ }
722
+
723
+ if ( mStatus == RenderingLabels )
724
+ {
725
+ disconnect (&mLabelingFutureWatcher , SIGNAL (finished ()), this , SLOT (renderingFinished ()));
672
726
673
- renderLayersFinished ();
727
+ QTime t;
728
+ t.start ();
729
+
730
+ mLabelingFutureWatcher .waitForFinished ();
731
+
732
+ qDebug (" waitForFinished (2): %f ms" , t.elapsed () / 1000.0 );
733
+
734
+ renderingFinished ();
735
+ }
736
+
737
+ Q_ASSERT ( mStatus == Idle );
674
738
}
675
739
676
740
bool QgsMapRendererParallelJob::isActive () const
677
741
{
678
- return mFutureWatcher . isRunning () ;
742
+ return mStatus != Idle ;
679
743
}
680
744
681
745
QgsLabelingResults* QgsMapRendererParallelJob::takeLabelingResults ()
682
746
{
683
- return 0 ;
747
+ return mLabelingEngine ? mLabelingEngine -> takeResults () : 0 ;
684
748
}
685
749
686
750
QImage QgsMapRendererParallelJob::renderedImage ()
687
751
{
688
- if ( isActive () )
752
+ if ( mStatus == RenderingLayers )
689
753
return composeImage ();
690
754
else
691
- return mFinalImage ;
755
+ return mFinalImage ; // when rendering labels or idle
692
756
}
693
757
694
758
void QgsMapRendererParallelJob::renderLayersFinished ()
695
759
{
696
- // TODO: now start rendering of labeling!
760
+ Q_ASSERT ( mStatus == RenderingLayers );
697
761
698
762
// compose final image
699
763
mFinalImage = composeImage ();
700
764
701
765
cleanupJobs ( mLayerJobs );
702
766
767
+ qDebug (" PARALLEL layers finished" );
768
+
769
+ if ( mSettings .testFlag ( QgsMapSettings::DrawLabeling ) && !mLabelingRenderContext .renderingStopped () )
770
+ {
771
+ mStatus = RenderingLabels;
772
+
773
+ connect (&mLabelingFutureWatcher , SIGNAL (finished ()), this , SLOT (renderingFinished ()));
774
+
775
+ // now start rendering of labeling!
776
+ mLabelingFuture = QtConcurrent::run ( renderLabelsStatic, this );
777
+ mLabelingFutureWatcher .setFuture (mLabelingFuture );
778
+ }
779
+ else
780
+ {
781
+ renderingFinished ();
782
+ }
783
+ }
784
+
785
+ void QgsMapRendererParallelJob::renderingFinished ()
786
+ {
787
+ qDebug (" PARALLEL finished" );
788
+
789
+ mStatus = Idle;
790
+
703
791
emit finished ();
704
792
}
705
793
@@ -716,6 +804,17 @@ void QgsMapRendererParallelJob::renderLayerStatic(LayerRenderJob& job)
716
804
QgsDebugMsg ( QString (" job %1 end [%2 ms]" ).arg ( (ulong) &job, 0 , 16 ).arg ( tt ) );
717
805
}
718
806
807
+
808
+ void QgsMapRendererParallelJob::renderLabelsStatic (QgsMapRendererParallelJob* self)
809
+ {
810
+ QPainter painter ( &self->mFinalImage );
811
+
812
+ drawLabeling ( self->mSettings , self->mLabelingRenderContext , self->mLabelingEngine , &painter );
813
+
814
+ painter.end ();
815
+ }
816
+
817
+
719
818
QImage QgsMapRendererParallelJob::composeImage ()
720
819
{
721
820
QImage image ( mSettings .outputSize (), QImage::Format_ARGB32_Premultiplied );
0 commit comments