@@ -157,11 +157,13 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster( const Qgs
157157 QList<QgsRasterInterface::DataType> destDataTypeList;
158158 for ( int bandNo = 1 ; bandNo <= nBands; bandNo++ )
159159 {
160+ QgsRasterNuller *nuller = pipe->nuller ();
160161
161162 bool srcHasNoDataValue = srcProvider->srcHasNoDataValue ( bandNo );
162163 bool destHasNoDataValue = false ;
163164 double destNoDataValue;
164- QgsRasterInterface::DataType destDataType = srcProvider->srcDataType ( bandNo );
165+ // QgsRasterInterface::DataType destDataType = srcProvider->srcDataType( bandNo );
166+ QgsRasterInterface::DataType destDataType = srcProvider->dataType ( bandNo );
165167 if ( srcHasNoDataValue )
166168 {
167169 // If source has no data value, it is used by provider
@@ -170,13 +172,12 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster( const Qgs
170172 destNoDataValue = srcProvider->noDataValue ();
171173 destHasNoDataValue = true ;
172174 }
173- #if 0
174- else if ( )
175+ else if ( nuller && nuller->noData ().size () > 0 )
175176 {
176- // TODO: see if nuller has user defined aditional values, in that case use one as no data value
177-
177+ // Use one user defined no data value
178+ destNoDataValue = nuller->noData ().value ( 0 ).min ;
179+ destHasNoDataValue = true ;
178180 }
179- #endif
180181 else
181182 {
182183 // Verify if we realy need no data value, i.e.
@@ -212,6 +213,8 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster( const Qgs
212213 destHasNoDataValue = true ;
213214 }
214215 }
216+ if ( nuller ) nuller->setOutputNoData ( destNoDataValue );
217+
215218 QgsDebugMsg ( QString ( " bandNo = %1 destDataType = %2 destHasNoDataValue = %3 destNoDataValue = %4" ).arg ( bandNo ).arg ( destDataType ).arg ( destHasNoDataValue ).arg ( destNoDataValue ) );
216219 destDataTypeList.append ( destDataType );
217220 destHasNoDataValueList.append ( destHasNoDataValue );
@@ -282,11 +285,12 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster(
282285 int iterCols = 0 ;
283286 int iterRows = 0 ;
284287
285- int dataTypeSize = srcProvider->typeSize ( srcProvider->srcDataType ( 1 ) );
288+ int dataTypeSize = srcProvider->typeSize ( srcProvider->dataType ( 1 ) ) / 8 ;
286289 QList<void *> dataList;
287290 for ( int i = 1 ; i <= nBands; ++i )
288291 {
289292 iter->startRasterRead ( i, nCols, nRows, outputExtent );
293+ // TODO: no need to alloc memory, change to readBlock() returning the allocated block
290294 dataList.push_back ( VSIMalloc ( dataTypeSize * mMaxTileWidth * mMaxTileHeight ) );
291295 // TODO - fix segfault here when using tiles+vrt (reported by Etienne)
292296 destProvider->setNoDataValue ( i, destNoDataValueList.value ( i - 1 ) );
@@ -347,6 +351,24 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster(
347351 }
348352 }
349353
354+ // It may happen that internal data type (dataType) is wider than destDataType
355+ QList<void *> destDataList;
356+ for ( int i = 1 ; i <= nBands; ++i )
357+ {
358+ if ( srcProvider->dataType ( i ) == destDataType )
359+ {
360+ destDataList.push_back ( dataList[i-1 ] );
361+ }
362+ else
363+ {
364+ // TODO: this conversion should go to QgsRasterDataProvider::write with additional input data type param
365+ void *destData = QgsRasterInterface::convert ( dataList[i-1 ], srcProvider->srcDataType ( i ), destDataType, iterCols * iterRows );
366+ destDataList.push_back ( destData );
367+ CPLFree ( dataList[i-1 ] );
368+ }
369+ dataList[i-1 ] = 0 ;
370+ }
371+
350372 if ( mTiledMode ) // write to file
351373 {
352374 delete destProvider;
@@ -356,8 +378,8 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster(
356378 // write data to output file. todo: loop over the data list
357379 for ( int i = 1 ; i <= nBands; ++i )
358380 {
359- destProvider->write ( dataList [i - 1 ], i, iterCols, iterRows, 0 , 0 );
360- CPLFree ( dataList [i - 1 ] );
381+ destProvider->write ( destDataList [i - 1 ], i, iterCols, iterRows, 0 , 0 );
382+ CPLFree ( destDataList [i - 1 ] );
361383 addToVRT ( QString::number ( fileIndex ), i, iterCols, iterRows, iterLeft, iterTop );
362384 }
363385 }
@@ -366,8 +388,8 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster(
366388 // loop over data
367389 for ( int i = 1 ; i <= nBands; ++i )
368390 {
369- destProvider->write ( dataList [i - 1 ], i, iterCols, iterRows, iterLeft, iterTop );
370- CPLFree ( dataList [i - 1 ] );
391+ destProvider->write ( destDataList [i - 1 ], i, iterCols, iterRows, iterLeft, iterTop );
392+ CPLFree ( destDataList [i - 1 ] );
371393 }
372394 }
373395 ++fileIndex;
0 commit comments