diff options
Diffstat (limited to 'ext/gd/libgd')
-rw-r--r-- | ext/gd/libgd/gd.h | 3 | ||||
-rw-r--r-- | ext/gd/libgd/gd_crop.c | 14 | ||||
-rw-r--r-- | ext/gd/libgd/gd_interpolation.c | 17 | ||||
-rw-r--r-- | ext/gd/libgd/gd_jpeg.c | 4 | ||||
-rw-r--r-- | ext/gd/libgd/gdft.c | 63 |
5 files changed, 69 insertions, 32 deletions
diff --git a/ext/gd/libgd/gd.h b/ext/gd/libgd/gd.h index 20156b97b5..b61d972e80 100644 --- a/ext/gd/libgd/gd.h +++ b/ext/gd/libgd/gd.h @@ -471,7 +471,7 @@ typedef struct { double linespacing; /* fine tune line spacing for '\n' */ int flags; /* Logical OR of gdFTEX_ values */ int charmap; /* TBB: 2.0.12: may be gdFTEX_Unicode, - gdFTEX_Shift_JIS, or gdFTEX_Big5; + gdFTEX_Shift_JIS, gdFTEX_Big5 or gdFTEX_MacRoman; when not specified, maps are searched for in the above order. */ int hdpi; @@ -487,6 +487,7 @@ typedef struct { #define gdFTEX_Unicode 0 #define gdFTEX_Shift_JIS 1 #define gdFTEX_Big5 2 +#define gdFTEX_MacRoman 3 /* FreeType 2 text output with fine tuning */ char * diff --git a/ext/gd/libgd/gd_crop.c b/ext/gd/libgd/gd_crop.c index bba425d0e3..84edb5d1f7 100644 --- a/ext/gd/libgd/gd_crop.c +++ b/ext/gd/libgd/gd_crop.c @@ -45,22 +45,20 @@ gdImagePtr gdImageCrop(gdImagePtr src, const gdRectPtr crop) gdImagePtr dst; int y; - /* check size */ - if (crop->width<=0 || crop->height<=0) { - return NULL; - } - /* allocate the requested size (could be only partially filled) */ if (src->trueColor) { dst = gdImageCreateTrueColor(crop->width, crop->height); + if (dst == NULL) { + return NULL; + } gdImageSaveAlpha(dst, 1); } else { dst = gdImageCreate(crop->width, crop->height); + if (dst == NULL) { + return NULL; + } gdImagePaletteCopy(dst, src); } - if (dst == NULL) { - return NULL; - } dst->transparent = src->transparent; /* check position in the src image */ diff --git a/ext/gd/libgd/gd_interpolation.c b/ext/gd/libgd/gd_interpolation.c index e34242bb73..c1bf061e0b 100644 --- a/ext/gd/libgd/gd_interpolation.c +++ b/ext/gd/libgd/gd_interpolation.c @@ -1322,8 +1322,8 @@ static gdImagePtr gdImageScaleBilinearTC(gdImagePtr im, const unsigned int new_w gdFixed f_j = gd_itofx(j); gdFixed f_a = gd_mulfx(f_i, f_dy); gdFixed f_b = gd_mulfx(f_j, f_dx); - const long m = gd_fxtoi(f_a); - const long n = gd_fxtoi(f_b); + const gdFixed m = gd_fxtoi(f_a); + const gdFixed n = gd_fxtoi(f_b); gdFixed f_f = f_a - gd_itofx(m); gdFixed f_g = f_b - gd_itofx(n); @@ -1363,10 +1363,10 @@ static gdImagePtr gdImageScaleBilinearTC(gdImagePtr im, const unsigned int new_w f_a3 = gd_itofx(gdTrueColorGetAlpha(pixel3)); f_a4 = gd_itofx(gdTrueColorGetAlpha(pixel4)); { - const char red = (char) gd_fxtoi(gd_mulfx(f_w1, f_r1) + gd_mulfx(f_w2, f_r2) + gd_mulfx(f_w3, f_r3) + gd_mulfx(f_w4, f_r4)); - const char green = (char) gd_fxtoi(gd_mulfx(f_w1, f_g1) + gd_mulfx(f_w2, f_g2) + gd_mulfx(f_w3, f_g3) + gd_mulfx(f_w4, f_g4)); - const char blue = (char) gd_fxtoi(gd_mulfx(f_w1, f_b1) + gd_mulfx(f_w2, f_b2) + gd_mulfx(f_w3, f_b3) + gd_mulfx(f_w4, f_b4)); - const char alpha = (char) gd_fxtoi(gd_mulfx(f_w1, f_a1) + gd_mulfx(f_w2, f_a2) + gd_mulfx(f_w3, f_a3) + gd_mulfx(f_w4, f_a4)); + const unsigned char red = (unsigned char) gd_fxtoi(gd_mulfx(f_w1, f_r1) + gd_mulfx(f_w2, f_r2) + gd_mulfx(f_w3, f_r3) + gd_mulfx(f_w4, f_r4)); + const unsigned char green = (unsigned char) gd_fxtoi(gd_mulfx(f_w1, f_g1) + gd_mulfx(f_w2, f_g2) + gd_mulfx(f_w3, f_g3) + gd_mulfx(f_w4, f_g4)); + const unsigned char blue = (unsigned char) gd_fxtoi(gd_mulfx(f_w1, f_b1) + gd_mulfx(f_w2, f_b2) + gd_mulfx(f_w3, f_b3) + gd_mulfx(f_w4, f_b4)); + const unsigned char alpha = (unsigned char) gd_fxtoi(gd_mulfx(f_w1, f_a1) + gd_mulfx(f_w2, f_a2) + gd_mulfx(f_w3, f_a3) + gd_mulfx(f_w4, f_a4)); new_img->tpixels[dst_offset_v][dst_offset_h] = gdTrueColorAlpha(red, green, blue, alpha); } @@ -2475,10 +2475,7 @@ int gdImageSetInterpolationMethod(gdImagePtr im, gdInterpolationMethod id) switch (id) { case GD_DEFAULT: - im->interpolation_id = GD_BILINEAR_FIXED; - im->interpolation = NULL; - break; - + id = GD_BILINEAR_FIXED; /* Optimized versions */ case GD_BILINEAR_FIXED: case GD_BICUBIC_FIXED: diff --git a/ext/gd/libgd/gd_jpeg.c b/ext/gd/libgd/gd_jpeg.c index a882b28c88..7189c28b58 100644 --- a/ext/gd/libgd/gd_jpeg.c +++ b/ext/gd/libgd/gd_jpeg.c @@ -122,6 +122,10 @@ const char * gdJpegGetVersionString() return "8"; break; + case 90: + return "9 compatible"; + break; + default: return "unknown"; } diff --git a/ext/gd/libgd/gdft.c b/ext/gd/libgd/gdft.c index aa8e8d3a74..4979e1511f 100644 --- a/ext/gd/libgd/gdft.c +++ b/ext/gd/libgd/gdft.c @@ -126,6 +126,7 @@ typedef struct typedef struct { char *fontlist; /* key */ + int preferred_map; FT_Library *library; } fontkey_t; @@ -337,8 +338,27 @@ static int fontTest (void *element, void *key) { font_t *a = (font_t *) element; fontkey_t *b = (fontkey_t *) key; - - return (strcmp (a->fontlist, b->fontlist) == 0); + + if (strcmp (a->fontlist, b->fontlist) == 0) { + switch (b->preferred_map) { + case gdFTEX_Unicode: + if (a->have_char_map_unicode) { + return 1; + } + break; + case gdFTEX_Shift_JIS: + if (a->have_char_map_sjis) { + return 1; + } + break; + case gdFTEX_Big5: + if (a->have_char_map_sjis) { + return 1; + } + break; + } + } + return 0; } static void *fontFetch (char **error, void *key) @@ -454,15 +474,17 @@ static void *fontFetch (char **error, void *key) * just use the map in a->face->charmaps[num_charmaps] and be done with it. */ - a->have_char_map_unicode = 0; - a->have_char_map_big5 = 0; - a->have_char_map_sjis = 0; - a->have_char_map_apple_roman = 0; for (n = 0; n < a->face->num_charmaps; n++) { charmap = a->face->charmaps[n]; platform = charmap->platform_id; encoding = charmap->encoding_id; + /* Whatever is the last value is what should be set */ + a->have_char_map_unicode = 0; + a->have_char_map_big5 = 0; + a->have_char_map_sjis = 0; + a->have_char_map_apple_roman = 0; + /* EAM DEBUG - Newer versions of libfree2 make it easier by defining encodings */ #if (defined(FREETYPE_MAJOR) && ((FREETYPE_MAJOR == 2 && ((FREETYPE_MINOR == 1 && FREETYPE_PATCH >= 3) || FREETYPE_MINOR > 1) || FREETYPE_MAJOR > 2))) if (charmap->encoding == FT_ENCODING_MS_SYMBOL @@ -483,17 +505,29 @@ static void *fontFetch (char **error, void *key) { /* Apple Unicode */ a->have_char_map_unicode = 1; found = charmap; + if (b->preferred_map == gdFTEX_Unicode) { + break; + } } else if (platform == 3 && encoding == 4) { /* Windows Big5 */ a->have_char_map_big5 = 1; found = charmap; + if (b->preferred_map == gdFTEX_Big5) { + break; + } } else if (platform == 3 && encoding == 2) { /* Windows Sjis */ a->have_char_map_sjis = 1; found = charmap; + if (b->preferred_map == gdFTEX_Shift_JIS) { + break; + } } else if ((platform == 1 && encoding == 0) /* Apple Roman */ || (platform == 2 && encoding == 0)) { /* ISO ASCII */ a->have_char_map_apple_roman = 1; found = charmap; + if (b->preferred_map == gdFTEX_MacRoman) { + break; + } } } if (!found) { @@ -826,9 +860,18 @@ gdImageStringFTEx (gdImage * im, int *brect, int fg, char *fontlist, double ptsi } /*****/ + /* 2.0.12: allow explicit specification of the preferred map; + * but we still fall back if it is not available. + */ + m = gdFTEX_Unicode; + if (strex && (strex->flags & gdFTEX_CHARMAP)) { + m = strex->charmap; + } + /* get the font (via font cache) */ fontkey.fontlist = fontlist; fontkey.library = &library; + fontkey.preferred_map = m; font = (font_t *) gdCacheGet (fontCache, &fontkey); if (!font) { gdCacheDelete(tc_cache); @@ -870,13 +913,7 @@ gdImageStringFTEx (gdImage * im, int *brect, int fg, char *fontlist, double ptsi if (fg < 0) { render_mode |= FT_LOAD_MONOCHROME; } - /* 2.0.12: allow explicit specification of the preferred map; - * but we still fall back if it is not available. - */ - m = gdFTEX_Unicode; - if (strex && (strex->flags & gdFTEX_CHARMAP)) { - m = strex->charmap; - } + /* Try all three types of maps, but start with the specified one */ mfound = 0; for (i = 0; i < 3; i++) { |