Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
buf.add_str(string)
buf.guess_segment_properties()
buf.direction = "TTB"
def v_advance_func(font, gid, data):
return 456
def v_origin_func(font, gid, data):
return (True, 345, 567)
funcs = hb.FontFuncs.create()
funcs.set_glyph_v_advance_func(v_advance_func, None)
funcs.set_glyph_v_origin_func(v_origin_func, None)
blankfont.funcs = funcs
hb.shape(blankfont, buf)
infos = [(pos.y_advance, pos.x_offset, pos.y_offset) for pos in buf.glyph_positions]
assert infos == expected
string = "edcba"
buf = hb.Buffer()
buf.add_str(string)
buf.guess_segment_properties()
messages = []
infos_trace = []
positions_trace = []
def message(msg):
messages.append(msg)
infos_trace.append(buf.glyph_infos)
positions_trace.append(buf.glyph_positions)
buf.set_message_func(message)
hb.shape(blankfont, buf)
gids = [g.codepoint for g in buf.glyph_infos]
assert gids == [5, 4, 1, 2, 1]
pos = [g.x_advance for g in buf.glyph_positions]
assert pos == [0, 0, 0, 100, 0]
expected_messages = [
'start table GSUB',
'start lookup 0',
'end lookup 0',
'end table GSUB',
'start table GPOS',
'start lookup 0',
'end lookup 0',
'end table GPOS',
]
assert messages == expected_messages
gids_trace = [[g.codepoint for g in infos] for infos in infos_trace]
def test_cluster_level(self):
buf = hb.Buffer()
assert buf.cluster_level == hb.BufferClusterLevel.DEFAULT
buf.cluster_level = hb.BufferClusterLevel.MONOTONE_CHARACTERS
assert buf.cluster_level == hb.BufferClusterLevel.MONOTONE_CHARACTERS
buf.cluster_level = hb.BufferClusterLevel.MONOTONE_GRAPHEMES
assert buf.cluster_level == hb.BufferClusterLevel.MONOTONE_GRAPHEMES
buf.cluster_level = hb.BufferClusterLevel.CHARACTERS
assert buf.cluster_level == hb.BufferClusterLevel.CHARACTERS
buf.cluster_level = hb.BufferClusterLevel.DEFAULT
assert buf.cluster_level == hb.BufferClusterLevel.DEFAULT
def test_glyh_name_no_features(self, blankfont, string, expected):
buf = hb.Buffer()
buf.add_str(string)
buf.guess_segment_properties()
hb.shape(blankfont, buf)
# font.get_glyph_name() returns None if the font does not contain glyph names
# or if the glyph ID does not exist.
glyph_names = [blankfont.get_glyph_name(g.codepoint) for g in buf.glyph_infos]
assert glyph_names == expected
assert blankfont.get_glyph_name(1000) is None
# font.glyph_to_string() return "gidN" if the font does not contain glyph names
# or if the glyph ID does not exist.
glyph_names = [blankfont.glyph_to_string(g.codepoint) for g in buf.glyph_infos]
assert glyph_names == expected
assert blankfont.glyph_to_string(1000) == 'gid1000'
def test_gid_and_cluster_no_features(self, blankfont, string, expected):
buf = hb.Buffer()
buf.add_str(string)
buf.guess_segment_properties()
hb.shape(blankfont, buf)
infos = [(g.codepoint, g.cluster) for g in buf.glyph_infos]
assert infos == expected
def test_add_utf8(self):
buf = hb.Buffer()
buf.add_utf8("aбç💩e".encode("utf-8"))
infos = [(g.codepoint, g.cluster) for g in buf.glyph_infos]
assert infos == [(0x61, 0), (0x431, 1), (0xE7, 3), (0x1F4A9, 5), (0x65, 9)]
def test_message_func_crash(self, blankfont):
string = "edcba"
buf = hb.Buffer()
buf.add_str(string)
buf.guess_segment_properties()
message_collector = MessageCollector()
buf.set_message_func(message_collector.message)
hb.shape(blankfont, buf)
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 test_create(self):
buf = hb.Buffer.create()
def blankfont():
"""Return a subset of AdobeBlank.ttf containing the following glyphs/characters:
[
{gid=0, name=".notdef"},
{gid=1, name="a", code=0x61},
{gid=2, name="b", code=0x62},
{gid=3, name="c", code=0x63},
{gid=4, name="d", code=0x64},
{gid=5, name="e", code=0x65},
{gid=6, name="ccedilla", code=0x62},
{gid=7, name="uni0431", code=0x0431}, # CYRILLIC SMALL LETTER BE
{gid=8, name="u1F4A9", code=0x1F4A9}, # PILE OF POO
]
"""
face = hb.Face(ADOBE_BLANK_TTF_PATH.read_bytes())
font = hb.Font(face)
upem = face.upem
font.scale = (upem, upem)
hb.ot_font_set_funcs(font)
return font