| <?xml version="1.0"?> | |
| <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" | |
| "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [ | |
| <!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'"> | |
| <!ENTITY version SYSTEM "version.xml"> | |
| ]> | |
| <chapter id="utilities"> | |
| <title>Utilities</title> | |
| <para> | |
| HarfBuzz includes several auxiliary components in addition to the | |
| main APIs. These include a set of command-line tools, a set of | |
| lower-level APIs for common data types that may be of interest to | |
| client programs. | |
| </para> | |
| <section id="utilities-command-line-tools"> | |
| <title>Command-line tools</title> | |
| <para> | |
| HarfBuzz include several command-line tools: | |
| <command>hb-shape</command>, <command>hb-view</command>, | |
| <command>hb-subset</command>, <command>hb-info</command>, | |
| <command>hb-raster</command>, and <command>hb-vector</command>. | |
| They can be used to examine | |
| HarfBuzz's functionality, debug font binaries, or explore the | |
| various shaping models and features from a terminal. | |
| </para> | |
| <section id="utilities-command-line-hbshape"> | |
| <title>hb-shape</title> | |
| <para> | |
| <emphasis><command>hb-shape</command></emphasis> allows you to run HarfBuzz's | |
| <function>hb_shape()</function> function on an input string and | |
| to examine the outcome, in human-readable form, as terminal | |
| output. <command>hb-shape</command> does | |
| <emphasis>not</emphasis> render the results of the shaping call | |
| into rendered text (you can use <command>hb-view</command>, below, for | |
| that). Instead, it prints out the final glyph indices and | |
| positions, taking all shaping operations into account, as if the | |
| input string were a HarfBuzz input buffer. | |
| </para> | |
| <para> | |
| You can specify the font to be used for shaping and, with | |
| command-line options, you can add various aspects of the | |
| internal state to the output that is sent to the terminal. The | |
| general format is | |
| </para> | |
| <programlisting><command>hb-shape</command> <optional>OPTIONS</optional> <parameter>path/to/font/file.ttf</parameter> <parameter>yourinputtext</parameter></programlisting> | |
| <para> | |
| The default output format is plain text (although JSON output | |
| can be selected instead by specifying the option | |
| <optional>--output-format=json</optional>). The default output | |
| syntax reports each glyph name (or glyph index if there is no | |
| name) followed by its cluster value, its horizontal and vertical | |
| position displacement, and its horizontal and vertical advances. | |
| </para> | |
| <para> | |
| Output options exist to skip any of these elements in the | |
| output, and to include additional data, such as Unicode | |
| code-point values, glyph extents, glyph flags, or interim | |
| shaping results. | |
| </para> | |
| <para> | |
| Output can also be redirected to a file, or input read from a | |
| file. Additional options enable you to enable or disable | |
| specific font features, to set variation-font axis values, to | |
| alter the language, script, direction, and clustering settings | |
| used, to enable sanity checks, or to change which shaping engine is used. | |
| </para> | |
| <para> | |
| For a complete explanation of the options available, run | |
| </para> | |
| <programlisting><command>hb-shape</command> <parameter>--help</parameter></programlisting> | |
| </section> | |
| <section id="utilities-command-line-hbview"> | |
| <title>hb-view</title> | |
| <para> | |
| <emphasis><command>hb-view</command></emphasis> allows you to | |
| see the shaped output of an input string in rendered | |
| form. Like <command>hb-shape</command>, | |
| <command>hb-view</command> takes a font file and a text string | |
| as its arguments: | |
| </para> | |
| <programlisting><command>hb-view</command> <optional>OPTIONS</optional> <parameter>path/to/font/file.ttf</parameter> <parameter>yourinputtext</parameter></programlisting> | |
| <para> | |
| By default, <command>hb-view</command> renders the shaped | |
| text in ASCII block-character images as terminal output. By | |
| appending the | |
| <command>--output-file=<optional>filename</optional></command> | |
| switch, you can write the output to a PNG, SVG, or PDF file | |
| (among other formats). | |
| </para> | |
| <para> | |
| As with <command>hb-shape</command>, a lengthy set of options | |
| is available, with which you can enable or disable | |
| specific font features, set variation-font axis values, | |
| alter the language, script, direction, and clustering settings | |
| used, enable sanity checks, or change which shaping engine is | |
| used. | |
| </para> | |
| <para> | |
| You can also set the foreground and background colors used for | |
| the output, independently control the width of all four | |
| margins, alter the line spacing, and annotate the output image | |
| with | |
| </para> | |
| <para> | |
| In general, <command>hb-view</command> is a quick way to | |
| verify that the output of HarfBuzz's shaping operation looks | |
| correct for a given text-and-font combination, but you may | |
| want to use <command>hb-shape</command> to figure out exactly | |
| why something does not appear as expected. | |
| </para> | |
| </section> | |
| <section id="utilities-command-line-hbraster"> | |
| <title>hb-raster</title> | |
| <para> | |
| <emphasis><command>hb-raster</command></emphasis> takes a font file | |
| and a text string, shapes the text, and renders the result as a | |
| PPM (Portable Pixel Map) raster image. | |
| </para> | |
| <programlisting><command>hb-raster</command> <optional>OPTIONS</optional> <parameter>path/to/font/file.ttf</parameter> <parameter>yourinputtext</parameter></programlisting> | |
| <para> | |
| It is similar to <command>hb-view</command> but uses HarfBuzz's own rasterizer and currently only outputs PPM images. | |
| </para> | |
| </section> | |
| <section id="utilities-command-line-hbvector"> | |
| <title>hb-vector</title> | |
| <para> | |
| <emphasis><command>hb-vector</command></emphasis> takes a font file | |
| and a text string, shapes the text, and renders the result as a | |
| SVG vector image. | |
| </para> | |
| <programlisting><command>hb-vector</command> <optional>OPTIONS</optional> <parameter>path/to/font/file.ttf</parameter> <parameter>yourinputtext</parameter></programlisting> | |
| <para> | |
| It is similar to <command>hb-view</command> but uses HarfBuzz's own vector output routines and currently only outputs SVG images. | |
| </para> | |
| </section> | |
| <section id="utilities-command-line-hbsubset"> | |
| <title>hb-subset</title> | |
| <para> | |
| <emphasis><command>hb-subset</command></emphasis> allows you | |
| to generate a subset of a given font, with a limited set of | |
| supported characters, features, and variation settings. | |
| </para> | |
| <para> | |
| By default, you provide an input font and an input text string | |
| as the arguments to <command>hb-subset</command>, and it will | |
| generate a font that covers the input text exactly like the | |
| input font does, but includes no other characters or features. | |
| </para> | |
| <programlisting><command>hb-subset</command> <optional>OPTIONS</optional> <parameter>path/to/font/file.ttf</parameter> <parameter>yourinputtext</parameter></programlisting> | |
| <para> | |
| For example, to create a subset of Noto Serif that just includes the | |
| numerals and the lowercase Latin alphabet, you could run | |
| </para> | |
| <programlisting><command>hb-subset</command> <optional>OPTIONS</optional> <parameter>NotoSerif-Regular.ttf</parameter> <parameter>0123456789abcdefghijklmnopqrstuvwxyz</parameter></programlisting> | |
| <para> | |
| There are options available to remove hinting from the | |
| subsetted font and to specify a list of variation-axis settings. | |
| </para> | |
| </section> | |
| <section id="utilities-command-line-hbinfo"> | |
| <title>hb-info</title> | |
| <para> | |
| <emphasis><command>hb-info</command></emphasis> allows you to | |
| query a font file for various information and prints it to the | |
| terminal. | |
| </para> | |
| <para> | |
| If no query options are specified, it will output a general | |
| summary about the font. | |
| </para> | |
| <programlisting><command>hb-info</command> <optional>OPTIONS</optional> <parameter>path/to/font/file.ttf</parameter></programlisting> | |
| <para> | |
| Command-line options are available to list full tables, names, | |
| characters, layout features, font variation, or color palettes, | |
| as well as retrieve specific font names, metrics, styles, or baselines. | |
| </para> | |
| </section> | |
| </section> | |
| <section id="utilities-common-types-apis"> | |
| <title>Common data types and APIs</title> | |
| <para> | |
| HarfBuzz includes several APIs for working with general-purpose | |
| data that you may find convenient to leverage in your own | |
| software. They include set operations and integer-to-integer | |
| mapping operations. | |
| </para> | |
| <para> | |
| HarfBuzz uses set operations for internal bookkeeping, such as | |
| when it collects all of the glyph IDs covered by a particular | |
| font feature. You can also use the set API to build sets, add | |
| and remove elements, test whether or not sets contain particular | |
| elements, or compute the unions, intersections, or differences | |
| between sets. | |
| </para> | |
| <para> | |
| All set elements are integers (specifically, | |
| <type>hb_codepoint_t</type> 32-bit unsigned ints), and there are | |
| functions for fetching the minimum and maximum element from a | |
| set. The set API also includes some functions that might not | |
| be part of a generic set facility, such as the ability to add a | |
| contiguous range of integer elements to a set in bulk, and the | |
| ability to fetch the next-smallest or next-largest element. | |
| </para> | |
| <para> | |
| The HarfBuzz set API includes some conveniences as well. All | |
| sets are lifecycle-managed, just like other HarfBuzz | |
| objects. You increase the reference count on a set with | |
| <function>hb_set_reference()</function> and decrease it with | |
| <function>hb_set_destroy()</function>. You can also attach | |
| user data to a set, just like you can to blobs, buffers, faces, | |
| fonts, and other objects, and set destroy callbacks. | |
| </para> | |
| <para> | |
| HarfBuzz also provides an API for keeping track of | |
| integer-to-integer mappings. As with the set API, each integer is | |
| stored as an unsigned 32-bit <type>hb_codepoint_t</type> | |
| element. Maps, like other objects, are reference counted with | |
| reference and destroy functions, and you can attach user data to | |
| them. The mapping operations include adding and deleting | |
| integer-to-integer key:value pairs to the map, testing for the | |
| presence of a key, fetching the population of the map, and so on. | |
| </para> | |
| <para> | |
| There are several other internal HarfBuzz facilities that are | |
| exposed publicly and which you may want to take advantage of | |
| while processing text. HarfBuzz uses a common | |
| <type>hb_tag_t</type> for a variety of OpenType tag identifiers (for | |
| scripts, languages, font features, table names, variation-axis | |
| names, and more), and provides functions for converting strings | |
| to tags and vice-versa. | |
| </para> | |
| <para> | |
| Finally, HarfBuzz also includes data type for Booleans, bit | |
| masks, and other simple types. | |
| </para> | |
| </section> | |
| </chapter> |