int main( int argc, char ** argv ) { AIGInfo_t *psInfo; GUInt32 *panRaster; int i, j; int bMagic = FALSE, bSupressMagic = FALSE; /* -------------------------------------------------------------------- */ /* Process arguments. */ /* -------------------------------------------------------------------- */ while( argc > 1 && argv[1][0] == '-' ) { if( EQUAL(argv[1],"-magic") ) bMagic = TRUE; else if( EQUAL(argv[1],"-nomagic") ) bSupressMagic = TRUE; argc--; argv++; } if( argc < 2 ) { printf( "Usage: aitest [-magic] coverage [block numbers...]\n" ); exit( 1 ); } /* -------------------------------------------------------------------- */ /* Open dataset. */ /* -------------------------------------------------------------------- */ psInfo = AIGOpen( argv[1], "r" ); if( psInfo == NULL ) exit( 1 ); AIGAccessTile( psInfo, 0, 0 ); /* -------------------------------------------------------------------- */ /* Dump general information */ /* -------------------------------------------------------------------- */ printf( "%d pixels x %d lines.\n", psInfo->nPixels, psInfo->nLines ); printf( "Lower Left = (%f,%f) Upper Right = (%f,%f)\n", psInfo->dfLLX, psInfo->dfLLY, psInfo->dfURX, psInfo->dfURY ); if( psInfo->nCellType == AIG_CELLTYPE_INT ) printf( "Integer coverage, %dx%d blocks.\n", psInfo->nBlockXSize, psInfo->nBlockYSize ); else printf( "Floating point coverage, %dx%d blocks.\n", psInfo->nBlockXSize, psInfo->nBlockYSize ); printf( "Stats - Min=%f, Max=%f, Mean=%f, StdDev=%f\n", psInfo->dfMin, psInfo->dfMax, psInfo->dfMean, psInfo->dfStdDev ); /* -------------------------------------------------------------------- */ /* Do we want a dump of all the ``magic'' numbers for */ /* instantated blocks? */ /* -------------------------------------------------------------------- */ if( !bSupressMagic ) DumpMagic( psInfo, bMagic ); /* -------------------------------------------------------------------- */ /* Read a block, and report it's contents. */ /* -------------------------------------------------------------------- */ panRaster = (GUInt32 *) CPLMalloc(psInfo->nBlockXSize * psInfo->nBlockYSize * 4); while( argc > 2 && (atoi(argv[2]) > 0 || argv[2][0] == '0') ) { int nBlock = atoi(argv[2]); CPLErr eErr; AIGTileInfo *psTInfo = psInfo->pasTileInfo + 0; argv++; argc--; eErr = AIGReadBlock( psTInfo->fpGrid, psTInfo->panBlockOffset[nBlock], psTInfo->panBlockSize[nBlock], psInfo->nBlockXSize, psInfo->nBlockYSize, panRaster, psInfo->nCellType ); printf( "\nBlock %d:\n", nBlock ); if( eErr != CE_None ) { printf( " Error! Skipping block.\n" ); continue; } for( j = 0; j < psInfo->nBlockYSize; j++ ) { for( i = 0; i < psInfo->nBlockXSize; i++ ) { if( i > 18 ) { printf( "..." ); break; } if( panRaster[i+j*psInfo->nBlockXSize] == ESRI_GRID_NO_DATA ) printf( "-*- " ); else if( psInfo->nCellType == AIG_CELLTYPE_FLOAT ) printf( "%f ", ((float *) panRaster)[i+j*psInfo->nBlockXSize] ); else printf( "%3d ", panRaster[i+j*psInfo->nBlockXSize] ); } printf( "\n" ); } } CPLFree( panRaster ); AIGClose( psInfo ); exit( 0 ); }
AIGInfo_t *AIGOpen( const char * pszInputName, const char * pszAccess ) { AIGInfo_t *psInfo; char *pszCoverName; (void) pszAccess; /* -------------------------------------------------------------------- */ /* If the pass name ends in .adf assume a file within the */ /* coverage has been selected, and strip that off the coverage */ /* name. */ /* -------------------------------------------------------------------- */ pszCoverName = CPLStrdup( pszInputName ); if( EQUAL(pszCoverName+strlen(pszCoverName)-4, ".adf") ) { int i; for( i = strlen(pszCoverName)-1; i > 0; i-- ) { if( pszCoverName[i] == '\\' || pszCoverName[i] == '/' ) { pszCoverName[i] = '\0'; break; } } if( i == 0 ) strcpy(pszCoverName,"."); } /* -------------------------------------------------------------------- */ /* Allocate info structure. */ /* -------------------------------------------------------------------- */ psInfo = (AIGInfo_t *) CPLCalloc(sizeof(AIGInfo_t),1); psInfo->bHasWarned = FALSE; psInfo->pszCoverName = pszCoverName; /* -------------------------------------------------------------------- */ /* Read the header file. */ /* -------------------------------------------------------------------- */ if( AIGReadHeader( pszCoverName, psInfo ) != CE_None ) { CPLFree( pszCoverName ); CPLFree( psInfo ); return NULL; } /* -------------------------------------------------------------------- */ /* Read the extents. */ /* -------------------------------------------------------------------- */ if( AIGReadBounds( pszCoverName, psInfo ) != CE_None ) { AIGClose( psInfo ); return NULL; } /* -------------------------------------------------------------------- */ /* Compute the number of pixels and lines, and the number of */ /* tile files. */ /* -------------------------------------------------------------------- */ if (psInfo->dfCellSizeX <= 0 || psInfo->dfCellSizeY <= 0) { CPLError( CE_Failure, CPLE_AppDefined, "Illegal cell size : %f x %f", psInfo->dfCellSizeX, psInfo->dfCellSizeY ); AIGClose( psInfo ); return NULL; } psInfo->nPixels = (int) ((psInfo->dfURX - psInfo->dfLLX + 0.5 * psInfo->dfCellSizeX) / psInfo->dfCellSizeX); psInfo->nLines = (int) ((psInfo->dfURY - psInfo->dfLLY + 0.5 * psInfo->dfCellSizeY) / psInfo->dfCellSizeY); if (psInfo->nPixels <= 0 || psInfo->nLines <= 0) { CPLError( CE_Failure, CPLE_AppDefined, "Invalid raster dimensions : %d x %d", psInfo->nPixels, psInfo->nLines ); AIGClose( psInfo ); return NULL; } if (psInfo->nBlockXSize <= 0 || psInfo->nBlockYSize <= 0 || psInfo->nBlocksPerRow <= 0 || psInfo->nBlocksPerColumn <= 0 || psInfo->nBlockXSize > INT_MAX / psInfo->nBlocksPerRow || psInfo->nBlockYSize > INT_MAX / psInfo->nBlocksPerColumn) { CPLError( CE_Failure, CPLE_AppDefined, "Invalid block characteristics: nBlockXSize=%d, " "nBlockYSize=%d, nBlocksPerRow=%d, nBlocksPerColumn=%d", psInfo->nBlockXSize, psInfo->nBlockYSize, psInfo->nBlocksPerRow, psInfo->nBlocksPerColumn); AIGClose( psInfo ); return NULL; } psInfo->nTileXSize = psInfo->nBlockXSize * psInfo->nBlocksPerRow; psInfo->nTileYSize = psInfo->nBlockYSize * psInfo->nBlocksPerColumn; psInfo->nTilesPerRow = (psInfo->nPixels-1) / psInfo->nTileXSize + 1; psInfo->nTilesPerColumn = (psInfo->nLines-1) / psInfo->nTileYSize + 1; if (psInfo->nTilesPerRow > INT_MAX / psInfo->nTilesPerColumn) { CPLError(CE_Failure, CPLE_OutOfMemory, "Too many tiles"); AIGClose( psInfo ); return NULL; } /* -------------------------------------------------------------------- */ /* Setup tile infos, but defer reading of tile data. */ /* -------------------------------------------------------------------- */ psInfo->pasTileInfo = (AIGTileInfo *) VSICalloc(sizeof(AIGTileInfo), psInfo->nTilesPerRow * psInfo->nTilesPerColumn); if (psInfo->pasTileInfo == NULL) { CPLError(CE_Failure, CPLE_OutOfMemory, "Cannot allocate tile info array"); AIGClose( psInfo ); return NULL; } /* -------------------------------------------------------------------- */ /* Read the statistics. */ /* -------------------------------------------------------------------- */ if( AIGReadStatistics( pszCoverName, psInfo ) != CE_None ) { AIGClose( psInfo ); return NULL; } return( psInfo ); }