⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gif.c

📁 libminigui-1.3.0.tar.gz。 miniGUI的库函数源代码!
💻 C
📖 第 1 页 / 共 2 页
字号:
static int ReadColorMap (FILE *src, int number, RGB* ColorMap){    int i;    unsigned char rgb[3];    for (i = 0; i < number; ++i) {        if (!ReadOK (src, rgb, sizeof(rgb))) {            return -1;	    }        ColorMap [i].r = rgb[0];        ColorMap [i].g = rgb[1];        ColorMap [i].b = rgb[2];    }    return 0;}static int ReadGIFGlobal ( FILE *src, GIFSCREEN* GifScreen){	unsigned char buf[9];	unsigned char version[4];    fseek(src, 0L, 0);    if (!ReadOK (src, buf, 6))        return -1;                /* not gif image*/    if (strncmp((char *) buf, "GIF", 3) != 0)        return -1;    strncpy (version, (char *) buf + 3, 3);    version [3] = '\0';    if (strcmp(version, "87a") != 0 && strcmp(version, "89a") != 0) {#ifdef _DEBUG        fprintf (stderr, "load_gif: GIF version number not 87a or 89a\n");#endif        return -1;                /* image loading error*/    }    GifScreen->transparent = -1;    GifScreen->delayTime = -1;    GifScreen->inputFlag = -1;    GifScreen->disposal = 0;    if (!ReadOK (src, buf, 7)) {#ifdef _DEBUG        fprintf (stderr, "load_gif: bad screen descriptor\n");#endif        return -1;                /* image loading error*/    }    GifScreen->Width = LM_to_uint (buf[0], buf[1]);    GifScreen->Height = LM_to_uint (buf[2], buf[3]);    GifScreen->BitPixel = 2 << (buf[4] & 0x07);    GifScreen->ColorResolution = (((buf[4] & 0x70) >> 3) + 1);    GifScreen->Background = buf[5];    GifScreen->AspectRatio = buf[6];    if (BitSet(buf[4], LOCALCOLORMAP)) {        /* Global Colormap */        if (ReadColorMap (src, GifScreen->BitPixel, GifScreen->ColorMap)) {#ifdef _DEBUG            fprintf (stderr, "load_gif: bad global colormap\n");#endif            return -1;                /* image loading error*/        }    }		return 0;}static int ReadImageDesc (FILE *src, IMAGEDESC* ImageDesc, GIFSCREEN* GifScreen){	unsigned char buf[16];	if (!ReadOK (src, buf, 9)) {#ifdef _DEBUG		fprintf (stderr, "load_gif: bad image size\n");#endif		return -1;	}	ImageDesc->Top= LM_to_uint (buf[0], buf[1]);	ImageDesc->Left= LM_to_uint (buf[2], buf[3]);	ImageDesc->Width = LM_to_uint (buf[4], buf[5]);	ImageDesc->Height = LM_to_uint (buf[6], buf[7]);	ImageDesc->haveColorMap = BitSet (buf[8], LOCALCOLORMAP);	ImageDesc->bitPixel = 1 << ((buf[8] & 0x07) + 1);    ImageDesc->interlace = BitSet(buf[8], INTERLACE);	if (ImageDesc->haveColorMap) {		if (ReadColorMap(src, ImageDesc->bitPixel, ImageDesc->ColorMap) < 0) {#ifdef _DEBUG			fprintf (stderr, "load_gif: bad local colormap\n");#endif			return -1;		}	} else {		memcpy (ImageDesc->ColorMap, GifScreen->ColorMap, MAXCOLORMAPSIZE*3);	}	return 0;}static int ReadImage (FILE* src, MYBITMAP* bmp, IMAGEDESC* ImageDesc, GIFSCREEN* GifScreen, int ignore){    unsigned char c;    int v;    int xpos = 0, ypos = 0, pass = 0;    /*     *        initialize the compression routines     */    if (!ReadOK(src, &c, 1)) {        fprintf (stderr,"load_gif: eof on image data\n");        return -1;    }    if (LWZReadByte(src, TRUE, c) < 0) {        fprintf (stderr,"load_gif: error reading image\n");        return -1;    }    /*     *        if this is an "uninteresting picture" ignore it.     */    if (ignore) {        while (LWZReadByte(src, FALSE, c) >= 0);        return -0;    }    /*image = imagenewcmap(len, height, cmapsize);*/    bmp->w = ImageDesc->Width;    bmp->h = ImageDesc->Height;    bmp->flags = MYBMP_FLOW_DOWN;    if (GifScreen->transparent > 0) {        bmp->flags |= MYBMP_TRANSPARENT;        bmp->transparent = GifScreen->transparent;    }    bmp->frames = 1;    bmp->depth = 8;    bmpComputePitch (bmp->depth, bmp->w, &bmp->pitch, TRUE);    bmp->bits = malloc (bmp->h * bmp->pitch);    if(!bmp->bits)        return -1;    while ((v = LWZReadByte(src, FALSE, c)) >= 0) {#if 0		int index = (ypos) * bmp->pitch + (xpos)*3;		bmp->bits[index + 0 ] = ImageDesc->ColorMap[CM_RED][v]; 		bmp->bits[index + 1 ] = ImageDesc->ColorMap[CM_GREEN][v];		bmp->bits[index + 2 ] = ImageDesc->ColorMap[CM_BLUE][v];#else		    	 bmp->bits[ypos * bmp->pitch + xpos] = v;#endif        ++xpos;        if (xpos == ImageDesc->Width) {            xpos = 0;            if (ImageDesc->interlace) {                switch (pass) {                case 0:                case 1:                    ypos += 8;                    break;                case 2:                    ypos += 4;                    break;                case 3:                    ypos += 2;                    break;                }                if (ypos >= ImageDesc->Height) {                    ++pass;                    switch (pass) {                    case 1:                        ypos = 4;                        break;                    case 2:                        ypos = 2;                        break;                    case 3:                        ypos = 1;                        break;                    default:                        goto fini;                    }                }            } else {                ++ypos;            }        }        if (ypos >= ImageDesc->Height)            break;    }fini:    return 0;}int ReadGIF(FILE *src, GIFBITMAP* gifbmp, HDC hdc){    unsigned char c;    int ok = 0;	MYBITMAP mybmp;	PBITMAP pbmp;	GIFSCREEN GifScreen;	IMAGEDESC ImageDesc;	GIFBITMAPELEMENT* pgifel;	if ( ReadGIFGlobal ( src, &GifScreen) < 0 ) {		return -1;	}    if ( (ok = ReadOK (src, &c, 1)) == 0) {#ifdef _debug        fprintf (stderr, "load_gif: eof on image data\n");#endif        return -1;    }	while ( c != ';' && ok>0 ){		switch (c) {		case '!':    			if ( (ok = ReadOK (src, &c, 1)) == 0) {#ifdef _debug       				 fprintf (stderr, "load_gif: eof on image data\n");#endif      				  return -1;    			}			DoExtension(src, c, &GifScreen);			break;		case ',':			gifbmp->count ++ ;			if (ReadImageDesc ( src, &ImageDesc, &GifScreen) < 0) {				return -1;			} else {				if (ReadImage ( src, &mybmp, &ImageDesc, &GifScreen, 0 ) < 0)					return -1;			}			pgifel = (GIFBITMAPELEMENT*) malloc (sizeof (GIFBITMAPELEMENT));			if (!pgifel)				return -1;			else {				pgifel->prev = pgifel->next = NULL;				pgifel->top = ImageDesc.Top;				pgifel->left = ImageDesc.Left;				pbmp = &(pgifel->Bitmap);#ifdef _USE_NEWGAL                if (ExpandMyBitmap (hdc, pbmp, &mybmp, ImageDesc.ColorMap, 0) < 0) {#else                if (ExpandMyBitmap (hdc, &mybmp, ImageDesc.ColorMap, pbmp) < 0) {#endif                    free (mybmp.bits);					goto error;                }                free (mybmp.bits);								if (gifbmp->first == NULL) {					gifbmp->first = gifbmp->current = pgifel;				} else {					pgifel->prev = gifbmp->current;					gifbmp->current->next = pgifel;					gifbmp->current = gifbmp->current->next;				}			}			break;		default:			break;		}		ok = ReadOK (src, &c, 1);		}	gifbmp->delaytime = GifScreen.delayTime;	return 0;error:    CleanGIF (gifbmp);    return -1;}void InitGIF (GIFBITMAP* gifbmp){	gifbmp->first = gifbmp->current = NULL;		return;}void CleanGIF (GIFBITMAP* gifbmp){	GIFBITMAPELEMENT *tmpel, *pel;			pel = gifbmp->first;	while (pel) {		tmpel= pel->next;		if (pel->Bitmap.bmBits)			free (pel->Bitmap.bmBits);		free (pel);		pel = tmpel;	}	return;}void RewindGIF (GIFBITMAP* gifbmp){	gifbmp->current = gifbmp->first;}PBITMAP GetCurrentGIFBmp (GIFBITMAP* gifbmp){	return &(gifbmp->current->Bitmap);}PBITMAP GetNextGIFBmp (GIFBITMAP* gifbmp){	gifbmp->current = gifbmp->current->next;	return GetCurrentGIFBmp (gifbmp);}#endif /* _EXT_FULLGIF */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -