@@ -86,14 +86,14 @@ void QgsRasterRenderer::startRasterRead( int bandNumber, QgsRasterViewPort* view
86
86
87
87
// split raster into small portions if necessary
88
88
RasterPartInfo pInfo;
89
- pInfo.nCols = viewPort->drawableAreaXDim * oversampling ;
90
- pInfo.nRows = viewPort->drawableAreaYDim * oversampling ;
89
+ pInfo.nCols = viewPort->drawableAreaXDim ;
90
+ pInfo.nRows = viewPort->drawableAreaYDim ;
91
91
92
92
// effective oversampling factors are different to global one because of rounding
93
- oversamplingX = ( double )pInfo.nCols / viewPort->drawableAreaXDim ;
94
- oversamplingY = ( double )pInfo.nRows / viewPort->drawableAreaYDim ;
93
+ oversamplingX = (( double )pInfo.nCols * oversampling ) / viewPort->drawableAreaXDim ;
94
+ oversamplingY = (( double )pInfo.nRows * oversampling ) / viewPort->drawableAreaYDim ;
95
95
96
- int totalMemoryUsage = pInfo.nCols * pInfo.nRows * mProvider ->dataTypeSize ( bandNumber );
96
+ int totalMemoryUsage = pInfo.nCols * oversamplingX * pInfo.nRows * oversamplingY * mProvider ->dataTypeSize ( bandNumber );
97
97
int parts = totalMemoryUsage / 100000000 + 1 ;
98
98
int nPartsPerDimension = sqrt ( parts );
99
99
pInfo.nColsPerPart = pInfo.nCols / nPartsPerDimension;
@@ -104,7 +104,8 @@ void QgsRasterRenderer::startRasterRead( int bandNumber, QgsRasterViewPort* view
104
104
mRasterPartInfos .insert ( bandNumber, pInfo );
105
105
}
106
106
107
- bool QgsRasterRenderer::readNextRasterPart ( int bandNumber, QgsRasterViewPort* viewPort, int & nCols, int & nRows, void ** rasterData, int & topLeftCol, int & topLeftRow )
107
+ bool QgsRasterRenderer::readNextRasterPart ( int bandNumber, double oversamplingX, double oversamplingY, QgsRasterViewPort* viewPort,
108
+ int & nCols, int & nRows, int & nColsRaster, int & nRowsRaster, void ** rasterData, int & topLeftCol, int & topLeftRow )
108
109
{
109
110
if ( !viewPort )
110
111
{
@@ -134,7 +135,6 @@ bool QgsRasterRenderer::readNextRasterPart( int bandNumber, QgsRasterViewPort* v
134
135
nCols = qMin ( pInfo.nColsPerPart , pInfo.nCols - pInfo.currentCol );
135
136
nRows = qMin ( pInfo.nRowsPerPart , pInfo.nRows - pInfo.currentRow );
136
137
int typeSize = mProvider ->dataTypeSize ( bandNumber ) / 8 ;
137
- pInfo.data = VSIMalloc ( typeSize * nCols * nRows );
138
138
139
139
// get subrectangle
140
140
QgsRectangle viewPortExtent = viewPort->mDrawnExtent ;
@@ -144,7 +144,10 @@ bool QgsRasterRenderer::readNextRasterPart( int bandNumber, QgsRasterViewPort* v
144
144
double ymax = viewPortExtent.yMaximum () - pInfo.currentRow / ( double )pInfo.nRows * viewPortExtent.height ();
145
145
QgsRectangle blockRect ( xmin, ymin, xmax, ymax );
146
146
147
- mProvider ->readBlock ( bandNumber, blockRect, nCols, nRows, viewPort->mSrcCRS , viewPort->mDestCRS , pInfo.data );
147
+ nColsRaster = nCols * oversamplingX;
148
+ nRowsRaster = nRows * oversamplingY;
149
+ pInfo.data = VSIMalloc ( typeSize * nColsRaster * nRowsRaster );
150
+ mProvider ->readBlock ( bandNumber, blockRect, nColsRaster, nRowsRaster, viewPort->mSrcCRS , viewPort->mDestCRS , pInfo.data );
148
151
*rasterData = pInfo.data ;
149
152
topLeftCol = pInfo.currentCol ;
150
153
topLeftRow = pInfo.currentRow ;
@@ -199,12 +202,12 @@ void QgsRasterRenderer::drawImage( QPainter* p, QgsRasterViewPort* viewPort, con
199
202
}
200
203
201
204
// top left position in device coords
202
- QPointF tlPoint = QPointF ( viewPort->topLeftPoint .x (), viewPort->topLeftPoint .y () );
205
+ QPoint tlPoint = QPoint ( viewPort->topLeftPoint .x () + topLeftCol , viewPort->topLeftPoint .y () + topLeftRow );
203
206
204
207
// resample and draw image
205
208
if (( mZoomedInResampler || mZoomedOutResampler ) && !doubleNear ( oversamplingX, 1.0 ) && !doubleNear ( oversamplingY, 1.0 ) )
206
209
{
207
- QImage dstImg ( nCols / oversamplingX + 1.0 , nRows / oversamplingY + 1.0 , QImage::Format_ARGB32_Premultiplied );
210
+ QImage dstImg ( nCols, nRows, QImage::Format_ARGB32_Premultiplied );
208
211
if ( mZoomedInResampler && oversamplingX < 1.0 )
209
212
{
210
213
mZoomedInResampler ->resample ( img, dstImg );
@@ -214,7 +217,6 @@ void QgsRasterRenderer::drawImage( QPainter* p, QgsRasterViewPort* viewPort, con
214
217
mZoomedOutResampler ->resample ( img, dstImg );
215
218
}
216
219
217
- tlPoint += QPointF ( topLeftCol / oversamplingX, topLeftRow / oversamplingY );
218
220
p->drawImage ( tlPoint, dstImg );
219
221
}
220
222
else // use original image
0 commit comments