Behdad Esfahbod | e478ebe | 2013-09-12 20:53:07 -0400 | [diff] [blame] | 1 | #!/usr/bin/python |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 2 | # -*- coding: utf-8 -*- |
Behdad Esfahbod | e478ebe | 2013-09-12 20:53:07 -0400 | [diff] [blame] | 3 | |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 4 | from __future__ import print_function |
Behdad Esfahbod | e478ebe | 2013-09-12 20:53:07 -0400 | [diff] [blame] | 5 | import sys |
| 6 | from gi.repository import HarfBuzz as hb |
Behdad Esfahbod | 2cd5323 | 2015-01-06 19:16:38 -0800 | [diff] [blame] | 7 | from gi.repository import GLib |
Behdad Esfahbod | e478ebe | 2013-09-12 20:53:07 -0400 | [diff] [blame] | 8 | |
Behdad Esfahbod | 81a31f3 | 2015-01-06 15:37:31 -0800 | [diff] [blame] | 9 | # Python 2/3 compatibility |
| 10 | try: |
| 11 | unicode |
| 12 | except NameError: |
| 13 | unicode = str |
| 14 | |
| 15 | def tounicode(s, encoding='utf-8'): |
| 16 | if not isinstance(s, unicode): |
| 17 | return s.decode(encoding) |
| 18 | else: |
| 19 | return s |
| 20 | |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 21 | fontdata = open (sys.argv[1], 'rb').read () |
Behdad Esfahbod | 238d6a3 | 2015-01-07 10:51:44 -0800 | [diff] [blame] | 22 | text = tounicode(sys.argv[2]) |
Behdad Esfahbod | e9f5c65 | 2015-01-19 14:42:11 -0800 | [diff] [blame] | 23 | # Need to create GLib.Bytes explicitly until this bug is fixed: |
| 24 | # https://bugzilla.gnome.org/show_bug.cgi?id=729541 |
Behdad Esfahbod | 2cd5323 | 2015-01-06 19:16:38 -0800 | [diff] [blame] | 25 | blob = hb.glib_blob_create (GLib.Bytes.new (fontdata)) |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 26 | face = hb.face_create (blob, 0) |
Behdad Esfahbod | 2cd5323 | 2015-01-06 19:16:38 -0800 | [diff] [blame] | 27 | del blob |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 28 | font = hb.font_create (face) |
| 29 | upem = hb.face_get_upem (face) |
Behdad Esfahbod | 2cd5323 | 2015-01-06 19:16:38 -0800 | [diff] [blame] | 30 | del face |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 31 | hb.font_set_scale (font, upem, upem) |
| 32 | #hb.ft_font_set_funcs (font) |
| 33 | hb.ot_font_set_funcs (font) |
| 34 | |
Behdad Esfahbod | 2cd5323 | 2015-01-06 19:16:38 -0800 | [diff] [blame] | 35 | buf = hb.buffer_create () |
Behdad Esfahbod | 238d6a3 | 2015-01-07 10:51:44 -0800 | [diff] [blame] | 36 | hb.buffer_add_utf8 (buf, text.encode('utf-8'), 0, -1) |
Behdad Esfahbod | 2cd5323 | 2015-01-06 19:16:38 -0800 | [diff] [blame] | 37 | hb.buffer_guess_segment_properties (buf) |
| 38 | |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 39 | hb.shape (font, buf, []) |
Behdad Esfahbod | 2cd5323 | 2015-01-06 19:16:38 -0800 | [diff] [blame] | 40 | del font |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 41 | |
| 42 | infos = hb.buffer_get_glyph_infos (buf) |
| 43 | positions = hb.buffer_get_glyph_positions (buf) |
| 44 | |
| 45 | for info,pos in zip(infos, positions): |
| 46 | gid = info.codepoint |
| 47 | cluster = info.cluster |
Behdad Esfahbod | 238d6a3 | 2015-01-07 10:51:44 -0800 | [diff] [blame] | 48 | x_advance = pos.x_advance |
| 49 | x_offset = pos.x_offset |
| 50 | y_offset = pos.y_offset |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 51 | |
Behdad Esfahbod | 238d6a3 | 2015-01-07 10:51:44 -0800 | [diff] [blame] | 52 | print("gid%d=%d@%d,%d+%d" % (gid, cluster, x_advance, x_offset, y_offset)) |