Skip to content

Commit ca4f055

Browse files
author
homann
committed
Ported r6598 to trunk
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@6599 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 9eaca7f commit ca4f055

File tree

1 file changed

+95
-17
lines changed

1 file changed

+95
-17
lines changed

src/core/raster/qgsrasterlayer.cpp

Lines changed: 95 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,11 +1121,19 @@ bool QgsRasterLayer::draw(QPainter * theQPainter,
11211121

11221122
// /\/\/\ - added to handle zoomed-in rasters
11231123

1124+
if ((myRasterViewPort->drawableAreaXDimInt) > 4000 && (myRasterViewPort->drawableAreaYDimInt > 4000))
1125+
{
1126+
// We have scale one raster pixel to more than 4000 screen pixels. What's the point of showing this layer?
1127+
// Instead, we just stop displaying the layer. Prevents allocating the entire world of memory for showing
1128+
// The pixel in all its glory.
1129+
QgsDebugMsg("Too zoomed out! Raster will not display");
1130+
return TRUE;
1131+
}
11241132

11251133
// Provider mode: See if a provider key is specified, and if so use the provider instead
1126-
1134+
11271135
QgsDebugMsg("QgsRasterLayer::draw: Checking for provider key.");
1128-
1136+
11291137
if (!mProviderKey.isEmpty())
11301138
{
11311139
QgsDebugMsg("QgsRasterLayer::draw: Wanting a '" + mProviderKey + "' provider to draw this.");
@@ -1326,7 +1334,7 @@ void QgsRasterLayer::draw (QPainter * theQPainter,
13261334
break;
13271335

13281336
}
1329-
1337+
13301338
//see if debug info is wanted
13311339
if (showDebugOverlayFlag)
13321340
{
@@ -1344,6 +1352,12 @@ void QgsRasterLayer::drawSingleBandGray(QPainter * theQPainter, QgsRasterViewPor
13441352
GDALDataType myDataType = myGdalBand->GetRasterDataType();
13451353
void *myGdalScanData = readData ( myGdalBand, theRasterViewPort );
13461354

1355+
/* Check for out of memory error */
1356+
if (myGdalScanData == NULL)
1357+
{
1358+
return;
1359+
}
1360+
13471361
QImage myQImage = QImage(theRasterViewPort->drawableAreaXDimInt, theRasterViewPort->drawableAreaYDimInt, 32);
13481362
//myQImage.fill(0);
13491363
myQImage.setAlphaBuffer(true);
@@ -1432,6 +1446,8 @@ void QgsRasterLayer::drawSingleBandGray(QPainter * theQPainter, QgsRasterViewPor
14321446
myQImage.setPixel(myRowInt, myColumnInt, qRgba(myGrayValInt, myGrayValInt, myGrayValInt, mTransparencyLevel));
14331447
}
14341448
}
1449+
1450+
/* TODO: Should readData be freed here? */
14351451

14361452
//render any inline filters
14371453
filterLayer(&myQImage);
@@ -1487,6 +1503,12 @@ void QgsRasterLayer::drawSingleBandPseudoColor(QPainter * theQPainter,
14871503
GDALDataType myDataType = myGdalBand->GetRasterDataType();
14881504
void *myGdalScanData = readData ( myGdalBand, theRasterViewPort );
14891505

1506+
/* Check for out of memory error */
1507+
if (myGdalScanData == NULL)
1508+
{
1509+
return;
1510+
}
1511+
14901512
QImage myQImage = QImage(theRasterViewPort->drawableAreaXDimInt, theRasterViewPort->drawableAreaYDimInt, 32);
14911513
//myQImage.fill(0);
14921514
myQImage.setAlphaBuffer(true);
@@ -1704,6 +1726,13 @@ void QgsRasterLayer::drawPalettedSingleBandColor(QPainter * theQPainter, QgsRast
17041726
GDALRasterBand *myGdalBand = gdalDataset->GetRasterBand(theBandNoInt);
17051727
GDALDataType myDataType = myGdalBand->GetRasterDataType();
17061728
void *myGdalScanData = readData ( myGdalBand, theRasterViewPort );
1729+
1730+
/* Check for out of memory error */
1731+
if (myGdalScanData == NULL)
1732+
{
1733+
return;
1734+
}
1735+
17071736
QgsColorTable *myColorTable = colorTable ( theBandNoInt );
17081737

17091738
QImage myQImage = QImage(theRasterViewPort->drawableAreaXDimInt, theRasterViewPort->drawableAreaYDimInt, 32);
@@ -1734,6 +1763,9 @@ void QgsRasterLayer::drawPalettedSingleBandColor(QPainter * theQPainter, QgsRast
17341763
myQImage.setPixel(myRowInt, myColumnInt, qRgba(c1, c2, c3, mTransparencyLevel));
17351764
}
17361765
}
1766+
1767+
/* TODO: Should readData be freed here? */
1768+
17371769
//render any inline filters
17381770
filterLayer(&myQImage);
17391771

@@ -1794,6 +1826,13 @@ void QgsRasterLayer::drawPalettedSingleBandGray(QPainter * theQPainter, QgsRaste
17941826
GDALRasterBand *myGdalBand = gdalDataset->GetRasterBand(theBandNoInt);
17951827
GDALDataType myDataType = myGdalBand->GetRasterDataType();
17961828
void *myGdalScanData = readData ( myGdalBand, theRasterViewPort );
1829+
1830+
/* Check for out of memory error */
1831+
if (myGdalScanData == NULL)
1832+
{
1833+
return;
1834+
}
1835+
17971836
QgsColorTable *myColorTable = &(myRasterBandStats.colorTable);
17981837

17991838
QImage myQImage = QImage(theRasterViewPort->drawableAreaXDimInt, theRasterViewPort->drawableAreaYDimInt, 32);
@@ -1898,6 +1937,13 @@ void QgsRasterLayer::drawPalettedSingleBandPseudoColor(QPainter * theQPainter, Q
18981937
GDALRasterBand *myGdalBand = gdalDataset->GetRasterBand(theBandNoInt);
18991938
GDALDataType myDataType = myGdalBand->GetRasterDataType();
19001939
void *myGdalScanData = readData ( myGdalBand, theRasterViewPort );
1940+
1941+
/* Check for out of memory error */
1942+
if (myGdalScanData == NULL)
1943+
{
1944+
return;
1945+
}
1946+
19011947
QgsColorTable *myColorTable = &(myRasterBandStats.colorTable);
19021948

19031949
QImage myQImage = QImage(theRasterViewPort->drawableAreaXDimInt, theRasterViewPort->drawableAreaYDimInt, 32);
@@ -2134,6 +2180,13 @@ void QgsRasterLayer::drawPalettedMultiBandColor(QPainter * theQPainter, QgsRaste
21342180
GDALRasterBand *myGdalBand = gdalDataset->GetRasterBand(theBandNoInt);
21352181
GDALDataType myDataType = myGdalBand->GetRasterDataType();
21362182
void *myGdalScanData = readData ( myGdalBand, theRasterViewPort );
2183+
2184+
/* Check for out of memory error */
2185+
if (myGdalScanData == NULL)
2186+
{
2187+
return;
2188+
}
2189+
21372190
QgsColorTable *myColorTable = colorTable ( theBandNoInt );
21382191

21392192
QImage myQImage = QImage(theRasterViewPort->drawableAreaXDimInt, theRasterViewPort->drawableAreaYDimInt, 32);
@@ -2272,6 +2325,16 @@ void QgsRasterLayer::drawMultiBandColor(QPainter * theQPainter, QgsRasterViewPor
22722325
void *myGdalGreenData = readData ( myGdalGreenBand, theRasterViewPort );
22732326
void *myGdalBlueData = readData ( myGdalBlueBand, theRasterViewPort );
22742327

2328+
/* Check for out of memory error */
2329+
if (myGdalRedData == NULL || myGdalGreenData == NULL || myGdalBlueData == NULL)
2330+
{
2331+
// Safe to free NULL-pointer */
2332+
VSIFree(myGdalRedData);
2333+
VSIFree(myGdalGreenData);
2334+
VSIFree(myGdalBlueData);
2335+
return;
2336+
}
2337+
22752338
bool haveTransparencyBand(false);
22762339
GDALRasterBand *myGdalTransparentBand;
22772340
GDALDataType myTransparentType;
@@ -2284,6 +2347,14 @@ void QgsRasterLayer::drawMultiBandColor(QPainter * theQPainter, QgsRasterViewPor
22842347
myGdalTransparentBand = gdalDataset->GetRasterBand(myTransparentBandNoInt);
22852348
myTransparentType = myGdalTransparentBand->GetRasterDataType();
22862349
myGdalTransparentData = readData ( myGdalTransparentBand, theRasterViewPort );
2350+
if (myGdalTransparentData == NULL)
2351+
{
2352+
// Safe to free NULL-pointer */
2353+
VSIFree(myGdalRedData);
2354+
VSIFree(myGdalGreenData);
2355+
VSIFree(myGdalBlueData);
2356+
return;
2357+
}
22872358
}
22882359

22892360
QImage myQImage = QImage(theRasterViewPort->drawableAreaXDimInt, theRasterViewPort->drawableAreaYDimInt, 32);
@@ -4377,8 +4448,6 @@ void *QgsRasterLayer::readData ( GDALRasterBand *gdalBand, QgsRasterViewPort *vi
43774448
GDALDataType type = gdalBand->GetRasterDataType();
43784449
int size = GDALGetDataTypeSize ( type ) / 8;
43794450

4380-
void *data = CPLMalloc ( size * viewPort->drawableAreaXDimInt * viewPort->drawableAreaYDimInt );
4381-
43824451
QgsDebugMsg("QgsRasterLayer::readData: calling RasterIO with " +\
43834452
QString(", source NW corner: ") + QString::number(viewPort->rectXOffsetInt)+\
43844453
", " + QString::number(viewPort->rectYOffsetInt)+\
@@ -4387,20 +4456,29 @@ void *QgsRasterLayer::readData ( GDALRasterBand *gdalBand, QgsRasterViewPort *vi
43874456
", dest size: " + QString::number(viewPort->drawableAreaXDimInt)+\
43884457
", " + QString::number(viewPort->drawableAreaYDimInt));
43894458

4390-
CPLErr myErr = gdalBand->RasterIO ( GF_Read,
4391-
viewPort->rectXOffsetInt,
4392-
viewPort->rectYOffsetInt,
4393-
viewPort->clippedWidthInt,
4394-
viewPort->clippedHeightInt,
4395-
data,
4396-
viewPort->drawableAreaXDimInt,
4397-
viewPort->drawableAreaYDimInt,
4398-
type, 0, 0 );
4399-
if (myErr != CPLE_None)
4459+
void *data = VSIMalloc ( size * viewPort->drawableAreaXDimInt * viewPort->drawableAreaYDimInt );
4460+
4461+
/* Abort if out of memory */
4462+
if (data == NULL)
44004463
{
4401-
QgsLogger::warning("RaterIO error: " + QString(CPLGetLastErrorMsg()));
4464+
QgsDebugMsg("Layer " + this->name() + " couldn't allocate enough memory. Ignoring");
4465+
}
4466+
else
4467+
{
4468+
CPLErr myErr = gdalBand->RasterIO ( GF_Read,
4469+
viewPort->rectXOffsetInt,
4470+
viewPort->rectYOffsetInt,
4471+
viewPort->clippedWidthInt,
4472+
viewPort->clippedHeightInt,
4473+
data,
4474+
viewPort->drawableAreaXDimInt,
4475+
viewPort->drawableAreaYDimInt,
4476+
type, 0, 0 );
4477+
if (myErr != CPLE_None)
4478+
{
4479+
QgsLogger::warning("RaterIO error: " + QString(CPLGetLastErrorMsg()));
4480+
}
44024481
}
4403-
44044482
return data;
44054483
}
44064484

0 commit comments

Comments
 (0)