From 796bfb0bd000f7d9d23e633a965f6a8a77a5e927 Mon Sep 17 00:00:00 2001 From: Scott MacVicar Date: Sun, 16 Feb 2014 21:53:19 -0800 Subject: [PATCH] imagettftext() uses the last charactermap it found and not the one you want Summary: This caused issues when you picked a font with multiple maps, it wouldn't pick the unicode version but instead pick the last one it saw. Change so we cache on a per encoding level. There was even a todo list item in the code. In an ideal world we can probably iterate through at font write time. Test Plan: See said unit test, it's Apache Licensed font included --- NEWS | 4 + ext/gd/libgd/gd.h | 3 +- ext/gd/libgd/gdft.c | 63 ++++-- ext/gd/tests/Rochester-Regular.otf | Bin 0 -> 27260 bytes .../tests/Rochester-Regular.otf.LICENSE.txt | 202 ++++++++++++++++++ ext/gd/tests/imagettftext_charmap_order.phpt | 65 ++++++ 6 files changed, 323 insertions(+), 14 deletions(-) create mode 100644 ext/gd/tests/Rochester-Regular.otf create mode 100644 ext/gd/tests/Rochester-Regular.otf.LICENSE.txt create mode 100644 ext/gd/tests/imagettftext_charmap_order.phpt diff --git a/NEWS b/NEWS index b0e4f42e0d..b3d5864d63 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2014, PHP 5.6.0 Alpha 3 +- gd: + . Fixed imagettftext to load the correct character map rather than the last one. + (Scott) + - Openssl . Fixed segfault when accessing non-existent context for client SNI use (Daniel Lowrey) 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/gdft.c b/ext/gd/libgd/gdft.c index ac2bf344ff..f4ee639081 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++) { diff --git a/ext/gd/tests/Rochester-Regular.otf b/ext/gd/tests/Rochester-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..79f63ced683e6342866d734b04f3c687f6dd942f GIT binary patch literal 27260 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 +--FILE-- += 10) { + printf("SUCCESS %d black pixels\n", $black_pixels); +} else { + printf("FAIL %d black pixels\n", $black_pixels); +} +imagedestroy($im); +?> +--EXPECTF-- +SUCCESS %d black pixels \ No newline at end of file -- 2.50.1