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

Skip to content

Commit db5f2c2

Browse files
committed
Warn on FreeType missing glyphs.
1 parent 4dbbd22 commit db5f2c2

File tree

3 files changed

+24
-7
lines changed

3 files changed

+24
-7
lines changed

lib/matplotlib/backends/backend_pdf.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import sys
1717
import time
1818
import types
19+
import warnings
1920
import zlib
2021

2122
import numpy as np
@@ -937,8 +938,13 @@ def get_char_width(charcode):
937938
s, flags=LOAD_NO_SCALE | LOAD_NO_HINTING).horiAdvance
938939
return cvt(width)
939940

940-
widths = [get_char_width(charcode)
941-
for charcode in range(firstchar, lastchar+1)]
941+
with warnings.catch_warnings():
942+
# Ignore 'Required glyph missing from current font' warning
943+
# from ft2font: here we're just builting the widths table, but
944+
# the missing glyphs may not even be used in the actual string.
945+
warnings.filterwarnings("ignore")
946+
widths = [get_char_width(charcode)
947+
for charcode in range(firstchar, lastchar+1)]
942948
descriptor['MaxWidth'] = max(widths)
943949

944950
# Make the "Differences" array, sort the ccodes < 255 from

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+
static 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_WarnFormat(NULL, 1, "Glyph %lu missing from current font.", charcode);
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
@@ -610,7 +620,7 @@ void FT2Font::set_text(
610620
FT_BBox glyph_bbox;
611621
FT_Pos last_advance;
612622

613-
glyph_index = FT_Get_Char_Index(face, codepoints[n]);
623+
glyph_index = ft_get_char_index_or_warn(face, codepoints[n]);
614624

615625
// retrieve kerning distance and move pen position
616626
if (use_kerning && previous && glyph_index) {
@@ -663,7 +673,8 @@ void FT2Font::set_text(
663673

664674
void FT2Font::load_char(long charcode, FT_Int32 flags)
665675
{
666-
int error = FT_Load_Char(face, (unsigned long)charcode, flags);
676+
FT_UInt glyph_index = ft_get_char_index_or_warn(face, (FT_ULong)charcode);
677+
int error = FT_Load_Glyph(face, glyph_index, flags);
667678

668679
if (error) {
669680
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)