1e478ebe4d3f74dc271ffe88680fd29f6b1924c93Behdad Esfahbod#!/usr/bin/python 2b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbod# -*- coding: utf-8 -*- 3e478ebe4d3f74dc271ffe88680fd29f6b1924c93Behdad Esfahbod 4b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbodfrom __future__ import print_function 5e478ebe4d3f74dc271ffe88680fd29f6b1924c93Behdad Esfahbodimport sys 6e478ebe4d3f74dc271ffe88680fd29f6b1924c93Behdad Esfahbodfrom gi.repository import HarfBuzz as hb 72cd5323531dcd800549b2cb1cb51d708e72ab2d8Behdad Esfahbodfrom gi.repository import GLib 8e478ebe4d3f74dc271ffe88680fd29f6b1924c93Behdad Esfahbod 981a31f3eff44a85bb2160d51156a01a18f0a97dfBehdad Esfahbod# Python 2/3 compatibility 1081a31f3eff44a85bb2160d51156a01a18f0a97dfBehdad Esfahbodtry: 1181a31f3eff44a85bb2160d51156a01a18f0a97dfBehdad Esfahbod unicode 1281a31f3eff44a85bb2160d51156a01a18f0a97dfBehdad Esfahbodexcept NameError: 1381a31f3eff44a85bb2160d51156a01a18f0a97dfBehdad Esfahbod unicode = str 1481a31f3eff44a85bb2160d51156a01a18f0a97dfBehdad Esfahbod 1581a31f3eff44a85bb2160d51156a01a18f0a97dfBehdad Esfahboddef tounicode(s, encoding='utf-8'): 1681a31f3eff44a85bb2160d51156a01a18f0a97dfBehdad Esfahbod if not isinstance(s, unicode): 1781a31f3eff44a85bb2160d51156a01a18f0a97dfBehdad Esfahbod return s.decode(encoding) 1881a31f3eff44a85bb2160d51156a01a18f0a97dfBehdad Esfahbod else: 1981a31f3eff44a85bb2160d51156a01a18f0a97dfBehdad Esfahbod return s 2081a31f3eff44a85bb2160d51156a01a18f0a97dfBehdad Esfahbod 21b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbodfontdata = open (sys.argv[1], 'rb').read () 22238d6a38f2ceb7d8dceec9365a823f032b3b9f7dBehdad Esfahbodtext = tounicode(sys.argv[2]) 23e9f5c65be027eb7759ab819e267e24dff3b017b6Behdad Esfahbod# Need to create GLib.Bytes explicitly until this bug is fixed: 24e9f5c65be027eb7759ab819e267e24dff3b017b6Behdad Esfahbod# https://bugzilla.gnome.org/show_bug.cgi?id=729541 252cd5323531dcd800549b2cb1cb51d708e72ab2d8Behdad Esfahbodblob = hb.glib_blob_create (GLib.Bytes.new (fontdata)) 26b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbodface = hb.face_create (blob, 0) 272cd5323531dcd800549b2cb1cb51d708e72ab2d8Behdad Esfahboddel blob 28b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbodfont = hb.font_create (face) 29b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbodupem = hb.face_get_upem (face) 302cd5323531dcd800549b2cb1cb51d708e72ab2d8Behdad Esfahboddel face 31b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbodhb.font_set_scale (font, upem, upem) 32b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbod#hb.ft_font_set_funcs (font) 33b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbodhb.ot_font_set_funcs (font) 34b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbod 352cd5323531dcd800549b2cb1cb51d708e72ab2d8Behdad Esfahbodbuf = hb.buffer_create () 36238d6a38f2ceb7d8dceec9365a823f032b3b9f7dBehdad Esfahbodhb.buffer_add_utf8 (buf, text.encode('utf-8'), 0, -1) 372cd5323531dcd800549b2cb1cb51d708e72ab2d8Behdad Esfahbodhb.buffer_guess_segment_properties (buf) 382cd5323531dcd800549b2cb1cb51d708e72ab2d8Behdad Esfahbod 39b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbodhb.shape (font, buf, []) 402cd5323531dcd800549b2cb1cb51d708e72ab2d8Behdad Esfahboddel font 41b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbod 42b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbodinfos = hb.buffer_get_glyph_infos (buf) 43b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbodpositions = hb.buffer_get_glyph_positions (buf) 44b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbod 45b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbodfor info,pos in zip(infos, positions): 46b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbod gid = info.codepoint 47b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbod cluster = info.cluster 48238d6a38f2ceb7d8dceec9365a823f032b3b9f7dBehdad Esfahbod x_advance = pos.x_advance 49238d6a38f2ceb7d8dceec9365a823f032b3b9f7dBehdad Esfahbod x_offset = pos.x_offset 50238d6a38f2ceb7d8dceec9365a823f032b3b9f7dBehdad Esfahbod y_offset = pos.y_offset 51b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0Behdad Esfahbod 52238d6a38f2ceb7d8dceec9365a823f032b3b9f7dBehdad Esfahbod print("gid%d=%d@%d,%d+%d" % (gid, cluster, x_advance, x_offset, y_offset)) 53