13#ifdef DEBUGGING_ENVARS
15static int verbose_set = 0;
17#define VERBOSE (verbose_set?verbose:set_verbose())
19static int set_verbose(
void)
21 verbose = !!
getenv(
"GIF_VERBOSE");
33#define MAXCOLORMAPSIZE 256
42#define MAX_LWZ_BITS 12
45#define LOCALCOLORMAP 0x80
46#define BitSet(byte, bit) (((byte) & (bit)) == (bit))
48#define ReadOK(file,buffer,len) (gdGetBuf(buffer, len, file) > 0)
50#define LM_to_uint(a,b) (((b)<<8)|(a))
58 unsigned int BitPixel;
59 unsigned int ColorResolution;
60 unsigned int Background;
61 unsigned int AspectRatio;
71} Gif89 = { -1, -1, -1, 0 };
74#define STACK_SIZE ((1<<(MAX_LWZ_BITS))*2)
76#define CSD_BUF_SIZE 280
94static int ReadColorMap (
gdIOCtx *
fd,
int number,
unsigned char (*
buffer)[256]);
95static int DoExtension (
gdIOCtx *
fd,
int label,
int *Transparent,
int *ZeroDataBlockP);
96static int GetDataBlock (
gdIOCtx *
fd,
unsigned char *
buf,
int *ZeroDataBlockP);
100static void ReadImage (
gdImagePtr im,
gdIOCtx *
fd,
int len,
int height,
unsigned char (*cmap)[256],
int interlace,
int *ZeroDataBlockP);
136 int Transparent = (-1);
137 unsigned char buf[16];
141 int imw, imh, screen_width, screen_height;
142 int useGlobalColormap;
147 int ZeroDataBlock =
FALSE;
148 int haveGlobalColormap;
162 if (memcmp((
char *)
buf+3,
"87a", 3) == 0) {
164 }
else if (memcmp((
char *)
buf+3,
"89a", 3) == 0) {
174 BitPixel = 2<<(
buf[4]&0x07);
176 ColorResolution = (int) (((
buf[4]&0x70)>>3)+1);
178 AspectRatio =
buf[6];
184 if (haveGlobalColormap) {
185 if (ReadColorMap(
fd, BitPixel, ColorMap)) {
205 DoExtension(
fd, c, &Transparent, &ZeroDataBlock);
221 bitPixel = 1<<((
buf[8]&0x07)+1);
227 if (
left + width > screen_width ||
top + height > screen_height) {
229 printf(
"Frame is not confined to screen dimension.\n");
238 if (!useGlobalColormap) {
239 if (ReadColorMap(
fd, bitPixel, localColorMap)) {
243 ReadImage(im,
fd, width, height, localColorMap,
246 if (!haveGlobalColormap) {
248 ColorMap[
CM_RED][1] = 0xff;
252 ReadImage(im,
fd, width, height,
256 if (Transparent != (-1)) {
285static int ReadColorMap(
gdIOCtx *
fd,
int number,
unsigned char (*
buffer)[256])
288 unsigned char rgb[3];
291 for (i = 0; i < number; ++i) {
292 if (!
ReadOK(
fd, rgb,
sizeof(rgb))) {
306DoExtension(
gdIOCtx *
fd,
int label,
int *Transparent,
int *ZeroDataBlockP)
308 unsigned char buf[256];
313 (
void) GetDataBlock(
fd, (
unsigned char*)
buf, ZeroDataBlockP);
315 Gif89.disposal = (
buf[0] >> 2) & 0x7;
316 Gif89.inputFlag = (
buf[0] >> 1) & 0x1;
319 if ((
buf[0] & 0x1) != 0)
320 *Transparent =
buf[3];
322 while (GetDataBlock(
fd, (
unsigned char*)
buf, ZeroDataBlockP) > 0);
327 while (GetDataBlock(
fd, (
unsigned char*)
buf, ZeroDataBlockP) > 0)
335GetDataBlock_(
gdIOCtx *
fd,
unsigned char *
buf,
int *ZeroDataBlockP)
343 *ZeroDataBlockP =
count == 0;
354GetDataBlock(
gdIOCtx *
fd,
unsigned char *
buf,
int *ZeroDataBlockP)
359 rv = GetDataBlock_(
fd,
buf, ZeroDataBlockP);
401 if ((
count = GetDataBlock(
fd, &scd->
buf[2], ZeroDataBlockP)) <= 0)
413 for (i = scd->
curbit,
j = 0;
j < code_size; ++i, ++
j) {
414 ret |= ((scd->
buf[i / 8] & (1 << (i % 8))) != 0) <<
j;
427 rv = GetCode_(
fd, scd, code_size,flag, ZeroDataBlockP);
428 if (
VERBOSE)
printf(
"[GetCode(,%d,%d) returning %d]\n",code_size,flag,
rv);
446 GetCode(
fd, &sd->
scd, 0,
TRUE, ZeroDataBlockP);
460 }
else if (sd->
fresh) {
489 unsigned char buf[260];
494 while ((
count = GetDataBlock(
fd,
buf, ZeroDataBlockP)) > 0)
518 *sd->
sp++ = sd->
table[1][code];
519 if (code == sd->
table[0][code]) {
522 code = sd->
table[0][code];
552 rv = LWZReadByte_(
fd, sd, flag, input_code_size, ZeroDataBlockP);
553 if (
VERBOSE)
printf(
"[LWZReadByte(,%d,%d) returning %d]\n",flag,input_code_size,
rv);
559ReadImage(
gdImagePtr im,
gdIOCtx *
fd,
int len,
int height,
unsigned char (*cmap)[256],
int interlace,
int *ZeroDataBlockP)
563 int xpos = 0, ypos = 0,
pass = 0;
588 if (LWZReadByte(
fd, &sd,
TRUE, c, ZeroDataBlockP) < 0) {
602 while ((
v = LWZReadByte(
fd, &sd,
FALSE, c, ZeroDataBlockP)) >= 0) {
625 if (ypos >= height) {
647 if (LWZReadByte(
fd, &sd,
FALSE, c, ZeroDataBlockP) >=0) {
getenv(?string $name=null, bool $local_only=false)
printf(string $format, mixed ... $values)
count(Countable|array $value, int $mode=COUNT_NORMAL)
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
gdIOCtx * gdNewFileCtx(FILE *)
struct gdSource * gdSourcePtr
gdIOCtx * gdNewSSCtx(gdSourcePtr in, gdSinkPtr out)
gdImagePtr gdImageCreateFromGif(FILE *fdFile)
gdImagePtr gdImageCreateFromGifCtx(gdIOCtxPtr fd)
gdImagePtr gdImageCreateFromGifSource(gdSourcePtr inSource)
#define BitSet(byte, bit)
#define ReadOK(file, buffer, len)
struct gdIOCtx * gdIOCtxPtr
#define pass(a, b, c, mul)
gdImagePtr gdImageCreate(int sx, int sy)
void gdImageDestroy(gdImagePtr im)
void gd_error_ex(int priority, const char *format,...)
void gdImageColorTransparent(gdImagePtr im, int color)
void gdImageSetPixel(gdImagePtr im, int x, int y, int color)
unsigned char buf[CSD_BUF_SIZE]
int table[2][(1<< MAX_LWZ_BITS)]
void(* gd_free)(struct gdIOCtx *)
#define safe_emalloc(nmemb, size, offset)
strncmp(string $string1, string $string2, int $length)
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)