def runHB(direction, script, language, features, text, fontname, positions): font = getHbFont(fontname) buf = HarfBuzz.buffer_create() text = toUnicode(text) HarfBuzz.buffer_add_utf8(buf, text.encode('utf-8'), 0, -1) HarfBuzz.buffer_set_direction(buf, HarfBuzz.direction_from_string(toBytes(direction))) HarfBuzz.buffer_set_script(buf, HarfBuzz.script_from_string(toBytes(script))) if language: HarfBuzz.buffer_set_language(buf, HarfBuzz.language_from_string(toBytes(language))) if features: features = [HarfBuzz.feature_from_string(toBytes(fea))[1] for fea in features.split(',')] else: features = [] HarfBuzz.shape(font, buf, features) info = HarfBuzz.buffer_get_glyph_infos(buf) ttfont = getTtFont(fontname) if positions: pos = HarfBuzz.buffer_get_glyph_positions(buf) glyphs = [] for i, p in zip(info, pos): glyph = ttfont.getGlyphName(i.codepoint) if p.x_offset or p.y_offset: glyph += "@%d,%d" % (p.x_offset, p.y_offset) glyph += "+%d" % p.x_advance if p.y_advance: glyph += ",%d" % p.y_advance glyphs.append(glyph) out = "|".join(glyphs) else: out = "|".join([ttfont.getGlyphName(i.codepoint) for i in info]) return "[%s]" % out
def runHB(text, buf, font, ttfont): HarfBuzz.buffer_clear_contents(buf) HarfBuzz.buffer_add_utf8(buf, text.encode('utf-8'), 0, -1) HarfBuzz.buffer_set_direction(buf, HarfBuzz.direction_t.RTL) HarfBuzz.buffer_set_script(buf, HarfBuzz.script_t.ARABIC) HarfBuzz.buffer_set_language(buf, HarfBuzz.language_from_string(b"ar")) HarfBuzz.shape(font, buf, []) info = HarfBuzz.buffer_get_glyph_infos(buf) out = "|".join([ttfont.getGlyphName(i.codepoint) for i in info]) return "[%s]" % out
def shape(text, font): text = toUnicode(text) buf = HarfBuzz.buffer_create() HarfBuzz.buffer_add_utf8(buf, text.encode('utf-8'), 0, -1) HarfBuzz.buffer_set_direction(buf, HarfBuzz.direction_t.RTL) HarfBuzz.buffer_set_script(buf, HarfBuzz.script_t.ARABIC) HarfBuzz.buffer_set_language(buf, HarfBuzz.language_from_string("ar")) HarfBuzz.shape(font, buf, [HarfBuzz.feature_from_string("+ss01")[1]]) glyphs = HarfBuzz.buffer_get_glyph_infos(buf) positions = HarfBuzz.buffer_get_glyph_positions(buf) return [(g.codepoint, p.x_advance, p.x_offset, p.y_offset) for g, p in zip(glyphs, positions)]
def runHB(text, buf, font, ttfont): HarfBuzz.buffer_clear_contents(buf) HarfBuzz.buffer_add_utf8(buf, text.encode('utf-8'), 0, -1) HarfBuzz.buffer_set_direction(buf, HarfBuzz.direction_t.RTL) HarfBuzz.buffer_set_script(buf, HarfBuzz.script_t.ARABIC) HarfBuzz.buffer_set_language(buf, HarfBuzz.language_from_string(b"ar")) HarfBuzz.shape(font, buf, []) info = HarfBuzz.buffer_get_glyph_infos(buf) positions = HarfBuzz.buffer_get_glyph_positions(buf) out = [] for i, p in zip(info, positions): text = "" text += ttfont.getGlyphName(i.codepoint) text += " w=%d" % p.x_advance if p.x_offset: text += " x=%d" % p.x_offset if p.y_offset: text += " y=%d" % p.y_offset out.append(text) return "[%s]" % "|".join(out)
# string indices, then this is quickest way to add text to # buffer: hb.buffer_add_utf8 (buf, text.encode('utf-8'), 0, -1) # Otherwise, then following handles both narrow and wide # Python builds (the first item in the array is BOM, so we skip it): elif sys.maxunicode == 0x10FFFF: hb.buffer_add_utf32 (buf, array.array('I', text.encode('utf-32'))[1:], 0, -1) else: hb.buffer_add_utf16 (buf, array.array('H', text.encode('utf-16'))[1:], 0, -1) hb.buffer_guess_segment_properties (buf) if ((hb.buffer_get_script(buf) == hb.script_t.MONGOLIAN) or (hb.buffer_get_script(buf) == hb.script_t.PHAGS_PA)): wantRotate = True if (hb.buffer_get_script(buf) == hb.script_t.HAN): hb.buffer_set_direction(buf, hb.direction_t.TTB) wantTTB = True hb.shape (font, buf, []) font_extents = hb.font_get_extents_for_direction(font, hb.buffer_get_direction(buf)) font_height = font_extents.ascender - font_extents.descender + font_extents.line_gap infos = hb.buffer_get_glyph_infos (buf) positions = hb.buffer_get_glyph_positions (buf) x = 0 y = 0 glyph_extents = list() min_ix = upem max_ix = -upem min_iy = upem