Changeset 14733

Show
Ignore:
Timestamp:
06/20/08 14:38:49 (6 months ago)
Author:
warmerdam
Message:

Read invalid blocks as nodata value if available. Create new files with
all blocks marked invalid. Support writing to invalid blocks as long as
there is already a pointer to valid data. (#2427)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/1.5/gdal/frmts/hfa/hfa_p.h

    r13278 r14733  
    142142     
    143143    void ReAllocBlock( int iBlock, int nSize ); 
     144    void NullBlock( void * ); 
    144145 
    145146  public: 
  • branches/1.5/gdal/frmts/hfa/hfaband.cpp

    r14710 r14733  
    801801} 
    802802 
     803/************************************************************************/ 
     804/*                             NullBlock()                              */ 
     805/*                                                                      */ 
     806/*      Set the block buffer to zero or the nodata value as             */ 
     807/*      appropriate.                                                    */ 
     808/************************************************************************/ 
     809 
     810void HFABand::NullBlock( void *pData ) 
     811 
     812{ 
     813    if( !bNoDataSet ) 
     814        memset( pData, 0,  
     815                HFAGetDataTypeBits(nDataType)*nBlockXSize*nBlockYSize/8 ); 
     816    else 
     817             
     818    { 
     819        double adfND[2]; 
     820        int nChunkSize = MAX(1,HFAGetDataTypeBits(nDataType)/8); 
     821        int nWords = nBlockXSize * nBlockYSize; 
     822        int i; 
     823 
     824        switch( nDataType ) 
     825        { 
     826          case EPT_u1: 
     827          { 
     828              nWords = (nWords + 7)/8; 
     829              if( dfNoData != 0.0 ) 
     830                  ((unsigned char *) &adfND)[0] = 0xff; 
     831              else 
     832                  ((unsigned char *) &adfND)[0] = 0x00; 
     833          } 
     834          break; 
     835 
     836          case EPT_u2: 
     837          { 
     838              nWords = (nWords + 3)/4; 
     839              if( dfNoData == 0.0 ) 
     840                  ((unsigned char *) &adfND)[0] = 0x00; 
     841              else if( dfNoData == 1.0 ) 
     842                  ((unsigned char *) &adfND)[0] = 0x55; 
     843              else if( dfNoData == 2.0 ) 
     844                  ((unsigned char *) &adfND)[0] = 0xaa; 
     845              else 
     846                  ((unsigned char *) &adfND)[0] = 0xff; 
     847          } 
     848          break; 
     849 
     850          case EPT_u4: 
     851          { 
     852              unsigned char byVal =  
     853                  (unsigned char) MAX(0,MIN(15,(int)dfNoData)); 
     854 
     855              nWords = (nWords + 1)/2; 
     856                   
     857              ((unsigned char *) &adfND)[0] = byVal + (byVal << 4); 
     858          } 
     859          break; 
     860 
     861          case EPT_u8: 
     862            ((unsigned char *) &adfND)[0] =  
     863                (unsigned char) MAX(0,MIN(255,(int)dfNoData)); 
     864            break; 
     865 
     866          case EPT_s8: 
     867            ((signed char *) &adfND)[0] =  
     868                (signed char) MAX(-128,MIN(127,(int)dfNoData)); 
     869            break; 
     870 
     871          case EPT_u16: 
     872            ((GUInt16 *) &adfND)[0] = (GUInt16) dfNoData; 
     873            break; 
     874 
     875          case EPT_s16: 
     876            ((GInt16 *) &adfND)[0] = (GInt16) dfNoData; 
     877            break; 
     878 
     879          case EPT_u32: 
     880            ((GUInt32 *) &adfND)[0] = (GUInt32) dfNoData; 
     881            break; 
     882 
     883          case EPT_s32: 
     884            ((GInt32 *) &adfND)[0] = (GInt32) dfNoData; 
     885            break; 
     886 
     887          case EPT_f32: 
     888            ((float *) &adfND)[0] = (float) dfNoData; 
     889            break; 
     890 
     891          case EPT_f64: 
     892            ((double *) &adfND)[0] = dfNoData; 
     893            break; 
     894 
     895          case EPT_c64: 
     896            ((float *) &adfND)[0] = dfNoData; 
     897            ((float *) &adfND)[1] = 0; 
     898            break; 
     899 
     900          case EPT_c128: 
     901            ((double *) &adfND)[0] = dfNoData; 
     902            ((double *) &adfND)[1] = 0; 
     903            break; 
     904        } 
     905             
     906        for( i = 0; i < nWords; i++ ) 
     907            memcpy( ((GByte *) pData) + nChunkSize * i,  
     908                    &adfND[0], nChunkSize ); 
     909    } 
     910 
     911} 
    803912 
    804913/************************************************************************/ 
     
    823932    if( !panBlockFlag[iBlock] & BFLG_VALID ) 
    824933    { 
    825         memset( pData, 0,  
    826                 HFAGetDataTypeBits(nDataType)*nBlockXSize*nBlockYSize/8 ); 
    827  
     934        NullBlock( pData ); 
    828935        return( CE_None ); 
    829936    } 
     
    10331140/* -------------------------------------------------------------------- */ 
    10341141    if( (panBlockFlag[iBlock] & BFLG_VALID) == 0 
    1035         && !(panBlockFlag[iBlock] & BFLG_COMPRESSED) ) 
     1142        && !(panBlockFlag[iBlock] & BFLG_COMPRESSED)  
     1143        && panBlockStart[iBlock] == 0 ) 
    10361144    { 
    10371145        CPLError( CE_Failure, CPLE_AppDefined,  
     
    12401348            return CE_Failure; 
    12411349        } 
     1350 
     1351/* -------------------------------------------------------------------- */ 
     1352/*      If the block was previously invalid, mark it as valid now.      */ 
     1353/* -------------------------------------------------------------------- */ 
     1354        if( (panBlockFlag[iBlock] & BFLG_VALID) == 0 ) 
     1355        { 
     1356            char        szVarName[64]; 
     1357            HFAEntry    *poDMS = poNode->GetNamedChild( "RasterDMS" ); 
     1358 
     1359            sprintf( szVarName, "blockinfo[%d].logvalid", iBlock ); 
     1360            poDMS->SetStringField( szVarName, "true" ); 
     1361 
     1362            panBlockFlag[iBlock] |= BFLG_VALID; 
     1363        } 
    12421364    } 
    12431365/* -------------------------------------------------------------------- */ 
  • branches/1.5/gdal/frmts/hfa/hfaopen.cpp

    r13343 r14733  
    20272027            memcpy( pabyData + nOffset + 6, &nValue, 4 ); 
    20282028 
    2029             /* logValid (true/false) */ 
    2030             if( bCreateCompressed ) 
    2031                 nValue16 = 0; 
    2032             else 
    2033                 nValue16 = 1; 
     2029            /* logValid (false) */ 
     2030            nValue16 = 0; 
    20342031            HFAStandard( 2, &nValue16 ); 
    20352032            memcpy( pabyData + nOffset + 10, &nValue16, 2 );