Ebrahim Byagowi | 8d19907 | 2020-02-19 14:56:55 +0330 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
Ebrahim Byagowi | cab2c2c | 2018-03-29 12:48:47 +0430 | [diff] [blame] | 2 | |
Behdad Esfahbod | e478ebe | 2013-09-12 20:53:07 -0400 | [diff] [blame] | 3 | import sys |
Behdad Esfahbod | d3e2a06 | 2016-06-30 11:01:22 -0700 | [diff] [blame] | 4 | import array |
Behdad Esfahbod | e478ebe | 2013-09-12 20:53:07 -0400 | [diff] [blame] | 5 | from gi.repository import HarfBuzz as hb |
Behdad Esfahbod | 2cd5323 | 2015-01-06 19:16:38 -0800 | [diff] [blame] | 6 | from gi.repository import GLib |
Behdad Esfahbod | e478ebe | 2013-09-12 20:53:07 -0400 | [diff] [blame] | 7 | |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 8 | fontdata = open (sys.argv[1], 'rb').read () |
Ebrahim Byagowi | 8d19907 | 2020-02-19 14:56:55 +0330 | [diff] [blame] | 9 | text = sys.argv[2] |
Behdad Esfahbod | e9f5c65 | 2015-01-19 14:42:11 -0800 | [diff] [blame] | 10 | # Need to create GLib.Bytes explicitly until this bug is fixed: |
| 11 | # https://bugzilla.gnome.org/show_bug.cgi?id=729541 |
Behdad Esfahbod | 2cd5323 | 2015-01-06 19:16:38 -0800 | [diff] [blame] | 12 | blob = hb.glib_blob_create (GLib.Bytes.new (fontdata)) |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 13 | face = hb.face_create (blob, 0) |
Behdad Esfahbod | 2cd5323 | 2015-01-06 19:16:38 -0800 | [diff] [blame] | 14 | del blob |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 15 | font = hb.font_create (face) |
| 16 | upem = hb.face_get_upem (face) |
Behdad Esfahbod | 2cd5323 | 2015-01-06 19:16:38 -0800 | [diff] [blame] | 17 | del face |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 18 | hb.font_set_scale (font, upem, upem) |
| 19 | #hb.ft_font_set_funcs (font) |
| 20 | hb.ot_font_set_funcs (font) |
| 21 | |
Behdad Esfahbod | 2cd5323 | 2015-01-06 19:16:38 -0800 | [diff] [blame] | 22 | buf = hb.buffer_create () |
Ebrahim Byagowi | 2a18212 | 2020-07-13 20:41:13 +0430 | [diff] [blame] | 23 | class Debugger (object): |
Behdad Esfahbod | 8718dae | 2015-12-18 19:53:40 +0000 | [diff] [blame] | 24 | def message (self, buf, font, msg, data, _x_what_is_this): |
Ebrahim Byagowi | 2a18212 | 2020-07-13 20:41:13 +0430 | [diff] [blame] | 25 | print (msg) |
Behdad Esfahbod | 8718dae | 2015-12-18 19:53:40 +0000 | [diff] [blame] | 26 | return True |
Ebrahim Byagowi | 2a18212 | 2020-07-13 20:41:13 +0430 | [diff] [blame] | 27 | debugger = Debugger () |
Behdad Esfahbod | 8718dae | 2015-12-18 19:53:40 +0000 | [diff] [blame] | 28 | hb.buffer_set_message_func (buf, debugger.message, 1, 0) |
Behdad Esfahbod | d3e2a06 | 2016-06-30 11:01:22 -0700 | [diff] [blame] | 29 | |
| 30 | ## |
| 31 | ## Add text to buffer |
| 32 | ## |
| 33 | # |
ebraminio | 7c6937e | 2017-11-20 14:49:22 -0500 | [diff] [blame] | 34 | # See https://github.com/harfbuzz/harfbuzz/pull/271 |
Behdad Esfahbod | d3e2a06 | 2016-06-30 11:01:22 -0700 | [diff] [blame] | 35 | # |
Ebrahim Byagowi | 2a18212 | 2020-07-13 20:41:13 +0430 | [diff] [blame] | 36 | # If you do not care about cluster values reflecting Python |
| 37 | # string indices, then this is quickest way to add text to |
| 38 | # buffer: |
| 39 | # hb.buffer_add_utf8 (buf, text.encode('utf-8'), 0, -1) |
| 40 | # Otherwise, then following handles both narrow and wide |
| 41 | # Python builds (the first item in the array is BOM, so we skip it): |
| 42 | if sys.maxunicode == 0x10FFFF: |
| 43 | hb.buffer_add_utf32 (buf, array.array ('I', text.encode ('utf-32'))[1:], 0, -1) |
Behdad Esfahbod | d3e2a06 | 2016-06-30 11:01:22 -0700 | [diff] [blame] | 44 | else: |
Ebrahim Byagowi | 2a18212 | 2020-07-13 20:41:13 +0430 | [diff] [blame] | 45 | hb.buffer_add_utf16 (buf, array.array ('H', text.encode ('utf-16'))[1:], 0, -1) |
Behdad Esfahbod | d3e2a06 | 2016-06-30 11:01:22 -0700 | [diff] [blame] | 46 | |
| 47 | |
Behdad Esfahbod | 2cd5323 | 2015-01-06 19:16:38 -0800 | [diff] [blame] | 48 | hb.buffer_guess_segment_properties (buf) |
| 49 | |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 50 | hb.shape (font, buf, []) |
Behdad Esfahbod | 2cd5323 | 2015-01-06 19:16:38 -0800 | [diff] [blame] | 51 | del font |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 52 | |
| 53 | infos = hb.buffer_get_glyph_infos (buf) |
| 54 | positions = hb.buffer_get_glyph_positions (buf) |
| 55 | |
Ebrahim Byagowi | 2a18212 | 2020-07-13 20:41:13 +0430 | [diff] [blame] | 56 | for info, pos in zip (infos, positions): |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 57 | gid = info.codepoint |
| 58 | cluster = info.cluster |
Behdad Esfahbod | 238d6a3 | 2015-01-07 10:51:44 -0800 | [diff] [blame] | 59 | x_advance = pos.x_advance |
| 60 | x_offset = pos.x_offset |
| 61 | y_offset = pos.y_offset |
Behdad Esfahbod | b632e79 | 2015-01-06 14:05:26 -0800 | [diff] [blame] | 62 | |
Ebrahim Byagowi | 2a18212 | 2020-07-13 20:41:13 +0430 | [diff] [blame] | 63 | print ("gid%d=%d@%d,%d+%d" % (gid, cluster, x_advance, x_offset, y_offset)) |