Changeset 13757
- Timestamp:
- 02/11/08 12:07:39 (5 months ago)
- Files:
-
- trunk/gdal/frmts/idrisi/IdrisiDataset.cpp (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/gdal/frmts/idrisi/IdrisiDataset.cpp
r13500 r13757 270 270 char **papszCategories; 271 271 char *pszUnitType; 272 bool bDirty;273 272 274 273 CPLErr GeoReference2Wkt( const char *pszRefSystem, … … 279 278 char **pszRefSystem, 280 279 char **pszRefUnit ); 281 282 void CalculateMinMax();283 280 284 281 protected: … … 348 345 virtual const GDALRasterAttributeTable *GetDefaultRAT(); 349 346 virtual CPLErr SetDefaultRAT( const GDALRasterAttributeTable * ); 347 348 float dfMaximum; 349 float dfMinimum; 350 bool bFirstVal; 350 351 }; 351 352 … … 368 369 papszCategories = NULL; 369 370 pszUnitType = NULL; 370 bDirty = false;371 371 372 372 adfGeoTransform[0] = 0.0; … … 388 388 if( papszRDC != NULL ) 389 389 { 390 if( eAccess == GA_Update )390 if( eAccess == GA_Update ) 391 391 { 392 if( bDirty ) 393 { 394 CalculateMinMax(); 395 } 396 CSLSetNameValueSeparator( papszRDC, ": " ); 392 int i; 393 394 for( i = 0; i < nBands; i++ ) 395 { 396 IdrisiRasterBand *poBand = (IdrisiRasterBand*) GetRasterBand( i + 1 ); 397 poBand->SetStatistics( poBand->dfMinimum, poBand->dfMaximum, 0.0, 0.0 ); 398 } 399 400 CSLSetNameValueSeparator( papszRDC, ": " ); 397 401 CSLSave( papszRDC, pszDocFilename ); 402 398 403 #ifndef WIN32 399 404 FormatCRLF( pszDocFilename ); … … 415 420 if( fp != NULL ) 416 421 VSIFCloseL( fp ); 417 }418 419 /************************************************************************/420 /* CalculateMinMax() */421 /************************************************************************/422 423 void IdrisiDataset::CalculateMinMax()424 {425 int iBand;426 double dfMin = 0.0;427 double dfMax = 0.0;428 429 for( iBand = 0; iBand < nBands; iBand++ )430 {431 IdrisiRasterBand *poBand = (IdrisiRasterBand*) GetRasterBand( iBand + 1 );432 poBand->ComputeStatistics( true, &dfMin, &dfMax, NULL, NULL, NULL, NULL );433 poBand->SetStatistics( dfMin, dfMax, 0.0, 0.0 );434 }435 422 } 436 423 … … 1027 1014 poDS->GetRasterBand( 1 )->GetBlockSize( &nBlockXSize, &nBlockYSize ); 1028 1015 1016 void *pData = VSIMalloc3( nBlockXSize, nBlockYSize, 1017 GDALGetDataTypeSize( eType ) / 8 ); 1018 1019 if( pData == NULL ) 1020 { 1021 CPLError( CE_Failure, CPLE_OutOfMemory, 1022 "IdrisiRasterBand::CreateCopy : Out of memory " ); 1023 delete poDS; 1024 return NULL; 1025 } 1026 1029 1027 for( int iBand = 1; iBand <= poSrcDS->GetRasterCount(); iBand++ ) 1030 1028 { … … 1033 1031 1034 1032 int iYOffset, iXOffset; 1035 void *pData;1036 1033 CPLErr eErr = CE_None; 1037 1038 pData = CPLMalloc( nBlockXSize * nBlockYSize * GDALGetDataTypeSize( eType ) / 8 );1039 1034 1040 1035 for( iYOffset = 0; iYOffset < nYSize; iYOffset += nBlockYSize ) … … 1068 1063 } 1069 1064 } 1070 CPLFree( pData ); 1071 } 1065 } 1066 1067 CPLFree( pData ); 1072 1068 1073 1069 // -------------------------------------------------------------------- … … 1076 1072 1077 1073 poDS->FlushCache(); 1078 1079 poDS->bDirty = ( ! ( bSuccessMin && bSuccessMax ) );1080 1074 1081 1075 return poDS; … … 1228 1222 this->eDataType = eDataType; 1229 1223 this->poDefaultRAT = NULL; 1224 this->dfMinimum = 0.0; 1225 this->dfMaximum = 0.0; 1226 this->bFirstVal = true; 1230 1227 1231 1228 // -------------------------------------------------------------------- … … 1240 1237 // -------------------------------------------------------------------- 1241 1238 1242 // FIXME : risk of overflow in multiplication 1243 nRecordSize = poDS->GetRasterXSize() * GDALGetDataTypeSize( eDataType ) / 8 * poDS->nBands; 1244 pabyScanLine = ( GByte * ) VSIMalloc( nRecordSize ); 1245 if (pabyScanLine == NULL) 1239 nRecordSize = poDS->GetRasterXSize() * GDALGetDataTypeSize( eDataType ) / 8; 1240 1241 pabyScanLine = (GByte*) VSIMalloc2( nRecordSize, poDS->nBands ); 1242 1243 if( pabyScanLine == NULL ) 1246 1244 { 1247 1245 CPLError(CE_Failure, CPLE_OutOfMemory, … … 1249 1247 poDS->GetRasterXSize()); 1250 1248 } 1249 1250 nRecordSize *= poDS->nBands; 1251 1251 } 1252 1252 … … 1317 1317 1318 1318 CPLErr IdrisiRasterBand::IWriteBlock( int nBlockXOff, 1319 int nBlockYOff,1320 void *pImage )1319 int nBlockYOff, 1320 void *pImage ) 1321 1321 { 1322 1322 IdrisiDataset *poGDS = (IdrisiDataset *) poDS; 1323 1324 poGDS->bDirty = true;1325 1323 1326 1324 #ifdef CPL_MSB … … 1364 1362 } 1365 1363 1364 // -------------------------------------------------------------------- 1365 // Store the first value as mimunm and maximum 1366 // -------------------------------------------------------------------- 1367 1368 if( bFirstVal ) 1369 { 1370 switch( eDataType ) 1371 { 1372 case GDT_Float32: 1373 dfMinimum = dfMaximum = (double) ((float*) pabyScanLine)[0]; 1374 break; 1375 case GDT_Int16: 1376 dfMinimum = dfMaximum = (double) ((GInt16*) pabyScanLine)[0]; 1377 break; 1378 default: 1379 dfMinimum = dfMaximum = (double) ((GByte*) pabyScanLine)[ 1380 poGDS->nBands == 1 ? 0 : 3 - this->nBand ]; 1381 } 1382 bFirstVal = false; 1383 } 1384 1385 // -------------------------------------------------------------------- 1386 // Search for the minimum and maximum values 1387 // -------------------------------------------------------------------- 1388 1389 int i, j; 1390 1391 if( eDataType == GDT_Float32 ) 1392 { 1393 for( i = 0; i < nBlockXSize; i++ ) 1394 { 1395 dfMinimum = MIN( dfMinimum, ((float*) pabyScanLine)[i] ); 1396 dfMaximum = MAX( dfMaximum, ((float*) pabyScanLine)[i] ); 1397 } 1398 } 1399 else if( eDataType == GDT_Int16 ) 1400 { 1401 for( i = 0; i < nBlockXSize; i++ ) 1402 { 1403 dfMinimum = MIN( dfMinimum, ((GInt16*) pabyScanLine)[i] ); 1404 dfMaximum = MAX( dfMaximum, ((GInt16*) pabyScanLine)[i] ); 1405 } 1406 } 1407 else if( poGDS->nBands == 1 ) 1408 { 1409 for( i = 0; i < nBlockXSize; i++ ) 1410 { 1411 dfMinimum = MIN( dfMinimum, ((GByte*) pabyScanLine)[i] ); 1412 dfMaximum = MAX( dfMaximum, ((GByte*) pabyScanLine)[i] ); 1413 } 1414 } 1415 else 1416 { 1417 for( i = 0, j = ( 3 - nBand ); i < nBlockXSize; i++, j += 3 ) 1418 { 1419 dfMinimum = MIN( dfMinimum, ((GByte*) pabyScanLine)[j] ); 1420 dfMaximum = MAX( dfMaximum, ((GByte*) pabyScanLine)[j] ); 1421 } 1422 } 1423 1366 1424 return CE_None; 1367 1425 } … … 1381 1439 if( pbSuccess ) 1382 1440 { 1383 *pbSuccess = ( ! poGDS->bDirty );1441 *pbSuccess = true; 1384 1442 } 1385 1443 … … 1401 1459 if( pbSuccess ) 1402 1460 { 1403 *pbSuccess = ( ! poGDS->bDirty );1461 *pbSuccess = true; 1404 1462 } 1405 1463
