Skip to content

Commit f572e93

Browse files
authored
Merge pull request #3596 from cherez/weakrefable_ft_fonts
Add weak reference support to freetype.Font
2 parents d6d41c2 + f638639 commit f572e93

File tree

3 files changed

+13
-0
lines changed

3 files changed

+13
-0
lines changed

src_c/_freetype.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,7 @@ PyTypeObject pgFont_Type = {
632632
.tp_repr = (reprfunc)_ftfont_repr,
633633
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
634634
.tp_doc = DOC_FREETYPE_FONT,
635+
.tp_weaklistoffset = offsetof(pgFontObject, weakreflist),
635636
.tp_methods = _ftfont_methods,
636637
.tp_getset = _ftfont_getsets,
637638
.tp_init = (initproc)_ftfont_init,
@@ -674,6 +675,7 @@ _ftfont_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
674675
obj->bgcolor[2] = 0;
675676
obj->bgcolor[3] = 0;
676677
obj->init_generation = current_freetype_generation;
678+
obj->weakreflist = NULL;
677679
}
678680
return (PyObject *)obj;
679681
}
@@ -689,6 +691,9 @@ _ftfont_dealloc(pgFontObject *self)
689691
_PGFT_Quit(self->freetype);
690692

691693
Py_XDECREF(self->path);
694+
if (self->weakreflist) {
695+
PyObject_ClearWeakRefs((PyObject *)self);
696+
}
692697
((PyObject *)self)->ob_type->tp_free((PyObject *)self);
693698
}
694699

src_c/freetype.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ typedef struct {
103103
struct freetypeinstance_ *freetype; /* Personal reference */
104104
struct fontinternals_ *_internals;
105105
unsigned int init_generation;
106+
PyObject *weakreflist;
106107
} pgFontObject;
107108

108109
#define pgFont_IS_ALIVE(o) (((pgFontObject *)(o))->_internals != 0)

test/freetype_test.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1605,6 +1605,13 @@ def ref_items(seq):
16051605
for i in range(n):
16061606
self.assertIsNone(refs[i](), "ref %d not collected" % i)
16071607

1608+
font2 = ft.Font(self._fixed_path)
1609+
ref = weakref.ref(font2)
1610+
del font2
1611+
for i in range(2):
1612+
gc.collect()
1613+
self.assertIsNone(ref(), "ref not collected")
1614+
16081615
try:
16091616
from sys import getrefcount
16101617
except ImportError:

0 commit comments

Comments
 (0)