📄 ebgif.c
字号:
/*********************************************
*功能:读取GIF文件的全局变量
*
*
***********************************************/
static int EbReadGIFGlobal ( FILE *src, GIFSCREEN* GifScreen)
{
unsigned char buf[9];
unsigned char version[4];
fseek(src, 0L, 0);
//GIF署名(Signature)和版本号(Version)
if (!ReadOK (src, buf, 6))
return -1;
if (strncmp((char *) buf, "GIF", 3) != 0)/* not gif image*/
{
fprintf(stderr, "Err: File is not GIF \n");
return -1;
}
strncpy (GifScreen->version, (char *) buf + 3, 3);
GifScreen->version[3] = '\0';
if (strcmp(GifScreen->version, "87a") != 0 && strcmp(GifScreen->version, "89a") != 0)
{
fprintf(stderr, "Err:GIF's version is not know \n");
return -1; /* image loading error*/
}
GifScreen->transparent = -1;
GifScreen->delayTime = -1;
GifScreen->inputFlag = -1;
GifScreen->disposal = 0;
if (!ReadOK (src, buf, 7))
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->gColorTable = BitSet(buf[4], LOCALCOLORMAP);
GifScreen->Background = buf[5];
GifScreen->AspectRatio = buf[6];
if (GifScreen->gColorTable) //全局颜色列表标志/* Global Colormap */
{
if (EbReadColorMap (src, GifScreen->BitPixel, GifScreen->ColorMap))
{
fprintf(stderr, "Err: GIF read global colormap failed\n");
return -1; /* image loading error*/
}
}
return 0;
}
/*********************************************
*功能:读取GIF文件的图形标识
*
*
***********************************************/
static int EbReadImageDesc (FILE *src, IMAGEDESC* ImageDesc, GIFSCREEN* GifScreen)
{
unsigned char buf[16];
if (!ReadOK (src, buf, 9))
return -1;
ImageDesc->Left= LM_to_uint (buf[0], buf[1]); //X方向偏移量
ImageDesc->Top= LM_to_uint (buf[2], buf[3]); //Y方向偏移量
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); // 交织标志
ImageDesc->sortFlag = BitSet(buf[8], 0x20); //分类标志,如果置位表示紧跟着的局部颜色列表分类排列
if (ImageDesc->haveColorMap)
{
if (EbReadColorMap(src, ImageDesc->bitPixel, ImageDesc->ColorMap) < 0)
return -1;
}
else
{
memcpy (ImageDesc->ColorMap, GifScreen->ColorMap, MAXCOLORMAPSIZE*3);
}
return 0;
}
static int EbReadImage (FILE* src, MYBITMAP* bmp, IMAGEDESC* ImageDesc, ControlExtension * ctrl, 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 (EbLWZReadByte(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 (EbLWZReadByte(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 (ctrl->trsFlag)
{
bmp->flags |= MYBMP_TRANSPARENT;
bmp->transparent = ctrl->trsColorIndex;
}
bmp->frames = 1;
bmp->depth = 8;
EbbmpComputePitch (bmp->depth, bmp->w, &bmp->pitch, TRUE);
bmp->bits = malloc (bmp->h * bmp->pitch);
if(!bmp->bits)
return -1;
while ((v = EbLWZReadByte(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 EbReadGIF(FILE *src, GIFBITMAP *gifbmp, HDC hdc)
{
unsigned char c;
int ok = 0;
MYBITMAP mybmp;
PBITMAP pbmp;
IMAGEDESC ImageDesc;
GIFBITMAPELEMENT* pgifel=NULL;
if ( EbReadGIFGlobal(src, &(gifbmp->screen)) < 0 )
return -1;
if ( (ok = ReadOK(src, &c, 1)) == 0)
return -1;
while ( c != ';' && ok>0 )
{
switch (c)
{
case '!'://0x21-扩展块
{
if ((ok = ReadOK (src, &c, 1)) == 0)
return -1;
if ( c == 0xF9)
{
pgifel = (GIFBITMAPELEMENT*) malloc (sizeof (GIFBITMAPELEMENT));
if (pgifel == NULL)
return -1;
memset(pgifel, 0 , sizeof(GIFBITMAPELEMENT));
}
EbDoExtension(src, c, pgifel);
break;
}
case ','://0x2C-图象标识符
{
if (EbReadImageDesc (src, &ImageDesc, &(gifbmp->screen)) < 0)
return -1;
if(EbReadImage(src, &mybmp, &ImageDesc, &(pgifel->ctrl), 0 ) < 0)
return -1;
if (pgifel == NULL)
{
pgifel = (GIFBITMAPELEMENT*) malloc (sizeof (GIFBITMAPELEMENT));
if (pgifel == NULL)
return -1;
memset(pgifel, 0 , sizeof(GIFBITMAPELEMENT));
}
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;
}
gifbmp->count ++ ;
pgifel = NULL;
}
break;
}
default:
break;
}
ok = ReadOK (src, &c, 1);
}
EbRewindGIF(gifbmp);
return 0;
error:
EbCleanGIF (gifbmp);
return -1;
}
void EbInitGIF (GIFBITMAP* gifbmp)
{
memset((void *)gifbmp, 0, sizeof(GIFBITMAP));
gifbmp->first = gifbmp->current = NULL;
return;
}
void EbCleanGIF (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 EbRewindGIF (GIFBITMAP* gifbmp)
{
gifbmp->current = gifbmp->first;
}
PBITMAP EbGetCurrentGIFBmp (GIFBITMAP* gifbmp)
{
if(gifbmp->current)
return &(gifbmp->current->Bitmap);
else
return 0;
}
PBITMAP EbGetNextGIFBmp (GIFBITMAP* gifbmp)
{
gifbmp->current = gifbmp->current->next;
return EbGetCurrentGIFBmp (gifbmp);
}
PGIFBITMAPELEMENT EbGetCurrentGIFItem(GIFBITMAP* gifbmp)
{
if (gifbmp->current)
return gifbmp->current;
else
return NULL;
}
PGIFBITMAPELEMENT EbGetNextGIFItem(GIFBITMAP* gifbmp)
{
gifbmp->current = gifbmp->current->next;
if (gifbmp->current == NULL)
gifbmp->current = gifbmp->first;
return gifbmp->current;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -