本文整理汇总了C++中DGifGetExtensionNext函数的典型用法代码示例。如果您正苦于以下问题:C++ DGifGetExtensionNext函数的具体用法?C++ DGifGetExtensionNext怎么用?C++ DGifGetExtensionNext使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了DGifGetExtensionNext函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: while
GifRecordType GIFAbstractDataset::FindFirstImage( GifFileType* hGifFile )
{
GifRecordType RecordType = TERMINATE_RECORD_TYPE;
while( DGifGetRecordType(hGifFile, &RecordType) != GIF_ERROR
&& RecordType != TERMINATE_RECORD_TYPE
&& RecordType != IMAGE_DESC_RECORD_TYPE )
{
/* Skip extension records found before IMAGE_DESC_RECORD_TYPE */
if (RecordType == EXTENSION_RECORD_TYPE)
{
int nFunction;
GifByteType *pExtData = nullptr;
if (DGifGetExtension(hGifFile, &nFunction, &pExtData) == GIF_ERROR)
break;
while (pExtData != nullptr)
{
if (DGifGetExtensionNext(hGifFile, &pExtData) == GIF_ERROR)
break;
}
}
}
return RecordType;
}
示例2: dGifGetExtension
value dGifGetExtension( value hdl )
{
CAMLparam1(hdl);
CAMLlocal3(ext,exts,res);
CAMLlocal1(newres);
GifFileType *GifFile = (GifFileType*) hdl;
int func;
GifByteType *extData;
exts = Val_int(0);
if (DGifGetExtension(GifFile,&func, &extData) == GIF_ERROR){
failwith("DGifGetExtension");
}
while( extData != NULL ){
ext= alloc_string(extData[0]);
memcpy(String_val(ext), &extData[1], extData[0]);
newres = alloc_small(2,0);
caml_modify_field(newres, 0, ext);
caml_modify_field(newres, 1, exts);
exts= newres;
DGifGetExtensionNext(GifFile, &extData);
}
res = alloc_small(2,0);
caml_modify_field(res,0, Val_int(func));
caml_modify_field(res,1, exts);
CAMLreturn(res);
}
示例3: readExtensions
static int readExtensions(int ExtFunction, GifByteType *ExtData, GifInfo *info) {
if (ExtData == NULL)
return GIF_OK;
if (ExtFunction == GRAPHICS_EXT_FUNC_CODE) {
GraphicsControlBlock *GCB = &info->controlBlock[info->gifFilePtr->ImageCount];
if (DGifExtensionToGCB(ExtData[0], ExtData + 1, GCB) == GIF_ERROR)
return GIF_ERROR;
GCB->DelayTime = GCB->DelayTime > 1 ? GCB->DelayTime * 10 : DEFAULT_FRAME_DURATION_MS;
}
else if (ExtFunction == COMMENT_EXT_FUNC_CODE) {
if (getComment(ExtData, info) == GIF_ERROR) {
info->gifFilePtr->Error = D_GIF_ERR_NOT_ENOUGH_MEM;
return GIF_ERROR;
}
}
else if (ExtFunction == APPLICATION_EXT_FUNC_CODE) {
char const *string = (char const *) (ExtData + 1);
if (strncmp("NETSCAPE2.0", string, ExtData[0]) == 0
|| strncmp("ANIMEXTS1.0", string, ExtData[0]) == 0) {
if (DGifGetExtensionNext(info->gifFilePtr, &ExtData,
&ExtFunction) == GIF_ERROR)
return GIF_ERROR;
if (ExtData[0] == 3 && ExtData[1] == 1) {
info->loopCount = (uint_fast16_t) (ExtData[2] + (ExtData[3] << 8));
}
}
}
return GIF_OK;
}
示例4: gif_fileread
static GifRecordType
gif_fileread(struct gif_state *h)
{
GifRecordType RecordType;
GifByteType *Extension;
int ExtCode, rc;
const char *type;
for (;;) {
if (GIF_ERROR == DGifGetRecordType(h->gif,&RecordType)) {
if (FbiStuff::fim_filereading_debug())
FIM_FBI_PRINTF("gif: DGifGetRecordType failed\n");
PrintGifError();
return (GifRecordType)-1;
}
switch (RecordType) {
case IMAGE_DESC_RECORD_TYPE:
if (FbiStuff::fim_filereading_debug())
FIM_FBI_PRINTF("gif: IMAGE_DESC_RECORD_TYPE found\n");
return RecordType;
case EXTENSION_RECORD_TYPE:
if (FbiStuff::fim_filereading_debug())
FIM_FBI_PRINTF("gif: EXTENSION_RECORD_TYPE found\n");
for (rc = DGifGetExtension(h->gif,&ExtCode,&Extension);
NULL != Extension;
rc = DGifGetExtensionNext(h->gif,&Extension)) {
if (rc == GIF_ERROR) {
if (FbiStuff::fim_filereading_debug())
FIM_FBI_PRINTF("gif: DGifGetExtension failed\n");
PrintGifError();
return (GifRecordType)-1;
}
if (FbiStuff::fim_filereading_debug()) {
switch (ExtCode) {
case COMMENT_EXT_FUNC_CODE: type="comment"; break;
case GRAPHICS_EXT_FUNC_CODE: type="graphics"; break;
case PLAINTEXT_EXT_FUNC_CODE: type="plaintext"; break;
case APPLICATION_EXT_FUNC_CODE: type="appl"; break;
default: type="???"; break;
}
FIM_FBI_PRINTF("gif: extcode=0x%x [%s]\n",ExtCode,type);
}
}
break;
case TERMINATE_RECORD_TYPE:
if (FbiStuff::fim_filereading_debug())
FIM_FBI_PRINTF("gif: TERMINATE_RECORD_TYPE found\n");
return RecordType;
default:
if (FbiStuff::fim_filereading_debug())
FIM_FBI_PRINTF("gif: unknown record type [%d]\n",RecordType);
return (GifRecordType)-1;
}
}
}
示例5: DGifGetExtension
/******************************************************************************
* Get an extension block (see GIF manual) from gif file. This routine only
* returns the first data block, and DGifGetExtensionNext should be called
* after this one until NULL extension is returned.
* The Extension should NOT be freed by the user (not dynamically allocated).
* Note it is assumed the Extension desc. header ('!') has been read.
*****************************************************************************/
static int
DGifGetExtension(GifFileType * GifFile,
int *ExtCode,
GifByteType ** Extension) {
GifByteType Buf;
if (READ(GifFile, &Buf, 1) != 1) {
return GIF_ERROR;
}
*ExtCode = Buf;
return DGifGetExtensionNext(GifFile, Extension);
}
示例6: GIFReadLoopCount
int GIFReadLoopCount(GifFileType* const gif, GifByteType** const buf,
int* const loop_count) {
assert(!memcmp(*buf + 1, "NETSCAPE2.0", 11) ||
!memcmp(*buf + 1, "ANIMEXTS1.0", 11));
if (DGifGetExtensionNext(gif, buf) == GIF_ERROR) {
return 0;
}
if (*buf == NULL) {
return 0; // Loop count sub-block missing.
}
if ((*buf)[0] < 3 || (*buf)[1] != 1) {
return 0; // wrong size/marker
}
*loop_count = (*buf)[2] | ((*buf)[3] << 8);
return 1;
}
示例7: GIFReadMetadata
int GIFReadMetadata(GifFileType* const gif, GifByteType** const buf,
WebPData* const metadata) {
const int is_xmp = !memcmp(*buf + 1, "XMP DataXMP", 11);
const int is_icc = !memcmp(*buf + 1, "ICCRGBG1012", 11);
assert(is_xmp || is_icc);
(void)is_icc; // silence unused warning.
// Construct metadata from sub-blocks.
// Usual case (including ICC profile): In each sub-block, the
// first byte specifies its size in bytes (0 to 255) and the
// rest of the bytes contain the data.
// Special case for XMP data: In each sub-block, the first byte
// is also part of the XMP payload. XMP in GIF also has a 257
// byte padding data. See the XMP specification for details.
while (1) {
WebPData subblock;
const uint8_t* tmp;
if (DGifGetExtensionNext(gif, buf) == GIF_ERROR) {
return 0;
}
if (*buf == NULL) break; // Finished.
subblock.size = is_xmp ? (*buf)[0] + 1 : (*buf)[0];
assert(subblock.size > 0);
subblock.bytes = is_xmp ? *buf : *buf + 1;
// Note: We store returned value in 'tmp' first, to avoid
// leaking old memory in metadata->bytes on error.
tmp = (uint8_t*)realloc((void*)metadata->bytes,
metadata->size + subblock.size);
if (tmp == NULL) {
return 0;
}
memcpy((void*)(tmp + metadata->size),
subblock.bytes, subblock.size);
metadata->bytes = tmp;
metadata->size += subblock.size;
}
if (is_xmp) {
// XMP padding data is 0x01, 0xff, 0xfe ... 0x01, 0x00.
const size_t xmp_pading_size = 257;
if (metadata->size > xmp_pading_size) {
metadata->size -= xmp_pading_size;
}
}
return 1;
}
示例8: fh_gif_getsize
int fh_gif_getsize(const char *name,int *x,int *y, int /*wanted_width*/, int /*wanted_height*/)
{
int px,py;
GifFileType *gft;
GifByteType *extension;
int extcode;
GifRecordType rt;
#if GIFLIB_MAJOR >= 5
int error;
gft=DGifOpenFileName(name, &error);
#else
gft=DGifOpenFileName(name);
#endif
if(gft==NULL) gflush;
do
{
if(DGifGetRecordType(gft,&rt) == GIF_ERROR) grflush;
switch(rt)
{
case IMAGE_DESC_RECORD_TYPE:
if(DGifGetImageDesc(gft)==GIF_ERROR) grflush;
px=gft->Image.Width;
py=gft->Image.Height;
*x=px; *y=py;
DGIFCLOSEFILE(gft);
return(FH_ERROR_OK);
break;
case EXTENSION_RECORD_TYPE:
if(DGifGetExtension(gft,&extcode,&extension)==GIF_ERROR) grflush;
while(extension!=NULL)
if(DGifGetExtensionNext(gft,&extension)==GIF_ERROR) grflush;
break;
default:
break;
}
}
while( rt!= TERMINATE_RECORD_TYPE );
DGIFCLOSEFILE(gft);
return(FH_ERROR_FORMAT);
}
示例9: DGifGetExtension
static int DGifGetExtension(GifFileType * GifFile, int *ExtCode, GifByteType ** Extension)
{
GifByteType Buf;
GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private;
if (!IS_READABLE(Private))
{
_GifError = D_GIF_ERR_NOT_READABLE;
return GIF_ERROR;
}
if (READ(GifFile, &Buf, 1) != 1)
{
_GifError = D_GIF_ERR_READ_FAILED;
return GIF_ERROR;
}
*ExtCode = Buf;
return DGifGetExtensionNext(GifFile, Extension);
}
示例10: block
/******************************************************************************
Get an extension block (see GIF manual) from GIF file. This routine only
returns the first data block, and DGifGetExtensionNext should be called
after this one until NULL extension is returned.
The Extension should NOT be freed by the user (not dynamically allocated).
Note it is assumed the Extension description header has been read.
******************************************************************************/
int
DGifGetExtension(GifFileType *GifFile, int *ExtCode, GifByteType **Extension)
{
GifByteType Buf;
GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
if (!IS_READABLE(Private)) {
/* This file was NOT open for reading: */
GifFile->Error = D_GIF_ERR_NOT_READABLE;
return GIF_ERROR;
}
if (READ(GifFile, &Buf, 1) != 1) {
GifFile->Error = D_GIF_ERR_READ_FAILED;
return GIF_ERROR;
}
*ExtCode = Buf;
return DGifGetExtensionNext(GifFile, Extension);
}
示例11: fh_gif_getsize
int fh_gif_getsize(char *name,int *x,int *y)
{
int px,py;
GifFileType *gft;
GifByteType *extension;
int extcode;
GifRecordType rt;
gft=DGifOpenFileName(name);
if(gft==NULL) gflush;
do
{
if(DGifGetRecordType(gft,&rt) == GIF_ERROR) grflush;
switch(rt)
{
case IMAGE_DESC_RECORD_TYPE:
if(DGifGetImageDesc(gft)==GIF_ERROR) grflush;
px=gft->Image.Width;
py=gft->Image.Height;
*x=px; *y=py;
DGifCloseFile(gft);
return(FH_ERROR_OK);
break;
case EXTENSION_RECORD_TYPE:
if(DGifGetExtension(gft,&extcode,&extension)==GIF_ERROR) grflush;
while(extension!=NULL)
if(DGifGetExtensionNext(gft,&extension)==GIF_ERROR) grflush;
break;
default:
break;
}
}
while( rt!= TERMINATE_RECORD_TYPE );
DGifCloseFile(gft);
return(FH_ERROR_FORMAT);
}
示例12: main
//.........这里部分代码省略.........
QuitGifError(GifFileIn, GifFileOut);
switch (RecordType) {
case IMAGE_DESC_RECORD_TYPE:
if (DGifGetImageDesc(GifFileIn) == GIF_ERROR)
QuitGifError(GifFileIn, GifFileOut);
if ((++ImageNum == ImageN) && ImageNFlag) {
/* We are suppose to modify this image color map, do it: */
GifFileIn->SColorMap =ModifyColorMap(GifFileIn->SColorMap);
if (!HasGIFOutput) {
/* We can quit here, as we have the color map: */
if (GifFileIn != NULL) DGifCloseFile(GifFileIn);
fclose(ColorFile);
exit(EXIT_SUCCESS);
}
}
if (HasGIFOutput)
if (EGifPutImageDesc(GifFileOut,
GifFileIn->Image.Left, GifFileIn->Image.Top,
GifFileIn->Image.Width, GifFileIn->Image.Height,
GifFileIn->Image.Interlace,
GifFileIn->Image.ColorMap) == GIF_ERROR)
QuitGifError(GifFileIn, GifFileOut);
if (!TranslateFlag || (ImageNFlag && (ImageN != ImageNum)))
{
/* Now read image itself in decoded form as we don't */
/* really care what we have there, and this is much */
/* faster. */
if (DGifGetCode(GifFileIn, &CodeSize, &CodeBlock) == GIF_ERROR)
QuitGifError(GifFileIn, GifFileOut);
if (HasGIFOutput)
if (EGifPutCode(GifFileOut, CodeSize, CodeBlock) == GIF_ERROR)
QuitGifError(GifFileIn, GifFileOut);
while (CodeBlock != NULL) {
if (DGifGetCodeNext(GifFileIn, &CodeBlock) == GIF_ERROR)
QuitGifError(GifFileIn, GifFileOut);
if (HasGIFOutput)
if (EGifPutCodeNext(GifFileOut, CodeBlock) == GIF_ERROR)
QuitGifError(GifFileIn, GifFileOut);
}
}
else /* we need to mung pixels intices */
{
int i;
register GifPixelType *cp;
GifPixelType *Line
= (GifPixelType *) malloc(GifFileIn->Image.Width *
sizeof(GifPixelType));
for (i = 0; i < GifFileIn->Image.Height; i++) {
if (DGifGetLine(GifFileIn, Line,GifFileIn->Image.Width)
== GIF_ERROR) {
QuitGifError(GifFileIn, GifFileOut);
}
/* translation step goes here */
for (cp = Line; cp < Line+GifFileIn->Image.Width; cp++)
*cp = Translation[*cp];
if (EGifPutLine(GifFileOut,
Line, GifFileIn->Image.Width)
== GIF_ERROR) {
QuitGifError(GifFileIn, GifFileOut);
}
}
free((char *) Line);
}
break;
case EXTENSION_RECORD_TYPE:
/* Skip any extension blocks in file: */
if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) == GIF_ERROR)
QuitGifError(GifFileIn, GifFileOut);
if (HasGIFOutput)
if (EGifPutExtension(GifFileOut, ExtCode, Extension[0],
Extension) == GIF_ERROR)
QuitGifError(GifFileIn, GifFileOut);
/* No support to more than one extension blocks, so discard: */
while (Extension != NULL) {
if (DGifGetExtensionNext(GifFileIn, &Extension) == GIF_ERROR)
QuitGifError(GifFileIn, GifFileOut);
}
break;
case TERMINATE_RECORD_TYPE:
break;
default: /* Should be traps by DGifGetRecordType. */
break;
}
}
while (RecordType != TERMINATE_RECORD_TYPE);
if (DGifCloseFile(GifFileIn) == GIF_ERROR)
QuitGifError(GifFileIn, GifFileOut);
if (HasGIFOutput)
if (EGifCloseFile(GifFileOut) == GIF_ERROR)
QuitGifError(GifFileIn, GifFileOut);
return 0;
}
示例13: DDGifSlurp
void DDGifSlurp(GifInfo *info, bool shouldDecode) {
GifRecordType RecordType;
GifByteType *ExtData;
int codeSize;
int ExtFunction;
do {
if (DGifGetRecordType(info->gifFilePtr, &RecordType) == GIF_ERROR)
return;
switch (RecordType) {
case IMAGE_DESC_RECORD_TYPE:
if (DGifGetImageDesc(info->gifFilePtr, !shouldDecode) == GIF_ERROR)
return;
const uint_fast16_t requiredScreenWidth = info->gifFilePtr->Image.Left + info->gifFilePtr->Image.Width;
const uint_fast16_t requiredScreenHeight = info->gifFilePtr->Image.Top + info->gifFilePtr->Image.Height;
if (requiredScreenWidth > info->gifFilePtr->SWidth || requiredScreenHeight > info->gifFilePtr->SHeight) {
if (shouldDecode) {
void *tmpRasterBits = realloc(info->rasterBits,
requiredScreenWidth * requiredScreenHeight * sizeof(GifPixelType));
if (tmpRasterBits == NULL) {
info->gifFilePtr->Error = D_GIF_ERR_NOT_ENOUGH_MEM;
return;
}
info->rasterBits = tmpRasterBits;
}
else {
info->gifFilePtr->SWidth = requiredScreenWidth;
info->gifFilePtr->SHeight = requiredScreenHeight;
}
}
if (shouldDecode) {
if (info->gifFilePtr->Image.Interlace) {
uint_fast16_t i, j;
/*
* The way an interlaced image should be read -
* offsets and jumps...
*/
uint_fast8_t InterlacedOffset[] = {0, 4, 2, 1};
uint_fast8_t InterlacedJumps[] = {8, 8, 4, 2};
/* Need to perform 4 passes on the image */
for (i = 0; i < 4; i++)
for (j = InterlacedOffset[i]; j < info->gifFilePtr->Image.Height; j += InterlacedJumps[i]) {
if (DGifGetLine(info->gifFilePtr, info->rasterBits + j * info->gifFilePtr->Image.Width,
info->gifFilePtr->Image.Width) == GIF_ERROR)
return;
}
}
else {
if (DGifGetLine(
info->gifFilePtr, info->rasterBits,
info->gifFilePtr->Image.Width * info->gifFilePtr->Image.Height) == GIF_ERROR)
return;
}
return;
}
else {
if (DGifGetCode(info->gifFilePtr, &codeSize, &ExtData) == GIF_ERROR)
return;
while (ExtData != NULL) {
if (DGifGetCodeNext(info->gifFilePtr, &ExtData) == GIF_ERROR)
return;
}
}
break;
case EXTENSION_RECORD_TYPE:
if (DGifGetExtension(info->gifFilePtr, &ExtFunction, &ExtData) == GIF_ERROR)
return;
if (!shouldDecode) {
GraphicsControlBlock *tmpInfos = realloc(info->controlBlock,
(info->gifFilePtr->ImageCount + 1) *
sizeof(GraphicsControlBlock));
if (tmpInfos == NULL) {
info->gifFilePtr->Error = D_GIF_ERR_NOT_ENOUGH_MEM;
return;
}
info->controlBlock = tmpInfos;
info->controlBlock[info->gifFilePtr->ImageCount].DelayTime = DEFAULT_FRAME_DURATION_MS;
if (readExtensions(ExtFunction, ExtData, info) == GIF_ERROR)
return;
}
while (ExtData != NULL) {
if (DGifGetExtensionNext(info->gifFilePtr, &ExtData,
&ExtFunction) == GIF_ERROR)
return;
if (!shouldDecode) {
if (readExtensions(ExtFunction, ExtData, info) == GIF_ERROR)
return;
}
}
break;
case TERMINATE_RECORD_TYPE:
break;
default: /* Should be trapped by DGifGetRecordType */
break;
//.........这里部分代码省略.........
示例14: get_gif_saved_images
int
get_gif_saved_images( GifFileType *gif, int subimage, SavedImage **ret, int *ret_images )
{
GifRecordType RecordType;
GifByteType *ExtData;
SavedImage temp_save;
int curr_image = 0, ret_count = *ret_images ;
int status = GIF_OK;
memset( &temp_save, 0x00, sizeof( temp_save ) );
do
{
if ( (status = DGifGetRecordType(gif, &RecordType)) == GIF_ERROR)
{
break;
}
switch (RecordType)
{
case IMAGE_DESC_RECORD_TYPE:
if ((status = get_gif_image_desc(gif, &temp_save)) == GIF_OK)
{
int size = temp_save.ImageDesc.Width*temp_save.ImageDesc.Height ;
temp_save.RasterBits = realloc( temp_save.RasterBits, size );
status = DGifGetLine(gif, (unsigned char*)temp_save.RasterBits, size);
if (status == GIF_OK)
{
if( curr_image == subimage || subimage < 0 )
{
append_gif_saved_image( &temp_save, ret, &(ret_count));
}
}
++curr_image ;
}
break;
case EXTENSION_RECORD_TYPE:
status = DGifGetExtension(gif,&temp_save.Function,&ExtData);
while (ExtData != NULL && status == GIF_OK )
{
/* Create an extension block with our data */
if ((status = AddExtensionBlock(&temp_save, ExtData[0], (char*)&(ExtData[1]))) == GIF_OK)
status = DGifGetExtensionNext(gif, &ExtData);
temp_save.Function = 0;
}
break;
case TERMINATE_RECORD_TYPE:
break;
default: /* Should be trapped by DGifGetRecordType */
break;
}
}while( status == GIF_OK && RecordType != TERMINATE_RECORD_TYPE);
/* if( status == GIF_OK && *ret == NULL )
append_gif_saved_image( &temp_save, ret, &(ret_count));
else
*/
free_gif_saved_image( &temp_save, True );
*ret_images = ret_count ;
return status;
}
示例15: DGifCloseFile
CPLErr BIGGIFDataset::ReOpen()
{
/* -------------------------------------------------------------------- */
/* If the file is already open, close it so we can restart. */
/* -------------------------------------------------------------------- */
if( hGifFile != NULL )
DGifCloseFile( hGifFile );
/* -------------------------------------------------------------------- */
/* If we are actually reopening, then we assume that access to */
/* the image data is not strictly once through sequential, and */
/* we will try to create a working database in a temporary */
/* directory to hold the image as we read through it the second */
/* time. */
/* -------------------------------------------------------------------- */
if( hGifFile != NULL )
{
GDALDriver *poGTiffDriver = (GDALDriver*) GDALGetDriverByName("GTiff");
if( poGTiffDriver != NULL )
{
/* Create as a sparse file to avoid filling up the whole file */
/* while closing and then destroying this temporary dataset */
const char* apszOptions[] = { "COMPRESS=LZW", "SPARSE_OK=YES", NULL };
CPLString osTempFilename = CPLGenerateTempFilename("biggif");
osTempFilename += ".tif";
poWorkDS = poGTiffDriver->Create( osTempFilename,
nRasterXSize, nRasterYSize, 1,
GDT_Byte, const_cast<char**>(apszOptions));
}
}
/* -------------------------------------------------------------------- */
/* Open */
/* -------------------------------------------------------------------- */
VSIFSeekL( fp, 0, SEEK_SET );
nLastLineRead = -1;
#if defined(GIFLIB_MAJOR) && GIFLIB_MAJOR >= 5
int nError;
hGifFile = DGifOpen( fp, VSIGIFReadFunc, &nError );
#else
hGifFile = DGifOpen( fp, VSIGIFReadFunc );
#endif
if( hGifFile == NULL )
{
CPLError( CE_Failure, CPLE_OpenFailed,
"DGifOpen() failed. Perhaps the gif file is corrupt?\n" );
return CE_Failure;
}
/* -------------------------------------------------------------------- */
/* Find the first image record. */
/* -------------------------------------------------------------------- */
GifRecordType RecordType = TERMINATE_RECORD_TYPE;
while( DGifGetRecordType(hGifFile, &RecordType) != GIF_ERROR
&& RecordType != TERMINATE_RECORD_TYPE
&& RecordType != IMAGE_DESC_RECORD_TYPE )
{
/* Skip extension records found before IMAGE_DESC_RECORD_TYPE */
if (RecordType == EXTENSION_RECORD_TYPE)
{
int nFunction;
GifByteType *pExtData;
if (DGifGetExtension(hGifFile, &nFunction, &pExtData) == GIF_ERROR)
break;
while (pExtData != NULL)
{
if (DGifGetExtensionNext(hGifFile, &pExtData) == GIF_ERROR)
break;
}
}
}
if( RecordType != IMAGE_DESC_RECORD_TYPE )
{
DGifCloseFile( hGifFile );
hGifFile = NULL;
CPLError( CE_Failure, CPLE_OpenFailed,
"Failed to find image description record in GIF file." );
return CE_Failure;
}
if (DGifGetImageDesc(hGifFile) == GIF_ERROR)
{
DGifCloseFile( hGifFile );
hGifFile = NULL;
CPLError( CE_Failure, CPLE_OpenFailed,
"Image description reading failed in GIF file." );
return CE_Failure;
}
return CE_None;
//.........这里部分代码省略.........