亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? dgif_lib.c

?? 開(kāi)源組態(tài)軟件
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
    StackPtr = Private->StackPtr;
    Prefix = Private->Prefix;
    Suffix = Private->Suffix;
    Stack = Private->Stack;
    EOFCode = Private->EOFCode;
    ClearCode = Private->ClearCode;
    LastCode = Private->LastCode;

    if (StackPtr != 0) {
	/* Let pop the stack off before continueing to read the gif file: */
	while (StackPtr != 0 && i < LineLen) Line[i++] = Stack[--StackPtr];
    }

    while (i < LineLen) {			    /* Decode LineLen items. */
	if (DGifDecompressInput(GifFile, &CrntCode) == GIF_ERROR)
    	    return GIF_ERROR;

	if (CrntCode == EOFCode) {
	    /* Note however that usually we will not be here as we will stop */
	    /* decoding as soon as we got all the pixel, or EOF code will    */
	    /* not be read at all, and DGifGetLine/Pixel clean everything.   */
	    if (i != LineLen - 1 || Private->PixelCount != 0) {
		_GifError = D_GIF_ERR_EOF_TOO_SOON;
		return GIF_ERROR;
	    }
	    i++;
	}
	else if (CrntCode == ClearCode) {
	    /* We need to start over again: */
	    for (j = 0; j <= LZ_MAX_CODE; j++) Prefix[j] = NO_SUCH_CODE;
	    Private->RunningCode = Private->EOFCode + 1;
	    Private->RunningBits = Private->BitsPerPixel + 1;
	    Private->MaxCode1 = 1 << Private->RunningBits;
	    LastCode = Private->LastCode = NO_SUCH_CODE;
	}
	else {
	    /* Its regular code - if in pixel range simply add it to output  */
	    /* stream, otherwise trace to codes linked list until the prefix */
	    /* is in pixel range:					     */
	    if (CrntCode < ClearCode) {
		/* This is simple - its pixel scalar, so add it to output:   */
		Line[i++] = CrntCode;
	    }
	    else {
		/* Its a code to needed to be traced: trace the linked list  */
		/* until the prefix is a pixel, while pushing the suffix     */
		/* pixels on our stack. If we done, pop the stack in reverse */
		/* (thats what stack is good for!) order to output.	     */
		if (Prefix[CrntCode] == NO_SUCH_CODE) {
		    /* Only allowed if CrntCode is exactly the running code: */
		    /* In that case CrntCode = XXXCode, CrntCode or the	     */
		    /* prefix code is last code and the suffix char is	     */
		    /* exactly the prefix of last code!			     */
		    if (CrntCode == Private->RunningCode - 2) {
			CrntPrefix = LastCode;
			Suffix[Private->RunningCode - 2] =
			Stack[StackPtr++] = DGifGetPrefixChar(Prefix,
							LastCode, ClearCode);
		    }
		    else {
			_GifError = D_GIF_ERR_IMAGE_DEFECT;
			return GIF_ERROR;
		    }
		}
		else
		    CrntPrefix = CrntCode;

		/* Now (if image is O.K.) we should not get an NO_SUCH_CODE  */
		/* During the trace. As we might loop forever, in case of    */
		/* defective image, we count the number of loops we trace    */
		/* and stop if we got LZ_MAX_CODE. obviously we can not      */
		/* loop more than that.					     */
		j = 0;
		while (j++ <= LZ_MAX_CODE &&
		       CrntPrefix > ClearCode &&
		       CrntPrefix <= LZ_MAX_CODE) {
		    Stack[StackPtr++] = Suffix[CrntPrefix];
		    CrntPrefix = Prefix[CrntPrefix];
		}
		if (j >= LZ_MAX_CODE || CrntPrefix > LZ_MAX_CODE) {
		    _GifError = D_GIF_ERR_IMAGE_DEFECT;
		    return GIF_ERROR;
		}
		/* Push the last character on stack: */
		Stack[StackPtr++] = CrntPrefix;

		/* Now lets pop all the stack into output: */
		while (StackPtr != 0 && i < LineLen)
		    Line[i++] = Stack[--StackPtr];
	    }
	    if (LastCode != NO_SUCH_CODE) {
		Prefix[Private->RunningCode - 2] = LastCode;

		if (CrntCode == Private->RunningCode - 2) {
		    /* Only allowed if CrntCode is exactly the running code: */
		    /* In that case CrntCode = XXXCode, CrntCode or the	     */
		    /* prefix code is last code and the suffix char is	     */
		    /* exactly the prefix of last code!			     */
		    Suffix[Private->RunningCode - 2] =
			DGifGetPrefixChar(Prefix, LastCode, ClearCode);
		}
		else {
		    Suffix[Private->RunningCode - 2] =
			DGifGetPrefixChar(Prefix, CrntCode, ClearCode);
		}
	    }
	    LastCode = CrntCode;
	}
    }

    Private->LastCode = LastCode;
    Private->StackPtr = StackPtr;

    return GIF_OK;
}

/******************************************************************************
* Routine to trace the Prefixes linked list until we get a prefix which is    *
* not code, but a pixel value (less than ClearCode). Returns that pixel value.*
* If image is defective, we might loop here forever, so we limit the loops to *
* the maximum possible if image O.k. - LZ_MAX_CODE times.		      *
******************************************************************************/
static int DGifGetPrefixChar(unsigned int *Prefix, int Code, int ClearCode)
{
    int i = 0;

    while (Code > ClearCode && i++ <= LZ_MAX_CODE) Code = Prefix[Code];
    return Code;
}

/******************************************************************************
*   Interface for accessing the LZ codes directly. Set Code to the real code  *
* (12bits), or to -1 if EOF code is returned.				      *
******************************************************************************/
int DGifGetLZCodes(GifFileType *GifFile, int *Code)
{
    GifByteType *CodeBlock;
    GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private;

    if (!IS_READABLE(Private)) {
	/* This file was NOT open for reading: */
	_GifError = D_GIF_ERR_NOT_READABLE;
	return GIF_ERROR;
    }

    if (DGifDecompressInput(GifFile, Code) == GIF_ERROR)
	return GIF_ERROR;

    if (*Code == Private->EOFCode) {
	/* Skip rest of codes (hopefully only NULL terminating block): */
	do if (DGifGetCodeNext(GifFile, &CodeBlock) == GIF_ERROR)
    	    return GIF_ERROR;
	while (CodeBlock != NULL);

	*Code = -1;
    }
    else if (*Code == Private->ClearCode) {
	/* We need to start over again: */
	Private->RunningCode = Private->EOFCode + 1;
	Private->RunningBits = Private->BitsPerPixel + 1;
	Private->MaxCode1 = 1 << Private->RunningBits;
    }

    return GIF_OK;
}

/******************************************************************************
*   The LZ decompression input routine:					      *
*   This routine is responsable for the decompression of the bit stream from  *
* 8 bits (bytes) packets, into the real codes.				      *
*   Returns GIF_OK if read succesfully.					      *
******************************************************************************/
static int DGifDecompressInput(GifFileType *GifFile, int *Code)
{
    GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;

    GifByteType NextByte;
    static unsigned int CodeMasks[] = {
	0x0000, 0x0001, 0x0003, 0x0007,
	0x000f, 0x001f, 0x003f, 0x007f,
	0x00ff, 0x01ff, 0x03ff, 0x07ff,
	0x0fff
    };

    while (Private->CrntShiftState < Private->RunningBits) {
	/* Needs to get more bytes from input stream for next code: */
	if (DGifBufferedInput(GifFile, Private->Buf, &NextByte)
	    == GIF_ERROR) {
	    return GIF_ERROR;
	}
	Private->CrntShiftDWord |=
		((unsigned long) NextByte) << Private->CrntShiftState;
	Private->CrntShiftState += 8;
    }
    *Code = Private->CrntShiftDWord & CodeMasks[Private->RunningBits];

    Private->CrntShiftDWord >>= Private->RunningBits;
    Private->CrntShiftState -= Private->RunningBits;

    /* If code cannt fit into RunningBits bits, must raise its size. Note */
    /* however that codes above 4095 are used for special signaling.      */
    if (++Private->RunningCode > Private->MaxCode1 &&
	Private->RunningBits < LZ_BITS) {
	Private->MaxCode1 <<= 1;
	Private->RunningBits++;
    }
    return GIF_OK;
}

/******************************************************************************
*   This routines read one gif data block at a time and buffers it internally *
* so that the decompression routine could access it.			      *
*   The routine returns the next byte from its internal buffer (or read next  *
* block in if buffer empty) and returns GIF_OK if succesful.		      *
******************************************************************************/
static int DGifBufferedInput(GifFileType *GifFile, GifByteType *Buf,
						      GifByteType *NextByte)
{
    if (Buf[0] == 0) {
	/* Needs to read the next buffer - this one is empty: */
	if (READ(GifFile, Buf, 1) != 1)
	{
	    _GifError = D_GIF_ERR_READ_FAILED;
	    return GIF_ERROR;
	}
	if (READ(GifFile,&Buf[1], Buf[0]) != Buf[0])
	{
	    _GifError = D_GIF_ERR_READ_FAILED;
	    return GIF_ERROR;
	}
	*NextByte = Buf[1];
	Buf[1] = 2;	   /* We use now the second place as last char read! */
	Buf[0]--;
    }
    else {
	*NextByte = Buf[Buf[1]++];
	Buf[0]--;
    }

    return GIF_OK;
}

/******************************************************************************
* This routine reads an entire GIF into core, hanging all its state info off  *
* the GifFileType pointer.  Call DGifOpenFileName() or DGifOpenFileHandle()   *
* first to initialize I/O.  Its inverse is EGifSpew().			      *
* 
 ******************************************************************************/
