xref: /aosp_15_r20/external/harfbuzz_ng/docs/usermanual-getting-started.xml (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker<?xml version="1.0"?>
2*2d1272b8SAndroid Build Coastguard Worker<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
3*2d1272b8SAndroid Build Coastguard Worker               "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
4*2d1272b8SAndroid Build Coastguard Worker  <!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'">
5*2d1272b8SAndroid Build Coastguard Worker  <!ENTITY version SYSTEM "version.xml">
6*2d1272b8SAndroid Build Coastguard Worker]>
7*2d1272b8SAndroid Build Coastguard Worker<chapter id="getting-started">
8*2d1272b8SAndroid Build Coastguard Worker  <title>Getting started with HarfBuzz</title>
9*2d1272b8SAndroid Build Coastguard Worker  <section id="an-overview-of-the-harfbuzz-shaping-api">
10*2d1272b8SAndroid Build Coastguard Worker    <title>An overview of the HarfBuzz shaping API</title>
11*2d1272b8SAndroid Build Coastguard Worker    <para>
12*2d1272b8SAndroid Build Coastguard Worker      The core of the HarfBuzz shaping API is the function
13*2d1272b8SAndroid Build Coastguard Worker      <function>hb_shape()</function>. This function takes a font, a
14*2d1272b8SAndroid Build Coastguard Worker      buffer containing a string of Unicode codepoints and
15*2d1272b8SAndroid Build Coastguard Worker      (optionally) a list of font features as its input. It replaces
16*2d1272b8SAndroid Build Coastguard Worker      the codepoints in the buffer with the corresponding glyphs from
17*2d1272b8SAndroid Build Coastguard Worker      the font, correctly ordered and positioned, and with any of the
18*2d1272b8SAndroid Build Coastguard Worker      optional font features applied.
19*2d1272b8SAndroid Build Coastguard Worker    </para>
20*2d1272b8SAndroid Build Coastguard Worker    <para>
21*2d1272b8SAndroid Build Coastguard Worker      In addition to holding the pre-shaping input (the Unicode
22*2d1272b8SAndroid Build Coastguard Worker      codepoints that comprise the input string) and the post-shaping
23*2d1272b8SAndroid Build Coastguard Worker      output (the glyphs and positions), a HarfBuzz buffer has several
24*2d1272b8SAndroid Build Coastguard Worker      properties that affect shaping. The most important are the
25*2d1272b8SAndroid Build Coastguard Worker      text-flow direction (e.g., left-to-right, right-to-left,
26*2d1272b8SAndroid Build Coastguard Worker      top-to-bottom, or bottom-to-top), the script tag, and the
27*2d1272b8SAndroid Build Coastguard Worker      language tag.
28*2d1272b8SAndroid Build Coastguard Worker    </para>
29*2d1272b8SAndroid Build Coastguard Worker
30*2d1272b8SAndroid Build Coastguard Worker    <para>
31*2d1272b8SAndroid Build Coastguard Worker      For input string buffers, flags are available to denote when the
32*2d1272b8SAndroid Build Coastguard Worker      buffer represents the beginning or end of a paragraph, to
33*2d1272b8SAndroid Build Coastguard Worker      indicate whether or not to visibly render Unicode <literal>Default
34*2d1272b8SAndroid Build Coastguard Worker      Ignorable</literal> codepoints, and to modify the cluster-merging
35*2d1272b8SAndroid Build Coastguard Worker      behavior for the buffer. For shaped output buffers, the
36*2d1272b8SAndroid Build Coastguard Worker      individual X and Y offsets and <literal>advances</literal>
37*2d1272b8SAndroid Build Coastguard Worker      (the logical dimensions) of each glyph are
38*2d1272b8SAndroid Build Coastguard Worker      accessible. HarfBuzz also flags glyphs as
39*2d1272b8SAndroid Build Coastguard Worker      <literal>UNSAFE_TO_BREAK</literal> if breaking the string at
40*2d1272b8SAndroid Build Coastguard Worker      that glyph (e.g., in a line-breaking or hyphenation process)
41*2d1272b8SAndroid Build Coastguard Worker      would require re-shaping the text.
42*2d1272b8SAndroid Build Coastguard Worker    </para>
43*2d1272b8SAndroid Build Coastguard Worker
44*2d1272b8SAndroid Build Coastguard Worker    <para>
45*2d1272b8SAndroid Build Coastguard Worker      HarfBuzz also provides methods to compare the contents of
46*2d1272b8SAndroid Build Coastguard Worker      buffers, join buffers, normalize buffer contents, and handle
47*2d1272b8SAndroid Build Coastguard Worker      invalid codepoints, as well as to determine the state of a
48*2d1272b8SAndroid Build Coastguard Worker      buffer (e.g., input codepoints or output glyphs). Buffer
49*2d1272b8SAndroid Build Coastguard Worker      lifecycles are managed and all buffers are reference-counted.
50*2d1272b8SAndroid Build Coastguard Worker    </para>
51*2d1272b8SAndroid Build Coastguard Worker
52*2d1272b8SAndroid Build Coastguard Worker    <para>
53*2d1272b8SAndroid Build Coastguard Worker      Although the default <function>hb_shape()</function> function is
54*2d1272b8SAndroid Build Coastguard Worker      sufficient for most use cases, a variant is also provided that
55*2d1272b8SAndroid Build Coastguard Worker      lets you specify which of HarfBuzz's shapers to use on a buffer.
56*2d1272b8SAndroid Build Coastguard Worker    </para>
57*2d1272b8SAndroid Build Coastguard Worker
58*2d1272b8SAndroid Build Coastguard Worker    <para>
59*2d1272b8SAndroid Build Coastguard Worker      HarfBuzz can read TrueType fonts, TrueType collections, OpenType
60*2d1272b8SAndroid Build Coastguard Worker      fonts, and OpenType collections. Functions are provided to query
61*2d1272b8SAndroid Build Coastguard Worker      font objects about metrics, Unicode coverage, available tables and
62*2d1272b8SAndroid Build Coastguard Worker      features, and variation selectors. Individual glyphs can also be
63*2d1272b8SAndroid Build Coastguard Worker      queried for metrics, variations, and glyph names. OpenType
64*2d1272b8SAndroid Build Coastguard Worker      variable fonts are supported, and HarfBuzz allows you to set
65*2d1272b8SAndroid Build Coastguard Worker      variation-axis coordinates on font objects.
66*2d1272b8SAndroid Build Coastguard Worker    </para>
67*2d1272b8SAndroid Build Coastguard Worker
68*2d1272b8SAndroid Build Coastguard Worker    <para>
69*2d1272b8SAndroid Build Coastguard Worker      HarfBuzz provides glue code to integrate with various other
70*2d1272b8SAndroid Build Coastguard Worker      libraries, including FreeType, GObject, and CoreText. Support
71*2d1272b8SAndroid Build Coastguard Worker      for integrating with Uniscribe and DirectWrite is experimental
72*2d1272b8SAndroid Build Coastguard Worker      at present.
73*2d1272b8SAndroid Build Coastguard Worker    </para>
74*2d1272b8SAndroid Build Coastguard Worker  </section>
75*2d1272b8SAndroid Build Coastguard Worker
76*2d1272b8SAndroid Build Coastguard Worker  <section id="terminology">
77*2d1272b8SAndroid Build Coastguard Worker    <title>Terminology</title>
78*2d1272b8SAndroid Build Coastguard Worker    <para>
79*2d1272b8SAndroid Build Coastguard Worker
80*2d1272b8SAndroid Build Coastguard Worker    </para>
81*2d1272b8SAndroid Build Coastguard Worker      <variablelist>
82*2d1272b8SAndroid Build Coastguard Worker	<?dbfo list-presentation="blocks"?>
83*2d1272b8SAndroid Build Coastguard Worker	<varlistentry>
84*2d1272b8SAndroid Build Coastguard Worker	  <term>script</term>
85*2d1272b8SAndroid Build Coastguard Worker	  <listitem>
86*2d1272b8SAndroid Build Coastguard Worker	    <para>
87*2d1272b8SAndroid Build Coastguard Worker	      In text shaping, a <emphasis>script</emphasis> is a
88*2d1272b8SAndroid Build Coastguard Worker	      writing system: a set of symbols, rules, and conventions
89*2d1272b8SAndroid Build Coastguard Worker	      that is used to represent a language or multiple
90*2d1272b8SAndroid Build Coastguard Worker	      languages.
91*2d1272b8SAndroid Build Coastguard Worker	    </para>
92*2d1272b8SAndroid Build Coastguard Worker	    <para>
93*2d1272b8SAndroid Build Coastguard Worker	      In general computing lingo, the word "script" can also
94*2d1272b8SAndroid Build Coastguard Worker	      be used to mean an executable program (usually one
95*2d1272b8SAndroid Build Coastguard Worker	      written in a human-readable programming language). For
96*2d1272b8SAndroid Build Coastguard Worker	      the sake of clarity, HarfBuzz documents will always use
97*2d1272b8SAndroid Build Coastguard Worker	      more specific terminology when referring to this
98*2d1272b8SAndroid Build Coastguard Worker	      meaning, such as "Python script" or "shell script." In
99*2d1272b8SAndroid Build Coastguard Worker	      all other instances, "script" refers to a writing system.
100*2d1272b8SAndroid Build Coastguard Worker	    </para>
101*2d1272b8SAndroid Build Coastguard Worker	    <para>
102*2d1272b8SAndroid Build Coastguard Worker	      For developers using HarfBuzz, it is important to note
103*2d1272b8SAndroid Build Coastguard Worker	      the distinction between a script and a language. Most
104*2d1272b8SAndroid Build Coastguard Worker	      scripts are used to write a variety of different
105*2d1272b8SAndroid Build Coastguard Worker	      languages, and many languages may be written in more
106*2d1272b8SAndroid Build Coastguard Worker	      than one script.
107*2d1272b8SAndroid Build Coastguard Worker	    </para>
108*2d1272b8SAndroid Build Coastguard Worker	  </listitem>
109*2d1272b8SAndroid Build Coastguard Worker	</varlistentry>
110*2d1272b8SAndroid Build Coastguard Worker
111*2d1272b8SAndroid Build Coastguard Worker	<varlistentry>
112*2d1272b8SAndroid Build Coastguard Worker	  <term>shaper</term>
113*2d1272b8SAndroid Build Coastguard Worker	  <listitem>
114*2d1272b8SAndroid Build Coastguard Worker	    <para>
115*2d1272b8SAndroid Build Coastguard Worker	      In HarfBuzz, a <emphasis>shaper</emphasis> is a
116*2d1272b8SAndroid Build Coastguard Worker	      handler for a specific script-shaping model. HarfBuzz
117*2d1272b8SAndroid Build Coastguard Worker	      implements separate shapers for Indic, Arabic, Thai and
118*2d1272b8SAndroid Build Coastguard Worker	      Lao, Khmer, Myanmar, Tibetan, Hangul, Hebrew, the
119*2d1272b8SAndroid Build Coastguard Worker	      Universal Shaping Engine (USE), and a default shaper for
120*2d1272b8SAndroid Build Coastguard Worker	      scripts with no script-specific shaping model.
121*2d1272b8SAndroid Build Coastguard Worker	    </para>
122*2d1272b8SAndroid Build Coastguard Worker	  </listitem>
123*2d1272b8SAndroid Build Coastguard Worker	</varlistentry>
124*2d1272b8SAndroid Build Coastguard Worker
125*2d1272b8SAndroid Build Coastguard Worker	<varlistentry>
126*2d1272b8SAndroid Build Coastguard Worker	  <term>cluster</term>
127*2d1272b8SAndroid Build Coastguard Worker	  <listitem>
128*2d1272b8SAndroid Build Coastguard Worker	    <para>
129*2d1272b8SAndroid Build Coastguard Worker	      In text shaping, a <emphasis>cluster</emphasis> is a
130*2d1272b8SAndroid Build Coastguard Worker	      sequence of codepoints that must be treated as an
131*2d1272b8SAndroid Build Coastguard Worker	      indivisible unit. Clusters can include code-point
132*2d1272b8SAndroid Build Coastguard Worker	      sequences that form a ligature or base-and-mark
133*2d1272b8SAndroid Build Coastguard Worker	      sequences. Tracking and preserving clusters is important
134*2d1272b8SAndroid Build Coastguard Worker	      when shaping operations might separate or reorder
135*2d1272b8SAndroid Build Coastguard Worker	      code points.
136*2d1272b8SAndroid Build Coastguard Worker	    </para>
137*2d1272b8SAndroid Build Coastguard Worker	    <para>
138*2d1272b8SAndroid Build Coastguard Worker	      HarfBuzz provides three cluster
139*2d1272b8SAndroid Build Coastguard Worker	      <emphasis>levels</emphasis> that implement different
140*2d1272b8SAndroid Build Coastguard Worker	      approaches to the problem of preserving clusters during
141*2d1272b8SAndroid Build Coastguard Worker	      shaping operations.
142*2d1272b8SAndroid Build Coastguard Worker	    </para>
143*2d1272b8SAndroid Build Coastguard Worker	  </listitem>
144*2d1272b8SAndroid Build Coastguard Worker	</varlistentry>
145*2d1272b8SAndroid Build Coastguard Worker
146*2d1272b8SAndroid Build Coastguard Worker	<varlistentry>
147*2d1272b8SAndroid Build Coastguard Worker	  <term>grapheme</term>
148*2d1272b8SAndroid Build Coastguard Worker	  <listitem>
149*2d1272b8SAndroid Build Coastguard Worker	    <para>
150*2d1272b8SAndroid Build Coastguard Worker	      In linguistics, a <emphasis>grapheme</emphasis> is one
151*2d1272b8SAndroid Build Coastguard Worker	      of the indivisible units that make up a writing system or
152*2d1272b8SAndroid Build Coastguard Worker	      script. Often, graphemes are individual symbols (letters,
153*2d1272b8SAndroid Build Coastguard Worker	      numbers, punctuation marks, logograms, etc.) but,
154*2d1272b8SAndroid Build Coastguard Worker	      depending on the writing system, a particular grapheme
155*2d1272b8SAndroid Build Coastguard Worker	      might correspond to a sequence of several Unicode code
156*2d1272b8SAndroid Build Coastguard Worker	      points.
157*2d1272b8SAndroid Build Coastguard Worker	    </para>
158*2d1272b8SAndroid Build Coastguard Worker	    <para>
159*2d1272b8SAndroid Build Coastguard Worker	      In practice, HarfBuzz and other text-shaping engines
160*2d1272b8SAndroid Build Coastguard Worker	      are not generally concerned with graphemes. However, it
161*2d1272b8SAndroid Build Coastguard Worker	      is important for developers using HarfBuzz to recognize
162*2d1272b8SAndroid Build Coastguard Worker	      that there is a difference between graphemes and shaping
163*2d1272b8SAndroid Build Coastguard Worker	      clusters (see above). The two concepts may overlap
164*2d1272b8SAndroid Build Coastguard Worker	      frequently, but there is no guarantee that they will be
165*2d1272b8SAndroid Build Coastguard Worker	      identical.
166*2d1272b8SAndroid Build Coastguard Worker	    </para>
167*2d1272b8SAndroid Build Coastguard Worker	  </listitem>
168*2d1272b8SAndroid Build Coastguard Worker	</varlistentry>
169*2d1272b8SAndroid Build Coastguard Worker
170*2d1272b8SAndroid Build Coastguard Worker	<varlistentry>
171*2d1272b8SAndroid Build Coastguard Worker	  <term>syllable</term>
172*2d1272b8SAndroid Build Coastguard Worker	  <listitem>
173*2d1272b8SAndroid Build Coastguard Worker	    <para>
174*2d1272b8SAndroid Build Coastguard Worker	      In linguistics, a <emphasis>syllable</emphasis> is an
175*2d1272b8SAndroid Build Coastguard Worker	      a sequence of sounds that makes up a building block of a
176*2d1272b8SAndroid Build Coastguard Worker	      particular language. Every language has its own set of
177*2d1272b8SAndroid Build Coastguard Worker	      rules describing what constitutes a valid syllable.
178*2d1272b8SAndroid Build Coastguard Worker	    </para>
179*2d1272b8SAndroid Build Coastguard Worker	    <para>
180*2d1272b8SAndroid Build Coastguard Worker	      For text-shaping purposes, the various definitions of
181*2d1272b8SAndroid Build Coastguard Worker	      "syllable" are important because script-specific shaping
182*2d1272b8SAndroid Build Coastguard Worker	      operations may be applied at the syllable level. For
183*2d1272b8SAndroid Build Coastguard Worker	      example, a reordering rule might specify that a vowel
184*2d1272b8SAndroid Build Coastguard Worker	      mark be reordered to the beginning of the syllable.
185*2d1272b8SAndroid Build Coastguard Worker	    </para>
186*2d1272b8SAndroid Build Coastguard Worker	    <para>
187*2d1272b8SAndroid Build Coastguard Worker	      Syllables will consist of one or more Unicode code
188*2d1272b8SAndroid Build Coastguard Worker	      points. The definition of a syllable for a particular
189*2d1272b8SAndroid Build Coastguard Worker	      writing system might correspond to how HarfBuzz
190*2d1272b8SAndroid Build Coastguard Worker	      identifies clusters (see above) for the same writing
191*2d1272b8SAndroid Build Coastguard Worker	      system. However, it is important for developers using
192*2d1272b8SAndroid Build Coastguard Worker	      HarfBuzz to recognize that there is a difference between
193*2d1272b8SAndroid Build Coastguard Worker	      syllables and shaping clusters. The two concepts may
194*2d1272b8SAndroid Build Coastguard Worker	      overlap frequently, but there is no guarantee that they
195*2d1272b8SAndroid Build Coastguard Worker	      will be identical.
196*2d1272b8SAndroid Build Coastguard Worker	    </para>
197*2d1272b8SAndroid Build Coastguard Worker	  </listitem>
198*2d1272b8SAndroid Build Coastguard Worker	</varlistentry>
199*2d1272b8SAndroid Build Coastguard Worker      </variablelist>
200*2d1272b8SAndroid Build Coastguard Worker
201*2d1272b8SAndroid Build Coastguard Worker  </section>
202*2d1272b8SAndroid Build Coastguard Worker
203*2d1272b8SAndroid Build Coastguard Worker
204*2d1272b8SAndroid Build Coastguard Worker  <section id="a-simple-shaping-example">
205*2d1272b8SAndroid Build Coastguard Worker    <title>A simple shaping example</title>
206*2d1272b8SAndroid Build Coastguard Worker
207*2d1272b8SAndroid Build Coastguard Worker    <para>
208*2d1272b8SAndroid Build Coastguard Worker      Below is the simplest HarfBuzz shaping example possible.
209*2d1272b8SAndroid Build Coastguard Worker    </para>
210*2d1272b8SAndroid Build Coastguard Worker    <orderedlist numeration="arabic">
211*2d1272b8SAndroid Build Coastguard Worker      <listitem>
212*2d1272b8SAndroid Build Coastguard Worker	<para>
213*2d1272b8SAndroid Build Coastguard Worker          Create a buffer and put your text in it.
214*2d1272b8SAndroid Build Coastguard Worker	</para>
215*2d1272b8SAndroid Build Coastguard Worker      </listitem>
216*2d1272b8SAndroid Build Coastguard Worker    </orderedlist>
217*2d1272b8SAndroid Build Coastguard Worker    <programlisting language="C">
218*2d1272b8SAndroid Build Coastguard Worker      #include &lt;hb.h&gt;
219*2d1272b8SAndroid Build Coastguard Worker
220*2d1272b8SAndroid Build Coastguard Worker      hb_buffer_t *buf;
221*2d1272b8SAndroid Build Coastguard Worker      buf = hb_buffer_create();
222*2d1272b8SAndroid Build Coastguard Worker      hb_buffer_add_utf8(buf, text, -1, 0, -1);
223*2d1272b8SAndroid Build Coastguard Worker    </programlisting>
224*2d1272b8SAndroid Build Coastguard Worker    <orderedlist numeration="arabic">
225*2d1272b8SAndroid Build Coastguard Worker      <listitem override="2">
226*2d1272b8SAndroid Build Coastguard Worker	<para>
227*2d1272b8SAndroid Build Coastguard Worker          Set the script, language and direction of the buffer.
228*2d1272b8SAndroid Build Coastguard Worker	</para>
229*2d1272b8SAndroid Build Coastguard Worker      </listitem>
230*2d1272b8SAndroid Build Coastguard Worker    </orderedlist>
231*2d1272b8SAndroid Build Coastguard Worker    <programlisting language="C">
232*2d1272b8SAndroid Build Coastguard Worker      // If you know the direction, script, and language
233*2d1272b8SAndroid Build Coastguard Worker      hb_buffer_set_direction(buf, HB_DIRECTION_LTR);
234*2d1272b8SAndroid Build Coastguard Worker      hb_buffer_set_script(buf, HB_SCRIPT_LATIN);
235*2d1272b8SAndroid Build Coastguard Worker      hb_buffer_set_language(buf, hb_language_from_string("en", -1));
236*2d1272b8SAndroid Build Coastguard Worker
237*2d1272b8SAndroid Build Coastguard Worker      // If you don't know the direction, script, and language
238*2d1272b8SAndroid Build Coastguard Worker      hb_buffer_guess_segment_properties(buffer);
239*2d1272b8SAndroid Build Coastguard Worker    </programlisting>
240*2d1272b8SAndroid Build Coastguard Worker    <orderedlist numeration="arabic">
241*2d1272b8SAndroid Build Coastguard Worker      <listitem override="3">
242*2d1272b8SAndroid Build Coastguard Worker	<para>
243*2d1272b8SAndroid Build Coastguard Worker          Create a face and a font from a font file.
244*2d1272b8SAndroid Build Coastguard Worker	</para>
245*2d1272b8SAndroid Build Coastguard Worker      </listitem>
246*2d1272b8SAndroid Build Coastguard Worker    </orderedlist>
247*2d1272b8SAndroid Build Coastguard Worker    <programlisting language="C">
248*2d1272b8SAndroid Build Coastguard Worker      hb_blob_t *blob = hb_blob_create_from_file(filename); /* or hb_blob_create_from_file_or_fail() */
249*2d1272b8SAndroid Build Coastguard Worker      hb_face_t *face = hb_face_create(blob, 0);
250*2d1272b8SAndroid Build Coastguard Worker      hb_font_t *font = hb_font_create(face);
251*2d1272b8SAndroid Build Coastguard Worker    </programlisting>
252*2d1272b8SAndroid Build Coastguard Worker    <orderedlist numeration="arabic">
253*2d1272b8SAndroid Build Coastguard Worker      <listitem override="4">
254*2d1272b8SAndroid Build Coastguard Worker	<para>
255*2d1272b8SAndroid Build Coastguard Worker          Shape!
256*2d1272b8SAndroid Build Coastguard Worker	</para>
257*2d1272b8SAndroid Build Coastguard Worker      </listitem>
258*2d1272b8SAndroid Build Coastguard Worker    </orderedlist>
259*2d1272b8SAndroid Build Coastguard Worker    <programlisting>
260*2d1272b8SAndroid Build Coastguard Worker      hb_shape(font, buf, NULL, 0);
261*2d1272b8SAndroid Build Coastguard Worker    </programlisting>
262*2d1272b8SAndroid Build Coastguard Worker    <orderedlist numeration="arabic">
263*2d1272b8SAndroid Build Coastguard Worker      <listitem override="5">
264*2d1272b8SAndroid Build Coastguard Worker	<para>
265*2d1272b8SAndroid Build Coastguard Worker          Get the glyph and position information.
266*2d1272b8SAndroid Build Coastguard Worker	</para>
267*2d1272b8SAndroid Build Coastguard Worker      </listitem>
268*2d1272b8SAndroid Build Coastguard Worker    </orderedlist>
269*2d1272b8SAndroid Build Coastguard Worker    <programlisting language="C">
270*2d1272b8SAndroid Build Coastguard Worker      unsigned int glyph_count;
271*2d1272b8SAndroid Build Coastguard Worker      hb_glyph_info_t *glyph_info    = hb_buffer_get_glyph_infos(buf, &amp;glyph_count);
272*2d1272b8SAndroid Build Coastguard Worker      hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buf, &amp;glyph_count);
273*2d1272b8SAndroid Build Coastguard Worker    </programlisting>
274*2d1272b8SAndroid Build Coastguard Worker    <orderedlist numeration="arabic">
275*2d1272b8SAndroid Build Coastguard Worker      <listitem override="6">
276*2d1272b8SAndroid Build Coastguard Worker	<para>
277*2d1272b8SAndroid Build Coastguard Worker          Iterate over each glyph.
278*2d1272b8SAndroid Build Coastguard Worker	</para>
279*2d1272b8SAndroid Build Coastguard Worker      </listitem>
280*2d1272b8SAndroid Build Coastguard Worker    </orderedlist>
281*2d1272b8SAndroid Build Coastguard Worker    <programlisting language="C">
282*2d1272b8SAndroid Build Coastguard Worker      hb_position_t cursor_x = 0;
283*2d1272b8SAndroid Build Coastguard Worker      hb_position_t cursor_y = 0;
284*2d1272b8SAndroid Build Coastguard Worker      for (unsigned int i = 0; i &lt; glyph_count; i++) {
285*2d1272b8SAndroid Build Coastguard Worker          hb_codepoint_t glyphid  = glyph_info[i].codepoint;
286*2d1272b8SAndroid Build Coastguard Worker          hb_position_t x_offset  = glyph_pos[i].x_offset;
287*2d1272b8SAndroid Build Coastguard Worker          hb_position_t y_offset  = glyph_pos[i].y_offset;
288*2d1272b8SAndroid Build Coastguard Worker          hb_position_t x_advance = glyph_pos[i].x_advance;
289*2d1272b8SAndroid Build Coastguard Worker          hb_position_t y_advance = glyph_pos[i].y_advance;
290*2d1272b8SAndroid Build Coastguard Worker       /* draw_glyph(glyphid, cursor_x + x_offset, cursor_y + y_offset); */
291*2d1272b8SAndroid Build Coastguard Worker          cursor_x += x_advance;
292*2d1272b8SAndroid Build Coastguard Worker          cursor_y += y_advance;
293*2d1272b8SAndroid Build Coastguard Worker      }
294*2d1272b8SAndroid Build Coastguard Worker    </programlisting>
295*2d1272b8SAndroid Build Coastguard Worker    <orderedlist numeration="arabic">
296*2d1272b8SAndroid Build Coastguard Worker      <listitem override="7">
297*2d1272b8SAndroid Build Coastguard Worker	<para>
298*2d1272b8SAndroid Build Coastguard Worker          Tidy up.
299*2d1272b8SAndroid Build Coastguard Worker	</para>
300*2d1272b8SAndroid Build Coastguard Worker      </listitem>
301*2d1272b8SAndroid Build Coastguard Worker    </orderedlist>
302*2d1272b8SAndroid Build Coastguard Worker    <programlisting language="C">
303*2d1272b8SAndroid Build Coastguard Worker      hb_buffer_destroy(buf);
304*2d1272b8SAndroid Build Coastguard Worker      hb_font_destroy(font);
305*2d1272b8SAndroid Build Coastguard Worker      hb_face_destroy(face);
306*2d1272b8SAndroid Build Coastguard Worker      hb_blob_destroy(blob);
307*2d1272b8SAndroid Build Coastguard Worker    </programlisting>
308*2d1272b8SAndroid Build Coastguard Worker
309*2d1272b8SAndroid Build Coastguard Worker    <para>
310*2d1272b8SAndroid Build Coastguard Worker      This example shows enough to get us started using HarfBuzz. In
311*2d1272b8SAndroid Build Coastguard Worker      the sections that follow, we will use the remainder of
312*2d1272b8SAndroid Build Coastguard Worker      HarfBuzz's API to refine and extend the example and improve its
313*2d1272b8SAndroid Build Coastguard Worker      text-shaping capabilities.
314*2d1272b8SAndroid Build Coastguard Worker    </para>
315*2d1272b8SAndroid Build Coastguard Worker  </section>
316*2d1272b8SAndroid Build Coastguard Worker</chapter>
317