Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def opensans():
"""Return a subset of OpenSans.ttf containing the following glyphs/characters:
[
{gid=0, name=".notdef"},
{gid=1, name="A", code=0x41},
]
"""
face = hb.Face(OPEN_SANS_TTF_PATH.read_bytes())
font = hb.Font(face)
upem = face.upem
font.scale = (upem, upem)
hb.ot_font_set_funcs(font)
return font
def shapeHB(text, font_name, font_size, features: Dict[str, bool] = None):
font = pdfmetrics.getFont(font_name)
if not isinstance(font, TTFont):
# TODO make valid for all types of fonts
raise RLKerningError("Not a TTF font")
fontdata = font.face._ttf_data
face = hb.Face(fontdata)
font = hb.Font(face)
# HB scales to integers in offset and advance so very big scale
# will divide by SCALE_MULT to get the actual size in fractional points
font.scale = (font_size * SCALE_MULT, font_size * SCALE_MULT)
hb.ot_font_set_funcs(font)
buf = hb.Buffer()
buf.add_str(text)
buf.guess_segment_properties()
hb.shape(font, buf, features)
return buf
# label image
ctx.set_font_size(30)
ctx.set_source_rgb(0.5, 0.5, 0.5)
ctx.move_to(x_tab, 50)
ctx.show_text("{}: {}".format(self.table_name, len(self._data)))
ctx.move_to(x_tab, 100)
if font_position:
ctx.show_text("Font Set: {}".format(font_position))
if len(self._data) > limit:
ctx.set_font_size(20)
ctx.move_to(x_tab, 150)
ctx.show_text("Warning: {} different items. Only showing most serious {}".format(
len(self._data), limit)
)
hb.ot_font_set_funcs(font.hbfont)
# Draw glyphs
x, y, baseline = x_tab, 200, 0
x_pos = x_tab
y_pos = 200
for idx, row in enumerate(self._data[:limit]):
string = "{}{}{}".format(
prefix_characters,
row['string'],
suffix_characters)
buf = self._shape_string(font, string, row['features'])
char_info = buf.glyph_infos
char_pos = buf.glyph_positions
for info, pos in zip(char_info, char_pos):
gid = info.codepoint
font.ftfont.load_glyph(gid, flags=6)
if len(diff_table) > item_limit:
ctx.set_font_size(20)
ctx.move_to(20, 150)
ctx.show_text("Warning: {} different items. Only showing most serious {}".format(
len(diff_table), item_limit)
)
# HB font
hb_face = hb.Face.create(open(font.path, 'rb').read())
hb_font = hb.Font.create(hb_face)
hb_upem = upm_size
hb_font.scale = (hb_upem, hb_upem)
if font.is_variable:
hb_font.set_variations(font.axis_locations)
hb.ot_font_set_funcs(hb_font)
# Draw glyphs
x, y, baseline = 20, 200, 0
x_pos = 20
y_pos = 200
for row in diff_table[:item_limit]:
buf = hb.Buffer.create()
buf.add_str(row['string'])
buf.guess_segment_properties()
try:
features = {f: True for f in row['features']}
hb.shape(hb_font, buf, features)
except KeyError:
hb.shape(hb_font, buf)