simoncozens/babelfont

Error loading fonts with incomplete GDEF

Closed this issue · 0 comments

yanone commented

I'm not preparing a PR here because creating a branch of my babelfont fork includes my previous unmerged PR, and I'm not so good with Github to be able to easily separate that.

Fraunces (ofl/fraunces/Fraunces[SOFT,WONK,opsz,wght].ttf), among others, has this issue:

In [3]: font = babelfont.load("ofl/fraunces/Fraunces[SOFT,WONK,opsz,wght].ttf")
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[3], line 1
----> 1 font = babelfont.load("ofl/fraunces/Fraunces[SOFT,WONK,opsz,wght].ttf")

File ~/.pyenv/versions/3.11.1/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/babelfont/__init__.py:17, in load(filename)
     16 def load(filename):
---> 17     return Convert(filename).load()

File ~/.pyenv/versions/3.11.1/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/babelfont/convertors/__init__.py:70, in Convert.load(self, **kwargs)
     68 for c in self.convertors:
     69     if c.can_load(self, **kwargs):
---> 70         return c.load(self, **kwargs)
     71 raise NotImplementedError

File ~/.pyenv/versions/3.11.1/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/babelfont/convertors/__init__.py:26, in BaseConvertor.load(cls, convertor)
     24 self.filename = convertor.filename
     25 self.scratch = convertor.scratch
---> 26 return self._load()

File ~/.pyenv/versions/3.11.1/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/babelfont/convertors/truetype.py:43, in TrueType._load(self)
     41 self._load_masters()
     42 self._load_names()
---> 43 self._load_glyphs()
     44 return self.font

File ~/.pyenv/versions/3.11.1/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/babelfont/convertors/truetype.py:110, in TrueType._load_glyphs(self)
    108 glyphs_dict = {}
    109 for glyph in self.tt.getGlyphOrder():
--> 110     category = _categorize_glyph(self.tt, glyph) or "base"
    111     glyphs_dict[glyph] = Glyph(name=glyph, codepoints=list(mapping.get(glyph, [])), category=category)
    112     self.font.glyphs.append(glyphs_dict[glyph])

File ~/.pyenv/versions/3.11.1/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/babelfont/convertors/truetype.py:20, in _categorize_glyph(font, glyphname)
     18 def _categorize_glyph(font,glyphname):
     19     if "GDEF" not in font: return None
---> 20     classdefs = font["GDEF"].table.GlyphClassDef.classDefs
     21     if glyphname not in classdefs:
     22         return None

AttributeError: 'NoneType' object has no attribute 'classDefs'