harfbuzz-ruby 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +12 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +258 -0
  5. data/Rakefile +8 -0
  6. data/benchmark/shaping_bench.rb +77 -0
  7. data/examples/basic_shaping.rb +67 -0
  8. data/examples/glyph_outlines.rb +79 -0
  9. data/examples/opentype_features.rb +91 -0
  10. data/examples/render_svg.rb +112 -0
  11. data/examples/render_waterfall.rb +177 -0
  12. data/examples/variable_fonts.rb +73 -0
  13. data/lib/harfbuzz/aat/layout.rb +78 -0
  14. data/lib/harfbuzz/blob.rb +136 -0
  15. data/lib/harfbuzz/buffer.rb +497 -0
  16. data/lib/harfbuzz/c/aat/layout.rb +15 -0
  17. data/lib/harfbuzz/c/base.rb +114 -0
  18. data/lib/harfbuzz/c/blob.rb +23 -0
  19. data/lib/harfbuzz/c/buffer.rb +127 -0
  20. data/lib/harfbuzz/c/common.rb +39 -0
  21. data/lib/harfbuzz/c/draw.rb +22 -0
  22. data/lib/harfbuzz/c/enums.rb +146 -0
  23. data/lib/harfbuzz/c/face.rb +37 -0
  24. data/lib/harfbuzz/c/font.rb +88 -0
  25. data/lib/harfbuzz/c/font_funcs.rb +58 -0
  26. data/lib/harfbuzz/c/map.rb +28 -0
  27. data/lib/harfbuzz/c/ot/color.rb +32 -0
  28. data/lib/harfbuzz/c/ot/font.rb +7 -0
  29. data/lib/harfbuzz/c/ot/layout.rb +83 -0
  30. data/lib/harfbuzz/c/ot/math.rb +23 -0
  31. data/lib/harfbuzz/c/ot/meta.rb +10 -0
  32. data/lib/harfbuzz/c/ot/metrics.rb +16 -0
  33. data/lib/harfbuzz/c/ot/name.rb +13 -0
  34. data/lib/harfbuzz/c/ot/shape.rb +10 -0
  35. data/lib/harfbuzz/c/ot/var.rb +22 -0
  36. data/lib/harfbuzz/c/paint.rb +38 -0
  37. data/lib/harfbuzz/c/set.rb +42 -0
  38. data/lib/harfbuzz/c/shape.rb +11 -0
  39. data/lib/harfbuzz/c/shape_plan.rb +24 -0
  40. data/lib/harfbuzz/c/structs.rb +120 -0
  41. data/lib/harfbuzz/c/subset.rb +49 -0
  42. data/lib/harfbuzz/c/unicode.rb +40 -0
  43. data/lib/harfbuzz/c/version.rb +25 -0
  44. data/lib/harfbuzz/draw_funcs.rb +112 -0
  45. data/lib/harfbuzz/error.rb +27 -0
  46. data/lib/harfbuzz/face.rb +186 -0
  47. data/lib/harfbuzz/feature.rb +76 -0
  48. data/lib/harfbuzz/flags.rb +85 -0
  49. data/lib/harfbuzz/font.rb +404 -0
  50. data/lib/harfbuzz/font_funcs.rb +286 -0
  51. data/lib/harfbuzz/glyph_info.rb +35 -0
  52. data/lib/harfbuzz/glyph_position.rb +41 -0
  53. data/lib/harfbuzz/library.rb +98 -0
  54. data/lib/harfbuzz/map.rb +157 -0
  55. data/lib/harfbuzz/ot/color.rb +125 -0
  56. data/lib/harfbuzz/ot/font.rb +16 -0
  57. data/lib/harfbuzz/ot/layout.rb +583 -0
  58. data/lib/harfbuzz/ot/math.rb +111 -0
  59. data/lib/harfbuzz/ot/meta.rb +34 -0
  60. data/lib/harfbuzz/ot/metrics.rb +54 -0
  61. data/lib/harfbuzz/ot/name.rb +81 -0
  62. data/lib/harfbuzz/ot/shape.rb +34 -0
  63. data/lib/harfbuzz/ot/var.rb +116 -0
  64. data/lib/harfbuzz/paint_funcs.rb +134 -0
  65. data/lib/harfbuzz/set.rb +272 -0
  66. data/lib/harfbuzz/shape_plan.rb +115 -0
  67. data/lib/harfbuzz/shaping_result.rb +94 -0
  68. data/lib/harfbuzz/subset.rb +130 -0
  69. data/lib/harfbuzz/unicode_funcs.rb +201 -0
  70. data/lib/harfbuzz/variation.rb +49 -0
  71. data/lib/harfbuzz/version.rb +5 -0
  72. data/lib/harfbuzz-ffi.rb +4 -0
  73. data/lib/harfbuzz.rb +313 -0
  74. data/sig/harfbuzz.rbs +594 -0
  75. metadata +132 -0
