2 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
3 "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
4 <!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
5 <!ENTITY version SYSTEM "version.xml">
7 <chapter id="utilities">
8 <title>Utilities</title>
10 HarfBuzz includes several auxiliary components in addition to the
11 main APIs. These include a set of command-line tools, a set of
12 lower-level APIs for common data types that may be of interest to
16 <section id="utilities-command-line-tools">
17 <title>Command-line tools</title>
19 HarfBuzz include three command-line tools:
20 <command>hb-shape</command>, <command>hb-view</command>, and
21 <command>hb-subset</command>. They can be used to examine
22 HarfBuzz's functionality, debug font binaries, or explore the
23 various shaping models and features from a terminal.
26 <section id="utilities-command-line-hbshape">
27 <title>hb-shape</title>
29 <emphasis><command>hb-shape</command></emphasis> allows you to run HarfBuzz's
30 <function>hb_shape()</function> function on an input string and
31 to examine the outcome, in human-readable form, as terminal
32 output. <command>hb-shape</command> does
33 <emphasis>not</emphasis> render the results of the shaping call
34 into rendered text (you can use <command>hb-view</command>, below, for
35 that). Instead, it prints out the final glyph indices and
36 positions, taking all shaping operations into account, as if the
37 input string were a HarfBuzz input buffer.
40 You can specify the font to be used for shaping and, with
41 command-line options, you can add various aspects of the
42 internal state to the output that is sent to the terminal. The
46 <command>hb-shape</command> <optional>[OPTIONS]</optional>
47 <parameter>path/to/font/file.ttf</parameter>
48 <parameter>yourinputtext</parameter>
51 The default output format is plain text (although JSON output
52 can be selected instead by specifying the option
53 <optional>--output-format=json</optional>). The default output
54 syntax reports each glyph name (or glyph index if there is no
55 name) followed by its cluster value, its horizontal and vertical
56 position displacement, and its horizontal and vertical advances.
59 Output options exist to skip any of these elements in the
60 output, and to include additional data, such as Unicode
61 code-point values, glyph extents, glyph flags, or interim
65 Output can also be redirected to a file, or input read from a
66 file. Additional options enable you to enable or disable
67 specific font features, to set variation-font axis values, to
68 alter the language, script, direction, and clustering settings
69 used, to enable sanity checks, or to change which shaping engine is used.
72 For a complete explanation of the options available, run
75 <command>hb-shape</command> <parameter>--help</parameter>
79 <section id="utilities-command-line-hbview">
80 <title>hb-view</title>
82 <emphasis><command>hb-view</command></emphasis> allows you to
83 see the shaped output of an input string in rendered
84 form. Like <command>hb-shape</command>,
85 <command>hb-view</command> takes a font file and a text string
89 <command>hb-view</command> <optional>[OPTIONS]</optional>
90 <parameter>path/to/font/file.ttf</parameter>
91 <parameter>yourinputtext</parameter>
94 By default, <command>hb-view</command> renders the shaped
95 text in ASCII block-character images as terminal output. By
97 <command>--output-file=<optional>filename</optional></command>
98 switch, you can write the output to a PNG, SVG, or PDF file
99 (among other formats).
102 As with <command>hb-shape</command>, a lengthy set of options
103 is available, with which you can enable or disable
104 specific font features, set variation-font axis values,
105 alter the language, script, direction, and clustering settings
106 used, enable sanity checks, or change which shaping engine is
110 You can also set the foreground and background colors used for
111 the output, independently control the width of all four
112 margins, alter the line spacing, and annotate the output image
116 In general, <command>hb-view</command> is a quick way to
117 verify that the output of HarfBuzz's shaping operation looks
118 correct for a given text-and-font combination, but you may
119 want to use <command>hb-shape</command> to figure out exactly
120 why something does not appear as expected.
124 <section id="utilities-command-line-hbsubset">
125 <title>hb-subset</title>
127 <emphasis><command>hb-subset</command></emphasis> allows you
128 to generate a subset of a given font, with a limited set of
129 supported characters, features, and variation settings.
132 By default, you provide an input font and an input text string
133 as the arguments to <command>hb-subset</command>, and it will
134 generate a font that covers the input text exactly like the
135 input font does, but includes no other characters or features.
138 <command>hb-subset</command> <optional>[OPTIONS]</optional>
139 <parameter>path/to/font/file.ttf</parameter>
140 <parameter>yourinputtext</parameter>
143 For example, to create a subset of Noto Serif that just includes the
144 numerals and the lowercase Latin alphabet, you could run
147 <command>hb-subset</command> <optional>[OPTIONS]</optional>
148 <parameter>NotoSerif-Regular.ttf</parameter>
149 <parameter>0123456789abcdefghijklmnopqrstuvwxyz</parameter>
152 There are options available to remove hinting from the
153 subsetted font and to specify a list of variation-axis settings.
159 <section id="utilities-common-types-apis">
160 <title>Common data types and APIs</title>
162 HarfBuzz includes several APIs for working with general-purpose
163 data that you may find convenient to leverage in your own
164 software. They include set operations and integer-to-integer
168 HarfBuzz uses set operations for internal bookkeeping, such as
169 when it collects all of the glyph IDs covered by a particular
170 font feature. You can also use the set API to build sets, add
171 and remove elements, test whether or not sets contain particular
172 elements, or compute the unions, intersections, or differences
176 All set elements are integers (specifically,
177 <type>hb_codepoint_t</type> 32-bit unsigned ints), and there are
178 functions for fetching the minimum and maximum element from a
179 set. The set API also includes some functions that might not
180 be part of a generic set facility, such as the ability to add a
181 contiguous range of integer elements to a set in bulk, and the
182 ability to fetch the next-smallest or next-largest element.
185 The HarfBuzz set API includes some conveniences as well. All
186 sets are lifecycle-managed, just like other HarfBuzz
187 objects. You increase the reference count on a set with
188 <function>hb_set_reference()</function> and decrease it with
189 <function>hb_set_destroy()</function>. You can also attach
190 user data to a set, just like you can to blobs, buffers, faces,
191 fonts, and other objects, and set destroy callbacks.
194 HarfBuzz also provides an API for keeping track of
195 integer-to-integer mappings. As with the set API, each integer is
196 stored as an unsigned 32-bit <type>hb_codepoint_t</type>
197 element. Maps, like other objects, are reference counted with
198 reference and destroy functions, and you can attach user data to
199 them. The mapping operations include adding and deleting
200 integer-to-integer key:value pairs to the map, testing for the
201 presence of a key, fetching the population of the map, and so on.
204 There are several other internal HarfBuzz facilities that are
205 exposed publicly and which you may want to take advantage of
206 while processing text. HarfBuzz uses a common
207 <type>hb_tag_t</type> for a variety of OpenType tag identifiers (for
208 scripts, languages, font features, table names, variation-axis
209 names, and more), and provides functions for converting strings
210 to tags and vice-versa.
213 Finally, HarfBuzz also includes data type for Booleans, bit
214 masks, and other simple types.