diff --git a/src/configure.in b/src/configure.in index d6ac27bbc01c1be510b42aeb8a0c094a22f802f9..486079734fbb829b25683b5305987d210162c1d5 100644 --- a/src/configure.in +++ b/src/configure.in @@ -1,4 +1,4 @@ -AC_REVISION("$Id: configure.in,v 1.293 1999/05/29 15:20:51 grubba Exp $") +AC_REVISION("$Id: configure.in,v 1.294 1999/05/30 20:11:12 mirar Exp $") AC_INIT(interpret.c) AC_CONFIG_HEADER(machine.h) @@ -284,6 +284,7 @@ AC_ARG_WITH(threads, [ --without-threads no threads support],[],[with_ AC_ARG_WITH(zlib, [ --without-zlib no gz compression support],[],[with_zlib=yes]) AC_ARG_WITH(ssleay, [ --without-ssleay no support for the secure socket protocol],[],[with_ssleay=yes]) AC_ARG_WITH(mysql, [ --without-mysql no support for the Mysql database],[],[with_mysql=yes]) +AC_ARG_WITH(gif-rle, [ --with-gif-rle use kind-of-rle packing instead of lzw],[],[]) AC_ARG_WITH(dmalloc, [ --with-dmalloc enable memory-leak tests],[AC_DEFINE(DEBUG_MALLOC,10)],[]) AC_ARG_WITH(checker, [ --with-checker add extra memory checking overhead (Purify)]) AC_ARG_WITH(profiling, [ --with-profiling add code used to profile pike code ],[AC_DEFINE(PROFILING)],[]) diff --git a/src/modules/Image/encodings/gif_lzw.c b/src/modules/Image/encodings/gif_lzw.c index 13ffa228307d986ae68acd254c227295851e6f76..4cd1b40023eef9e30bf909810b71755b52cad3ff 100644 --- a/src/modules/Image/encodings/gif_lzw.c +++ b/src/modules/Image/encodings/gif_lzw.c @@ -1,10 +1,11 @@ /* **! module Image **! note -**! $Id: gif_lzw.c,v 1.5 1998/04/29 01:27:22 mirar Exp $ +**! $Id: gif_lzw.c,v 1.6 1999/05/30 20:11:14 mirar Exp $ */ #include "global.h" +#include "image_machine.h" #include "gif_lzw.h" #define DEFAULT_OUTBYTES 16384 @@ -84,19 +85,37 @@ static INLINE void lzw_add(struct gif_lzw *lzw,int c) if (lzw->current==LZWCNULL) /* no current, load */ { lzw->current=c; +#ifdef GIF_LZW_LZ + lzw->skipone=0; +#endif return; } - lno=lzw->code[lzw->current].firstchild; /* check if we have this sequence */ - while (lno!=LZWCNULL) +#ifdef GIF_LZW_RLE + if (c==lzw->code[lzw->current].c) { - if (lzw->code[lno].c==c && lno!=lzw->codes-1 ) +#endif +#ifdef GIF_LZW_LZ + if (!lzw->skipone) { - lzw->current=lno; - return; +#endif + /* check if we have this sequence */ + lno=lzw->code[lzw->current].firstchild; + while (lno!=LZWCNULL) + { + if (lzw->code[lno].c==c && lno!=lzw->codes-1 ) + { + lzw->current=lno; + return; + } + lno=lzw->code[lno].next; + } +#ifdef GIF_LZW_RLE } - lno=lzw->code[lno].next; +#endif +#ifdef GIF_LZW_LZ } +#endif if (lzw->codes==4096) /* needs more than 12 bits */ { @@ -113,6 +132,9 @@ static INLINE void lzw_add(struct gif_lzw *lzw,int c) lzw->codebits=lzw->bits+1; lzw->current=c; +#ifdef GIF_LZW_LZ + lzw->skipone=0; +#endif return; } @@ -133,6 +155,9 @@ static INLINE void lzw_add(struct gif_lzw *lzw,int c) lzw->codebits++; lzw->current=c; +#ifdef GIF_LZW_LZ + lzw->skipone=!lzw->skipone; +#endif } void image_gif_lzw_init(struct gif_lzw *lzw,int bits) diff --git a/src/modules/Image/encodings/gif_lzw.h b/src/modules/Image/encodings/gif_lzw.h index 6cfc9936138dbbe365638b7efd07115d86a7a229..aa46fabe34a091cf309011448eec1b209ce48a46 100644 --- a/src/modules/Image/encodings/gif_lzw.h +++ b/src/modules/Image/encodings/gif_lzw.h @@ -1,7 +1,7 @@ /* **! module Image **! note -**! $Id: gif_lzw.h,v 1.6 1998/05/02 01:24:25 mirar Exp $ +**! $Id: gif_lzw.h,v 1.7 1999/05/30 20:11:15 mirar Exp $ */ typedef unsigned short lzwcode_t; /* no more than 12 bits used */ @@ -23,6 +23,10 @@ struct gif_lzw int earlychange; int reversebits; + +#ifdef GIF_LZW_LZ + int skipone; /* lz marker for skip next code */ +#endif unsigned long codes; unsigned long bits; /* initial encoding bits */