From 837d8ae984e5959633483191376b70d652e89379 Mon Sep 17 00:00:00 2001 From: nulano Date: Sun, 13 Oct 2019 00:11:48 +0100 Subject: [PATCH 1/2] fix support for extended unicode characters in PyPy --- Tests/test_imagefont.py | 2 +- src/_imagingft.c | 14 +------------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index b7cfefacf..1c44e5221 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -463,7 +463,7 @@ class TestImageFont(PillowTestCase): with self.assertRaises(UnicodeEncodeError): font.getsize("’") - @unittest.skipIf(is_pypy(), "requires CPython") + @unittest.skipIf(is_pypy(), "failing on PyPy") def test_unicode_extended(self): # issue #3777 text = "A\u278A\U0001F12B" diff --git a/src/_imagingft.c b/src/_imagingft.c index 0a9c00a91..d89f9a758 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -326,24 +326,12 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) static int font_getchar(PyObject* string, int index, FT_ULong* char_out) { -#if (defined(PYPY_VERSION_NUM)) - if (PyUnicode_Check(string)) { - Py_UNICODE* p = PyUnicode_AS_UNICODE(string); - int size = PyUnicode_GET_SIZE(string); - if (index >= size) - return 0; - *char_out = p[index]; - return 1; - } -#else if (PyUnicode_Check(string)) { if (index >= PyUnicode_GET_LENGTH(string)) return 0; *char_out = PyUnicode_READ_CHAR(string, index); return 1; } -#endif - return 0; } @@ -363,7 +351,7 @@ text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject * goto failed; } -#if (defined(PYPY_VERSION_NUM)) +#if (defined(PYPY_VERSION_NUM) && (PYPY_VERSION_NUM < 0x07020000)) if (PyUnicode_Check(string)) { Py_UNICODE *text = PyUnicode_AS_UNICODE(string); Py_ssize_t size = PyUnicode_GET_SIZE(string); From 64317f8885b171f16938a6e8306ab068a8a97ce4 Mon Sep 17 00:00:00 2001 From: nulano Date: Tue, 15 Oct 2019 21:58:50 +0100 Subject: [PATCH 2/2] raqm now works with PyPy on Windows --- .github/workflows/test-windows.yml | 4 ---- src/_imagingft.c | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index 075707bf6..af89d2d43 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -253,7 +253,6 @@ jobs: # for Raqm - name: Build dependencies / HarfBuzz - if: "!contains(matrix.python-version, 'pypy')" run: | set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 @@ -274,7 +273,6 @@ jobs: # for Raqm - name: Build dependencies / FriBidi - if: "!contains(matrix.python-version, 'pypy')" run: | set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 @@ -292,9 +290,7 @@ jobs: copy /Y /B *.lib %INCLIB% shell: cmd - # failing with PyPy3 - name: Build dependencies / Raqm - if: "!contains(matrix.python-version, 'pypy')" run: | set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 diff --git a/src/_imagingft.c b/src/_imagingft.c index d89f9a758..62a4c283e 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -380,7 +380,7 @@ text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject * and raqm fails with empty strings */ goto failed; } - int set_text = (*p_raqm.set_text)(rq, (const uint32_t *)(text), size); + int set_text = (*p_raqm.set_text)(rq, text, size); PyMem_Free(text); if (!set_text) { PyErr_SetString(PyExc_ValueError, "raqm_set_text() failed");