Changeset 11617
- Timestamp:
- 06/07/07 14:05:35 (1 year ago)
- Files:
-
- branches/1.4/gdal/frmts/aigrid/GNUmakefile (modified) (1 diff)
- branches/1.4/gdal/frmts/aigrid/aigopen.c (modified) (10 diffs)
- branches/1.4/gdal/frmts/aigrid/aigrid.h (modified) (5 diffs)
- branches/1.4/gdal/frmts/aigrid/aitest.c (modified) (8 diffs)
- branches/1.4/gdal/frmts/aigrid/gridlib.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/1.4/gdal/frmts/aigrid/GNUmakefile
r9480 r11617 10 10 11 11 clean: 12 rm -f *.o aitest $(OBJ) 12 rm -f *.o aitest $(OBJ) $(O_OBJ) 13 13 14 14 aitest: aitest.o $(AIGOBJ) branches/1.4/gdal/frmts/aigrid/aigopen.c
r10646 r11617 40 40 { 41 41 AIGInfo_t *psInfo; 42 char *pszHDRFilename;43 42 char *pszCoverName; 44 43 … … 86 85 87 86 /* -------------------------------------------------------------------- */ 88 /* Open the file w001001.adf file itself. */ 89 /* -------------------------------------------------------------------- */ 90 pszHDRFilename = (char *) CPLMalloc(strlen(pszCoverName)+40); 91 sprintf( pszHDRFilename, "%s/w001001.adf", pszCoverName ); 92 93 psInfo->fpGrid = AIGLLOpen( pszHDRFilename, "rb" ); 94 95 if( psInfo->fpGrid == NULL ) 96 { 97 CPLError( CE_Failure, CPLE_OpenFailed, 98 "Failed to open grid file:\n%s\n", 99 pszHDRFilename ); 100 101 CPLFree( psInfo ); 102 CPLFree( pszHDRFilename ); 103 CPLFree( pszCoverName ); 104 return( NULL ); 105 } 106 107 CPLFree( pszHDRFilename ); 108 pszHDRFilename = NULL; 109 110 /* -------------------------------------------------------------------- */ 111 /* Read the block index file. */ 112 /* -------------------------------------------------------------------- */ 113 if( AIGReadBlockIndex( pszCoverName, psInfo ) != CE_None ) 114 { 115 VSIFCloseL( psInfo->fpGrid ); 116 117 CPLFree( psInfo ); 87 /* Read the extents. */ 88 /* -------------------------------------------------------------------- */ 89 if( AIGReadBounds( pszCoverName, psInfo ) != CE_None ) 90 { 91 AIGClose( psInfo ); 118 92 return NULL; 119 93 } 120 94 121 95 /* -------------------------------------------------------------------- */ 122 /* Read the extents. */ 123 /* -------------------------------------------------------------------- */ 124 if( AIGReadBounds( pszCoverName, psInfo ) != CE_None ) 125 { 126 VSIFCloseL( psInfo->fpGrid ); 127 128 CPLFree( psInfo ); 129 return NULL; 130 } 131 132 /* -------------------------------------------------------------------- */ 133 /* Read the statistics. */ 134 /* -------------------------------------------------------------------- */ 135 if( AIGReadStatistics( pszCoverName, psInfo ) != CE_None ) 136 { 137 VSIFCloseL( psInfo->fpGrid ); 138 139 CPLFree( psInfo ); 140 return NULL; 141 } 142 143 /* -------------------------------------------------------------------- */ 144 /* Compute the number of pixels and lines. */ 96 /* Compute the number of pixels and lines, and the number of */ 97 /* tile files. */ 145 98 /* -------------------------------------------------------------------- */ 146 99 psInfo->nPixels = (int) … … 150 103 ((psInfo->dfURY - psInfo->dfLLY + 0.5 * psInfo->dfCellSizeY) 151 104 / psInfo->dfCellSizeY); 105 106 psInfo->nTileXSize = psInfo->nBlockXSize * psInfo->nBlocksPerRow; 107 psInfo->nTileYSize = psInfo->nBlockYSize * psInfo->nBlocksPerColumn; 108 109 psInfo->nTilesPerRow = (psInfo->nPixels-1) / psInfo->nTileXSize + 1; 110 psInfo->nTilesPerColumn = (psInfo->nLines-1) / psInfo->nTileYSize + 1; 111 112 /* -------------------------------------------------------------------- */ 113 /* Setup tile infos, but defer reading of tile data. */ 114 /* -------------------------------------------------------------------- */ 115 psInfo->pasTileInfo = (AIGTileInfo *) 116 CPLCalloc(sizeof(AIGTileInfo), 117 psInfo->nTilesPerRow * psInfo->nTilesPerColumn); 118 /* -------------------------------------------------------------------- */ 119 /* Read the statistics. */ 120 /* -------------------------------------------------------------------- */ 121 if( AIGReadStatistics( pszCoverName, psInfo ) != CE_None ) 122 { 123 AIGClose( psInfo ); 124 return NULL; 125 } 126 127 return( psInfo ); 128 } 129 130 /************************************************************************/ 131 /* AIGAccessTile() */ 132 /************************************************************************/ 133 134 CPLErr AIGAccessTile( AIGInfo_t *psInfo, int iTileX, int iTileY ) 135 136 { 137 char szBasename[20]; 138 char *pszFilename; 139 AIGTileInfo *psTInfo; 140 141 /* -------------------------------------------------------------------- */ 142 /* Identify our tile. */ 143 /* -------------------------------------------------------------------- */ 144 if( iTileX < 0 || iTileX >= psInfo->nTilesPerRow 145 || iTileY < 0 || iTileY >= psInfo->nTilesPerColumn ) 146 { 147 CPLAssert( FALSE ); 148 return CE_Failure; 149 } 150 151 psTInfo = psInfo->pasTileInfo + iTileX + iTileY * psInfo->nTilesPerRow; 152 153 if( psTInfo->fpGrid != NULL ) 154 return CE_None; 155 156 /* -------------------------------------------------------------------- */ 157 /* Compute the basename. */ 158 /* -------------------------------------------------------------------- */ 159 if( iTileY == 0 ) 160 sprintf( szBasename, "w%03d001", iTileX + 1 ); 161 else if( iTileY == 1 ) 162 sprintf( szBasename, "w%03d000", iTileX + 1 ); 163 else 164 sprintf( szBasename, "z%03d%03d", iTileX + 1, iTileY - 1 ); 152 165 153 return( psInfo ); 166 /* -------------------------------------------------------------------- */ 167 /* Open the file w001001.adf file itself. */ 168 /* -------------------------------------------------------------------- */ 169 pszFilename = (char *) CPLMalloc(strlen(psInfo->pszCoverName)+40); 170 sprintf( pszFilename, "%s/%s.adf", psInfo->pszCoverName, szBasename ); 171 172 psTInfo->fpGrid = AIGLLOpen( pszFilename, "rb" ); 173 174 if( psTInfo->fpGrid == NULL ) 175 { 176 CPLError( CE_Failure, CPLE_OpenFailed, 177 "Failed to open grid file:\n%s\n", 178 pszFilename ); 179 return CE_Failure; 180 } 181 182 CPLFree( pszFilename ); 183 pszFilename = NULL; 184 185 /* -------------------------------------------------------------------- */ 186 /* Read the block index file. */ 187 /* -------------------------------------------------------------------- */ 188 return AIGReadBlockIndex( psInfo, psTInfo, szBasename ); 154 189 } 155 190 … … 164 199 int nBlockID; 165 200 CPLErr eErr; 201 int iTileX, iTileY; 202 AIGTileInfo *psTInfo; 203 204 /* -------------------------------------------------------------------- */ 205 /* Compute our tile, and ensure it is accessable (open). Then */ 206 /* reduce block x/y values to be the block within that tile. */ 207 /* -------------------------------------------------------------------- */ 208 iTileX = nBlockXOff / psInfo->nBlocksPerRow; 209 iTileY = nBlockYOff / psInfo->nBlocksPerColumn; 210 211 eErr = AIGAccessTile( psInfo, iTileX, iTileY ); 212 if( eErr != CE_None ) 213 return eErr; 214 215 psTInfo = psInfo->pasTileInfo + iTileX + iTileY * psInfo->nTilesPerRow; 216 217 nBlockXOff -= iTileX * psInfo->nBlocksPerRow; 218 nBlockYOff -= iTileY * psInfo->nBlocksPerColumn; 166 219 167 220 /* -------------------------------------------------------------------- */ … … 177 230 } 178 231 179 if( nBlockID >= ps Info->nBlocks )232 if( nBlockID >= psTInfo->nBlocks ) 180 233 { 181 234 int i; … … 191 244 /* Read block. */ 192 245 /* -------------------------------------------------------------------- */ 193 eErr = AIGReadBlock( ps Info->fpGrid,194 ps Info->panBlockOffset[nBlockID],195 ps Info->panBlockSize[nBlockID],246 eErr = AIGReadBlock( psTInfo->fpGrid, 247 psTInfo->panBlockOffset[nBlockID], 248 psTInfo->panBlockSize[nBlockID], 196 249 psInfo->nBlockXSize, psInfo->nBlockYSize, 197 250 panData, psInfo->nCellType ); … … 224 277 int nBlockID; 225 278 CPLErr eErr; 279 int iTileX, iTileY; 280 AIGTileInfo *psTInfo; 281 282 /* -------------------------------------------------------------------- */ 283 /* Compute our tile, and ensure it is accessable (open). Then */ 284 /* reduce block x/y values to be the block within that tile. */ 285 /* -------------------------------------------------------------------- */ 286 iTileX = nBlockXOff / psInfo->nBlocksPerRow; 287 iTileY = nBlockYOff / psInfo->nBlocksPerColumn; 288 289 eErr = AIGAccessTile( psInfo, iTileX, iTileY ); 290 if( eErr != CE_None ) 291 return eErr; 292 293 psTInfo = psInfo->pasTileInfo + iTileX + iTileY * psInfo->nTilesPerRow; 294 295 nBlockXOff -= iTileX * psInfo->nBlocksPerRow; 296 nBlockYOff -= iTileY * psInfo->nBlocksPerColumn; 226 297 227 298 /* -------------------------------------------------------------------- */ … … 237 308 } 238 309 239 if( nBlockID >= ps Info->nBlocks )310 if( nBlockID >= psTInfo->nBlocks ) 240 311 { 241 312 int i; … … 251 322 /* Read block. */ 252 323 /* -------------------------------------------------------------------- */ 253 eErr = AIGReadBlock( ps Info->fpGrid,254 ps Info->panBlockOffset[nBlockID],255 ps Info->panBlockSize[nBlockID],324 eErr = AIGReadBlock( psTInfo->fpGrid, 325 psTInfo->panBlockOffset[nBlockID], 326 psTInfo->panBlockSize[nBlockID], 256 327 psInfo->nBlockXSize, psInfo->nBlockYSize, 257 328 (GInt32 *) pafData, psInfo->nCellType ); … … 281 352 282 353 { 283 VSIFCloseL( psInfo->fpGrid ); 284 285 CPLFree( psInfo->panBlockOffset ); 286 CPLFree( psInfo->panBlockSize ); 354 int nTileCount = psInfo->nTilesPerRow * psInfo->nTilesPerColumn; 355 int iTile; 356 357 for( iTile = 0; iTile < nTileCount; iTile++ ) 358 { 359 if( psInfo->pasTileInfo[iTile].fpGrid ) 360 { 361 VSIFCloseL( psInfo->pasTileInfo[iTile].fpGrid ); 362 363 CPLFree( psInfo->pasTileInfo[iTile].panBlockOffset ); 364 CPLFree( psInfo->pasTileInfo[iTile].panBlockSize ); 365 } 366 } 367 368 CPLFree( psInfo->pasTileInfo ); 287 369 CPLFree( psInfo->pszCoverName ); 288 370 CPLFree( psInfo ); branches/1.4/gdal/frmts/aigrid/aigrid.h
r10646 r11617 42 42 /* Grid Instance */ 43 43 /* ==================================================================== */ 44 44 45 typedef struct { 45 /* Private information */46 47 46 int nBlocks; 48 47 GUInt32 *panBlockOffset; … … 50 49 51 50 FILE *fpGrid; /* the w001001.adf file */ 51 } AIGTileInfo; 52 52 53 typedef struct { 54 /* Private information */ 55 56 AIGTileInfo *pasTileInfo; 57 53 58 int bHasWarned; 54 59 … … 67 72 int nBlocksPerRow; 68 73 int nBlocksPerColumn; 74 75 int nTileXSize; 76 int nTileYSize; 77 78 int nTilesPerRow; 79 int nTilesPerColumn; 69 80 70 81 double dfLLX; … … 90 101 /* ==================================================================== */ 91 102 103 CPLErr AIGAccessTile( AIGInfo_t *psInfo, int iTileX, int iTileY ); 92 104 CPLErr AIGReadBlock( FILE * fp, GUInt32 nBlockOffset, int nBlockSize, 93 105 int nBlockXSize, int nBlockYSize, GInt32 * panData, … … 95 107 96 108 CPLErr AIGReadHeader( const char *, AIGInfo_t * ); 97 CPLErr AIGReadBlockIndex( const char *, AIGInfo_t * ); 109 CPLErr AIGReadBlockIndex( AIGInfo_t *, AIGTileInfo *, 110 const char *pszBasename ); 98 111 CPLErr AIGReadBounds( const char *, AIGInfo_t * ); 99 112 CPLErr AIGReadStatistics( const char *, AIGInfo_t * ); branches/1.4/gdal/frmts/aigrid/aitest.c
r10475 r11617 42 42 { 43 43 int i; 44 45 for( i = 0; i < psInfo->nBlocks; i++ ) 44 AIGTileInfo *psTInfo = psInfo->pasTileInfo + 0; 45 46 for( i = 0; i < psTInfo->nBlocks; i++ ) 46 47 { 47 48 GByte byMagic; … … 50 51 const char *pszMessage = ""; 51 52 52 if( ps Info->panBlockSize[i] == 0 )53 if( psTInfo->panBlockSize[i] == 0 ) 53 54 continue; 54 55 55 VSIFSeekL( ps Info->fpGrid, psInfo->panBlockOffset[i], SEEK_SET );56 VSIFReadL( abyBlockSize, 2, 1, ps Info->fpGrid );56 VSIFSeekL( psTInfo->fpGrid, psTInfo->panBlockOffset[i], SEEK_SET ); 57 VSIFReadL( abyBlockSize, 2, 1, psTInfo->fpGrid ); 57 58 58 59 if( psInfo->nCellType == AIG_CELLTYPE_INT ) 59 60 { 60 VSIFReadL( &byMagic, 1, 1, ps Info->fpGrid );61 VSIFReadL( &byMagic, 1, 1, psTInfo->fpGrid ); 61 62 62 63 if( byMagic != 0 && byMagic != 0x43 && byMagic != 0x04 … … 71 72 } 72 73 73 if( byMagic == 0 && ps Info->panBlockSize[i] > 8 )74 if( byMagic == 0 && psTInfo->panBlockSize[i] > 8 ) 74 75 { 75 76 pszMessage = "(wrong size for 0x00 block, should be 8 bytes)"; … … 78 79 79 80 if( (abyBlockSize[0] * 256 + abyBlockSize[1])*2 != 80 ps Info->panBlockSize[i] )81 psTInfo->panBlockSize[i] ) 81 82 { 82 83 pszMessage = "(block size in data doesn't match index)"; … … 86 87 else 87 88 { 88 if( ps Info->panBlockSize[i] !=89 if( psTInfo->panBlockSize[i] != 89 90 psInfo->nBlockXSize*psInfo->nBlockYSize*sizeof(float) ) 90 91 { … … 97 98 { 98 99 printf( " %02x %5d %5d @ %d %s\n", byMagic, i, 99 ps Info->panBlockSize[i],100 ps Info->panBlockOffset[i],100 psTInfo->panBlockSize[i], 101 psTInfo->panBlockOffset[i], 101 102 pszMessage ); 102 103 } … … 143 144 if( psInfo == NULL ) 144 145 exit( 1 ); 146 147 AIGAccessTile( psInfo, 0, 0 ); 145 148 146 149 /* -------------------------------------------------------------------- */ … … 184 187 int nBlock = atoi(argv[2]); 185 188 CPLErr eErr; 189 AIGTileInfo *psTInfo = psInfo->pasTileInfo + 0; 186 190 187 191 argv++; 188 192 argc--; 189 193 190 eErr = AIGReadBlock( ps Info->fpGrid,191 ps Info->panBlockOffset[nBlock],192 ps Info->panBlockSize[nBlock],194 eErr = AIGReadBlock( psTInfo->fpGrid, 195 psTInfo->panBlockOffset[nBlock], 196 psTInfo->panBlockSize[nBlock], 193 197 psInfo->nBlockXSize, psInfo->nBlockYSize, 194 198 panRaster, psInfo->nCellType ); branches/1.4/gdal/frmts/aigrid/gridlib.c
r10646 r11617 447 447 if( nMarker + nPixels > nTotPixels ) 448 448 { 449 #ifdef notdef 449 450 CPLError( CE_Failure, CPLE_AppDefined, 450 451 "Run too long in AIGProcessBlock, needed %d values, got %d.", 451 452 nTotPixels - nPixels, nMarker ); 452 453 return CE_Failure; 454 #endif 455 printf( "Too much data, limit data to use\n" ); 456 nPixels = nTotPixels - nMarker; 453 457 } 454 458 … … 768 772 /************************************************************************/ 769 773 770 CPLErr AIGReadBlockIndex( const char * pszCoverName, AIGInfo_t * psInfo ) 774 CPLErr AIGReadBlockIndex( AIGInfo_t * psInfo, AIGTileInfo *psTInfo, 775 const char *pszBasename ) 771 776 772 777 { … … 781 786 /* Open the file hdr.adf file. */ 782 787 /* -------------------------------------------------------------------- */ 783 pszHDRFilename = (char *) CPLMalloc(strlen(ps zCoverName)+40);784 sprintf( pszHDRFilename, "%s/ w001001x.adf", pszCoverName );788 pszHDRFilename = (char *) CPLMalloc(strlen(psInfo->pszCoverName)+40); 789 sprintf( pszHDRFilename, "%s/%sx.adf", psInfo->pszCoverName, pszBasename ); 785 790 786 791 fp = AIGLLOpen( pszHDRFilename, "rb" ); … … 836 841 /* into the buffer. */ 837 842 /* -------------------------------------------------------------------- */ 838 ps Info->nBlocks = (nLength-100) / 8;839 panIndex = (GUInt32 *) CPLMalloc(ps Info->nBlocks * 8);843 psTInfo->nBlocks = (nLength-100) / 8; 844 panIndex = (GUInt32 *) CPLMalloc(psTInfo->nBlocks * 8); 840 845 VSIFSeekL( fp, 100, SEEK_SET ); 841 VSIFReadL( panIndex, 8, ps Info->nBlocks, fp );846 VSIFReadL( panIndex, 8, psTInfo->nBlocks, fp ); 842 847 843 848 VSIFCloseL( fp ); … … 846 851 /* Allocate AIGInfo block info arrays. */ 847 852 /* -------------------------------------------------------------------- */ 848 ps Info->panBlockOffset = (GUInt32 *) CPLMalloc(4 * psInfo->nBlocks);849 ps Info->panBlockSize = (int *) CPLMalloc(4 * psInfo->nBlocks);853 psTInfo->panBlockOffset = (GUInt32 *) CPLMalloc(4 * psTInfo->nBlocks); 854 psTInfo->panBlockSize = (int *) CPLMalloc(4 * psTInfo->nBlocks); 850 855 851 856 /* -------------------------------------------------------------------- */ 852 857 /* Populate the block information. */ 853 858 /* -------------------------------------------------------------------- */ 854 for( i = 0; i < ps Info->nBlocks; i++ )855 { 856 ps Info->panBlockOffset[i] = CPL_MSBWORD32(panIndex[i*2]) * 2;857 ps Info->panBlockSize[i] = CPL_MSBWORD32(panIndex[i*2+1]) * 2;859 for( i = 0; i < psTInfo->nBlocks; i++ ) 860 { 861 psTInfo->panBlockOffset[i] = CPL_MSBWORD32(panIndex[i*2]) * 2; 862 psTInfo->panBlockSize[i] = CPL_MSBWORD32(panIndex[i*2+1]) * 2; 858 863 } 859 864
