def glyphs_modified(font_before, font_after): """For glyphs which are shared between the two fonts, return glyphs who's surface areas differ and the diff is greater than a predetermined threshold""" bad_glyphs = [] glyphs_before = font_before.getGlyphSet() glyphs_after = font_after.getGlyphSet() glyphs_shared = set(glyphs_before.keys()) & set(glyphs_after.keys()) upm_before = font_before['head'].unitsPerEm upm_after = font_after['head'].unitsPerEm pen_before = AreaPen(glyphs_before) pen_after = AreaPen(glyphs_after) for glyph in glyphs_shared: glyphs_before[glyph].draw(pen_before) glyphs_after[glyph].draw(pen_after) area_before = pen_before.value pen_before.value = 0 area_after = pen_after.value pen_after.value = 0 area_norm_before = (area_before / upm_before) * upm_after area_norm_after = (area_after / upm_after) * upm_before if area_norm_before != area_norm_after: if abs(area_norm_before - area_norm_after) > GLYPH_AREA_THRESHOLD: bad_glyphs.append(glyph) glyphs_encoded = font_before['cmap'].getcmap(3, 1).cmap return [i for i in glyphs_encoded.items() if i[1] in bad_glyphs]
def glyphs_surface_area(font): """Calculate the surface area of a glyph's ink""" glyphs = {} glyph_set = font.getGlyphSet() area_pen = AreaPen(glyph_set) for glyph in glyph_set.keys(): glyph_set[glyph].draw(area_pen) area = area_pen.value area_pen.value = 0 glyphs[glyph] = area return glyphs