imagettftext with UTF-8 and long paths in PHP 7.1

[email protected] (Christoph Becker) Sat, 16 Jul 2016 02:43:57 +0200
Newsgroups php.internals.win
Message-ID <[email protected]>
Hi!

While running the ext/gd tests on Windows I've stumbled upon
bug48732-mb.phpt[1].  The test is marked as XFAIL "seems freetype issue,
to investigate".  I've tried to solve the issue, but I'm stuck.

The first issue is that libgd uses the macro access() to check whether
the given filename can be accessed[2].  In the bundled libgd, access is
defined as _access[3], what obviously can't work.  As quick workaround,
I changed that to tsrm_win32_access, and that lets the check succeed.
Of course, it's not possible for libgd to depend on a PHP API, so that
would require another solution.  Anyhow, the system libgd[4] includes
<unistd.h> and uses access (what presumably maps to _waccess).  (I'm
deliberately ignoring the Windows Mobile/CE fallback library, at least
for now).  If we'd use _waccess also for the bundled libgd (which might
happen anyway, as synchronizing the bundled and the system libgd is work
in progress), it *might* be possible to do the conversion in the PHP
binding and pass the UTF-16 filename to gdImageStringFT().  I don't know
if there is a simple way to convert from default_charset to UTF-16, though.

The next issue is that FT_New_Face()[5] is called to retrieve a face.
However, freetype seems to use fopen(), which also won't work.  On
StackOverflow[6] I found the suggestion to load the file into memory,
and then to use FT_New_Memory_Face().  That appears to be a viable
solution, but I wouldn't know how to implement it.

Anyway, I consider supporting arbitrary default_charset for font
filenames to be rather low priority (at least ASCII names should work
fine, mostly), but perhaps someone may want to solve this issue, and
hopefully my findings would be helpful in this case.

[1]
<https://github.com/php/php-src/blob/php-7.1.0alpha3/ext/gd/tests/bug48732-mb.phpt>
[2]
<https://github.com/php/php-src/blob/php-7.1.0alpha3/ext/gd/libgd/gdft.c#L407>
[3] <https://msdn.microsoft.com/en-us/library/1w06ktdy.aspx>
[4] <https://github.com/libgd/libgd/blob/gd-2.2.2/src/gdft.c#L24-L26>
[5]
<https://github.com/php/php-src/blob/php-7.1.0alpha3/ext/gd/libgd/gdft.c#L458>
[6]
<http://stackoverflow.com/questions/10075032/can-freetype-functions-accept-unicode-filenames>

-- 
Christoph M. Becker