diff -rub gd-2.0.33/entities.h gd-2.0.33jce3/entities.h --- gd-2.0.33/entities.h 2004-10-27 10:22:46.000000000 -0400 +++ gd-2.0.33jce3/entities.h 2005-08-15 11:23:47.000000000 -0400 @@ -11,7 +11,7 @@ extern "C" { #endif -struct entities_s { +static struct entities_s { char *name; int value; } entities[] = { diff -rub gd-2.0.33/entities.tcl gd-2.0.33jce3/entities.tcl --- gd-2.0.33/entities.tcl 2004-10-27 10:22:48.000000000 -0400 +++ gd-2.0.33jce3/entities.tcl 2005-08-15 10:19:33.000000000 -0400 @@ -32,7 +32,7 @@ puts $f "extern \"C\" {" puts $f "#endif" puts $f "" -puts $f "struct entities_s {" +puts $f "static struct entities_s {" puts $f " char *name;" puts $f " int value;" puts $f "} entities\[\] = {" diff -rub gd-2.0.33/gd.c gd-2.0.33jce3/gd.c --- gd-2.0.33/gd.c 2004-11-01 13:28:56.000000000 -0500 +++ gd-2.0.33jce3/gd.c 2005-08-15 11:23:47.000000000 -0400 @@ -72,9 +72,16 @@ int i; gdImagePtr im; im = (gdImage *) gdMalloc (sizeof (gdImage)); + if (!im) + return NULL; memset (im, 0, sizeof (gdImage)); /* Row-major ever since gd 1.3 */ im->pixels = (unsigned char **) gdMalloc (sizeof (unsigned char *) * sy); + if (!im->pixels) + { + free(im); + return NULL; + } im->polyInts = 0; im->polyAllocated = 0; im->brush = 0; @@ -84,6 +91,15 @@ { /* Row-major ever since gd 1.3 */ im->pixels[i] = (unsigned char *) gdCalloc (sx, sizeof (unsigned char)); + if (!im->pixels[i]) + { + for (--i ; i >= 0; i--) + { + gdFree(im->pixels[i]); + } + gdFree(im); + return NULL; + } } im->sx = sx; im->sy = sy; diff -rub gd-2.0.33/gd_gif_in.c gd-2.0.33jce3/gd_gif_in.c --- gd-2.0.33/gd_gif_in.c 2004-11-01 13:28:56.000000000 -0500 +++ gd-2.0.33jce3/gd_gif_in.c 2005-08-15 11:23:47.000000000 -0400 @@ -1,3 +1,7 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include #include #include diff -rub gd-2.0.33/gd_gif_out.c gd-2.0.33jce3/gd_gif_out.c --- gd-2.0.33/gd_gif_out.c 2004-11-02 08:41:00.000000000 -0500 +++ gd-2.0.33jce3/gd_gif_out.c 2005-08-15 11:23:47.000000000 -0400 @@ -1,3 +1,7 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include #include #include diff -rub gd-2.0.33/gd_topal.c gd-2.0.33jce3/gd_topal.c --- gd-2.0.33/gd_topal.c 2004-10-28 14:12:08.000000000 -0400 +++ gd-2.0.33jce3/gd_topal.c 2005-08-15 11:23:47.000000000 -0400 @@ -49,6 +49,10 @@ #define ORIGINAL_LIB_JPEG_REVERSE_ODD_ROWS */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include #include "gd.h" #include "gdhelpers.h" diff -rub gd-2.0.33/gdfontg.c gd-2.0.33jce3/gdfontg.c --- gd-2.0.33/gdfontg.c 2004-10-27 10:22:04.000000000 -0400 +++ gd-2.0.33jce3/gdfontg.c 2005-08-15 11:23:47.000000000 -0400 @@ -10,6 +10,9 @@ "Libor Skarvada, libor@informatics.muni.cz" */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif #include "gdfontg.h" diff -rub gd-2.0.33/gdfontl.c gd-2.0.33jce3/gdfontl.c --- gd-2.0.33/gdfontl.c 2004-10-27 10:22:04.000000000 -0400 +++ gd-2.0.33jce3/gdfontl.c 2005-08-15 11:23:47.000000000 -0400 @@ -11,6 +11,9 @@ "Libor Skarvada, libor@informatics.muni.cz" */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif #include "gdfontl.h" diff -rub gd-2.0.33/gdfontmb.c gd-2.0.33jce3/gdfontmb.c --- gd-2.0.33/gdfontmb.c 2004-10-27 10:22:04.000000000 -0400 +++ gd-2.0.33jce3/gdfontmb.c 2005-08-15 11:23:47.000000000 -0400 @@ -9,6 +9,9 @@ No copyright info was found in the original bdf. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif #include "gdfontmb.h" diff -rub gd-2.0.33/gdfonts.c gd-2.0.33jce3/gdfonts.c --- gd-2.0.33/gdfonts.c 2004-10-27 10:22:04.000000000 -0400 +++ gd-2.0.33jce3/gdfonts.c 2005-08-15 11:23:47.000000000 -0400 @@ -7,6 +7,9 @@ No copyright info was found in the original bdf. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif #include "gdfonts.h" diff -rub gd-2.0.33/gdfontt.c gd-2.0.33jce3/gdfontt.c --- gd-2.0.33/gdfontt.c 2004-10-27 10:22:04.000000000 -0400 +++ gd-2.0.33jce3/gdfontt.c 2005-08-15 11:23:47.000000000 -0400 @@ -10,6 +10,9 @@ "Libor Skarvada, libor@informatics.muni.cz" */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif #include "gdfontt.h" diff -rub gd-2.0.33/gdft.c gd-2.0.33jce3/gdft.c --- gd-2.0.33/gdft.c 2004-11-02 16:00:48.000000000 -0500 +++ gd-2.0.33jce3/gdft.c 2005-08-15 11:23:47.000000000 -0400 @@ -832,7 +832,7 @@ FT_Matrix matrix; FT_Vector penf, oldpenf, delta, total_min = {0,0}, total_max = {0,0}, glyph_min, glyph_max; FT_Face face; - FT_CharMap charmap; + FT_CharMap charmap = NULL; FT_Glyph image; FT_GlyphSlot slot; FT_Error err; @@ -966,8 +966,10 @@ } } +#if 0 if (fg < 0) render_mode |= FT_LOAD_MONOCHROME; +#endif /* find requested charmap */ encodingfound = 0; @@ -1208,12 +1210,14 @@ so we don't have to recheck for the terminating number */ if (! xshow_alloc) { xshow_alloc = 100; - strex->xshow = malloc(xshow_alloc); + strex->xshow = gdMalloc(xshow_alloc); xshow_pos = 0; } else if (xshow_pos + 20 > xshow_alloc) { xshow_alloc += 100; strex->xshow = realloc(strex->xshow, xshow_alloc); + if (! strex->xshow) + return "Problem allocating memory with realloc"; } xshow_pos += sprintf(strex->xshow + xshow_pos, "%g ", (double)(penf.x - oldpenf.x) * hdpi / (64 * METRIC_RES)); @@ -1322,10 +1326,8 @@ if (brect) { /* only if need brect */ - double dpix, dpiy; - - dpix = 64 * METRIC_RES / hdpi; - dpiy = 64 * METRIC_RES / vdpi; + double scalex = (double)hdpi / (64 * METRIC_RES); + double scaley = (double)vdpi / (64 * METRIC_RES); /* increase by 1 pixel to allow for rounding */ total_min.x -= METRIC_RES; @@ -1334,14 +1336,14 @@ total_max.y += METRIC_RES; /* rotate bounding rectangle, scale and round to int pixels, and translate */ - brect[0] = x + (total_min.x * cos_a + total_max.y * sin_a)/dpix; - brect[1] = y - (total_min.x * sin_a - total_max.y * cos_a)/dpiy; - brect[2] = x + (total_max.x * cos_a + total_max.y * sin_a)/dpix; - brect[3] = y - (total_max.x * sin_a - total_max.y * cos_a)/dpiy; - brect[4] = x + (total_max.x * cos_a + total_min.y * sin_a)/dpix; - brect[5] = y - (total_max.x * sin_a - total_min.y * cos_a)/dpiy; - brect[6] = x + (total_min.x * cos_a + total_min.y * sin_a)/dpix; - brect[7] = y - (total_min.x * sin_a - total_min.y * cos_a)/dpiy; + brect[0] = x + (total_min.x * cos_a + total_max.y * sin_a)*scalex; + brect[1] = y - (total_min.x * sin_a - total_max.y * cos_a)*scaley; + brect[2] = x + (total_max.x * cos_a + total_max.y * sin_a)*scalex; + brect[3] = y - (total_max.x * sin_a - total_max.y * cos_a)*scaley; + brect[4] = x + (total_max.x * cos_a + total_min.y * sin_a)*scalex; + brect[5] = y - (total_max.x * sin_a - total_min.y * cos_a)*scaley; + brect[6] = x + (total_min.x * cos_a + total_min.y * sin_a)*scalex; + brect[7] = y - (total_min.x * sin_a - total_min.y * cos_a)*scaley; } FT_Done_Size (platform_independent); @@ -1510,6 +1512,66 @@ #endif /* HAVE_LIBFONTCONFIG */ +#ifdef WIN32 +#define FONTSFX "\\FONTS" +#define GDP "GDFONTPATH=" +#define F_OK 0 /* Needed in Windows */ + +/* chkWinFontPath: + * See if environment variable envv is defined and + * if the path $envv/FONTS exists. If so, return the path, + * else return NULL. + */ +static char* +chkWinFontPath (char* envv) +{ + char* root; + char* path; + root = getenv(envv); + if (!root) return NULL; + path = (char*)gdMalloc(strlen(root)+strlen(FONTSFX)+1); + strcpy (path, root); + strcat (path, FONTSFX); + if (access (path, F_OK) == 0) { /* success */ + return path; + } + else { + gdFree (path); + return NULL; + } +} + +/* getWinFontPath: + * Find Windows system font directory. Use environment variables to + * find system directory with a FONTS subdirectory. + * If successful, set GDFONTPATH to this value, for caching, and return it. + * Else, return NULL + */ +static char* +getWinFontPath () +{ + char* path = chkWinFontPath("SystemRoot"); + if (!path) { + path = chkWinFontPath ("WinDir"); + if (!path) + return NULL; + } +#ifdef HAVE_SETENV + setenv("GDFONTPATH", path, 1); +#else + { + char* ebuf = (char*)gdMalloc(strlen(GDP)+strlen(path)+1); + int rv; + strcpy(ebuf,GDP); + strcat(ebuf,path); + rv = putenv(ebuf); + } +#endif + return path; +} + +#endif /* WIN32 */ + /* Look up font using font names as file names. */ static char * font_path(char **fontpath, char *name_list) { @@ -1524,6 +1586,10 @@ */ *fontpath = NULL; fontsearchpath = getenv ("GDFONTPATH"); +#ifdef WIN32 + if (!fontsearchpath) + fontsearchpath = getWinFontPath (); +#endif if (!fontsearchpath) fontsearchpath = DEFAULT_FONTPATH; fontlist = strdup (name_list); diff -rub gd-2.0.33/gdfx.c gd-2.0.33jce3/gdfx.c --- gd-2.0.33/gdfx.c 2004-10-27 10:22:07.000000000 -0400 +++ gd-2.0.33jce3/gdfx.c 2005-08-15 11:23:47.000000000 -0400 @@ -1,3 +1,7 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include "gd.h" #include diff -rub gd-2.0.33/gdhelpers.h gd-2.0.33jce3/gdhelpers.h --- gd-2.0.33/gdhelpers.h 2004-10-28 13:09:12.000000000 -0400 +++ gd-2.0.33jce3/gdhelpers.h 2005-08-15 11:23:47.000000000 -0400 @@ -29,30 +29,38 @@ /* 2.0.16: portable mutex support for thread safety. */ -#ifdef WIN32 -/* 2.0.18: must include windows.h to get CRITICAL_SECTION. */ -#include -#define gdMutexDeclare(x) CRITICAL_SECTION x -#define gdMutexSetup(x) InitializeCriticalSection(&x) -#define gdMutexShutdown(x) DeleteCriticalSection(&x) -#define gdMutexLock(x) EnterCriticalSection(&x) -#define gdMutexUnlock(x) LeaveCriticalSection(&x) -#else -#ifdef HAVE_PTHREAD -#include -#define gdMutexDeclare(x) pthread_mutex_t x -#define gdMutexSetup(x) pthread_mutex_init(&x, 0) -#define gdMutexShutdown(x) pthread_mutex_destroy(&x) -#define gdMutexLock(x) pthread_mutex_lock(&x) -#define gdMutexUnlock(x) pthread_mutex_unlock(&x) +#ifdef DISABLE_THREADS +# define gdMutexDeclare(x) +# define gdMutexSetup(x) +# define gdMutexShutdown(x) +# define gdMutexLock(x) +# define gdMutexUnlock(x) #else -#define gdMutexDeclare(x) -#define gdMutexSetup(x) -#define gdMutexShutdown(x) -#define gdMutexLock(x) -#define gdMutexUnlock(x) -#endif /* HAVE_PTHREAD */ -#endif /* WIN32 */ +# ifdef WIN32 +/* 2.0.18: must include windows.h to get CRITICAL_SECTION. */ +# include +# define gdMutexDeclare(x) CRITICAL_SECTION x +# define gdMutexSetup(x) InitializeCriticalSection(&x) +# define gdMutexShutdown(x) DeleteCriticalSection(&x) +# define gdMutexLock(x) EnterCriticalSection(&x) +# define gdMutexUnlock(x) LeaveCriticalSection(&x) +# else +# ifdef HAVE_PTHREAD +# include +# define gdMutexDeclare(x) pthread_mutex_t x +# define gdMutexSetup(x) pthread_mutex_init(&x, 0) +# define gdMutexShutdown(x) pthread_mutex_destroy(&x) +# define gdMutexLock(x) pthread_mutex_lock(&x) +# define gdMutexUnlock(x) pthread_mutex_unlock(&x) +# else +# define gdMutexDeclare(x) +# define gdMutexSetup(x) +# define gdMutexShutdown(x) +# define gdMutexLock(x) +# define gdMutexUnlock(x) +# endif /* HAVE_PTHREAD */ +# endif /* WIN32 */ +#endif /* DISABLE_THREADS */ #endif /* GDHELPERS_H */