int DGifSlurp(GifFileType *GifFile)
{
    int ImageSize;
    GifRecordType RecordType;
    SavedImage *sp;
    GifByteType *ExtData;
    SavedImage temp_save;

    temp_save.ExtensionBlocks=NULL;
    temp_save.ExtensionBlockCount=0;
  
    do {
	if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR)
	    return(GIF_ERROR);

	switch (RecordType) {
	    case IMAGE_DESC_RECORD_TYPE:
		if (DGifGetImageDesc(GifFile) == GIF_ERROR)
		    return(GIF_ERROR);

		sp = &GifFile->SavedImages[GifFile->ImageCount-1];
		ImageSize = sp->ImageDesc.Width * sp->ImageDesc.Height;

		sp->RasterBits
		    = (char *) malloc(ImageSize * sizeof(GifPixelType));

		if (DGifGetLine(GifFile, sp->RasterBits, ImageSize)
		    == GIF_ERROR)
		    return(GIF_ERROR);

        if (temp_save.ExtensionBlocks) {
            sp->ExtensionBlocks = temp_save.ExtensionBlocks;
            sp->ExtensionBlockCount = temp_save.ExtensionBlockCount;

            temp_save.ExtensionBlocks = NULL;
            temp_save.ExtensionBlockCount=0;

        /* FIXME: The following is wrong.  It is left in only for backwards
         * compatibility.  Someday it should go away.  Use the
         * sp->ExtensionBlocks->Function variable instead.
         */
            sp->Function = sp->ExtensionBlocks[0].Function;

        }

		break;

	    case EXTENSION_RECORD_TYPE:
		if (DGifGetExtension(GifFile,&temp_save.Function,&ExtData)==GIF_ERROR)
		    return(GIF_ERROR);
		while (ExtData != NULL) {
            
            /* Create an extension block with our data */
            if (AddExtensionBlock(&temp_save, ExtData[0], &ExtData[1])
               == GIF_ERROR)
                return (GIF_ERROR); 
            
		    if (DGifGetExtensionNext(GifFile, &ExtData) == GIF_ERROR)
			    return(GIF_ERROR);
            temp_save.Function = 0;
		}
		break;

	    case TERMINATE_RECORD_TYPE:
		break;

	    default:	/* Should be trapped by DGifGetRecordType */
		break;
	}
    } while (RecordType != TERMINATE_RECORD_TYPE);

    /* Just in case the Gif has an extension block without an associated
     * image... (Should we save this into a savefile structure with no image
     * instead?  Have to check if the present writing code can handle that as
     * well....
     */
    if (temp_save.ExtensionBlocks)
        FreeExtension(&temp_save);
    
    return(GIF_OK);
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品丝袜一区| 国产乱一区二区| 一区二区三区在线视频免费| 国产精品午夜春色av| 国产精品素人一区二区| 久久久久久久精| 国产日韩欧美在线一区| 久久精品视频一区二区三区| 精品国产电影一区二区| 久久新电视剧免费观看| 久久影院午夜论| 中文字幕欧美区| 亚洲柠檬福利资源导航| 亚洲香蕉伊在人在线观| 丝袜亚洲另类欧美| 老司机精品视频一区二区三区| 韩国女主播一区| 国产 欧美在线| 91小视频在线| 欧美日韩精品欧美日韩精品| 91麻豆精品国产无毒不卡在线观看| 91精品国产高清一区二区三区| 日韩欧美一区二区三区在线| 久久精品欧美一区二区三区麻豆| 国产欧美日韩亚州综合| 亚洲三级小视频| 午夜激情久久久| 国内精品伊人久久久久av影院| 东方aⅴ免费观看久久av| 日本精品一区二区三区高清 | 成人av在线播放网址| 一本一本大道香蕉久在线精品| 欧美日韩亚洲综合在线| 久久视频一区二区| 亚洲人精品午夜| 蜜臀av一区二区| 成人少妇影院yyyy| 欧美日韩精品一区二区在线播放 | 一区二区三区欧美视频| 丝袜美腿亚洲一区二区图片| 国产精品一区在线| 一本久道久久综合中文字幕| 欧美一区二区黄| 国产精品不卡在线观看| 日韩黄色小视频| 成人免费视频app| 欧美日韩色综合| 中文字幕乱码亚洲精品一区| 一区二区三区波多野结衣在线观看| 蜜臂av日日欢夜夜爽一区| 成人激情小说网站| 日韩网站在线看片你懂的| 国产精品久久午夜夜伦鲁鲁| 日本视频一区二区三区| 成年人网站91| 精品va天堂亚洲国产| 亚洲国产日韩在线一区模特 | 欧美日韩成人综合天天影院| 久久久久9999亚洲精品| 五月天一区二区| 成人涩涩免费视频| 日韩欧美区一区二| 亚洲精品乱码久久久久久| 国产美女久久久久| 欧美美女黄视频| 欧美国产综合一区二区| 久久国产精品无码网站| 欧美在线不卡视频| 亚洲国产精品av| 麻豆久久久久久| 欧美日韩国产综合一区二区| 最新成人av在线| 国产精品小仙女| 欧美大片在线观看| 亚洲成人免费av| 色婷婷综合久久久中文一区二区 | 国产做a爰片久久毛片| 欧美日韩免费一区二区三区| 亚洲欧洲av另类| 国产激情一区二区三区四区 | 亚洲一级二级在线| av在线不卡网| 国产人成亚洲第一网站在线播放 | 91美女在线视频| 欧美国产视频在线| 国产精品一卡二卡| 精品国产乱码久久久久久蜜臀| 日韩福利电影在线| 欧美日产国产精品| 亚洲国产日日夜夜| 欧美日韩在线一区二区| 亚洲国产综合91精品麻豆| 91蝌蚪porny成人天涯| 亚洲视频一区在线| 99re8在线精品视频免费播放| 国产精品日日摸夜夜摸av| 国产精品综合av一区二区国产馆| 欧美成人精品二区三区99精品| 美女一区二区三区| 欧美一级日韩不卡播放免费| 天天操天天色综合| 在线观看91av| 日韩综合在线视频| 日韩一卡二卡三卡| 紧缚捆绑精品一区二区| xnxx国产精品| 粉嫩一区二区三区性色av| 国产日韩欧美电影| www.性欧美| 亚洲欧美日韩精品久久久久| 在线免费亚洲电影| 亚洲高清三级视频| 日韩欧美专区在线| 国产最新精品免费| 国产精品日韩成人| 在线视频你懂得一区二区三区| 一区二区三区蜜桃网| 欧美怡红院视频| 日韩国产在线一| 欧美大片免费久久精品三p| 麻豆精品视频在线观看视频| 精品日韩99亚洲| 国产999精品久久久久久| 国产精品久久久久影院老司| 色伊人久久综合中文字幕| 午夜视频在线观看一区二区三区| 91麻豆精品国产91久久久| 精品一区二区三区影院在线午夜| 久久久国产精品午夜一区ai换脸| 国产成人精品一区二区三区四区| 国产精品成人在线观看| 欧美综合一区二区| 男人的j进女人的j一区| 欧美激情综合五月色丁香小说| 99久久伊人网影院| 亚洲va欧美va人人爽| 精品国精品自拍自在线| 波多野结衣的一区二区三区| 一区二区三区不卡视频| 精品少妇一区二区| 91日韩一区二区三区| 日本视频在线一区| 国产精品久久久久影院| 欧美日韩亚洲综合一区 | 欧美一级午夜免费电影| 国产精品1区二区.| 亚洲午夜久久久久久久久电影网| 日韩视频123| 99国产精品国产精品毛片| 日韩黄色免费网站| 国产精品二三区| 91精品国产欧美日韩| 99免费精品在线观看| 老色鬼精品视频在线观看播放| 国产精品成人免费精品自在线观看 | 欧美性大战久久久久久久蜜臀| 久久99久久99精品免视看婷婷 | 亚洲一卡二卡三卡四卡无卡久久| aaa欧美色吧激情视频| 日韩黄色片在线观看| 国产精品国产三级国产三级人妇| 91精品国产麻豆国产自产在线| 99久久精品99国产精品| 久久99国产乱子伦精品免费| 国产色91在线| 欧洲亚洲国产日韩| 亚洲.国产.中文慕字在线| 久久久久久免费| 欧美日韩国产首页在线观看| av资源网一区| 国产一区 二区| 奇米色777欧美一区二区| 亚洲免费三区一区二区| 国产天堂亚洲国产碰碰| 欧美一区二区成人6969| 色婷婷国产精品| 成人免费毛片嘿嘿连载视频| 奇米精品一区二区三区在线观看一| 亚洲精品乱码久久久久久| 中文乱码免费一区二区| 精品久久一区二区三区| 欧美二区三区的天堂| 在线免费av一区| 成人午夜精品在线| 国产麻豆91精品| 精品制服美女久久| 日韩电影在线一区二区| 亚洲成人黄色小说| 亚洲一区二区三区视频在线| 国产精品萝li| 欧美国产综合色视频| 国产亚洲欧洲997久久综合 | 国产视频一区二区在线| 精品少妇一区二区三区| 日韩无一区二区| 日韩一区二区三区高清免费看看| 欧美高清视频www夜色资源网| 欧美三区在线观看| 欧美在线一二三四区| 国产欧美精品区一区二区三区 |