Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 209b759

Browse files
committed
Warn on freetype missing glyphs.
There is an additional call site to FT_Get_Char_Index in PyFT2Font_get_char_index but that value is directly returned to Python so it would be easier to check for the value there and handle it accordingly (plus, in practice, the same warning will be triggered at the other two call sites at some point anyways). But I can replace that by a warning too.
1 parent d9b5b4e commit 209b759

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

src/ft2font.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,19 @@ FT2Image::draw_rect_filled(unsigned long x0, unsigned long y0, unsigned long x1,
162162

163163
inline double conv(long v)
164164
{
165-
return double(v) / 64.0;
165+
return v / 64.;
166166
}
167167

168+
FT_UInt ft_get_char_index_or_warn(FT_Face face, FT_ULong charcode)
169+
{
170+
FT_UInt glyph_index = FT_Get_Char_Index(face, charcode);
171+
if (!glyph_index) {
172+
PyErr_WarnEx(NULL, "Required glyph missing from current font.", 1);
173+
}
174+
return glyph_index;
175+
}
176+
177+
168178
int FT2Font::get_path_count()
169179
{
170180
// get the glyph as a path, a list of (COMMAND, *args) as described in matplotlib.path
@@ -611,7 +621,7 @@ void FT2Font::set_text(
611621
FT_BBox glyph_bbox;
612622
FT_Pos last_advance;
613623

614-
glyph_index = FT_Get_Char_Index(face, codepoints[n]);
624+
glyph_index = ft_get_char_index_or_warn(face, codepoints[n]);
615625

616626
// retrieve kerning distance and move pen position
617627
if (use_kerning && previous && glyph_index) {
@@ -664,7 +674,8 @@ void FT2Font::set_text(
664674

665675
void FT2Font::load_char(long charcode, FT_Int32 flags)
666676
{
667-
int error = FT_Load_Char(face, (unsigned long)charcode, flags);
677+
FT_UInt glyph_index = ft_get_char_index_or_warn(face, (FT_ULong)charcode);
678+
int error = FT_Load_Glyph(face, glyph_index, flags);
668679

669680
if (error) {
670681
throw std::runtime_error("Could not load charcode");

src/ft2font_wrapper.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -998,8 +998,8 @@ static PyObject *PyFT2Font_get_char_index(PyFT2Font *self, PyObject *args, PyObj
998998
const char *PyFT2Font_get_sfnt__doc__ =
999999
"get_sfnt(name)\n"
10001000
"\n"
1001-
"Get all values from the SFNT names table. Result is a dictionary whose"
1002-
"key is the platform-ID, ISO-encoding-scheme, language-code, and"
1001+
"Get all values from the SFNT names table. Result is a dictionary whose "
1002+
"key is the platform-ID, ISO-encoding-scheme, language-code, and "
10031003
"description.\n";
10041004

10051005
static PyObject *PyFT2Font_get_sfnt(PyFT2Font *self, PyObject *args, PyObject *kwds)

0 commit comments

Comments
 (0)