aboutsummaryrefslogtreecommitdiff
path: root/graphics/gd
diff options
context:
space:
mode:
authorDaichi GOTO <daichi@FreeBSD.org>2003-07-01 14:11:22 +0000
committerDaichi GOTO <daichi@FreeBSD.org>2003-07-01 14:11:22 +0000
commit49dd7471848dc57ed212f632d6656b7f0d51e40f (patch)
tree7c6c42ba28e39e1df562b591789110bc2b5499a6 /graphics/gd
parent701cdee42ad3c86a059c1893ba4748a79698e63b (diff)
downloadports-49dd7471848dc57ed212f632d6656b7f0d51e40f.tar.gz
ports-49dd7471848dc57ed212f632d6656b7f0d51e40f.zip
update graphics/gd: 1.8.4 --> 2.0.15
PR: 53582 Submitted by: KATO Tsuguru <tkato@prontomail.com>
Notes
Notes: svn path=/head/; revision=83994
Diffstat (limited to 'graphics/gd')
-rw-r--r--graphics/gd/Makefile50
-rw-r--r--graphics/gd/distinfo3
-rw-r--r--graphics/gd/files/Makefile.bsd60
-rw-r--r--graphics/gd/files/gd2togif.c40
-rw-r--r--graphics/gd/files/gd_biggif_out.c823
-rw-r--r--graphics/gd/files/gd_gif_in.c573
-rw-r--r--graphics/gd/files/gd_gif_out.c46
-rw-r--r--graphics/gd/files/gd_lzw_out.c795
-rw-r--r--graphics/gd/files/gdcmpgif.c85
-rw-r--r--graphics/gd/files/giftogd2.c48
-rw-r--r--graphics/gd/files/patch-ac188
-rw-r--r--graphics/gd/files/patch-gd.h41
-rw-r--r--graphics/gd/files/patch-gdft.c92
-rw-r--r--graphics/gd/files/patch-gdkanji.c87
-rw-r--r--graphics/gd/files/patch-gdtest.c81
-rw-r--r--graphics/gd/files/patch-gdttf.c17
-rw-r--r--graphics/gd/files/patch-gif15
-rw-r--r--graphics/gd/files/patch-index.html71
-rw-r--r--graphics/gd/pkg-descr33
-rw-r--r--graphics/gd/pkg-plist23
-rw-r--r--graphics/gd/scripts/configure44
21 files changed, 2849 insertions, 366 deletions
diff --git a/graphics/gd/Makefile b/graphics/gd/Makefile
index 09e7f0ddae4a..00c93c5acbf6 100644
--- a/graphics/gd/Makefile
+++ b/graphics/gd/Makefile
@@ -6,52 +6,48 @@
#
PORTNAME= gd
-PORTVERSION= 1.8.4
-PORTREVISION= 6
+PORTVERSION= 2.0.15
CATEGORIES+= graphics
MASTER_SITES= http://www.boutell.com/gd/http/ \
ftp://ftp.boutell.com/pub/boutell/gd/ \
- http://virtual-estates.net/~mi/port-stuff/ \
${MASTER_SITE_RINGSERVER}
MASTER_SITE_SUBDIR= graphics/gd
-DISTFILES= ${DISTNAME}${EXTRACT_SUFX} gd_gif_in.c.bz2
-EXTRACT_ONLY= ${DISTNAME}${EXTRACT_SUFX}
MAINTAINER?= ports@FreeBSD.org
COMMENT?= A graphics library for fast image creation
-BUILD_DEPENDS= freetype-config:${PORTSDIR}/print/freetype2 # XXX
-LIB_DEPENDS= jpeg:${PORTSDIR}/graphics/jpeg \
- png:${PORTSDIR}/graphics/png \
- freetype:${PORTSDIR}/print/freetype2
-.if !exists(/usr/bin/bzip2)
-BUILD_DEPENDS+= bzip2:${PORTSDIR}/archivers/bzip2
-.endif
-
-FREETYPE_CONFIG?= ${LOCALBASE}/bin/freetype-config
+LIB_DEPENDS= jpeg.9:${PORTSDIR}/graphics/jpeg \
+ png.5:${PORTSDIR}/graphics/png \
+ freetype.9:${PORTSDIR}/print/freetype2
-USE_REINPLACE= yes
-MAKE_ENV= FREETYPE_CONFIG="${FREETYPE_CONFIG}"
+MAKE_ENV= WRKSRC="${WRKSRC}"
+MAKEFILE= ${FILESDIR}/Makefile.bsd
INSTALLS_SHLIB= yes
-.if defined(WITH_X11)
+.if !defined(WITHOUT_X11)
USE_XPM= yes
.endif
+.if defined(HAVE_UNISYS_LICENSE) || \
+ (defined(USA_RESIDENT) && ${USA_RESIDENT} == "YES")
+WITH_LZW= yes
+.endif
+
+.if defined(GD_FONTS)
+USE_PERL5_BUILD= yes
+SCRIPTS_ENV+= GD_FONTS="${GD_FONTS}"
+.endif
+
pre-everything::
-.if !defined(WITH_X11)
- @${ECHO_MSG}
- @${ECHO_MSG} "If you want to compile with Xpm support,"
- @${ECHO_MSG} "hit Ctrl-C right now and use \"make WITH_X11=yes\""
- @${ECHO_MSG}
+.if !defined(WITH_LZW)
+ @${ECHO_MSG} "************************************************************"
+ @${ECHO_MSG} "* If you live outside US and Canada, you can define *"
+ @${ECHO_MSG} "* WITH_LZW to enable GIF compression support. *"
+ @${ECHO_MSG} "************************************************************"
.endif
post-extract:
- @${BZIP2_CMD} -dc ${DISTDIR}/${DIST_SUBDIR}/gd_gif_in.c.bz2 \
- > ${WRKSRC}/gd_gif_in.c
-
-post-patch:
- @${REINPLACE_CMD} -e 's|<malloc.h>|<stdlib.h>|g' ${WRKSRC}/gdcache.h
+ @${CP} ${FILESDIR}/g* ${WRKSRC}
post-install:
.if !defined(NOPORTDOCS)
diff --git a/graphics/gd/distinfo b/graphics/gd/distinfo
index ed8787c2bd67..4297649caf8a 100644
--- a/graphics/gd/distinfo
+++ b/graphics/gd/distinfo
@@ -1,2 +1 @@
-MD5 (gd-1.8.4.tar.gz) = 2aef76e79f206f9798233f025f5dd28d
-MD5 (gd_gif_in.c.bz2) = 54132aea09471bb997672436dd9a1a96
+MD5 (gd-2.0.15.tar.gz) = 6ededf633b4fd054662ec123c7825fbb
diff --git a/graphics/gd/files/Makefile.bsd b/graphics/gd/files/Makefile.bsd
new file mode 100644
index 000000000000..e10d6f2aceec
--- /dev/null
+++ b/graphics/gd/files/Makefile.bsd
@@ -0,0 +1,60 @@
+PROGS!= ${MAKE} -V BIN_PROGRAMS -f ${WRKSRC}/makefile.sample
+PROGS+= gd2togif gdcmpgif giftogd2
+PROGS+= annotate # new utility, not included in makefile.sample
+TESTS= gdtest gddemo gd2time gdtestft testac fontsizetest fontwheeltest
+SRCS= gd.c gd_gd.c gd_gd2.c gd_io.c gd_io_dp.c gd_io_file.c \
+ gd_io_ss.c gd_jpeg.c gd_png.c gd_ss.c gd_topal.c \
+ gd_wbmp.c gdcache.c gdfontg.c gdfontl.c gdfontmb.c \
+ gdfonts.c gdfontt.c gdft.c gdhelpers.c gdhelpers.h \
+ gdkanji.c gdtables.c gdxpm.c jisx0208.h \
+ wbmp.c wbmp.h
+SRCS+= gd_gif_in.c gd_gif_out.c gd_biggif_out.c gd_lzw_out.c
+MAKEDIR=/usr/share/mk
+LIB=gd
+SHLIB_MAJOR=4
+SHLIB_MINOR=0
+INCS= gd.h gd_io.h gdcache.h gdfontg.h gdfontl.h gdfontmb.h \
+ gdfonts.h gdfontt.h
+SHLIB_NAME!= ${MAKE} -V SHLIB_NAME LIB=${LIB} \
+ SHLIB_MAJOR=${SHLIB_MAJOR} SHLIB_MINOR=${SHLIB_MINOR} -f ${MAKEDIR}/bsd.lib.mk
+
+CFLAGS+=-I${.CURDIR} -I${LOCALBASE}/include/freetype2/ \
+ -I${LOCALBASE}/include/freetype2/freetype -I${LOCALBASE}/include \
+ -DHAVE_LIBPNG -DHAVE_LIBJPEG -DHAVE_LIBFREETYPE -DHAVE_LIBZ
+LDADD= -L${LOCALBASE}/lib -lpng -lz -ljpeg -lfreetype -lm
+
+.ifndef WITHOUT_X11
+CFLAGS+=-I${X11BASE}/include/X11 -I${X11BASE}/include -DHAVE_XPM
+LDADD+= -L${X11BASE}/lib -lXpm -lX11
+.endif
+
+.ifdef WITH_LZW
+CFLAGS+=-DLZW_LICENCED
+.endif
+
+# The package comes with tests, but without any sort of test-harness,
+# to run them all automaticly. So building tests is disabled here. -mi
+all: lib${LIB}.a ${SHLIB_NAME} ${PROGS} # ${TESTS}
+
+lib${LIB}.a ${SHLIB_NAME}: ${SRCS}
+ ${MAKE} LIB=${LIB} SRCS="${SRCS}" \
+ SHLIB_MAJOR=${SHLIB_MAJOR} SHLIB_MINOR=${SHLIB_MINOR} \
+ CFLAGS="${CFLAGS}" -ECFLAGS LDADD="${LDADD}" \
+ -f ${MAKEDIR}/bsd.lib.mk ${.TARGET}
+
+${PROGS} ${TESTS}: ${SHLIB_NAME} lib${LIB}.a
+ ${MAKE} PROG=${.TARGET} NOMAN=1 LDADD="-L. -lgd" \
+ CFLAGS="${CFLAGS}" -ECFLAGS -f ${MAKEDIR}/bsd.prog.mk
+
+install:
+ mkdir -p ${PREFIX}/include
+ ${MAKE} LIB=${LIB} LIBDIR=${PREFIX}/lib NOPROFILE=true \
+ SHLIB_MAJOR=${SHLIB_MAJOR} SHLIB_MINOR=${SHLIB_MINOR} \
+ -f ${MAKEDIR}/bsd.lib.mk install
+ cd ${.CURDIR} && ${BSD_INSTALL_DATA} ${INCS} ${PREFIX}/include
+ cd ${.CURDIR} && ${BSD_INSTALL_PROGRAM} ${PROGS} ${PREFIX}/bin/
+ ${BSD_INSTALL_SCRIPT} ${.CURDIR}/bdftogd ${PREFIX}/bin/
+
+.if exists(${.CURDIR}/Makefile.fonts)
+.include "Makefile.fonts"
+.endif
diff --git a/graphics/gd/files/gd2togif.c b/graphics/gd/files/gd2togif.c
new file mode 100644
index 000000000000..d5fbb8921c3a
--- /dev/null
+++ b/graphics/gd/files/gd2togif.c
@@ -0,0 +1,40 @@
+#include <stdio.h>
+#include "gd.h"
+
+/* A short program which converts a .gif file into a .gd file, for
+ your convenience in creating images on the fly from a
+ basis image that must be loaded quickly. The .gd format
+ is not intended to be a general-purpose format. */
+
+int main(int argc, char **argv)
+{
+ gdImagePtr im;
+ FILE *in, *out;
+ if (argc != 3) {
+ fprintf(stderr, "Usage: gd2togif filename.gd2 filename.gif\n");
+ exit(1);
+ }
+ in = fopen(argv[1], "rb");
+ if (!in) {
+ fprintf(stderr, "Input file does not exist!\n");
+ exit(1);
+ }
+ im = gdImageCreateFromGd2(in);
+ fclose(in);
+ if (!im) {
+ fprintf(stderr, "Input is not in GIF format!\n");
+ exit(1);
+ }
+ out = fopen(argv[2], "wb");
+ if (!out) {
+ fprintf(stderr, "Output file cannot be written to!\n");
+ gdImageDestroy(im);
+ exit(1);
+ }
+ gdImageGif(im, out);
+ fclose(out);
+ gdImageDestroy(im);
+
+ return 0;
+}
+
diff --git a/graphics/gd/files/gd_biggif_out.c b/graphics/gd/files/gd_biggif_out.c
new file mode 100644
index 000000000000..29ec90f87d56
--- /dev/null
+++ b/graphics/gd/files/gd_biggif_out.c
@@ -0,0 +1,823 @@
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include "gd.h"
+
+/*
+** Wrapper functions for this module.
+*/
+
+void gdImageBigGif(gdImagePtr im, FILE *outFile)
+{
+ gdIOCtx *out = gdNewFileCtx(outFile);
+ gdImageBigGifCtx(im, out);
+ out->gd_free(out);
+}
+
+void* gdImageBigGifPtr(gdImagePtr im, int *size)
+{
+ void *rv;
+ gdIOCtx *out = gdNewDynamicCtx(2048, NULL);
+ gdImageBigGifCtx(im, out);
+ rv = gdDPExtractData(out,size);
+ out->gd_free(out);
+ return rv;
+}
+
+/* Code drawn from ppmtogif.c, from the pbmplus package
+**
+** Based on GIFENCOD by David Rowley <mgardi@watdscu.waterloo.edu>. A
+** Lempel-Zim compression based on "compress".
+**
+** Modified by Marcel Wijkstra <wijkstra@fwi.uva.nl>
+**
+** Copyright (C) 1989 by Jef Poskanzer.
+**
+** Permission to use, copy, modify, and distribute this software and its
+** documentation for any purpose and without fee is hereby granted, provided
+** that the above copyright notice appear in all copies and that both that
+** copyright notice and this permission notice appear in supporting
+** documentation. This software is provided "as is" without express or
+** implied warranty.
+**
+** The Graphics Interchange Format(c) is the Copyright property of
+** CompuServe Incorporated. GIF(sm) is a Service Mark property of
+** CompuServe Incorporated.
+*
+* Heavily modified by Mouse, 1998-02-12.
+* Remove LZW compression.
+* Added miGIF run length compression.
+*
+*/
+
+/*
+ * a code_int must be able to hold 2**GIFBITS values of type int, and also -1
+ */
+typedef int code_int;
+
+static int colorstobpp(int colors);
+static void BumpPixel (void);
+static int GIFNextPixel (gdImagePtr im);
+static void GIFEncode (gdIOCtx *fp, int GWidth, int GHeight, int GInterlace, int Background, int Transparent, int BitsPerPixel, int *Red, int *Green, int *Blue, gdImagePtr im);
+/*static void Putword (int w, gdIOCtx *fp); */
+static void GIFcompress (int, gdIOCtx *, gdImagePtr, int);
+static void output (code_int code);
+
+/* UNUSED
+* static void char_init (void);
+* static void char_out (int c);
+*/
+
+/* Allows for reuse */
+static void init_statics(void);
+
+void gdImageBigGifCtx(gdImagePtr im, gdIOCtx *out)
+{
+ int interlace, transparent, BitsPerPixel;
+
+ interlace = im->interlace;
+ transparent = im->transparent;
+
+ BitsPerPixel = colorstobpp(im->colorsTotal);
+ /* Clear any old values in statics strewn through the GIF code */
+ init_statics();
+ /* All set, let's do it. */
+ GIFEncode(
+ out, im->sx, im->sy, interlace, 0, transparent, BitsPerPixel,
+ im->red, im->green, im->blue, im);
+}
+
+static int
+colorstobpp(int colors)
+{
+ int bpp = 0;
+
+ if ( colors <= 2 )
+ bpp = 1;
+ else if ( colors <= 4 )
+ bpp = 2;
+ else if ( colors <= 8 )
+ bpp = 3;
+ else if ( colors <= 16 )
+ bpp = 4;
+ else if ( colors <= 32 )
+ bpp = 5;
+ else if ( colors <= 64 )
+ bpp = 6;
+ else if ( colors <= 128 )
+ bpp = 7;
+ else if ( colors <= 256 )
+ bpp = 8;
+ return bpp;
+ }
+
+/*****************************************************************************
+ *
+ * GIFENCODE.C - GIF Image compression interface
+ *
+ * GIFEncode( FName, GHeight, GWidth, GInterlace, Background, Transparent,
+ * BitsPerPixel, Red, Green, Blue, gdImagePtr )
+ *
+ *****************************************************************************/
+
+#define TRUE 1
+#define FALSE 0
+
+static int Width, Height;
+static int curx, cury;
+static long CountDown;
+static int Pass = 0;
+static int Interlace;
+
+/*
+ * Bump the 'curx' and 'cury' to point to the next pixel
+ */
+static void
+BumpPixel(void)
+{
+ /*
+ * Bump the current X position
+ */
+ ++curx;
+
+ /*
+ * If we are at the end of a scan line, set curx back to the beginning
+ * If we are interlaced, bump the cury to the appropriate spot,
+ * otherwise, just increment it.
+ */
+ if( curx == Width ) {
+ curx = 0;
+
+ if( !Interlace )
+ ++cury;
+ else {
+ switch( Pass ) {
+
+ case 0:
+ cury += 8;
+ if( cury >= Height ) {
+ ++Pass;
+ cury = 4;
+ }
+ break;
+
+ case 1:
+ cury += 8;
+ if( cury >= Height ) {
+ ++Pass;
+ cury = 2;
+ }
+ break;
+
+ case 2:
+ cury += 4;
+ if( cury >= Height ) {
+ ++Pass;
+ cury = 1;
+ }
+ break;
+
+ case 3:
+ cury += 2;
+ break;
+ }
+ }
+ }
+}
+
+/*
+ * Return the next pixel from the image
+ */
+static int
+GIFNextPixel(gdImagePtr im)
+{
+ int r;
+
+ if( CountDown == 0 )
+ return EOF;
+
+ --CountDown;
+
+ r = gdImageGetPixel(im, curx, cury);
+
+ BumpPixel();
+
+ return r;
+}
+
+/* public */
+
+static void
+GIFEncode(gdIOCtx *fp, int GWidth, int GHeight, int GInterlace, int Background, int Transparent, int BitsPerPixel, int *Red, int *Green, int *Blue, gdImagePtr im)
+{
+ int B;
+ int RWidth, RHeight;
+ int LeftOfs, TopOfs;
+ int Resolution;
+ int ColorMapSize;
+ int InitCodeSize;
+ int i;
+
+ Interlace = GInterlace;
+
+ ColorMapSize = 1 << BitsPerPixel;
+
+ RWidth = Width = GWidth;
+ RHeight = Height = GHeight;
+ LeftOfs = TopOfs = 0;
+
+ Resolution = BitsPerPixel;
+
+ /*
+ * Calculate number of bits we are expecting
+ */
+ CountDown = (long)Width * (long)Height;
+
+ /*
+ * Indicate which pass we are on (if interlace)
+ */
+ Pass = 0;
+
+ /*
+ * The initial code size
+ */
+ if( BitsPerPixel <= 1 )
+ InitCodeSize = 2;
+ else
+ InitCodeSize = BitsPerPixel;
+
+ /*
+ * Set up the current x and y position
+ */
+ curx = cury = 0;
+
+ /*
+ * Write the Magic header
+ */
+ gdPutBuf( Transparent < 0 ? "GIF87a" : "GIF89a", 6, fp );
+
+ /*
+ * Write out the screen width and height
+ */
+ Putword( RWidth, fp );
+ Putword( RHeight, fp );
+
+ /*
+ * Indicate that there is a global colour map
+ */
+ B = 0x80; /* Yes, there is a color map */
+
+ /*
+ * OR in the resolution
+ */
+ B |= (Resolution - 1) << 4;
+
+ /*
+ * OR in the Bits per Pixel
+ */
+ B |= (BitsPerPixel - 1);
+
+ /*
+ * Write it out
+ */
+ gdPutC( B, fp );
+
+ /*
+ * Write out the Background colour
+ */
+ gdPutC( Background, fp );
+
+ /*
+ * Byte of 0's (future expansion)
+ */
+ gdPutC( 0, fp );
+
+ /*
+ * Write out the Global Colour Map
+ */
+ for( i=0; i<ColorMapSize; ++i ) {
+ gdPutC( Red[i], fp );
+ gdPutC( Green[i], fp );
+ gdPutC( Blue[i], fp );
+ }
+
+ /*
+ * Write out extension for transparent colour index, if necessary.
+ */
+ if ( Transparent >= 0 ) {
+ gdPutC( '!', fp );
+ gdPutC( 0xf9, fp );
+ gdPutC( 4, fp );
+ gdPutC( 1, fp );
+ gdPutC( 0, fp );
+ gdPutC( 0, fp );
+ gdPutC( (unsigned char) Transparent, fp );
+ gdPutC( 0, fp );
+ }
+
+ /*
+ * Write an Image separator
+ */
+ gdPutC( ',', fp );
+
+ /*
+ * Write the Image header
+ */
+
+ Putword( LeftOfs, fp );
+ Putword( TopOfs, fp );
+ Putword( Width, fp );
+ Putword( Height, fp );
+
+ /*
+ * Write out whether or not the image is interlaced
+ */
+ if( Interlace )
+ gdPutC( 0x40, fp );
+ else
+ gdPutC( 0x00, fp );
+
+ /*
+ * Write out the initial code size
+ */
+ gdPutC( InitCodeSize, fp );
+
+ /*
+ * Go and actually compress the data
+ */
+ GIFcompress( InitCodeSize+1, fp, im, Background );
+
+ /*
+ * Write out a Zero-length packet (to end the series)
+ */
+ gdPutC( 0, fp );
+
+ /*
+ * Write the GIF file terminator
+ */
+ gdPutC( ';', fp );
+}
+
+/* Write out a word to the GIF file */
+/*static void */
+/*Putword(int w, gdIOCtx *fp) */
+/*{ */
+/* fputc( w & 0xff, fp ); */
+/* fputc( (w / 256) & 0xff, fp ); */
+/*} */
+
+#define GIFBITS 12
+
+/*-----------------------------------------------------------------------
+ *
+ * miGIF Compression - mouse and ivo's GIF-compatible compression
+ *
+ * -run length encoding compression routines-
+ *
+ * Copyright (C) 1998 Hutchison Avenue Software Corporation
+ * http://www.hasc.com
+ * info@hasc.com
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. This software is provided "AS IS." The Hutchison Avenue
+ * Software Corporation disclaims all warranties, either express or implied,
+ * including but not limited to implied warranties of merchantability and
+ * fitness for a particular purpose, with respect to this code and accompanying
+ * documentation.
+ *
+ * The miGIF compression routines do not, strictly speaking, generate files
+ * conforming to the GIF spec, since the image data is not LZW-compressed
+ * (this is the point: in order to avoid transgression of the Unisys patent
+ * on the LZW algorithm.) However, miGIF generates data streams that any
+ * reasonably sane LZW decompresser will decompress to what we want.
+ *
+ * miGIF compression uses run length encoding. It compresses horizontal runs
+ * of pixels of the same color. This type of compression gives good results
+ * on images with many runs, for example images with lines, text and solid
+ * shapes on a solid-colored background. It gives little or no compression
+ * on images with few runs, for example digital or scanned photos.
+ *
+ * der Mouse
+ * mouse@rodents.montreal.qc.ca
+ * 7D C8 61 52 5D E7 2D 39 4E F1 31 3E E8 B3 27 4B
+ *
+ * ivo@hasc.com
+ *
+ * The Graphics Interchange Format(c) is the Copyright property of
+ * CompuServe Incorporated. GIF(sm) is a Service Mark property of
+ * CompuServe Incorporated.
+ *
+ */
+
+static int rl_pixel;
+static int rl_basecode;
+static int rl_count;
+static int rl_table_pixel;
+static int rl_table_max;
+static int just_cleared;
+static int out_bits;
+static int out_bits_init;
+static int out_count;
+static int out_bump;
+static int out_bump_init;
+static int out_clear;
+static int out_clear_init;
+static int max_ocodes;
+static int code_clear;
+static int code_eof;
+static unsigned int obuf;
+static int obits;
+static gdIOCtx *ofile;
+static unsigned char oblock[256];
+static int oblen;
+
+/* Used only when debugging GIF compression code */
+/* #define DEBUGGING_ENVARS */
+
+#ifdef DEBUGGING_ENVARS
+
+static int verbose_set = 0;
+static int verbose;
+#define VERBOSE (verbose_set?verbose:set_verbose())
+
+static int set_verbose(void)
+{
+ verbose = !!getenv("GIF_VERBOSE");
+ verbose_set = 1;
+ return(verbose);
+}
+
+#else
+
+#define VERBOSE 0
+
+#endif
+
+
+static const char *binformat(unsigned int v, int nbits)
+{
+ static char bufs[8][64];
+ static int bhand = 0;
+ unsigned int bit;
+ int bno;
+ char *bp;
+
+ bhand --;
+ if (bhand < 0) bhand = (sizeof(bufs)/sizeof(bufs[0]))-1;
+ bp = &bufs[bhand][0];
+ for (bno=nbits-1,bit=1U<<bno;bno>=0;bno--,bit>>=1)
+ { *bp++ = (v & bit) ? '1' : '0';
+ if (((bno&3) == 0) && (bno != 0)) *bp++ = '.';
+ }
+ *bp = '\0';
+ return(&bufs[bhand][0]);
+}
+
+static void write_block(void)
+{
+ int i;
+
+ if (VERBOSE)
+ { printf("write_block %d:",oblen);
+ for (i=0;i<oblen;i++) printf(" %02x",oblock[i]);
+ printf("\n");
+ }
+ gdPutC(oblen,ofile);
+ gdPutBuf(&oblock[0],oblen,ofile);
+ oblen = 0;
+}
+
+static void block_out(unsigned char c)
+{
+ if (VERBOSE) printf("block_out %s\n",binformat(c,8));
+ oblock[oblen++] = c;
+ if (oblen >= 255) write_block();
+}
+
+static void block_flush(void)
+{
+ if (VERBOSE) printf("block_flush\n");
+ if (oblen > 0) write_block();
+}
+
+static void output(int val)
+{
+ if (VERBOSE) printf("output %s [%s %d %d]\n",binformat(val,out_bits),binformat(obuf,obits),obits,out_bits);
+ obuf |= val << obits;
+ obits += out_bits;
+ while (obits >= 8)
+ { block_out(obuf&0xff);
+ obuf >>= 8;
+ obits -= 8;
+ }
+ if (VERBOSE) printf("output leaving [%s %d]\n",binformat(obuf,obits),obits);
+}
+
+static void output_flush(void)
+{
+ if (VERBOSE) printf("output_flush\n");
+ if (obits > 0) block_out(obuf);
+ block_flush();
+}
+
+static void did_clear(void)
+{
+ if (VERBOSE) printf("did_clear\n");
+ out_bits = out_bits_init;
+ out_bump = out_bump_init;
+ out_clear = out_clear_init;
+ out_count = 0;
+ rl_table_max = 0;
+ just_cleared = 1;
+}
+
+static void output_plain(int c)
+{
+ if (VERBOSE) printf("output_plain %s\n",binformat(c,out_bits));
+ just_cleared = 0;
+ output(c);
+ out_count ++;
+ if (out_count >= out_bump)
+ { out_bits ++;
+ out_bump += 1 << (out_bits - 1);
+ }
+ if (out_count >= out_clear)
+ { output(code_clear);
+ did_clear();
+ }
+}
+
+static unsigned int isqrt(unsigned int x)
+{
+ unsigned int r;
+ unsigned int v;
+
+ if (x < 2) return(x);
+ for (v=x,r=1;v;v>>=2,r<<=1) ;
+ while (1)
+ { v = ((x / r) + r) / 2;
+ if ((v == r) || (v == r+1)) return(r);
+ r = v;
+ }
+}
+
+static unsigned int compute_triangle_count(unsigned int count, unsigned int nrepcodes)
+{
+ unsigned int perrep;
+ unsigned int cost;
+
+ cost = 0;
+ perrep = (nrepcodes * (nrepcodes+1)) / 2;
+ while (count >= perrep)
+ { cost += nrepcodes;
+ count -= perrep;
+ }
+ if (count > 0)
+ { unsigned int n;
+ n = isqrt(count);
+ while ((n*(n+1)) >= 2*count) n --;
+ while ((n*(n+1)) < 2*count) n ++;
+ cost += n;
+ }
+ return(cost);
+}
+
+static void max_out_clear(void)
+{
+ out_clear = max_ocodes;
+}
+
+static void reset_out_clear(void)
+{
+ out_clear = out_clear_init;
+ if (out_count >= out_clear)
+ { output(code_clear);
+ did_clear();
+ }
+}
+
+static void rl_flush_fromclear(int count)
+{
+ int n;
+
+ if (VERBOSE) printf("rl_flush_fromclear %d\n",count);
+ max_out_clear();
+ rl_table_pixel = rl_pixel;
+ n = 1;
+ while (count > 0)
+ { if (n == 1)
+ { rl_table_max = 1;
+ output_plain(rl_pixel);
+ count --;
+ }
+ else if (count >= n)
+ { rl_table_max = n;
+ output_plain(rl_basecode+n-2);
+ count -= n;
+ }
+ else if (count == 1)
+ { rl_table_max ++;
+ output_plain(rl_pixel);
+ count = 0;
+ }
+ else
+ { rl_table_max ++;
+ output_plain(rl_basecode+count-2);
+ count = 0;
+ }
+ if (out_count == 0) n = 1; else n ++;
+ }
+ reset_out_clear();
+ if (VERBOSE) printf("rl_flush_fromclear leaving table_max=%d\n",rl_table_max);
+}
+
+static void rl_flush_clearorrep(int count)
+{
+ int withclr;
+
+ if (VERBOSE) printf("rl_flush_clearorrep %d\n",count);
+ withclr = 1 + compute_triangle_count(count,max_ocodes);
+ if (withclr < count)
+ { output(code_clear);
+ did_clear();
+ rl_flush_fromclear(count);
+ }
+ else
+ { for (;count>0;count--) output_plain(rl_pixel);
+ }
+}
+
+static void rl_flush_withtable(int count)
+{
+ int repmax;
+ int repleft;
+ int leftover;
+
+ if (VERBOSE) printf("rl_flush_withtable %d\n",count);
+ repmax = count / rl_table_max;
+ leftover = count % rl_table_max;
+ repleft = (leftover ? 1 : 0);
+ if (out_count+repmax+repleft > max_ocodes)
+ { repmax = max_ocodes - out_count;
+ leftover = count - (repmax * rl_table_max);
+ repleft = 1 + compute_triangle_count(leftover,max_ocodes);
+ }
+ if (VERBOSE) printf("rl_flush_withtable repmax=%d leftover=%d repleft=%d\n",repmax,leftover,repleft);
+ if (1+compute_triangle_count(count,max_ocodes) < repmax+repleft)
+ { output(code_clear);
+ did_clear();
+ rl_flush_fromclear(count);
+ return;
+ }
+ max_out_clear();
+ for (;repmax>0;repmax--) output_plain(rl_basecode+rl_table_max-2);
+ if (leftover)
+ { if (just_cleared)
+ { rl_flush_fromclear(leftover);
+ }
+ else if (leftover == 1)
+ { output_plain(rl_pixel);
+ }
+ else
+ { output_plain(rl_basecode+leftover-2);
+ }
+ }
+ reset_out_clear();
+}
+
+static void rl_flush(void)
+{
+ /* UNUSED int table_reps; */
+ /* UNUSED int table_extra; */
+
+ if (VERBOSE) printf("rl_flush [ %d %d\n",rl_count,rl_pixel);
+ if (rl_count == 1)
+ { output_plain(rl_pixel);
+ rl_count = 0;
+ if (VERBOSE) printf("rl_flush ]\n");
+ return;
+ }
+ if (just_cleared)
+ { rl_flush_fromclear(rl_count);
+ }
+ else if ((rl_table_max < 2) || (rl_table_pixel != rl_pixel))
+ { rl_flush_clearorrep(rl_count);
+ }
+ else
+ { rl_flush_withtable(rl_count);
+ }
+ if (VERBOSE) printf("rl_flush ]\n");
+ rl_count = 0;
+}
+
+static void GIFcompress(int init_bits, gdIOCtx *outfile, gdImagePtr im, int background)
+{
+ int c;
+
+ ofile = outfile;
+ obuf = 0;
+ obits = 0;
+ oblen = 0;
+ code_clear = 1 << (init_bits - 1);
+ code_eof = code_clear + 1;
+ rl_basecode = code_eof + 1;
+ out_bump_init = (1 << (init_bits - 1)) - 1;
+ /* for images with a lot of runs, making out_clear_init larger will
+ give better compression. */
+ out_clear_init = (init_bits <= 3) ? 9 : (out_bump_init-1);
+#ifdef DEBUGGING_ENVARS
+ { const char *ocienv;
+ ocienv = getenv("GIF_OUT_CLEAR_INIT");
+ if (ocienv)
+ { out_clear_init = atoi(ocienv);
+ if (VERBOSE) printf("[overriding out_clear_init to %d]\n",out_clear_init);
+ }
+ }
+#endif
+ out_bits_init = init_bits;
+ max_ocodes = (1 << GIFBITS) - ((1 << (out_bits_init - 1)) + 3);
+ did_clear();
+ output(code_clear);
+ rl_count = 0;
+ while (1)
+ { c = GIFNextPixel(im);
+ if ((rl_count > 0) && (c != rl_pixel)) rl_flush();
+ if (c == EOF) break;
+ if (rl_pixel == c)
+ { rl_count ++;
+ }
+ else
+ { rl_pixel = c;
+ rl_count = 1;
+ }
+ }
+ output(code_eof);
+ output_flush();
+}
+
+/*-----------------------------------------------------------------------
+ *
+ * End of miGIF section - See copyright notice at start of section.
+ *
+ *-----------------------------------------------------------------------
+*/
+
+/******************************************************************************
+ *
+ * GIF Specific routines
+ *
+ ******************************************************************************/
+
+/*
+ * Number of characters so far in this 'packet'
+ */
+static int a_count;
+
+/*
+ * Set up the 'byte output' routine
+ */
+
+/* UNUSED
+* static void
+* char_init(void)
+* {
+* a_count = 0;
+* }
+*/
+
+/*
+ * Define the storage for the packet accumulator
+ */
+
+/* UNUSED static char accum[ 256 ]; */
+
+static void init_statics(void) {
+ /* Some of these are properly initialized later. What I'm doing
+ here is making sure code that depends on C's initialization
+ of statics doesn't break when the code gets called more
+ than once. */
+ Width = 0;
+ Height = 0;
+ curx = 0;
+ cury = 0;
+ CountDown = 0;
+ Pass = 0;
+ Interlace = 0;
+ a_count = 0;
+}
+
+
+/* +-------------------------------------------------------------------+ */
+/* | Copyright 1990, 1991, 1993, David Koblas. (koblas@netcom.com) | */
+/* | Permission to use, copy, modify, and distribute this software | */
+/* | and its documentation for any purpose and without fee is hereby | */
+/* | granted, provided that the above copyright notice appear in all | */
+/* | copies and that both that copyright notice and this permission | */
+/* | notice appear in supporting documentation. This software is | */
+/* | provided "as is" without express or implied warranty. | */
+/* +-------------------------------------------------------------------+ */
+
diff --git a/graphics/gd/files/gd_gif_in.c b/graphics/gd/files/gd_gif_in.c
new file mode 100644
index 000000000000..fc1b587cc8b4
--- /dev/null
+++ b/graphics/gd/files/gd_gif_in.c
@@ -0,0 +1,573 @@
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include "gd.h"
+
+/* Used only when debugging GIF compression code */
+/* #define DEBUGGING_ENVARS */
+
+#ifdef DEBUGGING_ENVARS
+
+static int verbose_set = 0;
+static int verbose;
+#define VERBOSE (verbose_set?verbose:set_verbose())
+
+static int set_verbose(void)
+{
+ verbose = !!getenv("GIF_VERBOSE");
+ verbose_set = 1;
+ return(verbose);
+}
+
+#else
+
+#define VERBOSE 0
+
+#endif
+
+
+#define MAXCOLORMAPSIZE 256
+
+#define TRUE 1
+#define FALSE 0
+
+#define CM_RED 0
+#define CM_GREEN 1
+#define CM_BLUE 2
+
+#define MAX_LWZ_BITS 12
+
+#define INTERLACE 0x40
+#define LOCALCOLORMAP 0x80
+#define BitSet(byte, bit) (((byte) & (bit)) == (bit))
+
+#define ReadOK(file,buffer,len) (gdGetBuf(buffer, len, file) != 0)
+
+#define LM_to_uint(a,b) (((b)<<8)|(a))
+
+/* We may eventually want to use this information, but def it out for now */
+#if 0
+static struct {
+ unsigned int Width;
+ unsigned int Height;
+ unsigned char ColorMap[3][MAXCOLORMAPSIZE];
+ unsigned int BitPixel;
+ unsigned int ColorResolution;
+ unsigned int Background;
+ unsigned int AspectRatio;
+} GifScreen;
+#endif
+
+static struct {
+ int transparent;
+ int delayTime;
+ int inputFlag;
+ int disposal;
+} Gif89 = { -1, -1, -1, 0 };
+
+static int ReadColorMap (gdIOCtx *fd, int number, unsigned char (*buffer)[256]);
+static int DoExtension (gdIOCtx *fd, int label, int *Transparent);
+static int GetDataBlock (gdIOCtx *fd, unsigned char *buf);
+static int GetCode (gdIOCtx *fd, int code_size, int flag);
+static int LWZReadByte (gdIOCtx *fd, int flag, int input_code_size);
+
+static void ReadImage (gdImagePtr im, gdIOCtx *fd, int len, int height, unsigned char (*cmap)[256], int interlace); /*1.4//, int ignore); */
+
+int ZeroDataBlock;
+
+gdImagePtr gdImageCreateFromGifSource(gdSourcePtr inSource)
+{
+ gdIOCtx *in = gdNewSSCtx(inSource, NULL);
+ gdImagePtr im;
+
+ im = gdImageCreateFromGifCtx(in);
+
+ in->gd_free(in);
+
+ return im;
+}
+
+gdImagePtr
+gdImageCreateFromGif(FILE *fdFile)
+{
+ gdIOCtx *fd = gdNewFileCtx(fdFile);
+ gdImagePtr im = 0;
+
+ im = gdImageCreateFromGifCtx(fd);
+
+ fd->gd_free(fd);
+
+ return im;
+}
+
+gdImagePtr
+gdImageCreateFromGifCtx(gdIOCtxPtr fd)
+{
+/* 1.4 int imageNumber; */
+ int BitPixel;
+ int ColorResolution;
+ int Background;
+ int AspectRatio;
+ int Transparent = (-1);
+ unsigned char buf[16];
+ unsigned char c;
+ unsigned char ColorMap[3][MAXCOLORMAPSIZE];
+ unsigned char localColorMap[3][MAXCOLORMAPSIZE];
+ int imw, imh;
+ int useGlobalColormap;
+ int bitPixel;
+ int i;
+ /*1.4//int imageCount = 0; */
+ char version[4];
+
+ gdImagePtr im = 0;
+ ZeroDataBlock = FALSE;
+
+ /*1.4//imageNumber = 1; */
+ if (! ReadOK(fd,buf,6)) {
+ return 0;
+ }
+ if (strncmp((char *)buf,"GIF",3) != 0) {
+ return 0;
+ }
+ strncpy(version, (char *)buf + 3, 3);
+ version[3] = '\0';
+
+ if ((strcmp(version, "87a") != 0) && (strcmp(version, "89a") != 0)) {
+ return 0;
+ }
+ if (! ReadOK(fd,buf,7)) {
+ return 0;
+ }
+ BitPixel = 2<<(buf[4]&0x07);
+ ColorResolution = (int) (((buf[4]&0x70)>>3)+1);
+ Background = buf[5];
+ AspectRatio = buf[6];
+
+ if (BitSet(buf[4], LOCALCOLORMAP)) { /* Global Colormap */
+ if (ReadColorMap(fd, BitPixel, ColorMap)) {
+ return 0;
+ }
+ }
+ for (;;) {
+ if (! ReadOK(fd,&c,1)) {
+ return 0;
+ }
+ if (c == ';') { /* GIF terminator */
+ goto terminated;
+ }
+
+ if (c == '!') { /* Extension */
+ if (! ReadOK(fd,&c,1)) {
+ return 0;
+ }
+ DoExtension(fd, c, &Transparent);
+ continue;
+ }
+
+ if (c != ',') { /* Not a valid start character */
+ continue;
+ }
+
+ /*1.4//++imageCount; */
+
+ if (! ReadOK(fd,buf,9)) {
+ return 0;
+ }
+
+ useGlobalColormap = ! BitSet(buf[8], LOCALCOLORMAP);
+
+ bitPixel = 1<<((buf[8]&0x07)+1);
+
+ imw = LM_to_uint(buf[4],buf[5]);
+ imh = LM_to_uint(buf[6],buf[7]);
+ if (!(im = gdImageCreate(imw, imh))) {
+ return 0;
+ }
+ im->interlace = BitSet(buf[8], INTERLACE);
+ if (! useGlobalColormap) {
+ if (ReadColorMap(fd, bitPixel, localColorMap)) {
+ return 0;
+ }
+ ReadImage(im, fd, imw, imh, localColorMap,
+ BitSet(buf[8], INTERLACE));
+ /*1.4//imageCount != imageNumber); */
+ } else {
+ ReadImage(im, fd, imw, imh,
+ ColorMap,
+ BitSet(buf[8], INTERLACE));
+ /*1.4//imageCount != imageNumber); */
+ }
+ if (Transparent != (-1)) {
+ gdImageColorTransparent(im, Transparent);
+ }
+ goto terminated;
+ }
+
+terminated:
+ /* Terminator before any image was declared! */
+ if (!im) {
+ return 0;
+ }
+ /* Check for open colors at the end, so
+ we can reduce colorsTotal and ultimately
+ BitsPerPixel */
+ for (i=((im->colorsTotal-1)); (i>=0); i--) {
+ if (im->open[i]) {
+ im->colorsTotal--;
+ } else {
+ break;
+ }
+ }
+ return im;
+}
+
+static int
+ReadColorMap(gdIOCtx *fd, int number, unsigned char (*buffer)[256])
+{
+ int i;
+ unsigned char rgb[3];
+
+
+ for (i = 0; i < number; ++i) {
+ if (! ReadOK(fd, rgb, sizeof(rgb))) {
+ return TRUE;
+ }
+ buffer[CM_RED][i] = rgb[0] ;
+ buffer[CM_GREEN][i] = rgb[1] ;
+ buffer[CM_BLUE][i] = rgb[2] ;
+ }
+
+
+ return FALSE;
+}
+
+static int
+DoExtension(gdIOCtx *fd, int label, int *Transparent)
+{
+ static unsigned char buf[256];
+
+ switch (label) {
+ case 0xf9: /* Graphic Control Extension */
+ (void) GetDataBlock(fd, (unsigned char*) buf);
+ Gif89.disposal = (buf[0] >> 2) & 0x7;
+ Gif89.inputFlag = (buf[0] >> 1) & 0x1;
+ Gif89.delayTime = LM_to_uint(buf[1],buf[2]);
+ if ((buf[0] & 0x1) != 0)
+ *Transparent = buf[3];
+
+ while (GetDataBlock(fd, (unsigned char*) buf) != 0)
+ ;
+ return FALSE;
+ default:
+ break;
+ }
+ while (GetDataBlock(fd, (unsigned char*) buf) != 0)
+ ;
+
+ return FALSE;
+}
+
+static int
+GetDataBlock_(gdIOCtx *fd, unsigned char *buf)
+{
+ unsigned char count;
+
+ if (! ReadOK(fd,&count,1)) {
+ return -1;
+ }
+
+ ZeroDataBlock = count == 0;
+
+ if ((count != 0) && (! ReadOK(fd, buf, count))) {
+ return -1;
+ }
+
+ return count;
+}
+
+static int
+GetDataBlock(gdIOCtx *fd, unsigned char *buf)
+{
+ int rv;
+ int i;
+
+ rv = GetDataBlock_(fd,buf);
+ if (VERBOSE)
+ { printf("[GetDataBlock returning %d",rv);
+ if (rv > 0)
+ { printf(":");
+ for (i=0;i<rv;i++) printf(" %02x",buf[i]);
+ }
+ printf("]\n");
+ }
+ return(rv);
+}
+
+static int
+GetCode_(gdIOCtx *fd, int code_size, int flag)
+{
+ static unsigned char buf[280];
+ static int curbit, lastbit, done, last_byte;
+ int i, j, ret;
+ unsigned char count;
+
+ if (flag) {
+ curbit = 0;
+ lastbit = 0;
+ done = FALSE;
+ return 0;
+ }
+
+ if ( (curbit+code_size) >= lastbit) {
+ if (done) {
+ if (curbit >= lastbit) {
+ /* Oh well */
+ }
+ return -1;
+ }
+ buf[0] = buf[last_byte-2];
+ buf[1] = buf[last_byte-1];
+
+ if ((count = GetDataBlock(fd, &buf[2])) == 0)
+ done = TRUE;
+
+ last_byte = 2 + count;
+ curbit = (curbit - lastbit) + 16;
+ lastbit = (2+count)*8 ;
+ }
+
+ ret = 0;
+ for (i = curbit, j = 0; j < code_size; ++i, ++j)
+ ret |= ((buf[ i / 8 ] & (1 << (i % 8))) != 0) << j;
+
+ curbit += code_size;
+ return ret;
+}
+
+static int
+GetCode(gdIOCtx *fd, int code_size, int flag)
+{
+ int rv;
+
+ rv = GetCode_(fd,code_size,flag);
+ if (VERBOSE) printf("[GetCode(,%d,%d) returning %d]\n",code_size,flag,rv);
+ return(rv);
+}
+
+#define STACK_SIZE ((1<<(MAX_LWZ_BITS))*2)
+static int
+LWZReadByte_(gdIOCtx *fd, int flag, int input_code_size)
+{
+ static int fresh = FALSE;
+ int code, incode;
+ static int code_size, set_code_size;
+ static int max_code, max_code_size;
+ static int firstcode, oldcode;
+ static int clear_code, end_code;
+ static int table[2][(1<< MAX_LWZ_BITS)];
+ static int stack[STACK_SIZE], *sp;
+ register int i;
+
+ if (flag) {
+ set_code_size = input_code_size;
+ code_size = set_code_size+1;
+ clear_code = 1 << set_code_size ;
+ end_code = clear_code + 1;
+ max_code_size = 2*clear_code;
+ max_code = clear_code+2;
+
+ GetCode(fd, 0, TRUE);
+
+ fresh = TRUE;
+
+ for (i = 0; i < clear_code; ++i) {
+ table[0][i] = 0;
+ table[1][i] = i;
+ }
+ for (; i < (1<<MAX_LWZ_BITS); ++i)
+ table[0][i] = table[1][0] = 0;
+
+ sp = stack;
+
+ return 0;
+ } else if (fresh) {
+ fresh = FALSE;
+ do {
+ firstcode = oldcode =
+ GetCode(fd, code_size, FALSE);
+ } while (firstcode == clear_code);
+ return firstcode;
+ }
+
+ if (sp > stack)
+ return *--sp;
+
+ while ((code = GetCode(fd, code_size, FALSE)) >= 0) {
+ if (code == clear_code) {
+ for (i = 0; i < clear_code; ++i) {
+ table[0][i] = 0;
+ table[1][i] = i;
+ }
+ for (; i < (1<<MAX_LWZ_BITS); ++i)
+ table[0][i] = table[1][i] = 0;
+ code_size = set_code_size+1;
+ max_code_size = 2*clear_code;
+ max_code = clear_code+2;
+ sp = stack;
+ firstcode = oldcode =
+ GetCode(fd, code_size, FALSE);
+ return firstcode;
+ } else if (code == end_code) {
+ int count;
+ unsigned char buf[260];
+
+ if (ZeroDataBlock)
+ return -2;
+
+ while ((count = GetDataBlock(fd, buf)) > 0)
+ ;
+
+ if (count != 0)
+ return -2;
+ }
+
+ incode = code;
+
+ if (sp == (stack + STACK_SIZE)) {
+ /* Bad compressed data stream */
+ return -1;
+ }
+
+ if (code >= max_code) {
+ *sp++ = firstcode;
+ code = oldcode;
+ }
+
+ while (code >= clear_code) {
+ if (sp == (stack + STACK_SIZE)) {
+ /* Bad compressed data stream */
+ return -1;
+ }
+ *sp++ = table[1][code];
+ if (code == table[0][code]) {
+ /* Oh well */
+ }
+ code = table[0][code];
+ }
+
+ *sp++ = firstcode = table[1][code];
+
+ if ((code = max_code) <(1<<MAX_LWZ_BITS)) {
+ table[0][code] = oldcode;
+ table[1][code] = firstcode;
+ ++max_code;
+ if ((max_code >= max_code_size) &&
+ (max_code_size < (1<<MAX_LWZ_BITS))) {
+ max_code_size *= 2;
+ ++code_size;
+ }
+ }
+
+ oldcode = incode;
+
+ if (sp > stack)
+ return *--sp;
+ }
+ return code;
+}
+
+static int
+LWZReadByte(gdIOCtx *fd, int flag, int input_code_size)
+{
+ int rv;
+
+ rv = LWZReadByte_(fd,flag,input_code_size);
+ if (VERBOSE) printf("[LWZReadByte(,%d,%d) returning %d]\n",flag,input_code_size,rv);
+ return(rv);
+}
+
+static void
+ReadImage(gdImagePtr im, gdIOCtx *fd, int len, int height, unsigned char (*cmap)[256], int interlace) /*1.4//, int ignore) */
+{
+ unsigned char c;
+ int v;
+ int xpos = 0, ypos = 0, pass = 0;
+ int i;
+ /* Stash the color map into the image */
+ for (i=0; (i<gdMaxColors); i++) {
+ im->red[i] = cmap[CM_RED][i];
+ im->green[i] = cmap[CM_GREEN][i];
+ im->blue[i] = cmap[CM_BLUE][i];
+ im->open[i] = 1;
+ }
+ /* Many (perhaps most) of these colors will remain marked open. */
+ im->colorsTotal = gdMaxColors;
+ /*
+ ** Initialize the Compression routines
+ */
+ if (! ReadOK(fd,&c,1)) {
+ return;
+ }
+ if (LWZReadByte(fd, TRUE, c) < 0) {
+ return;
+ }
+
+ /*
+ ** If this is an "uninteresting picture" ignore it.
+ ** REMOVED For 1.4
+ */
+ /*if (ignore) { */
+ /* while (LWZReadByte(fd, FALSE, c) >= 0) */
+ /* ; */
+ /* return; */
+ /*} */
+
+ while ((v = LWZReadByte(fd,FALSE,c)) >= 0 ) {
+ /* This how we recognize which colors are actually used. */
+ if (im->open[v]) {
+ im->open[v] = 0;
+ }
+ gdImageSetPixel(im, xpos, ypos, v);
+ ++xpos;
+ if (xpos == len) {
+ xpos = 0;
+ if (interlace) {
+ switch (pass) {
+ case 0:
+ case 1:
+ ypos += 8; break;
+ case 2:
+ ypos += 4; break;
+ case 3:
+ ypos += 2; break;
+ }
+
+ if (ypos >= 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 >= height)
+ break;
+ }
+
+fini:
+ if (LWZReadByte(fd,FALSE,c)>=0) {
+ /* Ignore extra */
+ }
+}
+
diff --git a/graphics/gd/files/gd_gif_out.c b/graphics/gd/files/gd_gif_out.c
new file mode 100644
index 000000000000..10c7ab58000b
--- /dev/null
+++ b/graphics/gd/files/gd_gif_out.c
@@ -0,0 +1,46 @@
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include "gd.h"
+
+/*
+** Wrapper functions for GIF output.
+*/
+
+#define LZW_LICENCED
+
+void gdImageGifToSink(gdImagePtr im, gdSinkPtr outSink)
+{
+ gdIOCtx *out = gdNewSSCtx(NULL,outSink);
+ gdImageGifCtx(im, out);
+ out->gd_free(out);
+}
+
+void gdImageGifCtx(gdImagePtr im, gdIOCtx *out)
+{
+#ifdef LZW_LICENCED
+ gdImageLzwCtx(im, out);
+#else
+ gdImageBigGifCtx(im, out);
+#endif
+}
+
+void gdImageGif(gdImagePtr im, FILE *outFile)
+{
+#ifdef LZW_LICENCED
+ gdImageLzw(im, outFile);
+#else
+ gdImageBigGif(im, outFile);
+#endif
+}
+
+void* gdImageGifPtr(gdImagePtr im, int *size)
+{
+#ifdef LZW_LICENCED
+ return gdImageLzwPtr(im, size);
+#else
+ return gdImageBigGifPtr(im, size);
+#endif
+}
+
diff --git a/graphics/gd/files/gd_lzw_out.c b/graphics/gd/files/gd_lzw_out.c
new file mode 100644
index 000000000000..ee130c5e5a38
--- /dev/null
+++ b/graphics/gd/files/gd_lzw_out.c
@@ -0,0 +1,795 @@
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include "gd.h"
+
+/* Code drawn from ppmtogif.c, from the pbmplus package
+**
+** Based on GIFENCOD by David Rowley <mgardi@watdscu.waterloo.edu>. A
+** Lempel-Zim compression based on "compress".
+**
+** Modified by Marcel Wijkstra <wijkstra@fwi.uva.nl>
+**
+** Copyright (C) 1989 by Jef Poskanzer.
+**
+** Permission to use, copy, modify, and distribute this software and its
+** documentation for any purpose and without fee is hereby granted, provided
+** that the above copyright notice appear in all copies and that both that
+** copyright notice and this permission notice appear in supporting
+** documentation. This software is provided "as is" without express or
+** implied warranty.
+**
+** The Graphics Interchange Format(c) is the Copyright property of
+** CompuServe Incorporated. GIF(sm) is a Service Mark property of
+** CompuServe Incorporated.
+*/
+
+/*
+ * a code_int must be able to hold 2**GIFBITS values of type int, and also -1
+ */
+typedef int code_int;
+
+#ifdef SIGNED_COMPARE_SLOW
+typedef unsigned long int count_int;
+typedef unsigned short int count_short;
+#else /*SIGNED_COMPARE_SLOW*/
+typedef long int count_int;
+#endif /*SIGNED_COMPARE_SLOW*/
+
+static int colorstobpp(int colors);
+static void BumpPixel (void);
+static int GIFNextPixel (gdImagePtr im);
+static void GIFEncode (gdIOCtx *fp, int GWidth, int GHeight, int GInterlace, int Background, int Transparent, int BitsPerPixel, int *Red, int *Green, int *Blue, gdImagePtr im);
+/*static void Putword (int w, gdIOCtx *fp); */
+static void compress (int init_bits, gdIOCtx *outfile, gdImagePtr im);
+static void output (code_int code);
+static void cl_block (void);
+static void cl_hash (register count_int hsize);
+static void char_init (void);
+static void char_out (int c);
+static void flush_char (void);
+/* Allows for reuse */
+static void init_statics(void);
+
+void gdImageLzwCtx(gdImagePtr im, gdIOCtx *out)
+{
+ int interlace, transparent, BitsPerPixel;
+
+ interlace = im->interlace;
+ transparent = im->transparent;
+
+ BitsPerPixel = colorstobpp(im->colorsTotal);
+ /* Clear any old values in statics strewn through the GIF code */
+ init_statics();
+ /* All set, let's do it. */
+ GIFEncode(
+ out, im->sx, im->sy, interlace, 0, transparent, BitsPerPixel,
+ im->red, im->green, im->blue, im);
+}
+
+void gdImageLzw(gdImagePtr im, FILE *outFile)
+{
+ gdIOCtx *out = gdNewFileCtx(outFile);
+ gdImageLzwCtx(im, out);
+ out->gd_free(out);
+}
+
+void* gdImageLzwPtr(gdImagePtr im, int *size)
+{
+ void *rv;
+ gdIOCtx *out = gdNewDynamicCtx(2048, NULL);
+ gdImageLzwCtx(im, out);
+ rv = gdDPExtractData(out,size);
+ out->gd_free(out);
+ return rv;
+}
+
+
+
+static int
+colorstobpp(int colors)
+{
+ int bpp = 0;
+
+ if ( colors <= 2 )
+ bpp = 1;
+ else if ( colors <= 4 )
+ bpp = 2;
+ else if ( colors <= 8 )
+ bpp = 3;
+ else if ( colors <= 16 )
+ bpp = 4;
+ else if ( colors <= 32 )
+ bpp = 5;
+ else if ( colors <= 64 )
+ bpp = 6;
+ else if ( colors <= 128 )
+ bpp = 7;
+ else if ( colors <= 256 )
+ bpp = 8;
+ return bpp;
+ }
+
+/*****************************************************************************
+ *
+ * GIFENCODE.C - GIF Image compression interface
+ *
+ * GIFEncode( FName, GHeight, GWidth, GInterlace, Background, Transparent,
+ * BitsPerPixel, Red, Green, Blue, gdImagePtr )
+ *
+ *****************************************************************************/
+
+#define TRUE 1
+#define FALSE 0
+
+static int Width, Height;
+static int curx, cury;
+static long CountDown;
+static int Pass = 0;
+static int Interlace;
+
+/*
+ * Bump the 'curx' and 'cury' to point to the next pixel
+ */
+static void
+BumpPixel(void)
+{
+ /*
+ * Bump the current X position
+ */
+ ++curx;
+
+ /*
+ * If we are at the end of a scan line, set curx back to the beginning
+ * If we are interlaced, bump the cury to the appropriate spot,
+ * otherwise, just increment it.
+ */
+ if( curx == Width ) {
+ curx = 0;
+
+ if( !Interlace )
+ ++cury;
+ else {
+ switch( Pass ) {
+
+ case 0:
+ cury += 8;
+ if( cury >= Height ) {
+ ++Pass;
+ cury = 4;
+ }
+ break;
+
+ case 1:
+ cury += 8;
+ if( cury >= Height ) {
+ ++Pass;
+ cury = 2;
+ }
+ break;
+
+ case 2:
+ cury += 4;
+ if( cury >= Height ) {
+ ++Pass;
+ cury = 1;
+ }
+ break;
+
+ case 3:
+ cury += 2;
+ break;
+ }
+ }
+ }
+}
+
+/*
+ * Return the next pixel from the image
+ */
+static int
+GIFNextPixel(gdImagePtr im)
+{
+ int r;
+
+ if( CountDown == 0 )
+ return EOF;
+
+ --CountDown;
+
+ r = gdImageGetPixel(im, curx, cury);
+
+ BumpPixel();
+
+ return r;
+}
+
+/* public */
+
+static void
+GIFEncode(gdIOCtx *fp, int GWidth, int GHeight, int GInterlace, int Background, int Transparent, int BitsPerPixel, int *Red, int *Green, int *Blue, gdImagePtr im)
+{
+ int B;
+ int RWidth, RHeight;
+ int LeftOfs, TopOfs;
+ int Resolution;
+ int ColorMapSize;
+ int InitCodeSize;
+ int i;
+
+ Interlace = GInterlace;
+
+ ColorMapSize = 1 << BitsPerPixel;
+
+ RWidth = Width = GWidth;
+ RHeight = Height = GHeight;
+ LeftOfs = TopOfs = 0;
+
+ Resolution = BitsPerPixel;
+
+ /*
+ * Calculate number of bits we are expecting
+ */
+ CountDown = (long)Width * (long)Height;
+
+ /*
+ * Indicate which pass we are on (if interlace)
+ */
+ Pass = 0;
+
+ /*
+ * The initial code size
+ */
+ if( BitsPerPixel <= 1 )
+ InitCodeSize = 2;
+ else
+ InitCodeSize = BitsPerPixel;
+
+ /*
+ * Set up the current x and y position
+ */
+ curx = cury = 0;
+
+ /*
+ * Write the Magic header
+ */
+ gdPutBuf( Transparent < 0 ? "GIF87a" : "GIF89a", 6, fp );
+
+ /*
+ * Write out the screen width and height
+ */
+ Putword( RWidth, fp );
+ Putword( RHeight, fp );
+
+ /*
+ * Indicate that there is a global colour map
+ */
+ B = 0x80; /* Yes, there is a color map */
+
+ /*
+ * OR in the resolution
+ */
+ B |= (Resolution - 1) << 5;
+
+ /*
+ * OR in the Bits per Pixel
+ */
+ B |= (BitsPerPixel - 1);
+
+ /*
+ * Write it out
+ */
+ gdPutC( B, fp );
+
+ /*
+ * Write out the Background colour
+ */
+ gdPutC( Background, fp );
+
+ /*
+ * Byte of 0's (future expansion)
+ */
+ gdPutC( 0, fp );
+
+ /*
+ * Write out the Global Colour Map
+ */
+ for( i=0; i<ColorMapSize; ++i ) {
+ gdPutC( Red[i], fp );
+ gdPutC( Green[i], fp );
+ gdPutC( Blue[i], fp );
+ }
+
+ /*
+ * Write out extension for transparent colour index, if necessary.
+ */
+ if ( Transparent >= 0 ) {
+ gdPutC( '!', fp );
+ gdPutC( 0xf9, fp );
+ gdPutC( 4, fp );
+ gdPutC( 1, fp );
+ gdPutC( 0, fp );
+ gdPutC( 0, fp );
+ gdPutC( (unsigned char) Transparent, fp );
+ gdPutC( 0, fp );
+ }
+
+ /*
+ * Write an Image separator
+ */
+ gdPutC( ',', fp );
+
+ /*
+ * Write the Image header
+ */
+
+ Putword( LeftOfs, fp );
+ Putword( TopOfs, fp );
+ Putword( Width, fp );
+ Putword( Height, fp );
+
+ /*
+ * Write out whether or not the image is interlaced
+ */
+ if( Interlace )
+ gdPutC( 0x40, fp );
+ else
+ gdPutC( 0x00, fp );
+
+ /*
+ * Write out the initial code size
+ */
+ gdPutC( InitCodeSize, fp );
+
+ /*
+ * Go and actually compress the data
+ */
+ compress( InitCodeSize+1, fp, im );
+
+ /*
+ * Write out a Zero-length packet (to end the series)
+ */
+ gdPutC( 0, fp );
+
+ /*
+ * Write the GIF file terminator
+ */
+ gdPutC( ';', fp );
+}
+
+/* */
+/* * Write out a word to the GIF file */
+/* */
+/*static void */
+/*Putword(int w, FILE *fp) */
+/*{ */
+/* fputc( w & 0xff, fp ); */
+/* fputc( (w / 256) & 0xff, fp ); */
+/*} */
+
+
+/***************************************************************************
+ *
+ * GIFCOMPR.C - GIF Image compression routines
+ *
+ * Lempel-Ziv compression based on 'compress'. GIF modifications by
+ * David Rowley (mgardi@watdcsu.waterloo.edu)
+ *
+ ***************************************************************************/
+
+/*
+ * General DEFINEs
+ */
+
+#define GIFBITS 12
+
+#define HSIZE 5003 /* 80% occupancy */
+
+#ifdef NO_UCHAR
+ typedef char char_type;
+#else /*NO_UCHAR*/
+ typedef unsigned char char_type;
+#endif /*NO_UCHAR*/
+
+/*
+ *
+ * GIF Image compression - modified 'compress'
+ *
+ * Based on: compress.c - File compression ala IEEE Computer, June 1984.
+ *
+ * By Authors: Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas)
+ * Jim McKie (decvax!mcvax!jim)
+ * Steve Davies (decvax!vax135!petsd!peora!srd)
+ * Ken Turkowski (decvax!decwrl!turtlevax!ken)
+ * James A. Woods (decvax!ihnp4!ames!jaw)
+ * Joe Orost (decvax!vax135!petsd!joe)
+ *
+ */
+#include <ctype.h>
+
+#define ARGVAL() (*++(*argv) || (--argc && *++argv))
+
+static int n_bits; /* number of bits/code */
+static int maxbits = GIFBITS; /* user settable max # bits/code */
+static code_int maxcode; /* maximum code, given n_bits */
+static code_int maxmaxcode = (code_int)1 << GIFBITS; /* should NEVER generate this code */
+#ifdef COMPATIBLE /* But wrong! */
+# define MAXCODE(n_bits) ((code_int) 1 << (n_bits) - 1)
+#else /*COMPATIBLE*/
+# define MAXCODE(n_bits) (((code_int) 1 << (n_bits)) - 1)
+#endif /*COMPATIBLE*/
+
+static count_int htab [HSIZE];
+static unsigned short codetab [HSIZE];
+#define HashTabOf(i) htab[i]
+#define CodeTabOf(i) codetab[i]
+
+static code_int hsize = HSIZE; /* for dynamic table sizing */
+
+/*
+ * To save much memory, we overlay the table used by compress() with those
+ * used by decompress(). The tab_prefix table is the same size and type
+ * as the codetab. The tab_suffix table needs 2**GIFBITS characters. We
+ * get this from the beginning of htab. The output stack uses the rest
+ * of htab, and contains characters. There is plenty of room for any
+ * possible stack (stack used to be 8000 characters).
+ */
+
+#define tab_prefixof(i) CodeTabOf(i)
+#define tab_suffixof(i) ((char_type*)(htab))[i]
+#define de_stack ((char_type*)&tab_suffixof((code_int)1<<GIFBITS))
+
+static code_int free_ent = 0; /* first unused entry */
+
+/*
+ * block compression parameters -- after all codes are used up,
+ * and compression rate changes, start over.
+ */
+static int clear_flg = 0;
+
+static int offset;
+static long int in_count = 1; /* length of input */
+static long int out_count = 0; /* # of codes output (for debugging) */
+
+/*
+ * compress stdin to stdout
+ *
+ * Algorithm: use open addressing double hashing (no chaining) on the
+ * prefix code / next character combination. We do a variant of Knuth's
+ * algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime
+ * secondary probe. Here, the modular division first probe is gives way
+ * to a faster exclusive-or manipulation. Also do block compression with
+ * an adaptive reset, whereby the code table is cleared when the compression
+ * ratio decreases, but after the table fills. The variable-length output
+ * codes are re-sized at this point, and a special CLEAR code is generated
+ * for the decompressor. Late addition: construct the table according to
+ * file size for noticeable speed improvement on small files. Please direct
+ * questions about this implementation to ames!jaw.
+ */
+
+static int g_init_bits;
+static gdIOCtx* g_outfile;
+
+static int ClearCode;
+static int EOFCode;
+
+static void
+compress(int init_bits, gdIOCtx *outfile, gdImagePtr im)
+{
+ register long fcode;
+ register code_int i /* = 0 */;
+ register int c;
+ register code_int ent;
+ register code_int disp;
+ register code_int hsize_reg;
+ register int hshift;
+
+ /*
+ * Set up the globals: g_init_bits - initial number of bits
+ * g_outfile - pointer to output file
+ */
+ g_init_bits = init_bits;
+ g_outfile = outfile;
+
+ /*
+ * Set up the necessary values
+ */
+ offset = 0;
+ out_count = 0;
+ clear_flg = 0;
+ in_count = 1;
+ maxcode = MAXCODE(n_bits = g_init_bits);
+
+ ClearCode = (1 << (init_bits - 1));
+ EOFCode = ClearCode + 1;
+ free_ent = ClearCode + 2;
+
+ char_init();
+
+ ent = GIFNextPixel( im );
+
+ hshift = 0;
+ for ( fcode = (long) hsize; fcode < 65536L; fcode *= 2L )
+ ++hshift;
+ hshift = 8 - hshift; /* set hash code range bound */
+
+ hsize_reg = hsize;
+ cl_hash( (count_int) hsize_reg); /* clear hash table */
+
+ output( (code_int)ClearCode );
+
+#ifdef SIGNED_COMPARE_SLOW
+ while ( (c = GIFNextPixel( im )) != (unsigned) EOF ) {
+#else /*SIGNED_COMPARE_SLOW*/
+ while ( (c = GIFNextPixel( im )) != EOF ) { /* } */
+#endif /*SIGNED_COMPARE_SLOW*/
+
+ ++in_count;
+
+ fcode = (long) (((long) c << maxbits) + ent);
+ i = (((code_int)c << hshift) ^ ent); /* xor hashing */
+
+ if ( HashTabOf (i) == fcode ) {
+ ent = CodeTabOf (i);
+ continue;
+ } else if ( (long)HashTabOf (i) < 0 ) /* empty slot */
+ goto nomatch;
+ disp = hsize_reg - i; /* secondary hash (after G. Knott) */
+ if ( i == 0 )
+ disp = 1;
+probe:
+ if ( (i -= disp) < 0 )
+ i += hsize_reg;
+
+ if ( HashTabOf (i) == fcode ) {
+ ent = CodeTabOf (i);
+ continue;
+ }
+ if ( (long)HashTabOf (i) > 0 )
+ goto probe;
+nomatch:
+ output ( (code_int) ent );
+ ++out_count;
+ ent = c;
+#ifdef SIGNED_COMPARE_SLOW
+ if ( (unsigned) free_ent < (unsigned) maxmaxcode) {
+#else /*SIGNED_COMPARE_SLOW*/
+ if ( free_ent < maxmaxcode ) { /* } */
+#endif /*SIGNED_COMPARE_SLOW*/
+ CodeTabOf (i) = free_ent++; /* code -> hashtable */
+ HashTabOf (i) = fcode;
+ } else
+ cl_block();
+ }
+ /*
+ * Put out the final code.
+ */
+ output( (code_int)ent );
+ ++out_count;
+ output( (code_int) EOFCode );
+}
+
+/*****************************************************************
+ * TAG( output )
+ *
+ * Output the given code.
+ * Inputs:
+ * code: A n_bits-bit integer. If == -1, then EOF. This assumes
+ * that n_bits =< (long)wordsize - 1.
+ * Outputs:
+ * Outputs code to the file.
+ * Assumptions:
+ * Chars are 8 bits long.
+ * Algorithm:
+ * Maintain a GIFBITS character long buffer (so that 8 codes will
+ * fit in it exactly). Use the VAX insv instruction to insert each
+ * code in turn. When the buffer fills up empty it and start over.
+ */
+
+static unsigned long cur_accum = 0;
+static int cur_bits = 0;
+
+static unsigned long masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F,
+ 0x001F, 0x003F, 0x007F, 0x00FF,
+ 0x01FF, 0x03FF, 0x07FF, 0x0FFF,
+ 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF };
+
+static void
+output(code_int code)
+{
+ cur_accum &= masks[ cur_bits ];
+
+ if( cur_bits > 0 )
+ cur_accum |= ((long)code << cur_bits);
+ else
+ cur_accum = code;
+
+ cur_bits += n_bits;
+
+ while( cur_bits >= 8 ) {
+ char_out( (unsigned int)(cur_accum & 0xff) );
+ cur_accum >>= 8;
+ cur_bits -= 8;
+ }
+
+ /*
+ * If the next entry is going to be too big for the code size,
+ * then increase it, if possible.
+ */
+ if ( free_ent > maxcode || clear_flg ) {
+
+ if( clear_flg ) {
+
+ maxcode = MAXCODE (n_bits = g_init_bits);
+ clear_flg = 0;
+
+ } else {
+
+ ++n_bits;
+ if ( n_bits == maxbits )
+ maxcode = maxmaxcode;
+ else
+ maxcode = MAXCODE(n_bits);
+ }
+ }
+
+ if( code == EOFCode ) {
+ /*
+ * At EOF, write the rest of the buffer.
+ */
+ while( cur_bits > 0 ) {
+ char_out( (unsigned int)(cur_accum & 0xff) );
+ cur_accum >>= 8;
+ cur_bits -= 8;
+ }
+
+ flush_char();
+
+/* fflush( g_outfile ); */
+/* */
+/* if( ferror( g_outfile ) ) */
+/* return; */
+ }
+}
+
+/*
+ * Clear out the hash table
+ */
+static void
+cl_block (void) /* table clear for block compress */
+{
+
+ cl_hash ( (count_int) hsize );
+ free_ent = ClearCode + 2;
+ clear_flg = 1;
+
+ output( (code_int)ClearCode );
+}
+
+static void
+cl_hash(register count_int hsize) /* reset code table */
+
+{
+
+ register count_int *htab_p = htab+hsize;
+
+ register long i;
+ register long m1 = -1;
+
+ i = hsize - 16;
+ do { /* might use Sys V memset(3) here */
+ *(htab_p-16) = m1;
+ *(htab_p-15) = m1;
+ *(htab_p-14) = m1;
+ *(htab_p-13) = m1;
+ *(htab_p-12) = m1;
+ *(htab_p-11) = m1;
+ *(htab_p-10) = m1;
+ *(htab_p-9) = m1;
+ *(htab_p-8) = m1;
+ *(htab_p-7) = m1;
+ *(htab_p-6) = m1;
+ *(htab_p-5) = m1;
+ *(htab_p-4) = m1;
+ *(htab_p-3) = m1;
+ *(htab_p-2) = m1;
+ *(htab_p-1) = m1;
+ htab_p -= 16;
+ } while ((i -= 16) >= 0);
+
+ for ( i += 16; i > 0; --i )
+ *--htab_p = m1;
+}
+
+/******************************************************************************
+ *
+ * GIF Specific routines
+ *
+ ******************************************************************************/
+
+/*
+ * Number of characters so far in this 'packet'
+ */
+static int a_count;
+
+/*
+ * Set up the 'byte output' routine
+ */
+static void
+char_init(void)
+{
+ a_count = 0;
+}
+
+/*
+ * Define the storage for the packet accumulator
+ */
+static char accum[ 256 ];
+
+/*
+ * Add a character to the end of the current packet, and if it is 254
+ * characters, flush the packet to disk.
+ */
+static void
+char_out(int c)
+{
+ accum[ a_count++ ] = c;
+ if( a_count >= 254 )
+ flush_char();
+}
+
+/*
+ * Flush the packet to disk, and reset the accumulator
+ */
+static void
+flush_char(void)
+{
+ if( a_count > 0 ) {
+ gdPutC( a_count, g_outfile );
+ gdPutBuf( accum, a_count, g_outfile );
+ a_count = 0;
+ }
+}
+
+static void init_statics(void) {
+ /* Some of these are properly initialized later. What I'm doing
+ here is making sure code that depends on C's initialization
+ of statics doesn't break when the code gets called more
+ than once. */
+ Width = 0;
+ Height = 0;
+ curx = 0;
+ cury = 0;
+ CountDown = 0;
+ Pass = 0;
+ Interlace = 0;
+ a_count = 0;
+ cur_accum = 0;
+ cur_bits = 0;
+ g_init_bits = 0;
+ g_outfile = 0;
+ ClearCode = 0;
+ EOFCode = 0;
+ free_ent = 0;
+ clear_flg = 0;
+ offset = 0;
+ in_count = 1;
+ out_count = 0;
+ hsize = HSIZE;
+ n_bits = 0;
+ maxbits = GIFBITS;
+ maxcode = 0;
+ maxmaxcode = (code_int)1 << GIFBITS;
+}
+
+
+/* +-------------------------------------------------------------------+ */
+/* | Copyright 1990, 1991, 1993, David Koblas. (koblas@netcom.com) | */
+/* | Permission to use, copy, modify, and distribute this software | */
+/* | and its documentation for any purpose and without fee is hereby | */
+/* | granted, provided that the above copyright notice appear in all | */
+/* | copies and that both that copyright notice and this permission | */
+/* | notice appear in supporting documentation. This software is | */
+/* | provided "as is" without express or implied warranty. | */
+/* +-------------------------------------------------------------------+ */
diff --git a/graphics/gd/files/gdcmpgif.c b/graphics/gd/files/gdcmpgif.c
new file mode 100644
index 000000000000..13c243014d2b
--- /dev/null
+++ b/graphics/gd/files/gdcmpgif.c
@@ -0,0 +1,85 @@
+#include <stdio.h>
+#include <unistd.h> /* For unlink function */
+#include "gd.h"
+
+/* A short program which converts a .png file into a .gd file, for
+ your convenience in creating images on the fly from a
+ basis image that must be loaded quickly. The .gd format
+ is not intended to be a general-purpose format. */
+
+void CompareImages(char *msg, gdImagePtr im1, gdImagePtr im2);
+
+
+int main(int argc, char **argv)
+{
+ gdImagePtr im1, im2;
+ FILE *in;
+
+ if (argc != 3) {
+ fprintf(stderr, "Usage: gdcmpgif filename.gif filename.gif\n");
+ exit(1);
+ }
+ in = fopen(argv[1], "rb");
+ if (!in) {
+ fprintf(stderr, "Input file does not exist!\n");
+ exit(1);
+ }
+ im1 = gdImageCreateFromGif(in);
+ fclose(in);
+
+ if (!im1) {
+ fprintf(stderr, "Input is not in GIF format!\n");
+ exit(1);
+ }
+
+ in = fopen(argv[2], "rb");
+ if (!in) {
+ fprintf(stderr, "Input file 2 does not exist!\n");
+ exit(1);
+ }
+ im2 = gdImageCreateFromGif(in);
+ fclose(in);
+
+ if (!im2) {
+ fprintf(stderr, "Input 2 is not in GIF format!\n");
+ exit(1);
+ }
+
+ CompareImages("gdcmpgif", im1, im2);
+
+ gdImageDestroy(im1);
+ gdImageDestroy(im2);
+
+ return 0;
+}
+
+void CompareImages(char *msg, gdImagePtr im1, gdImagePtr im2)
+{
+ int cmpRes;
+
+ cmpRes = gdImageCompare(im1, im2);
+
+ if (cmpRes & GD_CMP_IMAGE) {
+ printf("%%%s: ERROR images differ: BAD\n",msg);
+ } else if (cmpRes != 0) {
+ printf("%%%s: WARNING images differ: WARNING - Probably OK\n",msg);
+ } else {
+ printf("%%%s: OK\n",msg);
+ return;
+ }
+
+ if (cmpRes & (GD_CMP_SIZE_X + GD_CMP_SIZE_Y)) {
+ printf("-%s: INFO image sizes differ\n",msg);
+ }
+
+ if (cmpRes & GD_CMP_NUM_COLORS) {
+ printf("-%s: INFO number of pallette entries differ %d Vs. %d\n",msg,
+ im1->colorsTotal, im2->colorsTotal);
+ }
+
+ if (cmpRes & GD_CMP_COLOR) {
+ printf("-%s: INFO actual colours of pixels differ\n",msg);
+ }
+}
+
+
diff --git a/graphics/gd/files/giftogd2.c b/graphics/gd/files/giftogd2.c
new file mode 100644
index 000000000000..3753b56ac4c6
--- /dev/null
+++ b/graphics/gd/files/giftogd2.c
@@ -0,0 +1,48 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "gd.h"
+
+/* A short program which converts a .gif file into a .gd file, for
+ your convenience in creating images on the fly from a
+ basis image that must be loaded quickly. The .gd format
+ is not intended to be a general-purpose format. */
+
+int main(int argc, char **argv)
+{
+ gdImagePtr im;
+ FILE *in, *out;
+ int cs, fmt;
+
+ if (argc != 5) {
+ fprintf(stderr, "Usage: giftogd2 filename.gif filename.gd2 cs fmt\n");
+ fprintf(stderr, " where cs is the chunk size\n");
+ fprintf(stderr, " fmt is 1 for raw, 2 for compressed\n");
+ exit(1);
+ }
+ in = fopen(argv[1], "rb");
+ if (!in) {
+ fprintf(stderr, "Input file does not exist!\n");
+ exit(1);
+ }
+ im = gdImageCreateFromGif(in);
+ fclose(in);
+ if (!im) {
+ fprintf(stderr, "Input is not in GIF format!\n");
+ exit(1);
+ }
+ out = fopen(argv[2], "wb");
+ if (!out) {
+ fprintf(stderr, "Output file cannot be written to!\n");
+ gdImageDestroy(im);
+ exit(1);
+ }
+ cs = atoi(argv[3]);
+ fmt = atoi(argv[4]);
+ gdImageGd2(im, out, cs, fmt);
+ fclose(out);
+ gdImageDestroy(im);
+
+ return 0;
+}
+
diff --git a/graphics/gd/files/patch-ac b/graphics/gd/files/patch-ac
deleted file mode 100644
index 9d63cb3d8eb1..000000000000
--- a/graphics/gd/files/patch-ac
+++ /dev/null
@@ -1,188 +0,0 @@
---- Makefile.orig Thu Feb 22 19:03:43 2001
-+++ Makefile Sun Dec 16 05:57:07 2001
-@@ -3,22 +3,30 @@
- #If you do not have gcc, change the setting for COMPILER, but you must
- #use an ANSI standard C compiler (NOT the old SunOS 4.1.3 cc
- #compiler; get gcc if you are still using it).
--COMPILER=gcc
-+COMPILER=${CC}
-
- #If the ar command fails on your system, consult the ar manpage
- #for your system.
--AR=ar
-+#AR=ar
-
- #If you don't have FreeType, libjpeg and/or Xpm installed, including the
- #header files, uncomment this (default). You really must install
- #libpng and zlib to get anywhere if you wish to create PNG images.
--CFLAGS=-O -DHAVE_LIBPNG -DHAVE_LIBJPEG
-+CFLAGS+=-DHAVE_LIBPNG -DHAVE_LIBJPEG -DHAVE_LIBFREETYPE
-
- #If you do have FreeType, libjpeg and/or Xpm fully installed, uncomment a
- #variation of this and comment out the line above. See also LIBS below.
- #CFLAGS=-O -DHAVE_LIBXPM -DHAVE_LIBPNG -DHAVE_LIBJPEG \
- # -DHAVE_LIBFREETYPE -DHAVE_LIBTTF
-
-+.if defined(WITH_X11)
-+CFLAGS+=-DHAVE_XPM
-+.endif
-+
-+.if defined(JISX0208)
-+CFLAGS+=-DJISX0208
-+.endif
-+
- #To use the old FreeType 1.x library, add this additional #define
- #to the line above
- #-DHAVE_LIBTTF
-@@ -30,7 +38,7 @@
- #Some systems are very picky about link order. They don't all agree
- #on the right order, either.
-
--LIBS=-lgd -lpng -lz -lm
-+LIBS=-lgd -lpng -lz -ljpeg -lm `$(FREETYPE_CONFIG) --libs`
-
- #If you do have FreeType, JPEG and/or Xpm fully installed, uncomment a
- #variation of this and comment out the line above. Note that
-@@ -38,6 +46,10 @@
-
- #LIBS=-lgd -lpng -lz -ljpeg -lfreetype -lm -lttf
-
-+.if defined(WITH_X11)
-+LIBS+=-lXpm -lX11
-+.endif
-+
- #Note: for Freetype 1.x, use DHAVE_LIBTTF and -lttf instead.
-
- #Typical install locations for freetype, zlib, xpm, libjpeg and libpng header
-@@ -45,7 +57,11 @@
- #ensure that the version of gd you are installing is used, and not an
- #older release in your directory tree somewhere.
-
--INCLUDEDIRS=-I. -I/usr/include/freetype2 -I/usr/include/X11 -I/usr/X11R6/include/X11 -I/usr/local/include
-+INCLUDEDIRS=-I. `$(FREETYPE_CONFIG) --cflags` -I${LOCALBASE}/include
-+
-+.if defined(WITH_X11)
-+INCLUDEDIRS+=-I${X11BASE}/include/X11 -I${X11BASE}/include
-+.endif
-
- #Typical install locations for freetype, zlib, xpm and libpng libraries.
- #If yours are somewhere else, other than a standard location
-@@ -55,16 +71,20 @@
- #on your system can't cause conflicts while building a new one.
- #This line shouldn't hurt if you don't actually have some of the
- #optional libraries and directories.
--LIBDIRS=-L. -L/usr/local/lib -L/usr/lib/X11 -L/usr/X11R6/lib
-+LIBDIRS=-L. -L${LOCALBASE}/lib -Wl,--rpath,${LOCALBASE}/lib
-+
-+.if defined(WITH_X11)
-+LIBDIRS+=-L${X11BASE}/lib -Wl,--rpath,${X11BASE}/lib
-+.endif
-
- #Location where libgd.a should be installed by "make install".
--INSTALL_LIB=/usr/local/lib
-+INSTALL_LIB=${PREFIX}/lib
-
- #Location where .h files should be installed by "make install".
--INSTALL_INCLUDE=/usr/local/include
-+INSTALL_INCLUDE=${PREFIX}/include/gd
-
- #Location where useful non-test programs should be installed by "make install".
--INSTALL_BIN=/usr/local/bin
-+INSTALL_BIN=${PREFIX}/bin
-
- #
- #
-@@ -74,34 +94,43 @@
-
- VERSION=1.8.4
-
--CC=$(COMPILER) $(INCLUDEDIRS)
--LINK=$(CC) $(LIBDIRS) $(LIBS)
-+CFLAGS+=$(INCLUDEDIRS)
-
- PROGRAMS=$(BIN_PROGRAMS) $(TEST_PROGRAMS)
-
- BIN_PROGRAMS=pngtogd pngtogd2 gdtopng gd2topng gd2copypal gdparttopng webpng
- TEST_PROGRAMS=gdtest gddemo gd2time gdtestft gdtestttf
-
--all: libgd.a $(PROGRAMS)
-+SOVER=2
-+
-+.SUFFIXES: .c .so .o
-
--install: libgd.a $(BIN_PROGRAMS)
-- sh ./install-item 644 libgd.a $(INSTALL_LIB)/libgd.a
-- sh ./install-item 755 pngtogd $(INSTALL_BIN)/pngtogd
-- sh ./install-item 755 pngtogd2 $(INSTALL_BIN)/pngtogd2
-- sh ./install-item 755 gdtopng $(INSTALL_BIN)/gdtopng
-- sh ./install-item 755 gd2topng $(INSTALL_BIN)/gd2topng
-- sh ./install-item 755 gd2copypal $(INSTALL_BIN)/gd2copypal
-- sh ./install-item 755 gdparttopng $(INSTALL_BIN)/gdparttopng
-- sh ./install-item 755 webpng $(INSTALL_BIN)/webpng
-- sh ./install-item 755 bdftogd $(INSTALL_BIN)/bdftogd
-- sh ./install-item 644 gd.h $(INSTALL_INCLUDE)/gd.h
-- sh ./install-item 644 gdcache.h $(INSTALL_INCLUDE)/gdcache.h
-- sh ./install-item 644 gd_io.h $(INSTALL_INCLUDE)/gd_io.h
-- sh ./install-item 644 gdfontg.h $(INSTALL_INCLUDE)/gdfontg.h
-- sh ./install-item 644 gdfontl.h $(INSTALL_INCLUDE)/gdfontl.h
-- sh ./install-item 644 gdfontmb.h $(INSTALL_INCLUDE)/gdfontmb.h
-- sh ./install-item 644 gdfonts.h $(INSTALL_INCLUDE)/gdfonts.h
-- sh ./install-item 644 gdfontt.h $(INSTALL_INCLUDE)/gdfontt.h
-+.c.so:
-+ $(CC) -fpic -DPIC $(CFLAGS) -o $@ -c $<
-+
-+all: libgd.a libgd.so.$(SOVER) $(PROGRAMS)
-+
-+install: libgd.a libgd.so.$(SOVER) $(BIN_PROGRAMS)
-+ -mkdir -p $(INSTALL_LIB) $(INSTALL_INCLUDE) $(INSTALL_BIN)
-+ ${BSD_INSTALL_DATA} libgd.a $(INSTALL_LIB)/libgd.a
-+ ${BSD_INSTALL_DATA} libgd.so.$(SOVER) $(INSTALL_LIB)/libgd.so.$(SOVER)
-+ -ln -sf libgd.so.$(SOVER) $(INSTALL_LIB)/libgd.so
-+ ${BSD_INSTALL_PROGRAM} pngtogd $(INSTALL_BIN)/pngtogd
-+ ${BSD_INSTALL_PROGRAM} pngtogd2 $(INSTALL_BIN)/pngtogd2
-+ ${BSD_INSTALL_PROGRAM} gdtopng $(INSTALL_BIN)/gdtopng
-+ ${BSD_INSTALL_PROGRAM} gd2topng $(INSTALL_BIN)/gd2topng
-+ ${BSD_INSTALL_PROGRAM} gd2copypal $(INSTALL_BIN)/gd2copypal
-+ ${BSD_INSTALL_PROGRAM} gdparttopng $(INSTALL_BIN)/gdparttopng
-+ ${BSD_INSTALL_PROGRAM} webpng $(INSTALL_BIN)/webpng
-+ ${BSD_INSTALL_SCRIPT} bdftogd $(INSTALL_BIN)/bdftogd
-+ ${BSD_INSTALL_DATA} gd.h $(INSTALL_INCLUDE)/gd.h
-+ ${BSD_INSTALL_DATA} gdcache.h $(INSTALL_INCLUDE)/gdcache.h
-+ ${BSD_INSTALL_DATA} gd_io.h $(INSTALL_INCLUDE)/gd_io.h
-+ ${BSD_INSTALL_DATA} gdfontg.h $(INSTALL_INCLUDE)/gdfontg.h
-+ ${BSD_INSTALL_DATA} gdfontl.h $(INSTALL_INCLUDE)/gdfontl.h
-+ ${BSD_INSTALL_DATA} gdfontmb.h $(INSTALL_INCLUDE)/gdfontmb.h
-+ ${BSD_INSTALL_DATA} gdfonts.h $(INSTALL_INCLUDE)/gdfonts.h
-+ ${BSD_INSTALL_DATA} gdfontt.h $(INSTALL_INCLUDE)/gdfontt.h
-
- gddemo: gddemo.o libgd.a
- $(CC) gddemo.o -o gddemo $(LIBDIRS) $(LIBS)
-@@ -138,18 +167,21 @@
- gdtestttf: gdtestttf.o libgd.a
- $(CC) --verbose gdtestttf.o -o gdtestttf $(LIBDIRS) $(LIBS)
-
--libgd.a: gd.o gd_gd.o gd_gd2.o gd_io.o gd_io_dp.o gd_io_file.o gd_ss.o \
-+OBJS= gd.o gd_gd.o gd_gd2.o gd_io.o gd_io_dp.o gd_io_file.o gd_ss.o \
- gd_io_ss.o gd_png.o gd_jpeg.o gdxpm.o gdfontt.o gdfonts.o gdfontmb.o gdfontl.o \
- gdfontg.o gdtables.o gdft.o gdttf.o gdcache.o gdkanji.o wbmp.o \
-- gd_wbmp.o gdhelpers.o gd.h gdfontt.h gdfonts.h gdfontmb.h gdfontl.h \
-+ gd_wbmp.o gdhelpers.o gd_gif_in.o
-+INCS= gd.h gdfontt.h gdfonts.h gdfontmb.h gdfontl.h \
- gdfontg.h gdhelpers.h
-+
-+libgd.a: $(INCS) $(OBJS)
- rm -f libgd.a
-- $(AR) rc libgd.a gd.o gd_gd.o gd_gd2.o gd_io.o gd_io_dp.o \
-- gd_io_file.o gd_ss.o gd_io_ss.o gd_png.o gd_jpeg.o gdxpm.o \
-- gdfontt.o gdfonts.o gdfontmb.o gdfontl.o gdfontg.o \
-- gdtables.o gdft.o gdttf.o gdcache.o gdkanji.o wbmp.o \
-- gd_wbmp.o gdhelpers.o
-+ $(AR) rc libgd.a $(OBJS)
- -ranlib libgd.a
-+
-+libgd.so.$(SOVER): $(INCS) $(OBJS:.o=.so)
-+ $(CC) -shared -Wl,-x,-soname,$@ -o $@ $(OBJS:.o=.so) $(LIBDIRS) $(LIBS)
-+ ln -sf libgd.so.$(SOVER) libgd.so
-
- clean:
- rm -f *.o *.a ${PROGRAMS} test/gdtest.jpg test/gdtest.wbmp
diff --git a/graphics/gd/files/patch-gd.h b/graphics/gd/files/patch-gd.h
new file mode 100644
index 000000000000..026f87b14b30
--- /dev/null
+++ b/graphics/gd/files/patch-gd.h
@@ -0,0 +1,41 @@
+--- gd.h Thu Jan 16 11:28:09 2003
++++ gd.h Mon Mar 24 16:26:14 2003
+@@ -209,4 +209,8 @@
+ gdImagePtr gdImageCreateFromPngSource (gdSourcePtr in);
+
++ gdImagePtr gdImageCreateFromGif(FILE *fd);
++ gdImagePtr gdImageCreateFromGifCtx(gdIOCtxPtr in);
++ gdImagePtr gdImageCreateFromGifSource(gdSourcePtr in);
++
+ gdImagePtr gdImageCreateFromGd (FILE * in);
+ gdImagePtr gdImageCreateFromGdCtx (gdIOCtxPtr in);
+@@ -300,4 +304,5 @@
+
+ void gdImagePolygon (gdImagePtr im, gdPointPtr p, int n, int c);
++ void gdImageOpenPolygon(gdImagePtr im, gdPointPtr p, int n, int c);
+ void gdImageFilledPolygon (gdImagePtr im, gdPointPtr p, int n, int c);
+
+@@ -395,4 +400,13 @@
+ void *gdImageJpegPtr (gdImagePtr im, int *size, int quality);
+
++ void gdImageLzw(gdImagePtr im, FILE *out);
++ void* gdImageLzwPtr(gdImagePtr im, int *size);
++ void gdImageLzwCtx(gdImagePtr im, gdIOCtxPtr out);
++
++ void gdImageBigGif(gdImagePtr im, FILE *out);
++ void* gdImageBigGifPtr(gdImagePtr im, int *size);
++ void gdImageBigGifCtx(gdImagePtr im, gdIOCtxPtr out);
++
++
+ /* A custom data sink. For backwards compatibility. Use
+ gdIOCtx instead. */
+@@ -408,4 +422,9 @@
+
+ void gdImagePngToSink (gdImagePtr im, gdSinkPtr out);
++
++ void gdImageGif(gdImagePtr im, FILE *out);
++ void* gdImageGifPtr(gdImagePtr im, int *size);
++ void gdImageGifCtx(gdImagePtr im, gdIOCtxPtr out);
++ void gdImageGifToSink(gdImagePtr im, gdSinkPtr out);
+
+ void gdImageGd (gdImagePtr im, FILE * out);
diff --git a/graphics/gd/files/patch-gdft.c b/graphics/gd/files/patch-gdft.c
new file mode 100644
index 000000000000..cdee3d88935b
--- /dev/null
+++ b/graphics/gd/files/patch-gdft.c
@@ -0,0 +1,92 @@
+--- gdft.c Thu Jan 16 13:29:32 2003
++++ gdft.c Mon Mar 24 17:09:54 2003
+@@ -546,8 +546,8 @@
+ a->tweencolor = gdTrueColorAlpha (gdTrueColorGetRed (fg),
+ gdTrueColorGetGreen (fg),
+ gdTrueColorGetBlue (fg),
+- gdAlphaMax -
+- (gdTrueColorGetAlpha (fg) *
++ gdAlphaMax - ((gdAlphaMax -
++ gdTrueColorGetAlpha (fg)) *
+ pixel / NUMCOLORS));
+ }
+ else
+@@ -680,10 +680,14 @@
+ if (y >= im->sy || y < 0)
+ continue;
+
+- for (col = 0; col < bitmap.width; col++, pc++)
+- {
+- if (bitmap.pixel_mode == ft_pixel_mode_grays)
+- {
++ for (col = 0; col < bitmap.width; col++, pc++) {
++ x = pen_x + col;
++ /* clip if out of bounds */
++ if (x >= im->sx || x < 0)
++ continue;
++
++ switch(bitmap.pixel_mode) {
++ case ft_pixel_mode_grays:
+ /*
+ * Round to NUMCOLORS levels of antialiasing for
+ * index color images since only 256 colors are
+@@ -692,44 +696,38 @@
+ tc_key.pixel = ((bitmap.buffer[pc] * NUMCOLORS)
+ + bitmap.num_grays / 2)
+ / (bitmap.num_grays - 1);
+- }
+- else if (bitmap.pixel_mode == ft_pixel_mode_mono)
+- {
+- tc_key.pixel = ((bitmap.buffer[pc / 8]
+- << (pc % 8)) & 128) ? NUMCOLORS : 0;
++ break;
++ case ft_pixel_mode_mono:
+ /* 2.0.5: mode_mono fix from Giuliano Pochini */
+ tc_key.pixel =
+ ((bitmap.
+ buffer[(col >> 3) +
+ pcr]) & (1 << (~col & 0x07))) ? NUMCOLORS : 0;
+- }
+- else
+- {
++ break;
++ default:
+ return "Unsupported ft_pixel_mode";
+- }
++ }
++
+ if (tc_key.pixel > 0) /* if not background */
+ {
+- x = pen_x + col;
+-
+- /* clip if out of bounds */
+- if (x >= im->sx || x < 0)
+- continue;
+- /* get pixel location in gd buffer */
+- pixel = &im->pixels[y][x];
+- if (tc_key.pixel == NUMCOLORS)
+- {
++ if (im->trueColor) {
++ tc_elem = (tweencolor_t *)gdCacheGet(tc_cache, &tc_key);
++ gdImageSetPixel(im, x, y, tc_elem->tweencolor);
++ } else {
++ /* get pixel location in gd buffer */
++ pixel = &im->pixels[y][x];
++ if (tc_key.pixel == NUMCOLORS)
+ /* use fg color directly. gd 2.0.2: watch out for
+ negative indexes (thanks to David Marwood). */
+ *pixel = (fg < 0) ? -fg : fg;
+- }
+- else
+- {
++ else {
+ /* find antialised color */
+
+ tc_key.bgcolor = *pixel;
+ tc_elem = (tweencolor_t *) gdCacheGet (tc_cache, &tc_key);
+ *pixel = tc_elem->tweencolor;
+ }
++ }
+ }
+ }
+ }
diff --git a/graphics/gd/files/patch-gdkanji.c b/graphics/gd/files/patch-gdkanji.c
deleted file mode 100644
index 2162a7e95c38..000000000000
--- a/graphics/gd/files/patch-gdkanji.c
+++ /dev/null
@@ -1,87 +0,0 @@
---- gdkanji.c.orig Fri Feb 2 05:23:56 2001
-+++ gdkanji.c Wed Feb 7 20:59:08 2001
-@@ -103,14 +103,18 @@
- unsigned char *str;
- #endif
- {
-- static int whatcode;
-+ static int whatcode = ASCII;
-+ int oldcode = ASCII;
- int c, i;
- char *lang = NULL;
-
- c = '\1';
- i = 0;
-
-- if (whatcode == 0) whatcode = ASCII;
-+ if (whatcode != EUCORSJIS && whatcode != ASCII) {
-+ oldcode = whatcode;
-+ whatcode = ASCII;
-+ }
-
- while ((whatcode == EUCORSJIS || whatcode == ASCII) && c != '\0') {
- if ((c = str[i++]) != '\0') {
-@@ -167,7 +171,7 @@
- if ((c >= 64 && c <= 126) || (c >= 128 && c <= 160))
- whatcode = SJIS;
- else
-- if (c >= 253 && c >= 254) whatcode = EUC;
-+ if (c >= 253 && c <= 254) whatcode = EUC;
- else
- if (c >= 161 && c <= 252) whatcode = EUCORSJIS;
- }
-@@ -184,6 +188,8 @@
- debug("Kanji code detected at %d byte.", i);
- #endif
-
-+ if (whatcode == EUCORSJIS && oldcode != ASCII) whatcode = oldcode;
-+
- if (whatcode == EUCORSJIS) {
- if (getenv ("LC_ALL")) lang = getenv ("LC_ALL");
- else
-@@ -310,7 +316,7 @@
- error("invalid code specification: \"%s\" or \"%s\"",
- EUCSTR, code);
- #endif
-- strcpy(to, from);
-+ ustrcpy(to, from);
- return;
- }
-
-@@ -328,7 +334,7 @@
- else
- #endif
- error("something happen");
-- strcpy(to, from);
-+ ustrcpy(to, from);
- return;
- }
-
-@@ -526,11 +532,10 @@
-
- t = (unsigned char *)gdMalloc(BUFSIZ);
- any2eucjp(t, s, BUFSIZ);
-- i = strlen(t);
-+ i = strlen((const char *)t);
- gdFree(t);
- return i;
- }
--#endif
-
- #ifdef DEBUG
- int main()
-@@ -543,7 +548,7 @@
- while ( (c = fgetc(stdin)) != '\n' && i < BUFSIZ ) input[i++] = c;
- input[i] = '\0';
-
-- printf("input : %d bytes\n", strlen(input));
-+ printf("input : %d bytes\n", strlen((const char *)input));
- printf("output: %d bytes\n", strwidth(input));
-
- output = (unsigned char *)gdMalloc(BUFSIZ);
-@@ -555,4 +560,5 @@
-
- return 0;
- }
-+#endif
- #endif
diff --git a/graphics/gd/files/patch-gdtest.c b/graphics/gd/files/patch-gdtest.c
new file mode 100644
index 000000000000..85c855d4db02
--- /dev/null
+++ b/graphics/gd/files/patch-gdtest.c
@@ -0,0 +1,81 @@
+--- gdtest.c.orig Thu Apr 25 14:16:47 2002
++++ gdtest.c Tue Nov 6 15:53:38 2001
+@@ -84,6 +84,35 @@
+ gdImageDestroy (im2);
+ ctx->gd_free (ctx);
+
++ /* */
++ /* Send to GIF File then Ptr */
++ /* */
++ sprintf(of, "%s.gif", argv[1]);
++ out = fopen(of, "wb");
++ gdImageGif(im, out);
++ fclose(out);
++
++ in = fopen(of, "rb");
++ if (!in) {
++ fprintf(stderr, "GIF Output file does not exist!\n");
++ exit(1);
++ }
++ im2 = gdImageCreateFromGif(in);
++ fclose(in);
++
++ CompareImages("GD->GIF File->GD", ref, im2);
++
++ unlink(of);
++ gdImageDestroy(im2);
++
++ iptr = gdImageGifPtr(im,&sz);
++ ctx = gdNewDynamicCtx(sz,iptr);
++ im2 = gdImageCreateFromGifCtx(ctx);
++
++ CompareImages("GD->GIF ptr->GD", ref, im2);
++
++ gdImageDestroy(im2);
++ ctx->gd_free(ctx);
+
+ /* */
+ /* Send to GD2 File then Ptr */
+@@ -200,7 +229,30 @@
+ gdImageDestroy (im2);
+ };
+
+- unlink (of);
++ /*
++ ** Test gdImageCreateFromGifSource
++ **/
++
++ in = fopen(of, "rb");
++
++ if (!in)
++ {
++ fprintf (stderr, "GD Source: ERROR - GD Source input file does not exist - Sink may have failed!\n");
++ };
++
++ imgsrc.source = freadWrapper;
++ imgsrc.context = in;
++ im2 = gdImageCreateFromGifSource(&imgsrc);
++ fclose(in);
++
++ if (im2 == NULL) {
++ printf("GD Source (GIF): ERROR Null returned by gdImageCreateFromGifSource\n");
++ } else {
++ CompareImages("GD Source (GIF)", ref, im2);
++ gdImageDestroy(im2);
++ };
++
++ unlink(of);
+
+ /* */
+ /* Test Extraction */
+@@ -266,6 +318,10 @@
+
+ printf ("[Merged Image has %d colours]\n", im2->colorsTotal);
+ CompareImages ("Merged (gdtest.png, gdtest_merge.png)", im2, im3);
++
++ out = fopen ("test/gdtest_merge_out.png", "wb");
++ gdImagePng(im2, out);
++ close(out);
+
+ gdImageDestroy (im2);
+ gdImageDestroy (im3);
diff --git a/graphics/gd/files/patch-gdttf.c b/graphics/gd/files/patch-gdttf.c
deleted file mode 100644
index c7b8768a725f..000000000000
--- a/graphics/gd/files/patch-gdttf.c
+++ /dev/null
@@ -1,17 +0,0 @@
---- gdttf.c.orig Fri Feb 2 05:23:56 2001
-+++ gdttf.c Wed Feb 7 20:57:34 2001
-@@ -221,11 +221,10 @@
- byte = *((unsigned char *) str);
- #ifdef JISX0208
- if (0xA1 <= byte && byte <= 0xFE) {
-- int jiscode, ku, ten;
-+ int ku, ten;
-
-- jiscode = 0x100 * (byte & 0x7F) + (str[1] & 0x7F);
-- ku = (jiscode >> 8) - 0x20;
-- ten = (jiscode % 256) - 0x20;
-+ ku = (byte & 0x7F) - 0x20;
-+ ten = (str[1] & 0x7F) - 0x20;
- if ( (ku < 1 || ku > 92) || (ten < 1 || ten > 94) ) {
- *chPtr = (Tcl_UniChar) byte;
- return 1;
diff --git a/graphics/gd/files/patch-gif b/graphics/gd/files/patch-gif
deleted file mode 100644
index e156fa2dd01f..000000000000
--- a/graphics/gd/files/patch-gif
+++ /dev/null
@@ -1,15 +0,0 @@
-This patch together with the old implementation (from gd-1.5) of
-gd_gif_in.c restore GD's ability to read GIF images. The writing of such
-images is troubled because of Unisys' zeal in patent enforcement.
-
---- gd.h Tue Feb 6 14:44:01 2001
-+++ gd.h Fri Jul 27 16:10:38 2001
-@@ -95,2 +95,4 @@
- gdImagePtr gdImageCreate(int sx, int sy);
-+gdImagePtr gdImageCreateFromGif(FILE *fd);
-+gdImagePtr gdImageCreateFromGifCtx(gdIOCtxPtr in);
- gdImagePtr gdImageCreateFromPng(FILE *fd);
---- gd_gif_in.c Fri Jul 27 16:13:45 2001
-+++ gd_gif_in.c Fri Jul 27 16:14:46 2001
-@@ -6,1 +6,0 @@
--#include "io.h"
diff --git a/graphics/gd/files/patch-index.html b/graphics/gd/files/patch-index.html
new file mode 100644
index 000000000000..243abcd238ec
--- /dev/null
+++ b/graphics/gd/files/patch-index.html
@@ -0,0 +1,71 @@
+--- index.html Mon Nov 25 11:39:31 2002
++++ index.html Wed Nov 27 12:47:38 2002
+@@ -35,4 +35,9 @@
+ modern image formats such as PNG and JPEG as soon as possible.
+
++<p>Note, that the FreeBSD port of gd2 includes support for GIF files
++ported from the earlier releases of gd. If the WITH_LZW was defined at
++build time, the software will also use LZW-compression when creating
++GIF files.
++
+ <p>
+ gd 2.0.8 <strong>requires</strong> that the following libraries
+@@ -116,4 +121,18 @@
+ Portions relating to WBMP copyright 2000, 2001, 2002 Maurice Szmurlo and Johan Van
+ den Brande.
++
++<p>
++GIF decompression code copyright 1990, 1991, 1993, by David Koblas
++(koblas@netcom.com).
++<p>
++Non-LZW-based GIF compression code copyright 1998, by Hutchison Avenue
++Software Corporation (<a href="http://www.hasc.com">http://www.hasc.com/<;/a>,
++info@hasc.com).
++<p>
++LZW-based GIF compression code David Rowley.
++Obtaining a license for the Unisys LZW compression patent is
++entirely between the user and Unisys. The authors of gd can provide
++NO assistance in this matter.
++
+ <p>
+ <strong>Permission has been granted to copy, distribute and modify gd in any
+@@ -192,5 +211,22 @@
+ <li><a href="http://martin.gleeson.com/fly/">fly</a>, by Martin Gleeson
+ </ul>
+-<P>
++
++<P><A NAME="gifpatch"><H3>What does the FreeBSD port add?</H3></A>
++
++<p>This version reinstates GIF support. Specifically, the following
++functions are added: gdImageGif, gdImageGifPtr, gdImageGifCtx,
++gdImageGifToSink, gdImageCreateFromGif, gdImageCreateFromGifCtx,
++gdImageCreateFromGifSource.
++The can be used just like the corresponding functions for the other
++image formats.
++
++<p>Other functions added, but not documented, are: gdImageLzw,
++gdImageLzwPtr, gdImageLzwCtx, gdImageBigGif, gdImageBigGifPtr,
++gdImageBigGifCtx.
++
++<p>The <a href=#gdImageOpenPolygon>gdImageOpenPolygon</a> is added.
++This is basically the same as <a href=#gdImagePolygon>gdImagePolygon</A>,
++but it does not join the start and end points. It is required by GD.pm.
++
+ <A NAME="whatsnew2.0.8"><H3>What's new in version 2.0.8?</H3></A>
+ <P>
+@@ -1058,5 +1094,6 @@
+ <DD>
+ Represents a point in the coordinate space of the image; used
+-by <A HREF="#gdImagePolygon">gdImagePolygon</A> and
++by <A HREF="#gdImagePolygon">gdImagePolygon</A>,
++<A HREF="#gdImageOpenPolygon">gdImageOpenPolygon</A>, and
+ <A HREF="#gdImageFilledPolygon">gdImageFilledPolygon</A>.
+ <PRE>
+@@ -1068,5 +1105,6 @@
+ <DD>
+ A pointer to a <A HREF="#gdPoint">gdPoint</A> structure; passed
+-as an argument to <A HREF="#gdImagePolygon">gdImagePolygon</A>
++as an argument to <A HREF="#gdImagePolygon">gdImagePolygon</A>,
++<A HREF="#gdImageOpenPolygon">gdImageOpenPolygon</A>,
+ and <A HREF="#gdImageFilledPolygon">gdImageFilledPolygon</A>.
+ </DL>
diff --git a/graphics/gd/pkg-descr b/graphics/gd/pkg-descr
index f6ec333a65c6..f7507cc8d13f 100644
--- a/graphics/gd/pkg-descr
+++ b/graphics/gd/pkg-descr
@@ -1,23 +1,16 @@
-DESCRIPTION
+gd is a graphics library. It allows your code to quickly draw images
+complete with lines, arcs, text, multiple colors, cut and paste from
+other images, and flood fills, and write out the result as a PNG, GIF
+or JPEG file. This is particularly useful in World Wide Web applications,
+where PNG, GIF and JPEG are three of the formats accepted for inline
+images by most browsers.
- gd is a graphics library. It allows your code to quickly draw images
- complete with lines, arcs, text, multiple colors, cut and paste from
- other images, and flood fills, and write out the result as a .PNG file.
- This is particularly useful in World Wide Web applications, where .PNG
- is the format used for inline images.
-
- gd is not a paint program. If you are looking for a paint program, you
- are looking in the wrong place. If you are not a programmer, you are
- looking in the wrong place.
-
- gd does not provide for every possible desirable graphics operation.
- It is not necessary or desirable for gd to become a kitchen-sink
- graphics package, but version 1.7.3 incorporates most of the commonly
- requested features for an 8-bit 2D package. Support for truecolor
- images, JPEG and truecolor PNG is planned for version 2.0.
-
-AUTHOR
- gd was written by Thomas Boutell and is currently distributed by
- boutell.com, Inc.
+gd does not provide for every possible desirable graphics operation,
+but version 2.0 does include most frequently requested features,
+including both truecolor and palette images, resampling (smooth
+resizing of truecolor images) and so forth.
WWW: http://www.boutell.com/gd/
+
+- Alex Dupre
+sysadmin@alexdupre.com
diff --git a/graphics/gd/pkg-plist b/graphics/gd/pkg-plist
index 8a33dbcbf553..baf9c27df669 100644
--- a/graphics/gd/pkg-plist
+++ b/graphics/gd/pkg-plist
@@ -1,22 +1,25 @@
+bin/annotate
bin/bdftogd
bin/gd2copypal
+bin/gd2togif
bin/gd2topng
+bin/gdcmpgif
bin/gdparttopng
bin/gdtopng
+bin/giftogd2
bin/pngtogd
bin/pngtogd2
bin/webpng
-include/gd/gd.h
-include/gd/gd_io.h
-include/gd/gdcache.h
-include/gd/gdfontg.h
-include/gd/gdfontl.h
-include/gd/gdfontmb.h
-include/gd/gdfonts.h
-include/gd/gdfontt.h
+include/gd.h
+include/gd_io.h
+include/gdcache.h
+include/gdfontg.h
+include/gdfontl.h
+include/gdfontmb.h
+include/gdfonts.h
+include/gdfontt.h
lib/libgd.a
lib/libgd.so
-lib/libgd.so.2
+lib/libgd.so.4
%%PORTDOCS%%share/doc/gd/index.html
%%PORTDOCS%%@dirrm share/doc/gd
-@dirrm include/gd
diff --git a/graphics/gd/scripts/configure b/graphics/gd/scripts/configure
new file mode 100644
index 000000000000..299f3877aaf8
--- /dev/null
+++ b/graphics/gd/scripts/configure
@@ -0,0 +1,44 @@
+#!/bin/sh
+# $FreeBSD$
+
+# The GD_FONTS environment variable can be set to specify the gzipped
+# tar-ball containing the fonts in bdf format and the bdf file names.
+#
+# For example:
+# GD_FONTS="/usr/ports/distfiles/x-koi8u.tgz koi6x10.bdf koi8x13.bdf \
+# koi9x15.bdf koi12x24.bdf koi10x20.bdf"
+#
+# This can be usefull for slave ports, like ukrainian/gd, which may
+# now provide alternative fonts easily.
+
+# TODO: . handle multiple archiving formats: tgz, tar.bz2, zip
+# . allow for passing already extracted font-files
+
+if [ -z "$GD_FONTS" ]
+then
+ echo "GD_FONTS can be set to specify an alternative list of .bdf files"
+ echo "See $0 for details..."
+ exit 0
+fi
+
+set $GD_FONTS
+#
+# The tarball is the first argument, the tiny, small, medium-bold,
+# large, and giant fonts follow.
+#
+
+tarball=$1
+shift
+tar -xvzpf $tarball -C $WRKSRC $@
+
+rm -f $WRKSRC/Makefile.fonts
+
+for font in Tiny Small MediumBold Large Giant
+do
+ f=`echo $font | tr -d [[:lower:]] | tr [[:upper:]] [[:lower:]]`
+ rm -f $WRKSRC/gdfont$f.[ch]
+ printf 'gdfont%s.c gdfont%s.h: %s\
+ perl ${.CURDIR}/bdftogd gdFont%s font%s < %s\n' \
+ $f $f $1 $font $f $1 >> $WRKSRC/Makefile.fonts
+ shift
+done