| | 803 | /************************************************************************/ |
|---|
| | 804 | /* NullBlock() */ |
|---|
| | 805 | /* */ |
|---|
| | 806 | /* Set the block buffer to zero or the nodata value as */ |
|---|
| | 807 | /* appropriate. */ |
|---|
| | 808 | /************************************************************************/ |
|---|
| | 809 | |
|---|
| | 810 | void 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 | } |
|---|
| | 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 | } |
|---|