@@ -541,29 +541,54 @@ void QgsComposer::print( QPrinter &printer )
541
541
542
542
QApplication::setOverrideCursor ( Qt::BusyCursor );
543
543
544
- if ( mComposition ->printAsRaster () )
544
+ bool printAsRaster = mComposition ->printAsRaster ();
545
+
546
+ if ( printAsRaster )
545
547
{
546
548
// print out via QImage, code copied from on_mActionExportAsImage_activated
547
549
int width = ( int )( mComposition ->printResolution () * mComposition ->paperWidth () / 25.4 );
548
550
int height = ( int )( mComposition -> printResolution () * mComposition ->paperHeight () / 25.4 );
549
551
QImage image ( QSize ( width, height ), QImage::Format_ARGB32 );
550
- image.setDotsPerMeterX ( mComposition ->printResolution () / 25.4 * 1000 );
551
- image.setDotsPerMeterY ( mComposition ->printResolution () / 25.4 * 1000 );
552
- image.fill ( 0 );
553
- QPainter imagePainter ( &image );
554
- QRectF sourceArea ( 0 , 0 , mComposition ->paperWidth (), mComposition ->paperHeight () );
555
- QRectF targetArea ( 0 , 0 , width, height );
556
- mComposition ->render ( &imagePainter, targetArea, sourceArea );
557
- imagePainter.end ();
558
- p.drawImage ( targetArea, image, targetArea );
552
+ if ( !image.isNull () )
553
+ {
554
+ image.setDotsPerMeterX ( mComposition ->printResolution () / 25.4 * 1000 );
555
+ image.setDotsPerMeterY ( mComposition ->printResolution () / 25.4 * 1000 );
556
+ image.fill ( 0 );
557
+ QPainter imagePainter ( &image );
558
+ QRectF sourceArea ( 0 , 0 , mComposition ->paperWidth (), mComposition ->paperHeight () );
559
+ QRectF targetArea ( 0 , 0 , width, height );
560
+ mComposition ->render ( &imagePainter, targetArea, sourceArea );
561
+ imagePainter.end ();
562
+ p.drawImage ( targetArea, image, targetArea );
563
+ }
564
+ else
565
+ {
566
+ QApplication::restoreOverrideCursor ();
567
+ int answer = QMessageBox::warning ( 0 ,
568
+ tr ( " Image too large" ),
569
+ tr ( " Creation of image with %1x%2 pixels failed. Retry without 'Print As Raster'?" )
570
+ .arg ( width ).arg ( height ),
571
+ QMessageBox::Ok | QMessageBox::Cancel,
572
+ QMessageBox::Ok );
573
+ if ( answer == QMessageBox::Cancel )
574
+ {
575
+ mComposition ->setPlotStyle ( savedPlotStyle );
576
+ return ;
577
+ }
578
+
579
+ QApplication::setOverrideCursor ( Qt::BusyCursor );
580
+ printAsRaster = false ;
581
+ }
559
582
}
560
- else
583
+
584
+ if ( !printAsRaster )
561
585
{
562
586
// better in case of custom page size, but only possible with Qt>=4.4.0
563
587
QRectF paperRectMM = printer.pageRect ( QPrinter::Millimeter );
564
588
QRectF paperRectPixel = printer.pageRect ( QPrinter::DevicePixel );
565
589
mComposition ->render ( &p, paperRectPixel, paperRectMM );
566
590
}
591
+
567
592
mComposition ->setPlotStyle ( savedPlotStyle );
568
593
QApplication::restoreOverrideCursor ();
569
594
}
@@ -580,18 +605,19 @@ void QgsComposer::on_mActionExportAsImage_triggered()
580
605
int height = ( int )( mComposition -> printResolution () * mComposition ->paperHeight () / 25.4 );
581
606
582
607
int memuse = width * height * 3 / 1000000 ; // pixmap + image
583
- QgsDebugMsg ( QString ( " Image %1 x %2" ).arg ( width ).arg ( height ) );
608
+ QgsDebugMsg ( QString ( " Image %1x %2" ).arg ( width ).arg ( height ) );
584
609
QgsDebugMsg ( QString ( " memuse = %1" ).arg ( memuse ) );
585
610
586
- if ( memuse > 200 ) // cca 4500 x 4500
611
+ if ( memuse > 200 ) // about 4500x4500
587
612
{
588
613
int answer = QMessageBox::warning ( 0 , tr ( " Big image" ),
589
- tr ( " To create image %1 x %2 requires circa %3 MB of memory" )
614
+ tr ( " To create image %1x %2 requires about %3 MB of memory. Proceed? " )
590
615
.arg ( width ).arg ( height ).arg ( memuse ),
591
- QMessageBox::Ok, QMessageBox::Abort );
616
+ QMessageBox::Ok | QMessageBox::Cancel , QMessageBox::Ok );
592
617
593
618
raise ();
594
- if ( answer == QMessageBox::Abort ) return ;
619
+ if ( answer == QMessageBox::Cancel )
620
+ return ;
595
621
}
596
622
597
623
// Get file and format (stolen from qgisapp.cpp but modified significantely)
@@ -678,12 +704,22 @@ void QgsComposer::on_mActionExportAsImage_triggered()
678
704
myQSettings.setValue ( " /UI/lastSaveAsImageFormat" , myFilterMap[myFilterString] );
679
705
myQSettings.setValue ( " /UI/lastSaveAsImageFile" , myOutputFileNameQString );
680
706
681
- if ( myOutputFileNameQString == " " ) return ;
707
+ if ( myOutputFileNameQString == " " )
708
+ return ;
709
+
710
+ QImage image ( QSize ( width, height ), QImage::Format_ARGB32 );
711
+ if ( image.isNull () )
712
+ {
713
+ QMessageBox::warning ( 0 ,
714
+ tr ( " Image too big" ),
715
+ tr ( " Creation of image with %1x%2 pixels failed. Export aborted." )
716
+ .arg ( width ).arg ( height ),
717
+ QMessageBox::Ok );
718
+ return ;
719
+ }
682
720
683
721
mComposition ->setPlotStyle ( QgsComposition::Print );
684
722
mView ->setScene ( 0 );
685
-
686
- QImage image ( QSize ( width, height ), QImage::Format_ARGB32 );
687
723
image.setDotsPerMeterX ( mComposition ->printResolution () / 25.4 * 1000 );
688
724
image.setDotsPerMeterY ( mComposition ->printResolution () / 25.4 * 1000 );
689
725
image.fill ( 0 );
0 commit comments