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 <hb.h> 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, &glyph_count); 272*2d1272b8SAndroid Build Coastguard Worker hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buf, &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 < 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