CPLErr BIGGifRasterBand::IReadBlock( CPL_UNUSED int nBlockXOff, int nBlockYOff, void * pImage ) { BIGGIFDataset *poGDS = (BIGGIFDataset *) poDS; CPLAssert( nBlockXOff == 0 ); if( panInterlaceMap != NULL ) nBlockYOff = panInterlaceMap[nBlockYOff]; /* -------------------------------------------------------------------- */ /* Do we already have this line in the work dataset? */ /* -------------------------------------------------------------------- */ if( poGDS->poWorkDS != NULL && nBlockYOff <= poGDS->nLastLineRead ) { return poGDS->poWorkDS-> RasterIO( GF_Read, 0, nBlockYOff, nBlockXSize, 1, pImage, nBlockXSize, 1, GDT_Byte, 1, NULL, 0, 0, 0, NULL ); } /* -------------------------------------------------------------------- */ /* Do we need to restart from the start of the image? */ /* -------------------------------------------------------------------- */ if( nBlockYOff <= poGDS->nLastLineRead ) { if( poGDS->ReOpen() == CE_Failure ) return CE_Failure; } /* -------------------------------------------------------------------- */ /* Read till we get our target line. */ /* -------------------------------------------------------------------- */ CPLErr eErr = CE_None; while( poGDS->nLastLineRead < nBlockYOff && eErr == CE_None ) { if( DGifGetLine( poGDS->hGifFile, (GifPixelType*)pImage, nBlockXSize ) == GIF_ERROR ) { CPLError( CE_Failure, CPLE_AppDefined, "Failure decoding scanline of GIF file." ); return CE_Failure; } poGDS->nLastLineRead++; if( poGDS->poWorkDS != NULL ) { eErr = poGDS->poWorkDS->RasterIO( GF_Write, 0, poGDS->nLastLineRead, nBlockXSize, 1, pImage, nBlockXSize, 1, GDT_Byte, 1, NULL, 0, 0, 0, NULL ); } } return eErr; }
GDALDataset *BIGGIFDataset::Open( GDALOpenInfo * poOpenInfo ) { if( !Identify( poOpenInfo ) || poOpenInfo->fpL == NULL ) return NULL; if( poOpenInfo->eAccess == GA_Update ) { CPLError( CE_Failure, CPLE_NotSupported, "The GIF driver does not support update access to existing" " files.\n" ); return NULL; } /* -------------------------------------------------------------------- */ /* Create a corresponding GDALDataset. */ /* -------------------------------------------------------------------- */ BIGGIFDataset *poDS = new BIGGIFDataset(); poDS->fp = poOpenInfo->fpL; poOpenInfo->fpL = NULL; poDS->eAccess = GA_ReadOnly; if( poDS->ReOpen() == CE_Failure ) { delete poDS; return NULL; } /* -------------------------------------------------------------------- */ /* Capture some information from the file that is of interest. */ /* -------------------------------------------------------------------- */ poDS->nRasterXSize = poDS->hGifFile->SavedImages[0].ImageDesc.Width; poDS->nRasterYSize = poDS->hGifFile->SavedImages[0].ImageDesc.Height; if( poDS->hGifFile->SavedImages[0].ImageDesc.ColorMap == NULL && poDS->hGifFile->SColorMap == NULL ) { CPLDebug("GIF", "Skipping image without color table"); delete poDS; return NULL; } /* -------------------------------------------------------------------- */ /* Create band information objects. */ /* -------------------------------------------------------------------- */ poDS->SetBand( 1, new BIGGifRasterBand( poDS, poDS->hGifFile->SBackGroundColor )); /* -------------------------------------------------------------------- */ /* Check for georeferencing. */ /* -------------------------------------------------------------------- */ poDS->DetectGeoreferencing(poOpenInfo); /* -------------------------------------------------------------------- */ /* Initialize any PAM information. */ /* -------------------------------------------------------------------- */ poDS->SetDescription( poOpenInfo->pszFilename ); poDS->TryLoadXML( poOpenInfo->GetSiblingFiles() ); /* -------------------------------------------------------------------- */ /* Support overviews. */ /* -------------------------------------------------------------------- */ poDS->oOvManager.Initialize( poDS, poOpenInfo->pszFilename, poOpenInfo->GetSiblingFiles() ); return poDS; }
GDALDataset *BIGGIFDataset::Open( GDALOpenInfo * poOpenInfo ) { if( !Identify( poOpenInfo ) ) return NULL; if( poOpenInfo->eAccess == GA_Update ) { CPLError( CE_Failure, CPLE_NotSupported, "The GIF driver does not support update access to existing" " files.\n" ); return NULL; } /* -------------------------------------------------------------------- */ /* Open the file. */ /* -------------------------------------------------------------------- */ VSILFILE *fp; fp = VSIFOpenL( poOpenInfo->pszFilename, "r" ); if( fp == NULL ) return NULL; /* -------------------------------------------------------------------- */ /* Create a corresponding GDALDataset. */ /* -------------------------------------------------------------------- */ BIGGIFDataset *poDS; poDS = new BIGGIFDataset(); poDS->fp = fp; poDS->eAccess = GA_ReadOnly; if( poDS->ReOpen() == CE_Failure ) { delete poDS; return NULL; } /* -------------------------------------------------------------------- */ /* Capture some information from the file that is of interest. */ /* -------------------------------------------------------------------- */ poDS->nRasterXSize = poDS->hGifFile->SavedImages[0].ImageDesc.Width; poDS->nRasterYSize = poDS->hGifFile->SavedImages[0].ImageDesc.Height; /* -------------------------------------------------------------------- */ /* Create band information objects. */ /* -------------------------------------------------------------------- */ poDS->SetBand( 1, new BIGGifRasterBand( poDS, poDS->hGifFile->SBackGroundColor )); /* -------------------------------------------------------------------- */ /* Check for world file. */ /* -------------------------------------------------------------------- */ poDS->bGeoTransformValid = GDALReadWorldFile( poOpenInfo->pszFilename, NULL, poDS->adfGeoTransform ) || GDALReadWorldFile( poOpenInfo->pszFilename, ".wld", poDS->adfGeoTransform ); /* -------------------------------------------------------------------- */ /* Initialize any PAM information. */ /* -------------------------------------------------------------------- */ poDS->SetDescription( poOpenInfo->pszFilename ); poDS->TryLoadXML(); /* -------------------------------------------------------------------- */ /* Support overviews. */ /* -------------------------------------------------------------------- */ poDS->oOvManager.Initialize( poDS, poOpenInfo->pszFilename ); return poDS; }