From 1c78216791b34a73d2813d63abf5616cf12b97d2 Mon Sep 17 00:00:00 2001 From: pmp-p Date: Wed, 1 Mar 2023 22:44:29 +0100 Subject: [PATCH 01/15] wasm freetype 2 init and some cleanup --- src_c/_freetype.c | 68 ++++++++++++++++++++++++++-------------- src_c/freetype/ft_wrap.h | 5 +-- src_py/freetype.py | 2 +- src_py/sysfont.py | 37 ++++++++++++++++++++-- 4 files changed, 83 insertions(+), 29 deletions(-) diff --git a/src_c/_freetype.c b/src_c/_freetype.c index e7353bd4ef..03e2ec4c48 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -30,9 +30,17 @@ #define MODULE_NAME "_freetype" #define FONT_TYPE_NAME "Font" +#define DEFAULT_FONT_NAME "freesans" +#define DEFAULT_FONT_FILE "freesansbold.ttf" +#define PKGDATA_MODULE_NAME "pygame.pkgdata" +#define RESOURCE_FUNC_NAME "getResource" + /* * FreeType module declarations */ + +PyObject *_freetypemodule = NULL; + static const Scale_t FACE_SIZE_NONE = {0, 0}; static int @@ -208,10 +216,6 @@ free_string(PGFT_String *); _var = PyObject_IsTrue(_pyobj); \ } -#define DEFAULT_FONT_NAME "freesansbold.ttf" -#define PKGDATA_MODULE_NAME "pygame.pkgdata" -#define RESOURCE_FUNC_NAME "getResource" - static PyObject * load_font_res(const char *filename) { @@ -687,7 +691,11 @@ _ftfont_init(pgFontObject *self, PyObject *args, PyObject *kwds) SDL_RWops *source; FreeTypeInstance *ft; +#if defined(__EMSCRIPTEN__) + ft = FREETYPE_MOD_STATE(_freetypemodule)->freetype; +#else ASSERT_GRAB_FREETYPE(ft, -1); +#endif if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O&lIi", kwlist, &file, obj_to_scale, (void *)&face_size, @@ -721,7 +729,7 @@ _ftfont_init(pgFontObject *self, PyObject *args, PyObject *kwds) self->resolution = FREETYPE_STATE->resolution; } if (file == Py_None) { - file = load_font_res(DEFAULT_FONT_NAME); + file = load_font_res(DEFAULT_FONT_FILE); if (!file) { PyErr_SetString(PyExc_RuntimeError, "Failed to find default font"); @@ -2035,6 +2043,14 @@ _ft_get_error(PyObject *self, PyObject *_null) Py_RETURN_NONE; } +#if defined(__EMSCRIPTEN__) +static PyObject * +_ft_get_version(PyObject *self, PyObject *args, PyObject *kwargs) +{ + return Py_BuildValue("iii", FREETYPE_MAJOR, FREETYPE_MINOR, + FREETYPE_PATCH); +} +#else static PyObject * _ft_get_version(PyObject *self, PyObject *args, PyObject *kwargs) { @@ -2081,6 +2097,7 @@ _ft_get_version(PyObject *self, PyObject *args, PyObject *kwargs) FREETYPE_PATCH); } } +#endif // defined(__EMSCRIPTEN__) static PyObject * _ft_get_cache_size(PyObject *self, PyObject *_null) @@ -2120,7 +2137,7 @@ _ft_get_init(PyObject *self, PyObject *_null) static PyObject * _ft_get_default_font(PyObject *self, PyObject *_null) { - return PyUnicode_FromString(DEFAULT_FONT_NAME); + return PyUnicode_FromString(DEFAULT_FONT_FILE); } static int @@ -2143,13 +2160,13 @@ _ft_clear(PyObject *mod) * FREETYPE MODULE DECLARATION ****************************************************/ #ifndef PYPY_VERSION -struct PyModuleDef _freetypemodule = { +struct PyModuleDef _freetypemoduledef = { PyModuleDef_HEAD_INIT, MODULE_NAME, DOC_PYGAMEFREETYPE, sizeof(_FreeTypeState), _ft_methods, 0, _ft_traverse, _ft_clear, 0}; #else /* PYPY_VERSION */ _FreeTypeState _modstate; -struct PyModuleDef _freetypemodule = { +struct PyModuleDef _freetypemoduledef = { PyModuleDef_HEAD_INIT, MODULE_NAME, DOC_PYGAMEFREETYPE, @@ -2163,7 +2180,7 @@ struct PyModuleDef _freetypemodule = { MODINIT_DEFINE(_freetype) { - PyObject *module, *apiobj; + PyObject *apiobj; static void *c_api[PYGAMEAPI_FREETYPE_NUMSLOTS]; import_pygame_base(); @@ -2196,27 +2213,32 @@ MODINIT_DEFINE(_freetype) return NULL; } - module = PyModule_Create(&_freetypemodule); + _freetypemodule = PyModule_Create(&_freetypemoduledef); - if (!module) { + if (!_freetypemodule) { return NULL; } - FREETYPE_MOD_STATE(module)->freetype = 0; - FREETYPE_MOD_STATE(module)->cache_size = 0; - FREETYPE_MOD_STATE(module)->resolution = PGFT_DEFAULT_RESOLUTION; +#if defined(__EMSCRIPTEN__) + _PGFT_Init(&(FREETYPE_MOD_STATE(_freetypemodule)->freetype), 0); +#else + FREETYPE_MOD_STATE(_freetypemodule)->freetype = 0; +#endif + FREETYPE_MOD_STATE(_freetypemodule)->cache_size = 0; + FREETYPE_MOD_STATE(_freetypemodule)->resolution = PGFT_DEFAULT_RESOLUTION; Py_INCREF(&pgFont_Type); - if (PyModule_AddObject(module, FONT_TYPE_NAME, (PyObject *)&pgFont_Type)) { + if (PyModule_AddObject(_freetypemodule, FONT_TYPE_NAME, + (PyObject *)&pgFont_Type)) { Py_DECREF(&pgFont_Type); - Py_DECREF(module); + Py_DECREF(_freetypemodule); return NULL; } -#define DEC_CONST(x) \ - if (PyModule_AddIntConstant(module, #x, (int)FT_##x)) { \ - Py_DECREF(module); \ - return NULL; \ +#define DEC_CONST(x) \ + if (PyModule_AddIntConstant(_freetypemodule, #x, (int)FT_##x)) { \ + Py_DECREF(_freetypemodule); \ + return NULL; \ } DEC_CONST(STYLE_NORMAL); @@ -2239,11 +2261,11 @@ MODINIT_DEFINE(_freetype) c_api[1] = &pgFont_New; apiobj = encapsulate_api(c_api, "freetype"); - if (PyModule_AddObject(module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { + if (PyModule_AddObject(_freetypemodule, PYGAMEAPI_LOCAL_ENTRY, apiobj)) { Py_XDECREF(apiobj); - Py_DECREF(module); + Py_DECREF(_freetypemodule); return NULL; } - return module; + return _freetypemodule; } diff --git a/src_c/freetype/ft_wrap.h b/src_c/freetype/ft_wrap.h index 314e2cfe52..03a8176cb5 100644 --- a/src_c/freetype/ft_wrap.h +++ b/src_c/freetype/ft_wrap.h @@ -232,9 +232,10 @@ typedef struct { } _FreeTypeState; #if !defined(PYPY_VERSION) -extern struct PyModuleDef _freetypemodule; +extern struct PyModuleDef _freetypemoduledef; #define FREETYPE_MOD_STATE(mod) ((_FreeTypeState *)PyModule_GetState(mod)) -#define FREETYPE_STATE FREETYPE_MOD_STATE(PyState_FindModule(&_freetypemodule)) +#define FREETYPE_STATE \ + FREETYPE_MOD_STATE(PyState_FindModule(&_freetypemoduledef)) #else /* defined(PYPY_VERSION) */ extern _FreeTypeState _modstate; #define FREETYPE_MOD_STATE(mod) (&_modstate) diff --git a/src_py/freetype.py b/src_py/freetype.py index 6c8dc0e4e2..d981a9ae06 100644 --- a/src_py/freetype.py +++ b/src_py/freetype.py @@ -45,7 +45,7 @@ def SysFont(name, size, bold=False, italic=False, constructor=None): - """pygame.ftfont.SysFont(name, size, bold=False, italic=False, constructor=None) -> Font + """pygame.freetype.SysFont(name, size, bold=False, italic=False, constructor=None) -> Font Create a pygame Font from system font resources. This will search the system fonts for the given font diff --git a/src_py/sysfont.py b/src_py/sysfont.py index 7ebf31e2b4..b9291590d0 100644 --- a/src_py/sysfont.py +++ b/src_py/sysfont.py @@ -201,14 +201,45 @@ def initsysfonts_darwin(): return fonts -# read the fonts on unix +# read the fonts on posix/unix def initsysfonts_unix(path="fc-list"): - """use the fc-list from fontconfig to get a list of fonts""" + """if not embedded, use the fc-list from fontconfig to get a list of fonts""" fonts = {} - if sys.platform == "emscripten": + print("208: initsysfonts_unix {path=}") + + # these are embedded and cannot get os to list fonts a simple way. + if hasattr(sys, "getandroidapilevel") or sys.platform == "emscripten": + from pathlib import Path + + # default font + import importlib.resources, pygame + + entry = importlib.resources.files(pygame) / "freesansbold.ttf" + _parse_font_entry_unix(f"{entry}: FreeSans:style=Bold", fonts) + + # pygbag cache in search order main script folder, then /tmp + main = __import__("__main__") + if hasattr(main, "__file__"): + fc_cache = Path(main.__file__).parent / "fc_cache" + else: + fc_cache = Path(__import__("tempfile").gettempdir()) / "fc_cache" + + if fc_cache.is_file(): + for entry in open(fc_cache).read().splitlines(): + _parse_font_entry_unix(entry, fonts) + else: + import warnings + + warnings.warn(f"no fc_cache font cache file at {fc_cache}") + + for k, v in fonts.items(): + print(f"238: fc-cache: {k} {v}") + return fonts + # fallback to os support + try: proc = subprocess.run( [path, ":", "file", "family", "style"], From e40aa0844bac4ddf565c429c8aaafc545159d7c3 Mon Sep 17 00:00:00 2001 From: pmp-p Date: Thu, 2 Mar 2023 01:43:49 +0100 Subject: [PATCH 02/15] cleanup, format --- src_py/sysfont.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src_py/sysfont.py b/src_py/sysfont.py index b9291590d0..1373afb3c1 100644 --- a/src_py/sysfont.py +++ b/src_py/sysfont.py @@ -213,12 +213,13 @@ def initsysfonts_unix(path="fc-list"): from pathlib import Path # default font - import importlib.resources, pygame + import importlib.resources + import pygame entry = importlib.resources.files(pygame) / "freesansbold.ttf" _parse_font_entry_unix(f"{entry}: FreeSans:style=Bold", fonts) - # pygbag cache in search order main script folder, then /tmp + # cache in search order main script folder, then /tmp main = __import__("__main__") if hasattr(main, "__file__"): fc_cache = Path(main.__file__).parent / "fc_cache" @@ -226,16 +227,12 @@ def initsysfonts_unix(path="fc-list"): fc_cache = Path(__import__("tempfile").gettempdir()) / "fc_cache" if fc_cache.is_file(): - for entry in open(fc_cache).read().splitlines(): - _parse_font_entry_unix(entry, fonts) + with open(fc_cache, "r") as file: + for entry in file.read().splitlines(): + _parse_font_entry_unix(entry, fonts) else: - import warnings - warnings.warn(f"no fc_cache font cache file at {fc_cache}") - for k, v in fonts.items(): - print(f"238: fc-cache: {k} {v}") - return fonts # fallback to os support From 32899224965de787249dbddc5255e4accd4c3583 Mon Sep 17 00:00:00 2001 From: pmp-p Date: Thu, 2 Mar 2023 01:48:27 +0100 Subject: [PATCH 03/15] set decoding to explicit utf-8 --- src_py/sysfont.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src_py/sysfont.py b/src_py/sysfont.py index 1373afb3c1..100c1f9605 100644 --- a/src_py/sysfont.py +++ b/src_py/sysfont.py @@ -227,8 +227,8 @@ def initsysfonts_unix(path="fc-list"): fc_cache = Path(__import__("tempfile").gettempdir()) / "fc_cache" if fc_cache.is_file(): - with open(fc_cache, "r") as file: - for entry in file.read().splitlines(): + with open(fc_cache, "rb") as file: + for entry in file.read().decode("utf-8").splitlines(): _parse_font_entry_unix(entry, fonts) else: warnings.warn(f"no fc_cache font cache file at {fc_cache}") From 19ec7f71c73d34fa8154de08b9857ee88a94004a Mon Sep 17 00:00:00 2001 From: pmp-p Date: Fri, 3 Mar 2023 01:31:36 +0100 Subject: [PATCH 04/15] remove debug line --- src_py/sysfont.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src_py/sysfont.py b/src_py/sysfont.py index 100c1f9605..27b630fa2b 100644 --- a/src_py/sysfont.py +++ b/src_py/sysfont.py @@ -206,8 +206,6 @@ def initsysfonts_unix(path="fc-list"): """if not embedded, use the fc-list from fontconfig to get a list of fonts""" fonts = {} - print("208: initsysfonts_unix {path=}") - # these are embedded and cannot get os to list fonts a simple way. if hasattr(sys, "getandroidapilevel") or sys.platform == "emscripten": from pathlib import Path From ff9351026fa7699305e2d71306e5a7599b060345 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Fri, 10 Mar 2023 00:30:21 -0800 Subject: [PATCH 05/15] Fix changes relative to #1993 --- src_c/_freetype.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_c/_freetype.c b/src_c/_freetype.c index b184239b52..9d8cfe44a0 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -2166,7 +2166,7 @@ _ft_clear(PyObject *mod) ****************************************************/ #ifndef PYPY_VERSION struct PyModuleDef _freetypemoduledef = { - PyModuleDef_HEAD_INIT, MODULE_NAME, DOC_PYGAMEFREETYPE, + PyModuleDef_HEAD_INIT, MODULE_NAME, DOC_FREETYPE, sizeof(_FreeTypeState), _ft_methods, 0, _ft_traverse, _ft_clear, 0}; #else /* PYPY_VERSION */ From 958633cbe91cac81839fb00733dc003c0f0fdaee Mon Sep 17 00:00:00 2001 From: pmp-p Date: Mon, 13 Mar 2023 11:27:32 +0100 Subject: [PATCH 06/15] remove useless init --- src_c/_freetype.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src_c/_freetype.c b/src_c/_freetype.c index 9d8cfe44a0..b6c23eb76c 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -2225,7 +2225,9 @@ MODINIT_DEFINE(_freetype) } #if defined(__EMSCRIPTEN__) - _PGFT_Init(&(FREETYPE_MOD_STATE(_freetypemodule)->freetype), 0); + //_PGFT_Init(&(FREETYPE_MOD_STATE(_freetypemodule)->freetype), 0); + #pragma message "NO _PGFT_Init" + FREETYPE_MOD_STATE(_freetypemodule)->freetype = 0; #else FREETYPE_MOD_STATE(_freetypemodule)->freetype = 0; #endif From 0edfc9a927fa18cc684bf8c7de4baf9545bbefb3 Mon Sep 17 00:00:00 2001 From: pmp-p Date: Mon, 13 Mar 2023 12:01:08 +0100 Subject: [PATCH 07/15] remove warning --- src_c/_freetype.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src_c/_freetype.c b/src_c/_freetype.c index b6c23eb76c..39b6b91136 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -2225,8 +2225,8 @@ MODINIT_DEFINE(_freetype) } #if defined(__EMSCRIPTEN__) - //_PGFT_Init(&(FREETYPE_MOD_STATE(_freetypemodule)->freetype), 0); - #pragma message "NO _PGFT_Init" +//_PGFT_Init(&(FREETYPE_MOD_STATE(_freetypemodule)->freetype), 0); +#pragma message "NO _PGFT_Init" FREETYPE_MOD_STATE(_freetypemodule)->freetype = 0; #else FREETYPE_MOD_STATE(_freetypemodule)->freetype = 0; From e063e5977985b8d49bb55ea1f6d6d141b32a563b Mon Sep 17 00:00:00 2001 From: pmp-p Date: Tue, 14 Mar 2023 12:29:11 +0100 Subject: [PATCH 08/15] really remove warning --- src_c/_freetype.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src_c/_freetype.c b/src_c/_freetype.c index 39b6b91136..c10b90bff4 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -2224,13 +2224,7 @@ MODINIT_DEFINE(_freetype) return NULL; } -#if defined(__EMSCRIPTEN__) -//_PGFT_Init(&(FREETYPE_MOD_STATE(_freetypemodule)->freetype), 0); -#pragma message "NO _PGFT_Init" - FREETYPE_MOD_STATE(_freetypemodule)->freetype = 0; -#else FREETYPE_MOD_STATE(_freetypemodule)->freetype = 0; -#endif FREETYPE_MOD_STATE(_freetypemodule)->cache_size = 0; FREETYPE_MOD_STATE(_freetypemodule)->resolution = PGFT_DEFAULT_RESOLUTION; From e7e563331aa3a20f8789648d5d7ef50219c2c58e Mon Sep 17 00:00:00 2001 From: "Paul m. p. Peny" Date: Tue, 3 Oct 2023 13:16:51 +0200 Subject: [PATCH 09/15] update --- src_c/_freetype.c | 164 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) diff --git a/src_c/_freetype.c b/src_c/_freetype.c index 22d01d73b9..010c8fee5d 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -218,6 +218,20 @@ free_string(PGFT_String *); _var = PyObject_IsTrue(_pyobj); \ } + + +static unsigned int current_freetype_generation = 0; + +#define FreetypeFont_GenerationCheck(x) \ + (((pgFontObject *)(x))->init_generation == current_freetype_generation) + +#define RAISE_FREETYPE_QUIT_ERROR(r) \ + RAISERETURN( \ + pgExc_SDLError, \ + "Invalid freetype font (freetype module quit since freetype font " \ + "created)", \ + r); + static PyObject * load_font_res(const char *filename) { @@ -886,6 +900,7 @@ _ftfont_init(pgFontObject *self, PyObject *args, PyObject *kwds) */ self->freetype = ft; ++ft->ref_count; + self->init_generation = current_freetype_generation; rval = 0; @@ -912,6 +927,10 @@ _ftfont_repr(pgFontObject *self) static PyObject * _ftfont_getstyle_flag(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + const intptr_t style_flag = (intptr_t)closure; return PyBool_FromLong(self->style & (FT_UInt16)style_flag); @@ -920,6 +939,10 @@ _ftfont_getstyle_flag(pgFontObject *self, void *closure) static int _ftfont_setstyle_flag(pgFontObject *self, PyObject *value, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(-1); + } + const intptr_t style_flag = (intptr_t)closure; if (!PyBool_Check(value)) { @@ -952,12 +975,20 @@ _ftfont_setstyle_flag(pgFontObject *self, PyObject *value, void *closure) static PyObject * _ftfont_getstyle(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + return PyLong_FromLong(self->style); } static int _ftfont_setstyle(pgFontObject *self, PyObject *value, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(-1); + } + FT_UInt32 style; if (!PyLong_Check(value)) { @@ -998,12 +1029,20 @@ _ftfont_setstyle(pgFontObject *self, PyObject *value, void *closure) static PyObject * _ftfont_getstrength(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + return PyFloat_FromDouble(self->strength); } static int _ftfont_setstrength(pgFontObject *self, PyObject *value, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(-1); + } + PyObject *strengthobj = PyNumber_Float(value); double strength; @@ -1026,6 +1065,10 @@ _ftfont_setstrength(pgFontObject *self, PyObject *value, void *closure) static PyObject * _ftfont_getsize(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + if (self->face_size.y == 0) { return PyFloat_FromDouble(FX6_TO_DBL(self->face_size.x)); } @@ -1036,6 +1079,10 @@ _ftfont_getsize(pgFontObject *self, void *closure) static int _ftfont_setsize(pgFontObject *self, PyObject *value, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(-1); + } + Scale_t face_size; DEL_ATTR_NOT_SUPPORTED_CHECK("size", value); @@ -1052,6 +1099,10 @@ _ftfont_setsize(pgFontObject *self, PyObject *value, void *closure) static PyObject * _ftfont_getunderlineadjustment(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + return PyFloat_FromDouble(self->underline_adjustment); } @@ -1059,6 +1110,10 @@ static int _ftfont_setunderlineadjustment(pgFontObject *self, PyObject *value, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(-1); + } + PyObject *adjustmentobj; double adjustment; @@ -1088,6 +1143,10 @@ _ftfont_setunderlineadjustment(pgFontObject *self, PyObject *value, static PyObject * _ftfont_getfontmetric(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + typedef long (*getter)(FreeTypeInstance *, pgFontObject *); long height; @@ -1102,6 +1161,10 @@ _ftfont_getfontmetric(pgFontObject *self, void *closure) static PyObject * _ftfont_getname(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + if (pgFont_IS_ALIVE(self)) { const char *name = _PGFT_Font_GetName(self->freetype, self); return name ? PyUnicode_FromString(name) : 0; @@ -1113,6 +1176,10 @@ _ftfont_getname(pgFontObject *self, void *closure) static PyObject * _ftfont_getstylename(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + if (pgFont_IS_ALIVE(self)) { const char *stylename = _PGFT_Font_GetStyleName(self->freetype, self); return stylename ? PyUnicode_FromString(stylename) : 0; @@ -1124,6 +1191,10 @@ _ftfont_getstylename(pgFontObject *self, void *closure) static PyObject * _ftfont_getpath(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + PyObject *path = ((pgFontObject *)self)->path; if (!path) { @@ -1137,6 +1208,10 @@ _ftfont_getpath(pgFontObject *self, void *closure) static PyObject * _ftfont_getscalable(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + ASSERT_SELF_IS_ALIVE(self) return PyBool_FromLong(self->is_scalable); } @@ -1144,6 +1219,10 @@ _ftfont_getscalable(pgFontObject *self, void *closure) static PyObject * _ftfont_getfixedwidth(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + long fixed_width; ASSERT_SELF_IS_ALIVE(self); @@ -1155,6 +1234,10 @@ _ftfont_getfixedwidth(pgFontObject *self, void *closure) static PyObject * _ftfont_getfixedsizes(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + long num_fixed_sizes; ASSERT_SELF_IS_ALIVE(self); @@ -1166,6 +1249,10 @@ _ftfont_getfixedsizes(pgFontObject *self, void *closure) static PyObject * _ftfont_getrender_flag(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + const intptr_t render_flag = (intptr_t)closure; return PyBool_FromLong(self->render_flags & (FT_UInt16)render_flag); @@ -1174,6 +1261,10 @@ _ftfont_getrender_flag(pgFontObject *self, void *closure) static int _ftfont_setrender_flag(pgFontObject *self, PyObject *value, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(-1); + } + const intptr_t render_flag = (intptr_t)closure; /* Generic setter; We do not know the name of the attribute */ @@ -1198,6 +1289,10 @@ _ftfont_setrender_flag(pgFontObject *self, PyObject *value, void *closure) static PyObject * _ftfont_getresolution(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + return PyLong_FromUnsignedLong((unsigned long)self->resolution); } @@ -1205,12 +1300,20 @@ _ftfont_getresolution(pgFontObject *self, void *closure) static PyObject * _ftfont_getrotation(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + return PyLong_FromLong((long)FX16_ROUND_TO_INT(self->rotation)); } static int _ftfont_setrotation(pgFontObject *self, PyObject *value, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(-1); + } + DEL_ATTR_NOT_SUPPORTED_CHECK("rotation", value); if (!self->is_scalable) { @@ -1231,12 +1334,20 @@ _ftfont_setrotation(pgFontObject *self, PyObject *value, void *closure) static PyObject * _ftfont_getfgcolor(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + return pgColor_New(self->fgcolor); } static int _ftfont_setfgcolor(pgFontObject *self, PyObject *value, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(-1); + } + DEL_ATTR_NOT_SUPPORTED_CHECK("fgcolor", value); if (!pg_RGBAFromObjEx(value, self->fgcolor, PG_COLOR_HANDLE_SIMPLE)) { @@ -1251,12 +1362,20 @@ _ftfont_setfgcolor(pgFontObject *self, PyObject *value, void *closure) static PyObject * _ftfont_getbgcolor(pgFontObject *self, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + return pgColor_New(self->bgcolor); } static int _ftfont_setbgcolor(pgFontObject *self, PyObject *value, void *closure) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(-1); + } + DEL_ATTR_NOT_SUPPORTED_CHECK("bgcolor", value); if (!pg_RGBAFromObjEx(value, self->bgcolor, PG_COLOR_HANDLE_SIMPLE)) { @@ -1298,6 +1417,10 @@ _ftfont_getdebugcachestats(pgFontObject *self, void *closure) static PyObject * _ftfont_getrect(pgFontObject *self, PyObject *args, PyObject *kwds) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + /* MODIFIED */ /* keyword list */ @@ -1394,6 +1517,10 @@ get_metrics(FontRenderMode *render, pgFontObject *font, PGFT_String *text) static PyObject * _ftfont_getmetrics(pgFontObject *self, PyObject *args, PyObject *kwds) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + /* keyword list */ static char *kwlist[] = {"text", "size", 0}; @@ -1442,6 +1569,10 @@ _ftfont_getmetrics(pgFontObject *self, PyObject *args, PyObject *kwds) static PyObject * _ftfont_getsizedascender(pgFontObject *self, PyObject *args) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + Scale_t face_size = FACE_SIZE_NONE; long value; @@ -1469,6 +1600,10 @@ _ftfont_getsizedascender(pgFontObject *self, PyObject *args) static PyObject * _ftfont_getsizeddescender(pgFontObject *self, PyObject *args) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + Scale_t face_size = FACE_SIZE_NONE; long value; @@ -1497,6 +1632,10 @@ _ftfont_getsizeddescender(pgFontObject *self, PyObject *args) static PyObject * _ftfont_getsizedheight(pgFontObject *self, PyObject *args) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + Scale_t face_size = FACE_SIZE_NONE; long value; @@ -1524,6 +1663,10 @@ _ftfont_getsizedheight(pgFontObject *self, PyObject *args) static PyObject * _ftfont_getsizedglyphheight(pgFontObject *self, PyObject *args) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + Scale_t face_size = FACE_SIZE_NONE; long value; @@ -1552,6 +1695,10 @@ _ftfont_getsizedglyphheight(pgFontObject *self, PyObject *args) static PyObject * _ftfont_getsizes(pgFontObject *self, PyObject *_null) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + int nsizes; int i; int rc; @@ -1589,6 +1736,10 @@ _ftfont_getsizes(pgFontObject *self, PyObject *_null) static PyObject * _ftfont_render_raw(pgFontObject *self, PyObject *args, PyObject *kwds) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + /* keyword list */ static char *kwlist[] = {"text", "style", "rotation", "size", "invert", 0}; @@ -1652,6 +1803,10 @@ _ftfont_render_raw(pgFontObject *self, PyObject *args, PyObject *kwds) static PyObject * _ftfont_render_raw_to(pgFontObject *self, PyObject *args, PyObject *kwds) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + /* keyword list */ static char *kwlist[] = {"array", "text", "dest", "style", "rotation", "size", "invert", 0}; @@ -1717,6 +1872,10 @@ _ftfont_render_raw_to(pgFontObject *self, PyObject *args, PyObject *kwds) static PyObject * _ftfont_render(pgFontObject *self, PyObject *args, PyObject *kwds) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + /* keyword list */ static char *kwlist[] = {"text", "fgcolor", "bgcolor", "style", "rotation", "size", 0}; @@ -1841,6 +2000,10 @@ _ftfont_render(pgFontObject *self, PyObject *args, PyObject *kwds) static PyObject * _ftfont_render_to(pgFontObject *self, PyObject *args, PyObject *kwds) { + if (!FreetypeFont_GenerationCheck(self)) { + RAISE_FREETYPE_QUIT_ERROR(NULL); + } + /* keyword list */ static char *kwlist[] = {"surf", "dest", "text", "fgcolor", "bgcolor", "style", "rotation", "size", 0}; @@ -2023,6 +2186,7 @@ _ft_quit(PyObject *self, PyObject *_null) _PGFT_Quit(state->freetype); state->cache_size = 0; state->freetype = 0; + current_freetype_generation++; } Py_RETURN_NONE; From 891d43534ee2ef290888dcc88e9b0291c07646aa Mon Sep 17 00:00:00 2001 From: "Paul m. p. Peny" Date: Tue, 3 Oct 2023 13:24:17 +0200 Subject: [PATCH 10/15] format --- src_c/_freetype.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src_c/_freetype.c b/src_c/_freetype.c index 09ca718431..7953dbd6e4 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -218,20 +218,6 @@ free_string(PGFT_String *); _var = PyObject_IsTrue(_pyobj); \ } - - -static unsigned int current_freetype_generation = 0; - -#define FreetypeFont_GenerationCheck(x) \ - (((pgFontObject *)(x))->init_generation == current_freetype_generation) - -#define RAISE_FREETYPE_QUIT_ERROR(r) \ - RAISERETURN( \ - pgExc_SDLError, \ - "Invalid freetype font (freetype module quit since freetype font " \ - "created)", \ - r); - static unsigned int current_freetype_generation = 0; #define FreetypeFont_GenerationCheck(x) \ From 808e953866ab569a3bd9b9d6ff871be8a550840f Mon Sep 17 00:00:00 2001 From: pmp-p Date: Sun, 29 Sep 2024 15:04:40 +0200 Subject: [PATCH 11/15] tested on ft 2.20.2 wasm --- src_c/_freetype.c | 288 ++++++++++++++++----------------------- src_c/freetype/ft_wrap.h | 3 +- src_py/sysfont.py | 17 ++- 3 files changed, 127 insertions(+), 181 deletions(-) diff --git a/src_c/_freetype.c b/src_c/_freetype.c index 8860c2b967..61e109fd94 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -43,160 +43,97 @@ PyObject *_freetypemodule = NULL; static const Scale_t FACE_SIZE_NONE = {0, 0}; -static int -_ft_traverse(PyObject *, visitproc, void *); -static int -_ft_clear(PyObject *); - -static PyObject * -_ft_quit(PyObject *, PyObject *); -static PyObject * -_ft_init(PyObject *, PyObject *, PyObject *); -static PyObject * -_ft_get_version(PyObject *, PyObject *, PyObject *); -static PyObject * -_ft_get_error(PyObject *, PyObject *); -static PyObject * -_ft_get_init(PyObject *, PyObject *); -static PyObject * -_ft_autoinit(PyObject *, PyObject *); -static PyObject * -_ft_get_cache_size(PyObject *, PyObject *); -static PyObject * -_ft_get_default_resolution(PyObject *, PyObject *); -static PyObject * -_ft_set_default_resolution(PyObject *, PyObject *); -static PyObject * -_ft_get_default_font(PyObject *self, PyObject *args); +static int _ft_traverse(PyObject *, visitproc, void *); +static int _ft_clear(PyObject *); + +static PyObject *_ft_quit(PyObject *, PyObject *); +static PyObject *_ft_init(PyObject *, PyObject *, PyObject *); +static PyObject *_ft_get_version(PyObject *, PyObject *, PyObject *); +static PyObject *_ft_get_error(PyObject *, PyObject *); +static PyObject *_ft_get_init(PyObject *, PyObject *); +static PyObject *_ft_was_init(PyObject *, PyObject *); +static PyObject *_ft_autoinit(PyObject *, PyObject *); +static PyObject *_ft_get_cache_size(PyObject *, PyObject *); +static PyObject *_ft_get_default_resolution(PyObject *, PyObject *); +static PyObject *_ft_set_default_resolution(PyObject *, PyObject *); +static PyObject *_ft_get_default_font(PyObject *self, PyObject *args); /* * Constructor/init/destructor */ -static PyObject * -_ftfont_new(PyTypeObject *, PyObject *, PyObject *); -static void -_ftfont_dealloc(pgFontObject *); -static PyObject * -_ftfont_repr(pgFontObject *); -static int -_ftfont_init(pgFontObject *, PyObject *, PyObject *); +static PyObject *_ftfont_new(PyTypeObject *, PyObject *, PyObject *); +static void _ftfont_dealloc(pgFontObject *); +static PyObject *_ftfont_repr(pgFontObject *); +static int _ftfont_init(pgFontObject *, PyObject *, PyObject *); /* * Main methods */ -static PyObject * -_ftfont_getrect(pgFontObject *, PyObject *, PyObject *); -static PyObject * -_ftfont_getmetrics(pgFontObject *, PyObject *, PyObject *); -static PyObject * -_ftfont_render(pgFontObject *, PyObject *, PyObject *); -static PyObject * -_ftfont_render_to(pgFontObject *, PyObject *, PyObject *); -static PyObject * -_ftfont_render_raw(pgFontObject *, PyObject *, PyObject *); -static PyObject * -_ftfont_render_raw_to(pgFontObject *, PyObject *, PyObject *); -static PyObject * -_ftfont_getsizedascender(pgFontObject *, PyObject *); -static PyObject * -_ftfont_getsizeddescender(pgFontObject *, PyObject *); -static PyObject * -_ftfont_getsizedheight(pgFontObject *, PyObject *); -static PyObject * -_ftfont_getsizedglyphheight(pgFontObject *, PyObject *); -static PyObject * -_ftfont_getsizes(pgFontObject *, PyObject *); +static PyObject *_ftfont_getrect(pgFontObject *, PyObject *, PyObject *); +static PyObject *_ftfont_getmetrics(pgFontObject *, PyObject *, PyObject *); +static PyObject *_ftfont_render(pgFontObject *, PyObject *, PyObject *); +static PyObject *_ftfont_render_to(pgFontObject *, PyObject *, PyObject *); +static PyObject *_ftfont_render_raw(pgFontObject *, PyObject *, PyObject *); +static PyObject *_ftfont_render_raw_to(pgFontObject *, PyObject *, PyObject *); +static PyObject *_ftfont_getsizedascender(pgFontObject *, PyObject *); +static PyObject *_ftfont_getsizeddescender(pgFontObject *, PyObject *); +static PyObject *_ftfont_getsizedheight(pgFontObject *, PyObject *); +static PyObject *_ftfont_getsizedglyphheight(pgFontObject *, PyObject *); +static PyObject *_ftfont_getsizes(pgFontObject *, PyObject *); /* static PyObject *_ftfont_copy(pgFontObject *); */ /* * Getters/setters */ -static PyObject * -_ftfont_getsize(pgFontObject *, void *); -static int -_ftfont_setsize(pgFontObject *, PyObject *, void *); -static PyObject * -_ftfont_getstyle(pgFontObject *, void *); -static int -_ftfont_setstyle(pgFontObject *, PyObject *, void *); -static PyObject * -_ftfont_getname(pgFontObject *, void *); -static PyObject * -_ftfont_getstylename(pgFontObject *, void *); -static PyObject * -_ftfont_getpath(pgFontObject *, void *); -static PyObject * -_ftfont_getscalable(pgFontObject *, void *); -static PyObject * -_ftfont_getfixedwidth(pgFontObject *, void *); -static PyObject * -_ftfont_getfixedsizes(pgFontObject *, void *); -static PyObject * -_ftfont_getstrength(pgFontObject *, void *); -static int -_ftfont_setstrength(pgFontObject *, PyObject *, void *); -static PyObject * -_ftfont_getunderlineadjustment(pgFontObject *, void *); -static int -_ftfont_setunderlineadjustment(pgFontObject *, PyObject *, void *); -static PyObject * -_ftfont_getrotation(pgFontObject *, void *); -static int -_ftfont_setrotation(pgFontObject *, PyObject *, void *); -static PyObject * -_ftfont_getfgcolor(pgFontObject *, void *); -static int -_ftfont_setfgcolor(pgFontObject *, PyObject *, void *); -static PyObject * -_ftfont_getbgcolor(pgFontObject *, void *); -static int -_ftfont_setbgcolor(pgFontObject *, PyObject *, void *); - -static PyObject * -_ftfont_getresolution(pgFontObject *, void *); - -static PyObject * -_ftfont_getfontmetric(pgFontObject *, void *); - -static PyObject * -_ftfont_getstyle_flag(pgFontObject *, void *); -static int -_ftfont_setstyle_flag(pgFontObject *, PyObject *, void *); - -static PyObject * -_ftfont_getrender_flag(pgFontObject *, void *); -static int -_ftfont_setrender_flag(pgFontObject *, PyObject *, void *); +static PyObject *_ftfont_getsize(pgFontObject *, void *); +static int _ftfont_setsize(pgFontObject *, PyObject *, void *); +static PyObject *_ftfont_getstyle(pgFontObject *, void *); +static int _ftfont_setstyle(pgFontObject *, PyObject *, void *); +static PyObject *_ftfont_getname(pgFontObject *, void *); +static PyObject *_ftfont_getstylename(pgFontObject *, void *); +static PyObject *_ftfont_getpath(pgFontObject *, void *); +static PyObject *_ftfont_getscalable(pgFontObject *, void *); +static PyObject *_ftfont_getfixedwidth(pgFontObject *, void *); +static PyObject *_ftfont_getfixedsizes(pgFontObject *, void *); +static PyObject *_ftfont_getstrength(pgFontObject *, void *); +static int _ftfont_setstrength(pgFontObject *, PyObject *, void *); +static PyObject *_ftfont_getunderlineadjustment(pgFontObject *, void *); +static int _ftfont_setunderlineadjustment(pgFontObject *, PyObject *, void *); +static PyObject *_ftfont_getrotation(pgFontObject *, void *); +static int _ftfont_setrotation(pgFontObject *, PyObject *, void *); +static PyObject *_ftfont_getfgcolor(pgFontObject *, void *); +static int _ftfont_setfgcolor(pgFontObject *, PyObject *, void *); +static PyObject *_ftfont_getbgcolor(pgFontObject *, void *); +static int _ftfont_setbgcolor(pgFontObject *, PyObject *, void *); + +static PyObject *_ftfont_getresolution(pgFontObject *, void *); + +static PyObject *_ftfont_getfontmetric(pgFontObject *, void *); + +static PyObject *_ftfont_getstyle_flag(pgFontObject *, void *); +static int _ftfont_setstyle_flag(pgFontObject *, PyObject *, void *); + +static PyObject *_ftfont_getrender_flag(pgFontObject *, void *); +static int _ftfont_setrender_flag(pgFontObject *, PyObject *, void *); #if defined(PGFT_DEBUG_CACHE) -static PyObject * -_ftfont_getdebugcachestats(pgFontObject *, void *); +static PyObject *_ftfont_getdebugcachestats(pgFontObject *, void *); #endif /* * Internal helpers */ -static PyObject * -get_metrics(FontRenderMode *, pgFontObject *, PGFT_String *); -static PyObject * -load_font_res(const char *); -static int -parse_dest(PyObject *, int *, int *); -static int -obj_to_scale(PyObject *, void *); -static int -objs_to_scale(PyObject *, PyObject *, Scale_t *); -static int -numbers_to_scale(PyObject *, PyObject *, Scale_t *); -static int -build_scale(PyObject *, PyObject *, Scale_t *); -static FT_UInt -number_to_FX6_unsigned(PyObject *); -static int -obj_to_rotation(PyObject *, void *); -static void -free_string(PGFT_String *); +static PyObject *get_metrics(FontRenderMode *, pgFontObject *, PGFT_String *); +static PyObject *load_font_res(const char *); +static int parse_dest(PyObject *, int *, int *); +static int obj_to_scale(PyObject *, void *); +static int objs_to_scale(PyObject *, PyObject *, Scale_t *); +static int numbers_to_scale(PyObject *, PyObject *, Scale_t *); +static int build_scale(PyObject *, PyObject *, Scale_t *); +static FT_UInt number_to_FX6_unsigned(PyObject *); +static int obj_to_rotation(PyObject *, void *); +static void free_string(PGFT_String *); /* * Auxiliary defines @@ -235,7 +172,6 @@ load_font_res(const char *filename) { PyObject *load_basicfunc = 0; PyObject *pkgdatamodule = 0; - PyObject *resourcefunc = 0; PyObject *result = 0; PyObject *tmp; @@ -244,13 +180,9 @@ load_font_res(const char *filename) goto font_resource_end; } - resourcefunc = PyObject_GetAttrString(pkgdatamodule, RESOURCE_FUNC_NAME); - if (!resourcefunc) { - goto font_resource_end; - } - - result = PyObject_CallFunction(resourcefunc, "s", filename); - if (!result) { + result = + PyObject_CallMethod(pkgdatamodule, RESOURCE_FUNC_NAME, "s", filename); + if (result == NULL) { goto font_resource_end; } @@ -274,7 +206,6 @@ load_font_res(const char *filename) font_resource_end: Py_XDECREF(pkgdatamodule); - Py_XDECREF(resourcefunc); Py_XDECREF(load_basicfunc); return result; } @@ -505,7 +436,7 @@ static PyMethodDef _ft_methods[] = { DOC_FREETYPE_INIT}, {"quit", (PyCFunction)_ft_quit, METH_NOARGS, DOC_FREETYPE_QUIT}, {"get_init", _ft_get_init, METH_NOARGS, DOC_FREETYPE_GETINIT}, - {"was_init", _ft_get_init, METH_NOARGS, + {"was_init", _ft_was_init, METH_NOARGS, DOC_FREETYPE_WASINIT}, // DEPRECATED {"get_error", _ft_get_error, METH_NOARGS, DOC_FREETYPE_GETERROR}, {"get_version", (PyCFunction)_ft_get_version, METH_VARARGS | METH_KEYWORDS, @@ -647,7 +578,7 @@ _ftfont_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds) if (obj) { obj->id.open_args.flags = 0; obj->id.open_args.pathname = 0; - obj->path = 0; + obj->path = NULL; obj->resolution = 0; obj->is_scalable = 0; obj->freetype = 0; @@ -690,6 +621,9 @@ _ftfont_dealloc(pgFontObject *self) ((PyObject *)self)->ob_type->tp_free((PyObject *)self); } +FreeTypeInstance *_freetypeinstance; +_FreeTypeState *_freetypestate; + static int _ftfont_init(pgFontObject *self, PyObject *args, PyObject *kwds) { @@ -709,13 +643,6 @@ _ftfont_init(pgFontObject *self, PyObject *args, PyObject *kwds) int rval = -1; SDL_RWops *source; - FreeTypeInstance *ft; -#if defined(__EMSCRIPTEN__) - ft = FREETYPE_MOD_STATE(_freetypemodule)->freetype; -#else - ASSERT_GRAB_FREETYPE(ft, -1); -#endif - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O&lIi", kwlist, &file, obj_to_scale, (void *)&face_size, &font_index, &resolution, &ucs4)) { @@ -730,23 +657,27 @@ _ftfont_init(pgFontObject *self, PyObject *args, PyObject *kwds) _PGFT_Quit(self->freetype); self->freetype = 0; } + Py_XDECREF(self->path); - self->path = 0; - self->is_scalable = 0; + self->path = NULL; + self->is_scalable = 0; self->face_size = face_size; + if (ucs4) { self->render_flags |= FT_RFLAG_UCS4; - } - else { + } else { self->render_flags &= ~FT_RFLAG_UCS4; } + + if (resolution) { self->resolution = (FT_UInt)resolution; + } else { + self->resolution = _freetypestate->resolution; } - else { - self->resolution = FREETYPE_STATE->resolution; - } + + if (file == Py_None) { file = load_font_res(DEFAULT_FONT_FILE); @@ -813,12 +744,12 @@ _ftfont_init(pgFontObject *self, PyObject *args, PyObject *kwds) goto end; } - if (_PGFT_TryLoadFont_RWops(ft, self, source, font_index)) { + if (_PGFT_TryLoadFont_RWops(_freetypeinstance, self, source, font_index)) { goto end; } if (!self->is_scalable && self->face_size.x == 0) { - if (_PGFT_Font_GetAvailableSize(ft, self, 0, &size, &height, &width, + if (_PGFT_Font_GetAvailableSize(_freetypeinstance, self, 0, &size, &height, &width, &x_ppem, &y_ppem)) { self->face_size.x = DBL_TO_FX6(x_ppem); self->face_size.y = DBL_TO_FX6(y_ppem); @@ -832,8 +763,8 @@ _ftfont_init(pgFontObject *self, PyObject *args, PyObject *kwds) Otherwise, the freetype library may be closed before the object frees its local resources. See pygame-ce issue #202 */ - self->freetype = ft; - ++ft->ref_count; + self->freetype = _freetypeinstance; + ++_freetypeinstance->ref_count; rval = 0; @@ -2134,8 +2065,7 @@ _ft_init(PyObject *self, PyObject *args, PyObject *kwds) unsigned resolution = 0; _FreeTypeState *state = FREETYPE_MOD_STATE(self); - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|II", kwlist, &cache_size, - &resolution)) { + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|II", kwlist, &cache_size, &resolution)) { return NULL; } @@ -2162,12 +2092,11 @@ _ft_get_error(PyObject *self, PyObject *_null) Py_RETURN_NONE; } -#if defined(__EMSCRIPTEN__) +#if defined(__EMSCRIPTEN__) || defined(__wasi__) static PyObject * _ft_get_version(PyObject *self, PyObject *args, PyObject *kwargs) { - return Py_BuildValue("iii", FREETYPE_MAJOR, FREETYPE_MINOR, - FREETYPE_PATCH); + return Py_BuildValue("iii", FREETYPE_MAJOR, FREETYPE_MINOR, FREETYPE_PATCH); } #else static PyObject * @@ -2216,7 +2145,7 @@ _ft_get_version(PyObject *self, PyObject *args, PyObject *kwargs) FREETYPE_PATCH); } } -#endif // defined(__EMSCRIPTEN__) +#endif // defined(__EMSCRIPTEN__) || defined(__wasi__) static PyObject * _ft_get_cache_size(PyObject *self, PyObject *_null) @@ -2253,6 +2182,19 @@ _ft_get_init(PyObject *self, PyObject *_null) return PyBool_FromLong(FREETYPE_MOD_STATE(self)->freetype ? 1 : 0); } +static PyObject * +_ft_was_init(PyObject *self, PyObject *_null) +{ + if (PyErr_WarnEx( + PyExc_DeprecationWarning, + "was_init has been deprecated and may be removed in a future " + "version. Use the equivalent get_init function instead", + 1) == -1) { + return NULL; + } + return _ft_get_init(self, _null); +} + static PyObject * _ft_get_default_font(PyObject *self, PyObject *_null) { @@ -2341,10 +2283,8 @@ MODINIT_DEFINE(_freetype) FREETYPE_MOD_STATE(_freetypemodule)->freetype = 0; FREETYPE_MOD_STATE(_freetypemodule)->cache_size = 0; FREETYPE_MOD_STATE(_freetypemodule)->resolution = PGFT_DEFAULT_RESOLUTION; - Py_INCREF(&pgFont_Type); - if (PyModule_AddObject(_freetypemodule, FONT_TYPE_NAME, - (PyObject *)&pgFont_Type)) { + if (PyModule_AddObject(_freetypemodule, FONT_TYPE_NAME, (PyObject *)&pgFont_Type)) { Py_DECREF(&pgFont_Type); Py_DECREF(_freetypemodule); return NULL; @@ -2381,6 +2321,10 @@ MODINIT_DEFINE(_freetype) Py_DECREF(_freetypemodule); return NULL; } - +#if defined(__EMSCRIPTEN__) || defined(__wasi__) + _ft_autoinit(_freetypemodule, NULL); + _freetypestate = FREETYPE_MOD_STATE(_freetypemodule); + _freetypeinstance = FREETYPE_MOD_STATE(_freetypemodule)->freetype; +#endif return _freetypemodule; } diff --git a/src_c/freetype/ft_wrap.h b/src_c/freetype/ft_wrap.h index 1b1d79545d..c6fc9e1b0b 100644 --- a/src_c/freetype/ft_wrap.h +++ b/src_c/freetype/ft_wrap.h @@ -234,8 +234,7 @@ typedef struct { #if !defined(PYPY_VERSION) extern struct PyModuleDef _freetypemoduledef; #define FREETYPE_MOD_STATE(mod) ((_FreeTypeState *)PyModule_GetState(mod)) -#define FREETYPE_STATE \ - FREETYPE_MOD_STATE(PyState_FindModule(&_freetypemoduledef)) +#define FREETYPE_STATE FREETYPE_MOD_STATE(PyState_FindModule(&_freetypemoduledef)) #else /* defined(PYPY_VERSION) */ extern _FreeTypeState _modstate; #define FREETYPE_MOD_STATE(mod) (&_modstate) diff --git a/src_py/sysfont.py b/src_py/sysfont.py index ff0dc2c0d4..9104a1603b 100644 --- a/src_py/sysfont.py +++ b/src_py/sysfont.py @@ -206,34 +206,37 @@ def initsysfonts_unix(path="fc-list"): fonts = {} # these are embedded and cannot get os to list fonts a simple way. - if hasattr(sys, "getandroidapilevel") or sys.platform == "emscripten": + if hasattr(sys, "getandroidapilevel") or sys.platform in ("emscripten","wasi","android"): from pathlib import Path # default font import importlib.resources import pygame - entry = importlib.resources.files(pygame) / "freesansbold.ttf" + entry = importlib.resources.files(pygame) / pygame._freetype.get_default_font() _parse_font_entry_unix(f"{entry}: FreeSans:style=Bold", fonts) # cache in search order main script folder, then /tmp main = __import__("__main__") - if hasattr(main, "__file__"): - fc_cache = Path(main.__file__).parent / "fc_cache" + + if os.environ.get("FC_CACHE",""): + fc_cache = Path(os.environ.get("FC_CACHE")) + elif hasattr(main, "__file__"): + fc_cache = Path(main.__file__).parent / path else: - fc_cache = Path(__import__("tempfile").gettempdir()) / "fc_cache" + fc_cache = Path(__import__("tempfile").gettempdir()) / path if fc_cache.is_file(): with open(fc_cache, "rb") as file: for entry in file.read().decode("utf-8").splitlines(): _parse_font_entry_unix(entry, fonts) else: - warnings.warn(f"no fc_cache font cache file at {fc_cache}") + warnings.warn(f"no font cache (fc-list format) file found at {fc_cache}") return fonts import subprocess - + try: proc = subprocess.run( [path, ":", "file", "family", "style"], From 033c8ee561a90683de7aa3a773bd37109d2f450d Mon Sep 17 00:00:00 2001 From: "Paul m. p. Peny" Date: Sun, 29 Sep 2024 16:55:08 +0200 Subject: [PATCH 12/15] remove wasm fencing --- src_c/_freetype.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src_c/_freetype.c b/src_c/_freetype.c index 8b908daf84..7f4baa0ba7 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -2322,10 +2322,10 @@ MODINIT_DEFINE(_freetype) Py_DECREF(_freetypemodule); return NULL; } -#if defined(__EMSCRIPTEN__) || defined(__wasi__) +//#if defined(__EMSCRIPTEN__) || defined(__wasi__) _ft_autoinit(_freetypemodule, NULL); _freetypestate = FREETYPE_MOD_STATE(_freetypemodule); _freetypeinstance = FREETYPE_MOD_STATE(_freetypemodule)->freetype; -#endif +//#endif return _freetypemodule; } From b35b54bbf7fc504f906d39a6c5c57853abfca232 Mon Sep 17 00:00:00 2001 From: pmp-p Date: Sun, 29 Sep 2024 17:02:56 +0200 Subject: [PATCH 13/15] format --- src_c/_freetype.c | 226 +++++++++++++++++++++++++-------------- src_c/freetype/ft_wrap.h | 3 +- src_py/sysfont.py | 8 +- 3 files changed, 155 insertions(+), 82 deletions(-) diff --git a/src_c/_freetype.c b/src_c/_freetype.c index 7f4baa0ba7..c4698d0600 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -44,97 +44,162 @@ PyObject *_freetypemodule = NULL; static const Scale_t FACE_SIZE_NONE = {0, 0}; -static int _ft_traverse(PyObject *, visitproc, void *); -static int _ft_clear(PyObject *); - -static PyObject *_ft_quit(PyObject *, PyObject *); -static PyObject *_ft_init(PyObject *, PyObject *, PyObject *); -static PyObject *_ft_get_version(PyObject *, PyObject *, PyObject *); -static PyObject *_ft_get_error(PyObject *, PyObject *); -static PyObject *_ft_get_init(PyObject *, PyObject *); -static PyObject *_ft_was_init(PyObject *, PyObject *); -static PyObject *_ft_autoinit(PyObject *, PyObject *); -static PyObject *_ft_get_cache_size(PyObject *, PyObject *); -static PyObject *_ft_get_default_resolution(PyObject *, PyObject *); -static PyObject *_ft_set_default_resolution(PyObject *, PyObject *); -static PyObject *_ft_get_default_font(PyObject *self, PyObject *args); +static int +_ft_traverse(PyObject *, visitproc, void *); +static int +_ft_clear(PyObject *); + +static PyObject * +_ft_quit(PyObject *, PyObject *); +static PyObject * +_ft_init(PyObject *, PyObject *, PyObject *); +static PyObject * +_ft_get_version(PyObject *, PyObject *, PyObject *); +static PyObject * +_ft_get_error(PyObject *, PyObject *); +static PyObject * +_ft_get_init(PyObject *, PyObject *); +static PyObject * +_ft_was_init(PyObject *, PyObject *); +static PyObject * +_ft_autoinit(PyObject *, PyObject *); +static PyObject * +_ft_get_cache_size(PyObject *, PyObject *); +static PyObject * +_ft_get_default_resolution(PyObject *, PyObject *); +static PyObject * +_ft_set_default_resolution(PyObject *, PyObject *); +static PyObject * +_ft_get_default_font(PyObject *self, PyObject *args); /* * Constructor/init/destructor */ -static PyObject *_ftfont_new(PyTypeObject *, PyObject *, PyObject *); -static void _ftfont_dealloc(pgFontObject *); -static PyObject *_ftfont_repr(pgFontObject *); -static int _ftfont_init(pgFontObject *, PyObject *, PyObject *); +static PyObject * +_ftfont_new(PyTypeObject *, PyObject *, PyObject *); +static void +_ftfont_dealloc(pgFontObject *); +static PyObject * +_ftfont_repr(pgFontObject *); +static int +_ftfont_init(pgFontObject *, PyObject *, PyObject *); /* * Main methods */ -static PyObject *_ftfont_getrect(pgFontObject *, PyObject *, PyObject *); -static PyObject *_ftfont_getmetrics(pgFontObject *, PyObject *, PyObject *); -static PyObject *_ftfont_render(pgFontObject *, PyObject *, PyObject *); -static PyObject *_ftfont_render_to(pgFontObject *, PyObject *, PyObject *); -static PyObject *_ftfont_render_raw(pgFontObject *, PyObject *, PyObject *); -static PyObject *_ftfont_render_raw_to(pgFontObject *, PyObject *, PyObject *); -static PyObject *_ftfont_getsizedascender(pgFontObject *, PyObject *); -static PyObject *_ftfont_getsizeddescender(pgFontObject *, PyObject *); -static PyObject *_ftfont_getsizedheight(pgFontObject *, PyObject *); -static PyObject *_ftfont_getsizedglyphheight(pgFontObject *, PyObject *); -static PyObject *_ftfont_getsizes(pgFontObject *, PyObject *); +static PyObject * +_ftfont_getrect(pgFontObject *, PyObject *, PyObject *); +static PyObject * +_ftfont_getmetrics(pgFontObject *, PyObject *, PyObject *); +static PyObject * +_ftfont_render(pgFontObject *, PyObject *, PyObject *); +static PyObject * +_ftfont_render_to(pgFontObject *, PyObject *, PyObject *); +static PyObject * +_ftfont_render_raw(pgFontObject *, PyObject *, PyObject *); +static PyObject * +_ftfont_render_raw_to(pgFontObject *, PyObject *, PyObject *); +static PyObject * +_ftfont_getsizedascender(pgFontObject *, PyObject *); +static PyObject * +_ftfont_getsizeddescender(pgFontObject *, PyObject *); +static PyObject * +_ftfont_getsizedheight(pgFontObject *, PyObject *); +static PyObject * +_ftfont_getsizedglyphheight(pgFontObject *, PyObject *); +static PyObject * +_ftfont_getsizes(pgFontObject *, PyObject *); /* static PyObject *_ftfont_copy(pgFontObject *); */ /* * Getters/setters */ -static PyObject *_ftfont_getsize(pgFontObject *, void *); -static int _ftfont_setsize(pgFontObject *, PyObject *, void *); -static PyObject *_ftfont_getstyle(pgFontObject *, void *); -static int _ftfont_setstyle(pgFontObject *, PyObject *, void *); -static PyObject *_ftfont_getname(pgFontObject *, void *); -static PyObject *_ftfont_getstylename(pgFontObject *, void *); -static PyObject *_ftfont_getpath(pgFontObject *, void *); -static PyObject *_ftfont_getscalable(pgFontObject *, void *); -static PyObject *_ftfont_getfixedwidth(pgFontObject *, void *); -static PyObject *_ftfont_getfixedsizes(pgFontObject *, void *); -static PyObject *_ftfont_getstrength(pgFontObject *, void *); -static int _ftfont_setstrength(pgFontObject *, PyObject *, void *); -static PyObject *_ftfont_getunderlineadjustment(pgFontObject *, void *); -static int _ftfont_setunderlineadjustment(pgFontObject *, PyObject *, void *); -static PyObject *_ftfont_getrotation(pgFontObject *, void *); -static int _ftfont_setrotation(pgFontObject *, PyObject *, void *); -static PyObject *_ftfont_getfgcolor(pgFontObject *, void *); -static int _ftfont_setfgcolor(pgFontObject *, PyObject *, void *); -static PyObject *_ftfont_getbgcolor(pgFontObject *, void *); -static int _ftfont_setbgcolor(pgFontObject *, PyObject *, void *); - -static PyObject *_ftfont_getresolution(pgFontObject *, void *); - -static PyObject *_ftfont_getfontmetric(pgFontObject *, void *); - -static PyObject *_ftfont_getstyle_flag(pgFontObject *, void *); -static int _ftfont_setstyle_flag(pgFontObject *, PyObject *, void *); - -static PyObject *_ftfont_getrender_flag(pgFontObject *, void *); -static int _ftfont_setrender_flag(pgFontObject *, PyObject *, void *); +static PyObject * +_ftfont_getsize(pgFontObject *, void *); +static int +_ftfont_setsize(pgFontObject *, PyObject *, void *); +static PyObject * +_ftfont_getstyle(pgFontObject *, void *); +static int +_ftfont_setstyle(pgFontObject *, PyObject *, void *); +static PyObject * +_ftfont_getname(pgFontObject *, void *); +static PyObject * +_ftfont_getstylename(pgFontObject *, void *); +static PyObject * +_ftfont_getpath(pgFontObject *, void *); +static PyObject * +_ftfont_getscalable(pgFontObject *, void *); +static PyObject * +_ftfont_getfixedwidth(pgFontObject *, void *); +static PyObject * +_ftfont_getfixedsizes(pgFontObject *, void *); +static PyObject * +_ftfont_getstrength(pgFontObject *, void *); +static int +_ftfont_setstrength(pgFontObject *, PyObject *, void *); +static PyObject * +_ftfont_getunderlineadjustment(pgFontObject *, void *); +static int +_ftfont_setunderlineadjustment(pgFontObject *, PyObject *, void *); +static PyObject * +_ftfont_getrotation(pgFontObject *, void *); +static int +_ftfont_setrotation(pgFontObject *, PyObject *, void *); +static PyObject * +_ftfont_getfgcolor(pgFontObject *, void *); +static int +_ftfont_setfgcolor(pgFontObject *, PyObject *, void *); +static PyObject * +_ftfont_getbgcolor(pgFontObject *, void *); +static int +_ftfont_setbgcolor(pgFontObject *, PyObject *, void *); + +static PyObject * +_ftfont_getresolution(pgFontObject *, void *); + +static PyObject * +_ftfont_getfontmetric(pgFontObject *, void *); + +static PyObject * +_ftfont_getstyle_flag(pgFontObject *, void *); +static int +_ftfont_setstyle_flag(pgFontObject *, PyObject *, void *); + +static PyObject * +_ftfont_getrender_flag(pgFontObject *, void *); +static int +_ftfont_setrender_flag(pgFontObject *, PyObject *, void *); #if defined(PGFT_DEBUG_CACHE) -static PyObject *_ftfont_getdebugcachestats(pgFontObject *, void *); +static PyObject * +_ftfont_getdebugcachestats(pgFontObject *, void *); #endif /* * Internal helpers */ -static PyObject *get_metrics(FontRenderMode *, pgFontObject *, PGFT_String *); -static PyObject *load_font_res(const char *); -static int parse_dest(PyObject *, int *, int *); -static int obj_to_scale(PyObject *, void *); -static int objs_to_scale(PyObject *, PyObject *, Scale_t *); -static int numbers_to_scale(PyObject *, PyObject *, Scale_t *); -static int build_scale(PyObject *, PyObject *, Scale_t *); -static FT_UInt number_to_FX6_unsigned(PyObject *); -static int obj_to_rotation(PyObject *, void *); -static void free_string(PGFT_String *); +static PyObject * +get_metrics(FontRenderMode *, pgFontObject *, PGFT_String *); +static PyObject * +load_font_res(const char *); +static int +parse_dest(PyObject *, int *, int *); +static int +obj_to_scale(PyObject *, void *); +static int +objs_to_scale(PyObject *, PyObject *, Scale_t *); +static int +numbers_to_scale(PyObject *, PyObject *, Scale_t *); +static int +build_scale(PyObject *, PyObject *, Scale_t *); +static FT_UInt +number_to_FX6_unsigned(PyObject *); +static int +obj_to_rotation(PyObject *, void *); +static void +free_string(PGFT_String *); /* * Auxiliary defines @@ -667,18 +732,18 @@ _ftfont_init(pgFontObject *self, PyObject *args, PyObject *kwds) if (ucs4) { self->render_flags |= FT_RFLAG_UCS4; - } else { + } + else { self->render_flags &= ~FT_RFLAG_UCS4; } - if (resolution) { self->resolution = (FT_UInt)resolution; - } else { + } + else { self->resolution = _freetypestate->resolution; } - if (file == Py_None) { file = load_font_res(DEFAULT_FONT_FILE); @@ -750,8 +815,8 @@ _ftfont_init(pgFontObject *self, PyObject *args, PyObject *kwds) } if (!self->is_scalable && self->face_size.x == 0) { - if (_PGFT_Font_GetAvailableSize(_freetypeinstance, self, 0, &size, &height, &width, - &x_ppem, &y_ppem)) { + if (_PGFT_Font_GetAvailableSize(_freetypeinstance, self, 0, &size, + &height, &width, &x_ppem, &y_ppem)) { self->face_size.x = DBL_TO_FX6(x_ppem); self->face_size.y = DBL_TO_FX6(y_ppem); } @@ -2066,7 +2131,8 @@ _ft_init(PyObject *self, PyObject *args, PyObject *kwds) unsigned resolution = 0; _FreeTypeState *state = FREETYPE_MOD_STATE(self); - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|II", kwlist, &cache_size, &resolution)) { + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|II", kwlist, &cache_size, + &resolution)) { return NULL; } @@ -2097,7 +2163,8 @@ _ft_get_error(PyObject *self, PyObject *_null) static PyObject * _ft_get_version(PyObject *self, PyObject *args, PyObject *kwargs) { - return Py_BuildValue("iii", FREETYPE_MAJOR, FREETYPE_MINOR, FREETYPE_PATCH); + return Py_BuildValue("iii", FREETYPE_MAJOR, FREETYPE_MINOR, + FREETYPE_PATCH); } #else static PyObject * @@ -2285,7 +2352,8 @@ MODINIT_DEFINE(_freetype) FREETYPE_MOD_STATE(_freetypemodule)->cache_size = 0; FREETYPE_MOD_STATE(_freetypemodule)->resolution = PGFT_DEFAULT_RESOLUTION; Py_INCREF(&pgFont_Type); - if (PyModule_AddObject(_freetypemodule, FONT_TYPE_NAME, (PyObject *)&pgFont_Type)) { + if (PyModule_AddObject(_freetypemodule, FONT_TYPE_NAME, + (PyObject *)&pgFont_Type)) { Py_DECREF(&pgFont_Type); Py_DECREF(_freetypemodule); return NULL; diff --git a/src_c/freetype/ft_wrap.h b/src_c/freetype/ft_wrap.h index c6fc9e1b0b..1b1d79545d 100644 --- a/src_c/freetype/ft_wrap.h +++ b/src_c/freetype/ft_wrap.h @@ -234,7 +234,8 @@ typedef struct { #if !defined(PYPY_VERSION) extern struct PyModuleDef _freetypemoduledef; #define FREETYPE_MOD_STATE(mod) ((_FreeTypeState *)PyModule_GetState(mod)) -#define FREETYPE_STATE FREETYPE_MOD_STATE(PyState_FindModule(&_freetypemoduledef)) +#define FREETYPE_STATE \ + FREETYPE_MOD_STATE(PyState_FindModule(&_freetypemoduledef)) #else /* defined(PYPY_VERSION) */ extern _FreeTypeState _modstate; #define FREETYPE_MOD_STATE(mod) (&_modstate) diff --git a/src_py/sysfont.py b/src_py/sysfont.py index 9104a1603b..73033c8817 100644 --- a/src_py/sysfont.py +++ b/src_py/sysfont.py @@ -206,7 +206,11 @@ def initsysfonts_unix(path="fc-list"): fonts = {} # these are embedded and cannot get os to list fonts a simple way. - if hasattr(sys, "getandroidapilevel") or sys.platform in ("emscripten","wasi","android"): + if hasattr(sys, "getandroidapilevel") or sys.platform in ( + "emscripten", + "wasi", + "android", + ): from pathlib import Path # default font @@ -219,7 +223,7 @@ def initsysfonts_unix(path="fc-list"): # cache in search order main script folder, then /tmp main = __import__("__main__") - if os.environ.get("FC_CACHE",""): + if os.environ.get("FC_CACHE", ""): fc_cache = Path(os.environ.get("FC_CACHE")) elif hasattr(main, "__file__"): fc_cache = Path(main.__file__).parent / path From 137832535327e515f0b5e9761c987bd98665f831 Mon Sep 17 00:00:00 2001 From: "Paul m. p. Peny" Date: Sun, 29 Sep 2024 17:10:26 +0200 Subject: [PATCH 14/15] auto format failed ... --- src_c/_freetype.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src_c/_freetype.c b/src_c/_freetype.c index c4698d0600..289bc53349 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -2390,10 +2390,8 @@ MODINIT_DEFINE(_freetype) Py_DECREF(_freetypemodule); return NULL; } -//#if defined(__EMSCRIPTEN__) || defined(__wasi__) _ft_autoinit(_freetypemodule, NULL); _freetypestate = FREETYPE_MOD_STATE(_freetypemodule); _freetypeinstance = FREETYPE_MOD_STATE(_freetypemodule)->freetype; -//#endif return _freetypemodule; } From 0074d2bc12c25169ac5d37d42a7d78e9b701f243 Mon Sep 17 00:00:00 2001 From: pmp-p Date: Sun, 29 Sep 2024 17:18:15 +0200 Subject: [PATCH 15/15] pre-commit run --all-files --- src_c/_freetype.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_c/_freetype.c b/src_c/_freetype.c index 289bc53349..5ae84b13e2 100644 --- a/src_c/_freetype.c +++ b/src_c/_freetype.c @@ -41,7 +41,6 @@ PyObject *_freetypemodule = NULL; - static const Scale_t FACE_SIZE_NONE = {0, 0}; static int @@ -2390,6 +2389,7 @@ MODINIT_DEFINE(_freetype) Py_DECREF(_freetypemodule); return NULL; } + _ft_autoinit(_freetypemodule, NULL); _freetypestate = FREETYPE_MOD_STATE(_freetypemodule); _freetypeinstance = FREETYPE_MOD_STATE(_freetypemodule)->freetype;