📄 gridlib.cpp
字号:
} CPLFree( pabyIntermediate ); return( CE_None );}/************************************************************************//* AIGProcessBlock() *//* *//* Process a block using ``D7'', ``E0'' or ``DF'' compression. *//************************************************************************/static CPLErr AIGProcessBlock( GByte *pabyCur, int nDataSize, int nMin, int nMagic, int nBlockXSize, int nBlockYSize, GInt32 * panData ){ int nTotPixels, nPixels; int i;/* ==================================================================== *//* Process runs till we are done. *//* ==================================================================== */ nTotPixels = nBlockXSize * nBlockYSize; nPixels = 0; while( nPixels < nTotPixels && nDataSize > 0 ) { int nMarker = *(pabyCur++); nDataSize--; /* -------------------------------------------------------------------- *//* Repeat data - four byte data block (0xE0) *//* -------------------------------------------------------------------- */ if( nMagic == 0xE0 ) { GInt32 nValue; if( nMarker + nPixels > nTotPixels ) { CPLError( CE_Failure, CPLE_AppDefined, "Run too long in AIGProcessBlock, needed %d values, got %d.", nTotPixels - nPixels, nMarker ); return CE_Failure; } nValue = 0; memcpy( &nValue, pabyCur, 4 ); pabyCur += 4; nDataSize -= 4; nValue = CPL_MSBWORD32( nValue ); nValue += nMin; for( i = 0; i < nMarker; i++ ) panData[nPixels++] = nValue; } /* -------------------------------------------------------------------- *//* Repeat data - two byte data block (0xF0) *//* -------------------------------------------------------------------- */ else if( nMagic == 0xF0 ) { GInt32 nValue; if( nMarker + nPixels > nTotPixels ) { CPLError( CE_Failure, CPLE_AppDefined, "Run too long in AIGProcessBlock, needed %d values, got %d.", nTotPixels - nPixels, nMarker ); return CE_Failure; } nValue = (pabyCur[0] * 256 + pabyCur[1]) + nMin; pabyCur += 2; for( i = 0; i < nMarker; i++ ) panData[nPixels++] = nValue; } /* -------------------------------------------------------------------- *//* Repeat data - one byte data block (0xFC) *//* -------------------------------------------------------------------- */ else if( nMagic == 0xFC || nMagic == 0xF8 ) { GInt32 nValue; if( nMarker + nPixels > nTotPixels ) { CPLError( CE_Failure, CPLE_AppDefined, "Run too long in AIGProcessBlock, needed %d values, got %d.", nTotPixels - nPixels, nMarker ); return CE_Failure; } nValue = *(pabyCur++) + nMin; nDataSize--; for( i = 0; i < nMarker; i++ ) panData[nPixels++] = nValue; } /* -------------------------------------------------------------------- *//* Repeat data - no actual data, just assign minimum (0xDF) *//* -------------------------------------------------------------------- */ else if( nMagic == 0xDF && nMarker < 128 ) { if( nMarker + nPixels > nTotPixels ) { CPLError( CE_Failure, CPLE_AppDefined, "Run too long in AIGProcessBlock, needed %d values, got %d.", nTotPixels - nPixels, nMarker ); return CE_Failure; } for( i = 0; i < nMarker; i++ ) panData[nPixels++] = nMin; } /* -------------------------------------------------------------------- *//* Literal data (0xD7): 8bit values. *//* -------------------------------------------------------------------- */ else if( nMagic == 0xD7 && nMarker < 128 ) { if( nMarker + nPixels > nTotPixels ) { CPLError( CE_Failure, CPLE_AppDefined, "Run too long in AIGProcessBlock, needed %d values, got %d.", nTotPixels - nPixels, nMarker ); return CE_Failure; } while( nMarker > 0 && nDataSize > 0 ) { panData[nPixels++] = *(pabyCur++) + nMin; nMarker--; nDataSize--; } }/* -------------------------------------------------------------------- *//* Literal data (0xCF): 16 bit values. *//* -------------------------------------------------------------------- */ else if( nMagic == 0xCF && nMarker < 128 ) { GInt32 nValue; if( nMarker + nPixels > nTotPixels ) { CPLError( CE_Failure, CPLE_AppDefined, "Run too long in AIGProcessBlock, needed %d values, got %d.", nTotPixels - nPixels, nMarker ); return CE_Failure; } while( nMarker > 0 && nDataSize > 0 ) { nValue = pabyCur[0] * 256 + pabyCur[1] + nMin; panData[nPixels++] = nValue; pabyCur += 2; nMarker--; nDataSize -= 2; } }/* -------------------------------------------------------------------- *//* Nodata repeat *//* -------------------------------------------------------------------- */ else if( nMarker > 128 ) { nMarker = 256 - nMarker; if( nMarker + nPixels > nTotPixels ) { CPLError( CE_Failure, CPLE_AppDefined, "Run too long in AIGProcessBlock, needed %d values, got %d.", nTotPixels - nPixels, nMarker ); return CE_Failure; } while( nMarker > 0 ) { panData[nPixels++] = ESRI_GRID_NO_DATA; nMarker--; } } else { return CE_Failure; } } if( nPixels < nTotPixels || nDataSize < 0 ) { CPLError( CE_Failure, CPLE_AppDefined, "Ran out of data processing block with nMagic=%d.", nMagic ); return CE_Failure; } return CE_None;}/************************************************************************//* AIGReadBlock() *//* *//* Read a single block of integer grid data. *//************************************************************************/CPLErr AIGReadBlock( FILE * fp, int nBlockOffset, int nBlockSize, int nBlockXSize, int nBlockYSize, GInt32 *panData, int nCellType ){ GByte *pabyRaw, *pabyCur; CPLErr eErr; int i, nMagic, nMinSize=0, nDataSize; GInt32 nMin = 0;/* -------------------------------------------------------------------- *//* If the block has zero size it is all dummies. *//* -------------------------------------------------------------------- */ if( nBlockSize == 0 ) { for( i = 0; i < nBlockXSize * nBlockYSize; i++ ) panData[i] = ESRI_GRID_NO_DATA; return( CE_None ); } /* -------------------------------------------------------------------- *//* Read the block into memory. *//* -------------------------------------------------------------------- */ pabyRaw = (GByte *) CPLMalloc(nBlockSize+2); if( VSIFSeek( fp, nBlockOffset, SEEK_SET ) != 0 || VSIFRead( pabyRaw, nBlockSize+2, 1, fp ) != 1 ) { memset( panData, 0, nBlockXSize*nBlockYSize*4 ); CPLError( CE_Failure, CPLE_AppDefined, "Read of %d bytes from offset %d for grid block failed.", nBlockSize+2, nBlockOffset ); return CE_Failure; }/* -------------------------------------------------------------------- *//* Verify the block size. *//* -------------------------------------------------------------------- */ if( nBlockSize != (pabyRaw[0]*256 + pabyRaw[1])*2 ) { memset( panData, 0, nBlockXSize*nBlockYSize*4 ); CPLError( CE_Failure, CPLE_AppDefined, "Block is corrupt, block size was %d, but expected to be %d.", (pabyRaw[0]*256 + pabyRaw[1])*2, nBlockSize ); return CE_Failure; } nDataSize = nBlockSize; /* -------------------------------------------------------------------- *//* Handle float files directly. *//* -------------------------------------------------------------------- */ if( nCellType == AIG_CELLTYPE_FLOAT ) { AIGProcessRaw32BitFloatBlock( pabyRaw + 2, nDataSize, 0, nBlockXSize, nBlockYSize, (float *) panData ); CPLFree( pabyRaw ); return CE_None; }/* -------------------------------------------------------------------- *//* Collect minimum value. *//* -------------------------------------------------------------------- */ pabyCur = pabyRaw + 2; nMinSize = pabyCur[1]; pabyCur += 2; if( nMinSize > 4 ) { memset( panData, 0, nBlockXSize*nBlockYSize*4 ); CPLError( CE_Failure, CPLE_AppDefined, "Corrupt 'minsize' of %d in block header. Read aborted.", nMinSize ); return CE_Failure; } if( nMinSize == 4 ) { memcpy( &nMin, pabyCur, 4 ); nMin = CPL_MSBWORD32( nMin ); pabyCur += 4; } else { nMin = 0; for( i = 0; i < nMinSize; i++ ) { nMin = nMin * 256 + *pabyCur; pabyCur++; } if( pabyRaw[4] > 127 ) { if( nMinSize == 2 ) nMin = nMin - 65536; else if( nMinSize == 1 ) nMin = nMin - 256; else if( nMinSize == 3 ) nMin = nMin - 256*256*256; } } nDataSize -= 2+nMinSize; /* -------------------------------------------------------------------- *//* Call an apppropriate handler depending on magic code. *//* -------------------------------------------------------------------- */ nMagic = pabyRaw[2];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -