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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gifalloc.c

?? 一款最完整的工業組態軟源代碼
?? C
字號:
/*****************************************************************************
*   "Gif-Lib" - Yet another gif library.				     *
*									     *
* Written by:  Gershon Elber				Ver 0.1, Jun. 1989   *
* Extensively hacked by: Eric S. Raymond		Ver 1.?, Sep 1992    *
******************************************************************************
* GIF construction tools						      *
******************************************************************************
* History:								     *
* 15 Sep 92 - Version 1.0 by Eric Raymond.				     *
*****************************************************************************/

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "gif_lib.h"

#define MAX(x, y)	(((x) > (y)) ? (x) : (y))

/******************************************************************************
* Miscellaneous utility functions					      *
******************************************************************************/

int BitSize(int n)
/* return smallest bitfield size n will fit in */
{
    register	i;

    for (i = 1; i <= 8; i++)
	if ((1 << i) >= n)
	    break;
    return(i);
}


/******************************************************************************
* Color map object functions						      *
******************************************************************************/

ColorMapObject *MakeMapObject(int ColorCount, const GifColorType *ColorMap)
/*
 * Allocate a color map of given size; initialize with contents of
 * ColorMap if that pointer is non-NULL.
 */
{
    ColorMapObject *Object;

    if (ColorCount != (1 << BitSize(ColorCount)))
	return((ColorMapObject *)NULL);

    Object = (ColorMapObject *)malloc(sizeof(ColorMapObject));
    if (Object == (ColorMapObject *)NULL)
	return((ColorMapObject *)NULL);

    Object->Colors = (GifColorType *)calloc(ColorCount, sizeof(GifColorType));
    if (Object->Colors == (GifColorType *)NULL)
	return((ColorMapObject *)NULL);

    Object->ColorCount = ColorCount;
    Object->BitsPerPixel = BitSize(ColorCount);

    if (ColorMap)
	memcpy((char *)Object->Colors,
	       (char *)ColorMap, ColorCount * sizeof(GifColorType));

    return(Object);
}

void FreeMapObject(ColorMapObject *Object)
/*
 * Free a color map object
 */
{
    free(Object->Colors);
    free(Object);
}

#ifdef DEBUG
void DumpColorMap(ColorMapObject *Object, FILE *fp)
{
    if (Object)
    {
	int i, j, Len = Object->ColorCount;

	for (i = 0; i < Len; i+=4) {
	    for (j = 0; j < 4 && j < Len; j++) {
		fprintf(fp,
			"%3d: %02x %02x %02x   ", i + j,
		       Object->Colors[i + j].Red,
		       Object->Colors[i + j].Green,
		       Object->Colors[i + j].Blue);
	    }
	    fprintf(fp, "\n");
	}
    }
}
#endif /* DEBUG */

ColorMapObject *UnionColorMap(
			 const ColorMapObject *ColorIn1,
			 const ColorMapObject *ColorIn2,
			 GifPixelType ColorTransIn2[])
/*
 * Compute the union of two given color maps and return it.  If result can't 
 * fit into 256 colors, NULL is returned, the allocated union otherwise.
 * ColorIn1 is copied as is to ColorUnion, while colors from ColorIn2 are
 * copied iff they didn't exist before.  ColorTransIn2 maps the old
 * ColorIn2 into ColorUnion color map table.
 */
{
    int i, j, CrntSlot, RoundUpTo, NewBitSize;
    ColorMapObject *ColorUnion;

    /*
     * Allocate table which will hold the result for sure.
     */
    ColorUnion
	= MakeMapObject(MAX(ColorIn1->ColorCount,ColorIn2->ColorCount)*2,NULL);

    if (ColorUnion == NULL)
	return(NULL);

    /* Copy ColorIn1 to ColorUnionSize; */
    for (i = 0; i < ColorIn1->ColorCount; i++)
	ColorUnion->Colors[i] = ColorIn1->Colors[i];
    CrntSlot = ColorIn1->ColorCount;

    /*
     * Potentially obnoxious hack:
     *
     * Back CrntSlot down past all contiguous {0, 0, 0} slots at the end
     * of table 1.  This is very useful if your display is limited to
     * 16 colors.
     */
    while (ColorIn1->Colors[CrntSlot-1].Red == 0
	   && ColorIn1->Colors[CrntSlot-1].Green == 0
	   && ColorIn1->Colors[CrntSlot-1].Red == 0)
	CrntSlot--;

    /* Copy ColorIn2 to ColorUnionSize (use old colors if they exist): */
    for (i = 0; i < ColorIn2->ColorCount && CrntSlot<=256; i++)
    {
	/* Let's see if this color already exists: */
	for (j = 0; j < ColorIn1->ColorCount; j++)
	    if (memcmp(&ColorIn1->Colors[j], &ColorIn2->Colors[i], sizeof(GifColorType)) == 0)
		break;

	if (j < ColorIn1->ColorCount)
	    ColorTransIn2[i] = j;	/* color exists in Color1 */
	else
	{
	    /* Color is new - copy it to a new slot: */
	    ColorUnion->Colors[CrntSlot] = ColorIn2->Colors[i];
	    ColorTransIn2[i] = CrntSlot++;
	}
    }

    if (CrntSlot > 256)
    {
	FreeMapObject(ColorUnion);
	return((ColorMapObject *)NULL);
    }

    NewBitSize = BitSize(CrntSlot);
    RoundUpTo = (1 << NewBitSize);

    if (RoundUpTo != ColorUnion->ColorCount)
    {
	register GifColorType	*Map = ColorUnion->Colors;

	/*
	 * Zero out slots up to next power of 2.
	 * We know these slots exist because of the way ColorUnion's
	 * start dimension was computed.
	 */
	for (j = CrntSlot; j < RoundUpTo; j++)
	    Map[j].Red = Map[j].Green = Map[j].Blue = 0;

	/* perhaps we can shrink the map? */
	if (RoundUpTo < ColorUnion->ColorCount)
	    ColorUnion->Colors 
		= (GifColorType *)realloc(Map, sizeof(GifColorType)*RoundUpTo);
    }

    ColorUnion->ColorCount = RoundUpTo;
    ColorUnion->BitsPerPixel = NewBitSize;

    return(ColorUnion);
}

void ApplyTranslation(SavedImage *Image, GifPixelType Translation[])
/*
 * Apply a given color translation to the raster bits of an image
 */
{
    register int i;
    register int RasterSize = Image->ImageDesc.Height * Image->ImageDesc.Width;

    for (i = 0; i < RasterSize; i++)
	Image->RasterBits[i] = Translation[Image->RasterBits[i]];
}

/******************************************************************************
* Extension record functions						      *
******************************************************************************/

void MakeExtension(SavedImage *New, int Function)
{
    New->Function = Function;
    /*
     * Someday we might have to deal with multiple extensions.
     */
}

int AddExtensionBlock(SavedImage *New, int Len, char ExtData[])
{
    ExtensionBlock	*ep;

    if (New->ExtensionBlocks == NULL)
	New->ExtensionBlocks = (ExtensionBlock *)malloc(sizeof(ExtensionBlock));
    else
	New->ExtensionBlocks =
	    (ExtensionBlock *)realloc(New->ExtensionBlocks,
		      sizeof(ExtensionBlock) * (New->ExtensionBlockCount + 1));

    if (New->ExtensionBlocks == NULL)
	return(GIF_ERROR);

    ep = &New->ExtensionBlocks[New->ExtensionBlockCount++];

    if ((ep->Bytes = (char *)malloc(ep->ByteCount = Len)) == NULL)
	return(GIF_ERROR);

    if (ExtData) {
	    memcpy(ep->Bytes, ExtData, Len);
        ep->Function = New->Function;
    }

    return(GIF_OK);
}

void FreeExtension(SavedImage *Image)
{
    ExtensionBlock	*ep;

    for (ep = Image->ExtensionBlocks;
	 ep < Image->ExtensionBlocks + Image->ExtensionBlockCount;
	 ep++)
	(void) free((char *)ep->Bytes);
    free((char *)Image->ExtensionBlocks);
    Image->ExtensionBlocks = NULL;
}

/******************************************************************************
* Image block allocation functions					      *
******************************************************************************/
SavedImage *MakeSavedImage(GifFileType *GifFile, const SavedImage *CopyFrom)
/*
 * Append an image block to the SavedImages array  
 */
{
    SavedImage	*sp;

    if (GifFile->SavedImages == NULL)
	GifFile->SavedImages = (SavedImage *)malloc(sizeof(SavedImage));
    else
	GifFile->SavedImages = (SavedImage *)realloc(GifFile->SavedImages,
				sizeof(SavedImage) * (GifFile->ImageCount+1));

    if (GifFile->SavedImages == NULL)
	return((SavedImage *)NULL);
    else
    {
	sp = &GifFile->SavedImages[GifFile->ImageCount++];
	memset((char *)sp, '\0', sizeof(SavedImage));

	if (CopyFrom)
	{
	    memcpy((char *)sp, CopyFrom, sizeof(SavedImage));

	    /*
	     * Make our own allocated copies of the heap fields in the
	     * copied record.  This guards against potential aliasing
	     * problems.
	     */

	    /* first, the local color map */
	    if (sp->ImageDesc.ColorMap)
		sp->ImageDesc.ColorMap =
		    MakeMapObject(CopyFrom->ImageDesc.ColorMap->ColorCount,
				  CopyFrom->ImageDesc.ColorMap->Colors);

	    /* next, the raster */
	    sp->RasterBits = (char *)malloc(sizeof(GifPixelType)
				* CopyFrom->ImageDesc.Height
				* CopyFrom->ImageDesc.Width);
	    memcpy(sp->RasterBits,
		   CopyFrom->RasterBits,
		   sizeof(GifPixelType)
			* CopyFrom->ImageDesc.Height
			* CopyFrom->ImageDesc.Width);

	    /* finally, the extension blocks */
	    if (sp->ExtensionBlocks)
	    {
		sp->ExtensionBlocks
		    = (ExtensionBlock*)malloc(sizeof(ExtensionBlock)
					      * CopyFrom->ExtensionBlockCount);
		memcpy(sp->ExtensionBlocks,
		   CopyFrom->ExtensionBlocks,
		   sizeof(ExtensionBlock)
		   	* CopyFrom->ExtensionBlockCount);

		/*
		 * For the moment, the actual blocks can take their
		 * chances with free().  We'll fix this later. 
		 */
	    }
	}

	return(sp);
    }
}