data/sig/harfbuzz.rbs ADDED
@@ -0,0 +1,594 @@
1
+ # RBS type signatures for harfbuzz-ruby
2
+ # HarfBuzz Ruby FFI bindings
3
+
4
+ module HarfBuzz
5
+ VERSION: String
6
+
7
+ # HarfBuzz library version
8
+ def self.version: () -> [Integer, Integer, Integer]
9
+ def self.version_string: () -> String
10
+ def self.version_atleast?: (Integer major, Integer minor, Integer micro) -> bool
11
+ def self.version_at_least?: (Integer major, Integer minor, Integer micro) -> bool
12
+
13
+ # OpenType tag conversions
14
+ def self.tag: (String | Symbol | Integer) -> Integer
15
+ def self.tag_to_s: (Integer tag) -> String
16
+
17
+ # Direction
18
+ def self.direction: (String str) -> Symbol
19
+
20
+ # Language
21
+ def self.language: (String str) -> FFI::Pointer
22
+ def self.default_language: () -> FFI::Pointer
23
+ def self.language_to_s: (FFI::Pointer lang) -> String
24
+ def self.language_matches?: (FFI::Pointer lang1, FFI::Pointer lang2) -> bool
25
+
26
+ # Script
27
+ def self.script: (String str) -> Integer
28
+ def self.script_from_tag: (Integer tag) -> Integer
29
+ def self.script_horizontal_direction: (Integer script) -> Symbol
30
+
31
+ # Color component extraction
32
+ def self.color_alpha: (Integer color) -> Integer
33
+ def self.color_red: (Integer color) -> Integer
34
+ def self.color_green: (Integer color) -> Integer
35
+ def self.color_blue: (Integer color) -> Integer
36
+
37
+ # Shaping
38
+ def self.shape: (Font font, Buffer buffer, ?Array[Feature] features, ?shapers: Array[String]?) -> void
39
+ def self.shapers: () -> Array[String]
40
+ def self.shape_text: (
41
+ String text,
42
+ font_path: String,
43
+ ?features: Array[Feature | String] | Hash[Symbol | String, bool | Integer],
44
+ ?direction: Symbol?,
45
+ ?script: Integer?,
46
+ ?language: String?
47
+ ) -> ShapingResult
48
+
49
+ # Library path override
50
+ def self.library_path: () -> String
51
+ def self.library_path=: (String path) -> String
52
+
53
+ # Error hierarchy
54
+ class Error < StandardError; end
55
+ class AllocationError < Error; end
56
+ class InvalidArgumentError < Error; end
57
+ class FeatureParseError < Error; end
58
+ class VariationParseError < Error; end
59
+ class UnavailableError < Error; end
60
+ class SubsetError < Error; end
61
+
62
+ # hb_blob_t wrapper
63
+ class Blob
64
+ attr_reader ptr: FFI::Pointer
65
+
66
+ def initialize: (String data, ?mode: Symbol) -> void
67
+ def self.from_file: (String path) -> Blob
68
+ def self.from_file!: (String path) -> Blob
69
+ def self.empty: () -> Blob
70
+ def self.wrap_owned: (FFI::Pointer ptr) -> Blob
71
+ def self.wrap_borrowed: (FFI::Pointer ptr) -> Blob
72
+
73
+ def sub_blob: (Integer offset, Integer length) -> Blob
74
+ def writable_copy: () -> Blob?
75
+ def length: () -> Integer
76
+ def size: () -> Integer
77
+ def data: () -> String
78
+ def data_writable: () -> String?
79
+ def immutable?: () -> bool
80
+ def make_immutable!: () -> self
81
+ def inspect: () -> String
82
+ end
83
+
84
+ # hb_buffer_t wrapper
85
+ class Buffer
86
+ attr_reader ptr: FFI::Pointer
87
+
88
+ def initialize: () -> void
89
+ def self.empty: () -> Buffer
90
+ def self.wrap_owned: (FFI::Pointer ptr) -> Buffer
91
+ def self.wrap_borrowed: (FFI::Pointer ptr) -> Buffer
92
+ def self.serialize_format: (String str) -> Symbol
93
+ def self.serialize_format_name: (Symbol fmt) -> String
94
+ def self.serialize_formats: () -> Array[String]
95
+
96
+ def create_similar: () -> Buffer
97
+ def reset: () -> self
98
+ def clear: () -> self
99
+ def pre_allocate: (Integer size) -> bool
100
+ def allocation_successful?: () -> bool
101
+
102
+ def add: (Integer codepoint, Integer cluster) -> self
103
+ def add_utf8: (String text, ?item_offset: Integer, ?item_length: Integer) -> self
104
+ def add_utf16: (String text, ?item_offset: Integer, ?item_length: Integer) -> self
105
+ def add_utf32: (String text, ?item_offset: Integer, ?item_length: Integer) -> self
106
+ def add_latin1: (String text, ?item_offset: Integer, ?item_length: Integer) -> self
107
+ def add_codepoints: (Array[Integer] codepoints, ?item_offset: Integer, ?item_length: Integer) -> self
108
+ def append: (Buffer other, Integer start, Integer end_) -> self
109
+
110
+ def content_type: () -> Symbol
111
+ def content_type=: (Symbol type) -> void
112
+ def direction: () -> Symbol
113
+ def direction=: (Symbol dir) -> void
114
+ def script: () -> Integer
115
+ def script=: (Integer script) -> void
116
+ def language: () -> FFI::Pointer
117
+ def language=: (FFI::Pointer lang) -> void
118
+ def unicode_funcs: () -> UnicodeFuncs
119
+ def unicode_funcs=: (UnicodeFuncs ufuncs) -> void
120
+ def segment_properties: () -> untyped
121
+ def segment_properties=: (untyped props) -> void
122
+ def guess_segment_properties: () -> self
123
+
124
+ def flags: () -> Integer
125
+ def flags=: (Integer flags) -> void
126
+ def cluster_level: () -> Symbol
127
+ def cluster_level=: (Symbol level) -> void
128
+ def replacement_codepoint: () -> Integer
129
+ def replacement_codepoint=: (Integer cp) -> void
130
+ def invisible_glyph: () -> Integer
131
+ def invisible_glyph=: (Integer glyph) -> void
132
+ def not_found_glyph: () -> Integer
133
+ def not_found_glyph=: (Integer glyph) -> void
134
+ def random_state: () -> Integer
135
+ def random_state=: (Integer state) -> void
136
+
137
+ def length: () -> Integer
138
+ def size: () -> Integer
139
+ def length=: (Integer len) -> void
140
+
141
+ def glyph_infos: () -> Array[GlyphInfo]
142
+ def glyph_positions: () -> Array[GlyphPosition]
143
+ def has_positions?: () -> bool
144
+
145
+ def normalize_glyphs: () -> self
146
+ def reverse: () -> self
147
+ def reverse_range: (Integer start, Integer end_) -> self
148
+ def reverse_clusters: () -> self
149
+
150
+ def on_message: () { (String message) -> void } -> self
151
+ def diff: (Buffer other, Integer dottedcircle_glyph, Integer position_fuzz) -> Integer
152
+
153
+ def serialize: (?font: Font?, ?format: Symbol, ?flags: Integer) -> String
154
+ def serialize_glyphs: (?font: Font?, ?format: Symbol, ?flags: Integer) -> String
155
+ def serialize_unicode: (?format: Symbol, ?flags: Integer) -> String
156
+ def deserialize_glyphs: (String str, ?font: Font?, ?format: Symbol) -> bool
157
+ def deserialize_unicode: (String str, ?format: Symbol) -> bool
158
+
159
+ def inspect: () -> String
160
+ end
161
+
162
+ # hb_face_t wrapper
163
+ class Face
164
+ attr_reader ptr: FFI::Pointer
165
+
166
+ def initialize: (Blob blob, ?Integer index) -> void
167
+ def self.for_tables: () { (Integer tag) -> Blob? } -> Face
168
+ def self.empty: () -> Face
169
+ def self.count: (Blob blob) -> Integer
170
+ def self.wrap_owned: (FFI::Pointer ptr) -> Face
171
+ def self.wrap_borrowed: (FFI::Pointer ptr) -> Face
172
+
173
+ def index: () -> Integer
174
+ def index=: (Integer idx) -> void
175
+ def upem: () -> Integer
176
+ def upem=: (Integer u) -> void
177
+ def glyph_count: () -> Integer
178
+ def glyph_count=: (Integer count) -> void
179
+ def table_tags: () -> Array[Integer]
180
+ def table: (Integer tag) -> Blob
181
+ def reference_table: (Integer tag) -> Blob
182
+ def blob: () -> Blob
183
+ def unicodes: () -> Set
184
+ def nominal_glyph_mapping: () -> Map
185
+ def variation_selectors: () -> Set
186
+ def variation_unicodes: (Integer selector) -> Set
187
+ def immutable?: () -> bool
188
+ def make_immutable!: () -> self
189
+ def inspect: () -> String
190
+ end
191
+
192
+ # hb_font_t wrapper
193
+ class Font
194
+ attr_reader ptr: FFI::Pointer
195
+
196
+ def initialize: (Face face) -> void
197
+ def self.empty: () -> Font
198
+ def self.wrap_owned: (FFI::Pointer ptr) -> Font
199
+ def self.wrap_borrowed: (FFI::Pointer ptr) -> Font
200
+
201
+ def face: () -> Face
202
+ def scale: () -> [Integer, Integer]
203
+ def scale=: ([Integer, Integer] xy) -> void
204
+ def ppem: () -> [Integer, Integer]
205
+ def ppem=: ([Integer, Integer] xy) -> void
206
+ def ptem: () -> Float
207
+ def ptem=: (Float ptem) -> void
208
+ def synthetic_bold: () -> [Float, Float, bool]
209
+ def set_synthetic_bold: (Float x_embolden, Float y_embolden, bool in_place) -> void
210
+ def synthetic_slant: () -> Float
211
+ def synthetic_slant=: (Float slant) -> void
212
+ def variations=: (Array[Variation] variations) -> void
213
+ def set_variation: (Integer tag, Float value) -> void
214
+ def var_coords_design: () -> Array[Float]
215
+ def var_coords_normalized: () -> Array[Integer]
216
+
217
+ def glyph_name: (Integer glyph) -> String?
218
+ def glyph_from_name: (String name) -> Integer?
219
+ def nominal_glyph: (Integer unicode) -> Integer?
220
+ def nominal_glyphs: (Array[Integer] unicodes) -> Array[Integer?]
221
+ def glyph_h_advance: (Integer glyph) -> Integer
222
+ def glyph_v_advance: (Integer glyph) -> Integer
223
+ def glyph_h_advances: (Array[Integer] glyphs) -> Array[Integer]
224
+ def glyph_v_advances: (Array[Integer] glyphs) -> Array[Integer]
225
+ def glyph_h_origin: (Integer glyph) -> [Integer, Integer]?
226
+ def glyph_v_origin: (Integer glyph) -> [Integer, Integer]?
227
+ def glyph_extents: (Integer glyph) -> Hash[Symbol, Integer]?
228
+ def glyph_contour_point: (Integer glyph, Integer point_index) -> [Integer, Integer]?
229
+
230
+ def draw_glyph: (Integer glyph, DrawFuncs draw_funcs, ?untyped draw_data) -> void
231
+ def paint_glyph: (Integer glyph, PaintFuncs paint_funcs, ?palette_index: Integer, ?foreground: Integer) -> void
232
+ def funcs=: (FontFuncs funcs) -> void
233
+
234
+ def immutable?: () -> bool
235
+ def make_immutable!: () -> self
236
+ def inspect: () -> String
237
+ end
238
+
239
+ # hb_map_t wrapper
240
+ class Map
241
+ include Enumerable[nil]
242
+
243
+ attr_reader ptr: FFI::Pointer
244
+
245
+ def initialize: () -> void
246
+ def self.empty: () -> Map
247
+ def self.wrap_owned: (FFI::Pointer ptr) -> Map
248
+ def self.wrap_borrowed: (FFI::Pointer ptr) -> Map
249
+
250
+ def []: (Integer key) -> Integer
251
+ def []=: (Integer key, Integer value) -> void
252
+ def get: (Integer key) -> Integer
253
+ def set: (Integer key, Integer value) -> void
254
+ def has?: (Integer key) -> bool
255
+ def delete: (Integer key) -> void
256
+ def clear: () -> void
257
+ def is_empty?: () -> bool
258
+ def length: () -> Integer
259
+ def size: () -> Integer
260
+ def allocation_successful?: () -> bool
261
+ def each: () { ([Integer, Integer] pair) -> void } -> void
262
+ | () -> Enumerator[[Integer, Integer], void]
263
+ def to_h: () -> Hash[Integer, Integer]
264
+ def update: (Map other) -> void
265
+ def replace: (Map other) -> void
266
+ def ==: (untyped other) -> bool
267
+ def inspect: () -> String
268
+ end
269
+
270
+ # hb_set_t wrapper
271
+ class Set
272
+ include Enumerable[Integer]
273
+
274
+ attr_reader ptr: FFI::Pointer
275
+
276
+ HB_SET_VALUE_INVALID: Integer
277
+
278
+ def initialize: () -> void
279
+ def self.empty: () -> Set
280
+ def self.wrap_owned: (FFI::Pointer ptr) -> Set
281
+ def self.wrap_borrowed: (FFI::Pointer ptr) -> Set
282
+
283
+ def add: (Integer cp) -> void
284
+ def add_range: (Integer first, Integer last) -> void
285
+ def del: (Integer cp) -> void
286
+ def del_range: (Integer first, Integer last) -> void
287
+ def has?: (Integer cp) -> bool
288
+ def clear: () -> void
289
+ def is_empty?: () -> bool
290
+ def length: () -> Integer
291
+ def size: () -> Integer
292
+ def allocation_successful?: () -> bool
293
+ def min: () -> Integer?
294
+ def max: () -> Integer?
295
+ def each: () { (Integer cp) -> void } -> void
296
+ | () -> Enumerator[Integer, void]
297
+ def each_range: () { ([Integer, Integer] range) -> void } -> void
298
+ | () -> Enumerator[[Integer, Integer], void]
299
+ def reverse_each: () { (Integer cp) -> void } -> void
300
+ | () -> Enumerator[Integer, void]
301
+ def to_a: () -> Array[Integer]
302
+ def union: (Set other) -> void
303
+ def intersect: (Set other) -> void
304
+ def subtract: (Set other) -> void
305
+ def symmetric_difference: (Set other) -> void
306
+ def subset?: (Set other) -> bool
307
+ def superset?: (Set other) -> bool
308
+ def ==: (untyped other) -> bool
309
+ def inspect: () -> String
310
+ end
311
+
312
+ # OpenType feature
313
+ class Feature
314
+ HB_FEATURE_GLOBAL_START: Integer
315
+ HB_FEATURE_GLOBAL_END: Integer
316
+
317
+ def initialize: (untyped struct) -> void
318
+ def self.from_string: (String str) -> Feature
319
+ def self.from_hash: (Hash[Symbol | String, bool | Integer] hash) -> Array[Feature]
320
+
321
+ def tag: () -> Integer
322
+ def value: () -> Integer
323
+ def start: () -> Integer
324
+ def end_index: () -> Integer
325
+ def to_struct: () -> untyped
326
+ def to_s: () -> String
327
+ def inspect: () -> String
328
+ end
329
+
330
+ # Variable font variation axis value
331
+ class Variation
332
+ def initialize: (untyped struct) -> void
333
+ def self.from_string: (String str) -> Variation
334
+
335
+ def tag: () -> Integer
336
+ def value: () -> Float
337
+ def to_struct: () -> untyped
338
+ def to_s: () -> String
339
+ def inspect: () -> String
340
+ end
341
+
342
+ # Glyph info after shaping
343
+ class GlyphInfo
344
+ def initialize: (FFI::Pointer ptr) -> void
345
+ def glyph_id: () -> Integer
346
+ def cluster: () -> Integer
347
+ def inspect: () -> String
348
+ end
349
+
350
+ # Glyph position after shaping
351
+ class GlyphPosition
352
+ def initialize: (FFI::Pointer ptr) -> void
353
+ def x_advance: () -> Integer
354
+ def y_advance: () -> Integer
355
+ def x_offset: () -> Integer
356
+ def y_offset: () -> Integer
357
+ def inspect: () -> String
358
+ end
359
+
360
+ # High-level shaping result
361
+ class ShapingResult
362
+ include Enumerable[nil]
363
+
364
+ attr_reader buffer: Buffer
365
+ attr_reader font: Font
366
+
367
+ def initialize: (buffer: Buffer, font: Font) -> void
368
+ def glyph_infos: () -> Array[GlyphInfo]
369
+ def glyph_positions: () -> Array[GlyphPosition]
370
+ def each: () { (GlyphInfo info, GlyphPosition pos) -> void } -> void
371
+ def length: () -> Integer
372
+ def size: () -> Integer
373
+ def total_advance: () -> [Integer, Integer]
374
+ def to_svg_path: () -> String
375
+ def inspect: () -> String
376
+ end
377
+
378
+ # hb_draw_funcs_t wrapper — glyph outline callbacks
379
+ class DrawFuncs
380
+ attr_reader ptr: FFI::Pointer
381
+
382
+ def initialize: () -> void
383
+ def self.wrap_owned: (FFI::Pointer ptr) -> DrawFuncs
384
+ def self.wrap_borrowed: (FFI::Pointer ptr) -> DrawFuncs
385
+
386
+ def on_move_to: () { (Float x, Float y, untyped draw_state) -> void } -> void
387
+ def on_line_to: () { (Float x, Float y, untyped draw_state) -> void } -> void
388
+ def on_quadratic_to: () { (Float cx, Float cy, Float x, Float y, untyped draw_state) -> void } -> void
389
+ def on_cubic_to: () { (Float c1x, Float c1y, Float c2x, Float c2y, Float x, Float y, untyped draw_state) -> void } -> void
390
+ def on_close_path: () { (untyped draw_state) -> void } -> void
391
+ def immutable?: () -> bool
392
+ def make_immutable!: () -> self
393
+ def inspect: () -> String
394
+ end
395
+
396
+ # hb_paint_funcs_t wrapper — color glyph paint callbacks
397
+ class PaintFuncs
398
+ attr_reader ptr: FFI::Pointer
399
+
400
+ def initialize: () -> void
401
+ def self.wrap_owned: (FFI::Pointer ptr) -> PaintFuncs
402
+ def self.wrap_borrowed: (FFI::Pointer ptr) -> PaintFuncs
403
+
404
+ def immutable?: () -> bool
405
+ def make_immutable!: () -> self
406
+ def inspect: () -> String
407
+ end
408
+
409
+ # hb_font_funcs_t wrapper — custom font function overrides
410
+ class FontFuncs
411
+ attr_reader ptr: FFI::Pointer
412
+
413
+ def initialize: () -> void
414
+ def self.empty: () -> FontFuncs
415
+ def self.wrap_owned: (FFI::Pointer ptr) -> FontFuncs
416
+ def self.wrap_borrowed: (FFI::Pointer ptr) -> FontFuncs
417
+
418
+ def immutable?: () -> bool
419
+ def make_immutable!: () -> self
420
+ def inspect: () -> String
421
+ end
422
+
423
+ # hb_unicode_funcs_t wrapper
424
+ class UnicodeFuncs
425
+ attr_reader ptr: FFI::Pointer
426
+
427
+ def initialize: () -> void
428
+ def self.default: () -> UnicodeFuncs
429
+ def self.empty: () -> UnicodeFuncs
430
+ def self.wrap_owned: (FFI::Pointer ptr) -> UnicodeFuncs
431
+ def self.wrap_borrowed: (FFI::Pointer ptr) -> UnicodeFuncs
432
+
433
+ def general_category: (Integer codepoint) -> Symbol
434
+ def combining_class: (Integer codepoint) -> Integer
435
+ def mirroring: (Integer codepoint) -> Integer
436
+ def script: (Integer codepoint) -> Integer
437
+ def compose: (Integer a, Integer b) -> Integer?
438
+ def decompose: (Integer ab) -> [Integer, Integer]?
439
+ def immutable?: () -> bool
440
+ def make_immutable!: () -> self
441
+ def inspect: () -> String
442
+ end
443
+
444
+ # hb_shape_plan_t wrapper
445
+ class ShapePlan
446
+ attr_reader ptr: FFI::Pointer
447
+
448
+ def initialize: (Face face, untyped props, ?Array[Feature] features, ?Array[String]? shapers) -> void
449
+ def self.create_cached: (Face face, untyped props, ?Array[Feature] features, ?Array[String]? shapers) -> ShapePlan
450
+ def self.empty: () -> ShapePlan
451
+ def self.wrap_owned: (FFI::Pointer ptr) -> ShapePlan
452
+ def self.wrap_borrowed: (FFI::Pointer ptr) -> ShapePlan
453
+
454
+ def execute: (Font font, Buffer buffer, ?Array[Feature] features) -> bool
455
+ def shaper: () -> String
456
+ def inspect: () -> String
457
+ end
458
+
459
+ # OpenType namespace
460
+ module OT
461
+ module Layout
462
+ def self.has_glyph_classes?: (Face face) -> bool
463
+ def self.glyph_class: (Face face, Integer glyph) -> Symbol
464
+ def self.glyphs_in_class: (Face face, Symbol klass) -> Set
465
+ def self.has_math_kern?: (Face face, Integer glyph, Symbol kern_type) -> bool
466
+ def self.script_tags: (Face face, Symbol table) -> Array[Integer]
467
+ def self.language_tags: (Face face, Symbol table, Integer script_index) -> Array[Integer]
468
+ def self.feature_tags: (Face face, Symbol table, Integer script_index, Integer language_index) -> Array[Integer]
469
+ def self.lookup_count: (Face face, Symbol table) -> Integer
470
+ def self.feature_count: (Face face, Symbol table) -> Integer
471
+ def self.script_count: (Face face, Symbol table) -> Integer
472
+ def self.tags_to_script_and_language: (Face face, Symbol table, Integer script_tag, Integer language_tag) -> [Integer, Integer]
473
+ def self.tag_to_script: (Integer tag) -> Integer
474
+ def self.tag_to_language: (Integer tag) -> Integer
475
+ end
476
+
477
+ module Color
478
+ def self.has_palettes?: (Face face) -> bool
479
+ def self.palette_count: (Face face) -> Integer
480
+ def self.color_count: (Face face) -> Integer
481
+ def self.palette_name_id: (Face face, Integer palette_index) -> Integer
482
+ def self.palette_flags: (Face face, Integer palette_index) -> Integer
483
+ def self.palette_colors: (Face face, Integer palette_index) -> Array[Integer]
484
+ def self.has_layers?: (Face face) -> bool
485
+ def self.glyph_layer_count: (Face face, Integer glyph) -> Integer
486
+ def self.glyph_layers: (Face face, Integer glyph) -> Array[Hash[Symbol, Integer]]
487
+ def self.has_svg?: (Face face) -> bool
488
+ def self.has_png?: (Face face) -> bool
489
+ def self.has_paint?: (Face face) -> bool
490
+ end
491
+
492
+ module Math
493
+ def self.has_data?: (Face face) -> bool
494
+ def self.constant: (Font font, Symbol constant) -> Integer
495
+ def self.glyph_italics_correction: (Font font, Integer glyph) -> Integer
496
+ def self.glyph_top_accent_attachment: (Font font, Integer glyph) -> Integer
497
+ def self.is_glyph_extended_shape: (Face face, Integer glyph) -> bool
498
+ def self.glyph_kerning: (Font font, Integer glyph, Symbol kern_type, Integer correction_height) -> Integer
499
+ def self.glyph_variant_count: (Font font, Integer glyph, Symbol direction) -> Integer
500
+ def self.glyph_assembly_count: (Font font, Integer glyph, Symbol direction) -> Integer
501
+ end
502
+
503
+ module Meta
504
+ def self.entry_tags: (Face face) -> Array[Integer]
505
+ def self.entry: (Face face, Integer tag) -> Blob
506
+ end
507
+
508
+ module Metrics
509
+ def self.x_height: (Font font, ?FFI::Pointer? language) -> Integer?
510
+ def self.cap_height: (Font font, ?FFI::Pointer? language) -> Integer?
511
+ def self.ascender: (Font font, ?FFI::Pointer? language) -> Integer?
512
+ def self.descender: (Font font, ?FFI::Pointer? language) -> Integer?
513
+ def self.underline_position: (Font font, ?FFI::Pointer? language) -> Integer?
514
+ def self.underline_thickness: (Font font, ?FFI::Pointer? language) -> Integer?
515
+ def self.strikeout_position: (Font font, ?FFI::Pointer? language) -> Integer?
516
+ def self.strikeout_thickness: (Font font, ?FFI::Pointer? language) -> Integer?
517
+ def self.variation: (Font font, Symbol metric, ?FFI::Pointer? language) -> Integer?
518
+ def self.x_variation: (Font font, Symbol metric) -> Integer
519
+ def self.y_variation: (Font font, Symbol metric) -> Integer
520
+ end
521
+
522
+ module Name
523
+ def self.name_count: (Face face) -> Integer
524
+ def self.name_ids: (Face face) -> Array[Integer]
525
+ def self.get_utf8: (Face face, Integer name_id, FFI::Pointer language) -> String?
526
+ def self.get_utf16: (Face face, Integer name_id, FFI::Pointer language) -> String?
527
+ def self.get_utf32: (Face face, Integer name_id, FFI::Pointer language) -> String?
528
+ end
529
+
530
+ module Shape
531
+ def self.glyphs_closure: (Font font, Buffer buffer, ?Array[Feature] features) -> Set
532
+ def self.plan_collect_lookups: (Face face, Integer script_index, Integer language_index, Integer feature_index, Symbol table) -> Set
533
+ end
534
+
535
+ module Var
536
+ def self.has_data?: (Face face) -> bool
537
+ def self.axis_count: (Face face) -> Integer
538
+ def self.axis_infos: (Face face) -> Array[Hash[Symbol, untyped]]
539
+ def self.find_axis_info: (Face face, Integer axis_tag) -> Hash[Symbol, untyped]?
540
+ def self.named_instance_count: (Face face) -> Integer
541
+ def self.named_instance_design_coords: (Face face, Integer instance_index) -> Array[Float]
542
+ def self.named_instance_named_coords: (Face face, Integer instance_index) -> Array[Integer]
543
+ def self.named_instance_subfamily_name_id: (Face face, Integer instance_index) -> Integer
544
+ def self.named_instance_postscript_name_id: (Face face, Integer instance_index) -> Integer
545
+ def self.normalize_variations: (Face face, Array[Variation] variations) -> Array[Integer]
546
+ def self.normalize_coords: (Face face, Array[Float] design_coords) -> Array[Integer]
547
+ end
548
+
549
+ module Font
550
+ def self.set_funcs: (::HarfBuzz::Font font) -> void
551
+ end
552
+ end
553
+
554
+ # Apple Advanced Typography namespace
555
+ module AAT
556
+ module Layout
557
+ def self.has_feature?: (Face face, Integer feature_type, Integer feature_selector) -> bool
558
+ def self.feature_count: (Face face) -> Integer
559
+ def self.feature_infos: (Face face) -> Array[Hash[Symbol, untyped]]
560
+ def self.language_feature_count: (Face face) -> Integer
561
+ end
562
+ end
563
+
564
+ # Font subsetting
565
+ module Subset
566
+ def self.available?: () -> bool
567
+ def self.subset: (::HarfBuzz::Face face, Input input) -> ::HarfBuzz::Face
568
+
569
+ class Input
570
+ attr_reader ptr: FFI::Pointer
571
+
572
+ def initialize: () -> void
573
+ def unicode_set: () -> ::HarfBuzz::Set
574
+ def glyph_set: () -> ::HarfBuzz::Set
575
+ def flags: () -> Integer
576
+ def flags=: (Integer flags) -> void
577
+ def inspect: () -> String
578
+ end
579
+
580
+ class Plan
581
+ attr_reader ptr: FFI::Pointer
582
+
583
+ def initialize: (::HarfBuzz::Face face, Input input) -> void
584
+ def execute: () -> ::HarfBuzz::Face
585
+ def old_to_new_glyph_mapping: () -> ::HarfBuzz::Map
586
+ def new_to_old_glyph_mapping: () -> ::HarfBuzz::Map
587
+ def unicode_to_old_glyph_mapping: () -> ::HarfBuzz::Map
588
+ def inspect: () -> String
589
+ end
590
+ end
591
+ end
592
+
593
+ # Compatibility alias
594
+ Harfbuzz = HarfBuzz