1*2d1272b8SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*2d1272b8SAndroid Build Coastguard Worker 3*2d1272b8SAndroid Build Coastguard Workerimport sys 4*2d1272b8SAndroid Build Coastguard Workerimport array 5*2d1272b8SAndroid Build Coastguard Workerimport gi 6*2d1272b8SAndroid Build Coastguard Workergi.require_version('HarfBuzz', '0.0') 7*2d1272b8SAndroid Build Coastguard Workerfrom gi.repository import HarfBuzz as hb 8*2d1272b8SAndroid Build Coastguard Workerfrom gi.repository import GLib 9*2d1272b8SAndroid Build Coastguard Worker 10*2d1272b8SAndroid Build Coastguard Workerfontdata = open (sys.argv[1], 'rb').read () 11*2d1272b8SAndroid Build Coastguard Workertext = sys.argv[2] 12*2d1272b8SAndroid Build Coastguard Worker# Need to create GLib.Bytes explicitly until this bug is fixed: 13*2d1272b8SAndroid Build Coastguard Worker# https://bugzilla.gnome.org/show_bug.cgi?id=729541 14*2d1272b8SAndroid Build Coastguard Workerblob = hb.glib_blob_create (GLib.Bytes.new (fontdata)) 15*2d1272b8SAndroid Build Coastguard Workerface = hb.face_create (blob, 0) 16*2d1272b8SAndroid Build Coastguard Workerdel blob 17*2d1272b8SAndroid Build Coastguard Workerfont = hb.font_create (face) 18*2d1272b8SAndroid Build Coastguard Workerupem = hb.face_get_upem (face) 19*2d1272b8SAndroid Build Coastguard Workerdel face 20*2d1272b8SAndroid Build Coastguard Workerhb.font_set_scale (font, upem, upem) 21*2d1272b8SAndroid Build Coastguard Worker#hb.ft_font_set_funcs (font) 22*2d1272b8SAndroid Build Coastguard Workerhb.ot_font_set_funcs (font) 23*2d1272b8SAndroid Build Coastguard Worker 24*2d1272b8SAndroid Build Coastguard Workerbuf = hb.buffer_create () 25*2d1272b8SAndroid Build Coastguard Workerclass Debugger (object): 26*2d1272b8SAndroid Build Coastguard Worker def message (self, buf, font, msg, data, _x_what_is_this): 27*2d1272b8SAndroid Build Coastguard Worker print (msg) 28*2d1272b8SAndroid Build Coastguard Worker return True 29*2d1272b8SAndroid Build Coastguard Workerdebugger = Debugger () 30*2d1272b8SAndroid Build Coastguard Workerhb.buffer_set_message_func (buf, debugger.message, 1, 0) 31*2d1272b8SAndroid Build Coastguard Worker 32*2d1272b8SAndroid Build Coastguard Worker## 33*2d1272b8SAndroid Build Coastguard Worker## Add text to buffer 34*2d1272b8SAndroid Build Coastguard Worker## 35*2d1272b8SAndroid Build Coastguard Worker# 36*2d1272b8SAndroid Build Coastguard Worker# See https://github.com/harfbuzz/harfbuzz/pull/271 37*2d1272b8SAndroid Build Coastguard Worker# 38*2d1272b8SAndroid Build Coastguard Worker# If you do not care about cluster values reflecting Python 39*2d1272b8SAndroid Build Coastguard Worker# string indices, then this is quickest way to add text to 40*2d1272b8SAndroid Build Coastguard Worker# buffer: 41*2d1272b8SAndroid Build Coastguard Worker# hb.buffer_add_utf8 (buf, text.encode('utf-8'), 0, -1) 42*2d1272b8SAndroid Build Coastguard Worker# Otherwise, then following handles both narrow and wide 43*2d1272b8SAndroid Build Coastguard Worker# Python builds (the first item in the array is BOM, so we skip it): 44*2d1272b8SAndroid Build Coastguard Workerif sys.maxunicode == 0x10FFFF: 45*2d1272b8SAndroid Build Coastguard Worker hb.buffer_add_utf32 (buf, array.array ('I', text.encode ('utf-32'))[1:], 0, -1) 46*2d1272b8SAndroid Build Coastguard Workerelse: 47*2d1272b8SAndroid Build Coastguard Worker hb.buffer_add_utf16 (buf, array.array ('H', text.encode ('utf-16'))[1:], 0, -1) 48*2d1272b8SAndroid Build Coastguard Worker 49*2d1272b8SAndroid Build Coastguard Worker 50*2d1272b8SAndroid Build Coastguard Workerhb.buffer_guess_segment_properties (buf) 51*2d1272b8SAndroid Build Coastguard Worker 52*2d1272b8SAndroid Build Coastguard Workerhb.shape (font, buf, []) 53*2d1272b8SAndroid Build Coastguard Workerdel font 54*2d1272b8SAndroid Build Coastguard Worker 55*2d1272b8SAndroid Build Coastguard Workerinfos = hb.buffer_get_glyph_infos (buf) 56*2d1272b8SAndroid Build Coastguard Workerpositions = hb.buffer_get_glyph_positions (buf) 57*2d1272b8SAndroid Build Coastguard Worker 58*2d1272b8SAndroid Build Coastguard Workerfor info, pos in zip (infos, positions): 59*2d1272b8SAndroid Build Coastguard Worker gid = info.codepoint 60*2d1272b8SAndroid Build Coastguard Worker cluster = info.cluster 61*2d1272b8SAndroid Build Coastguard Worker x_advance = pos.x_advance 62*2d1272b8SAndroid Build Coastguard Worker x_offset = pos.x_offset 63*2d1272b8SAndroid Build Coastguard Worker y_offset = pos.y_offset 64*2d1272b8SAndroid Build Coastguard Worker 65*2d1272b8SAndroid Build Coastguard Worker print ("gid%d=%d@%d,%d+%d" % (gid, cluster, x_advance, x_offset, y_offset)) 66