void FreeSavedImages(GifFileType *GifFile)
{
    SavedImage	*sp;

    for (sp = GifFile->SavedImages;
	 sp < GifFile->SavedImages + GifFile->ImageCount;
	 sp++)
    {
	if (sp->ImageDesc.ColorMap)
	    FreeMapObject(sp->ImageDesc.ColorMap);

	if (sp->RasterBits)
	    free((char *)sp->RasterBits);

	if (sp->ExtensionBlocks)
	    FreeExtension(sp);
    }
    free((char *) GifFile->SavedImages);
}



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲成av人在线观看导航| 欧美性猛交一区二区三区精品| 日本美女一区二区三区视频| 蜜臂av日日欢夜夜爽一区| 亚洲电影视频在线| 免费看黄色91| 99久久精品国产导航| 色婷婷av一区二区三区大白胸| 欧美性极品少妇| 91麻豆精品国产91久久久使用方法| 欧美精品色一区二区三区| 欧美电影免费观看高清完整版| 亚洲一二三级电影| 国产精品蜜臀av| 亚洲午夜久久久久久久久电影院| 丝瓜av网站精品一区二区| 国产美女精品在线| 在线视频欧美区| 久久久www成人免费无遮挡大片| 亚洲欧美色图小说| 美女爽到高潮91| 91丝袜高跟美女视频| 日韩一区二区三区视频在线观看| 亚洲丝袜精品丝袜在线| 国产揄拍国内精品对白| 欧美精品v国产精品v日韩精品 | 欧美一区二区三区人| 亚洲欧美综合另类在线卡通| 蜜乳av一区二区三区| 欧美最猛黑人xxxxx猛交| 国产精品婷婷午夜在线观看| 精品一区二区三区视频在线观看| 欧美日韩高清在线播放| 一区二区三区在线高清| 粉嫩一区二区三区性色av| 国产精品18久久久久久久久| 欧美伊人久久久久久久久影院| 国产精品私人自拍| 丁香六月久久综合狠狠色| 日韩女同互慰一区二区| 国产一区二区三区精品视频| 欧美大黄免费观看| 韩国毛片一区二区三区| 久久久精品中文字幕麻豆发布| 国产乱国产乱300精品| 国产欧美精品区一区二区三区| 成人av集中营| 亚洲一区二区不卡免费| 在线播放日韩导航| 久久av资源站| 国产精品福利一区二区三区| 在线视频一区二区免费| 麻豆国产欧美一区二区三区| 久久久久久99精品| 欧美视频在线观看一区二区| 久久国产精品区| 亚洲欧美经典视频| 欧美成人vr18sexvr| 不卡电影一区二区三区| 亚洲综合成人在线视频| 久久精品夜色噜噜亚洲a∨| 成人ar影院免费观看视频| 蜜臀av一区二区在线免费观看| 欧美国产丝袜视频| 日韩欧美国产wwwww| www..com久久爱| 韩国三级中文字幕hd久久精品| 亚洲人被黑人高潮完整版| 久久奇米777| 欧美一区二区精品在线| 欧洲精品在线观看| 岛国精品一区二区| 国内精品不卡在线| 日本欧美在线观看| 午夜私人影院久久久久| 一区二区三区在线影院| 亚洲视频一区二区在线观看| 久久影音资源网| 欧美大片一区二区| 日韩视频一区二区三区| 欧美精品日韩综合在线| 欧美日韩黄视频| 99精品视频中文字幕| 免费欧美日韩国产三级电影| 人禽交欧美网站| 免费成人深夜小野草| 九九在线精品视频| 麻豆精品精品国产自在97香蕉| 国产精品视频在线看| 国产精品久久久99| 一区二区在线观看免费| 亚洲一区二区偷拍精品| 午夜精品视频在线观看| 精品一区二区三区在线播放视频| 免费成人在线网站| 播五月开心婷婷综合| 99久久久久免费精品国产| 色av成人天堂桃色av| 在线不卡a资源高清| 国产日产精品一区| 一区二区理论电影在线观看| 日本特黄久久久高潮| 国产精品久久久久久久岛一牛影视| 国产拍欧美日韩视频二区| 亚洲免费观看在线观看| 日本sm残虐另类| av中文字幕在线不卡| 欧美成人女星排行榜| 一区二区视频在线看| 麻豆国产精品官网| 欧美日本在线一区| 中文字幕一区二区三区精华液| 亚洲午夜久久久久久久久电影院| 狠狠色丁香婷婷综合| 欧美曰成人黄网| 国产精品久久久久久亚洲毛片| 亚洲图片欧美一区| 岛国一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 亚洲不卡一区二区三区| 成人久久视频在线观看| 精品对白一区国产伦| 日韩中文字幕麻豆| 欧美老肥妇做.爰bbww| 一区二区三区日韩| 一本一本大道香蕉久在线精品 | 一区二区三区毛片| 色婷婷亚洲综合| 国产婷婷色一区二区三区四区 | 久久蜜桃一区二区| 韩国三级中文字幕hd久久精品| 欧美一区二区三区不卡| 丝袜美腿高跟呻吟高潮一区| 日韩限制级电影在线观看| 天天操天天色综合| 欧美一级午夜免费电影| 精品无码三级在线观看视频| 欧美日韩一区二区三区高清 | 成人av网站大全| 亚洲美女淫视频| 51精品久久久久久久蜜臀| 国产专区综合网| 久久免费美女视频| 成人性色生活片免费看爆迷你毛片| 国产精品三级视频| 欧美日韩1234| 国产91精品一区二区麻豆网站| 怡红院av一区二区三区| 精品精品国产高清a毛片牛牛| 成人av电影在线观看| 亚洲午夜免费福利视频| 久久午夜老司机| 成人一级黄色片| 久久精品国产第一区二区三区| 久久久国产午夜精品| 在线电影国产精品| 日本韩国欧美在线| 国产成人在线视频免费播放| 亚洲五码中文字幕| 国产欧美日本一区二区三区| 91精品国产色综合久久ai换脸 | 久久亚区不卡日本| 99r精品视频| 亚洲日本va在线观看| 91行情网站电视在线观看高清版| 精品一区二区三区在线观看国产| 一个色在线综合| 亚洲国产精品一区二区尤物区| 中文字幕高清一区| 国产欧美一区二区三区在线看蜜臀 | 日韩欧美国产午夜精品| 欧美日韩久久久| 欧美一级片在线观看| 欧美精品乱码久久久久久按摩 | 欧美一区二区三区在线| 欧美亚洲综合另类| 欧美日韩精品一区二区三区蜜桃| 91精品91久久久中77777| 91麻豆文化传媒在线观看| 91在线观看免费视频| 91国偷自产一区二区开放时间 | 在线观看一区二区视频| 欧美日韩午夜影院| 91精品在线一区二区| 久久影院午夜片一区| 国产精品毛片高清在线完整版| 亚洲影视在线播放| 日本欧美一区二区在线观看| 国产成都精品91一区二区三| 不卡视频在线看| 欧美一级午夜免费电影| 亚洲伦理在线精品| 视频在线观看国产精品| 成人av电影在线观看| 日韩一区二区三区视频| 亚洲天堂网中文字| 国产乱淫av一区二区三区| 91亚洲精品久久久蜜桃网站| 亚洲精品一线二线三线无人区| 一区二区视频免费在线观看|