/
usr
/
share
/
gtk-doc
/
html
/
harfbuzz
/
/usr/share/gtk-doc/html/harfbuzz
mkdir
upload
Name
Size
Mode
Actions
a-clustering-example-for-levels-0-and-1.html
5307
0644
edit
dl
rm
aat-shaping.html
2359
0644
edit
dl
rm
adding-text-to-the-buffer.html
5800
0644
edit
dl
rm
annotation-glossary.html
5644
0644
edit
dl
rm
api-index-0-9-2.html
44447
0644
edit
dl
rm
api-index-0-9-5.html
3339
0644
edit
dl
rm
api-index-0-9-7.html
12306
0644
edit
dl
rm
api-index-0-9-8.html
2088
0644
edit
dl
rm
api-index-0-9-10.html
3200
0644
edit
dl
rm
api-index-0-9-11.html
2070
0644
edit
dl
rm
api-index-0-9-20.html
2303
0644
edit
dl
rm
api-index-0-9-22.html
2115
0644
edit
dl
rm
api-index-0-9-28.html
2062
0644
edit
dl
rm
api-index-0-9-30.html
2525
0644
edit
dl
rm
api-index-0-9-31.html
2932
0644
edit
dl
rm
api-index-0-9-38.html
3822
0644
edit
dl
rm
api-index-0-9-39.html
2058
0644
edit
dl
rm
api-index-0-9-41.html
2067
0644
edit
dl
rm
api-index-0-9-42.html
2587
0644
edit
dl
rm
api-index-1-0-5.html
2737
0644
edit
dl
rm
api-index-1-1-2.html
2374
0644
edit
dl
rm
api-index-1-1-3.html
2957
0644
edit
dl
rm
api-index-1-2-3.html
2872
0644
edit
dl
rm
api-index-1-3-3.html
5536
0644
edit
dl
rm
api-index-1-4-0.html
2347
0644
edit
dl
rm
api-index-1-4-2.html
5369
0644
edit
dl
rm
api-index-1-4-3.html
2029
0644
edit
dl
rm
api-index-1-5-0.html
2900
0644
edit
dl
rm
api-index-1-6-0.html
2266
0644
edit
dl
rm
api-index-1-7-5.html
1701
0644
edit
dl
rm
api-index-1-7-7.html
5550
0644
edit
dl
rm
api-index-1-8-0.html
2662
0644
edit
dl
rm
api-index-1-8-1.html
2485
0644
edit
dl
rm
api-index-1-8-5.html
2088
0644
edit
dl
rm
api-index-1-8-6.html
3187
0644
edit
dl
rm
api-index-1-9-0.html
3460
0644
edit
dl
rm
api-index-2-0-0.html
5926
0644
edit
dl
rm
api-index-2-1-0.html
8069
0644
edit
dl
rm
api-index-2-2-0.html
5326
0644
edit
dl
rm
api-index-2-3-0.html
2650
0644
edit
dl
rm
api-index-2-4-0.html
2087
0644
edit
dl
rm
api-index-2-5-0.html
2108
0644
edit
dl
rm
api-index-2-6-0.html
5240
0644
edit
dl
rm
api-index-2-7-3.html
2824
0644
edit
dl
rm
api-index-full.html
140340
0644
edit
dl
rm
buffers-language-script-and-direction.html
4951
0644
edit
dl
rm
building.html
15346
0644
edit
dl
rm
ch01s03.html
4495
0644
edit
dl
rm
ch03s02.html
6078
0644
edit
dl
rm
ch03s03.html
4580
0644
edit
dl
rm
ch12.html
3557
0644
edit
dl
rm
ch13.html
3078
0644
edit
dl
rm
ch14.html
1876
0644
edit
dl
rm
ch15.html
3044
0644
edit
dl
rm
clusters.html
6499
0644
edit
dl
rm
complex-scripts.html
3001
0644
edit
dl
rm
customizing-unicode-functions.html
6400
0644
edit
dl
rm
deprecated-api-index.html
6223
0644
edit
dl
rm
fonts-and-faces-custom-functions.html
7398
0644
edit
dl
rm
fonts-and-faces-native-opentype.html
5196
0644
edit
dl
rm
fonts-and-faces-variable.html
5304
0644
edit
dl
rm
fonts-and-faces.html
7671
0644
edit
dl
rm
getting-started.html
5043
0644
edit
dl
rm
graphite-shaping.html
2308
0644
edit
dl
rm
harfbuzz-hb-aat-layout.html
139345
0644
edit
dl
rm
harfbuzz-hb-blob.html
35902
0644
edit
dl
rm
harfbuzz-hb-buffer.html
195491
0644
edit
dl
rm
harfbuzz-hb-common.html
65323
0644
edit
dl
rm
harfbuzz-hb-coretext.html
11371
0644
edit
dl
rm
harfbuzz-hb-deprecated.html
25328
0644
edit
dl
rm
harfbuzz-hb-directwrite.html
6155
0644
edit
dl
rm
harfbuzz-hb-face.html
52100
0644
edit
dl
rm
harfbuzz-hb-font.html
262696
0644
edit
dl
rm
harfbuzz-hb-ft.html
28719
0644
edit
dl
rm
harfbuzz-hb-gdi.html
4310
0644
edit
dl
rm
harfbuzz-hb-glib.html
10086
0644
edit
dl
rm
harfbuzz-hb-gobject.html
2953
0644
edit
dl
rm
harfbuzz-hb-graphite2.html
5828
0644
edit
dl
rm
harfbuzz-hb-icu.html
7969
0644
edit
dl
rm
harfbuzz-hb-map.html
29188
0644
edit
dl
rm
harfbuzz-hb-ot-color.html
39949
0644
edit
dl
rm
harfbuzz-hb-ot-font.html
4630
0644
edit
dl
rm
harfbuzz-hb-ot-layout.html
145088
0644
edit
dl
rm
harfbuzz-hb-ot-math.html
52886
0644
edit
dl
rm
harfbuzz-hb-ot-meta.html
10286
0644
edit
dl
rm
harfbuzz-hb-ot-metrics.html
17927
0644
edit
dl
rm
harfbuzz-hb-ot-name.html
19603
0644
edit
dl
rm
harfbuzz-hb-ot-shape.html
6257
0644
edit
dl
rm
harfbuzz-hb-ot-var.html
36708
0644
edit
dl
rm
harfbuzz-hb-set.html
59423
0644
edit
dl
rm
harfbuzz-hb-shape-plan.html
38412
0644
edit
dl
rm
harfbuzz-hb-shape.html
11702
0644
edit
dl
rm
harfbuzz-hb-unicode.html
106701
0644
edit
dl
rm
harfbuzz-hb-uniscribe.html
6099
0644
edit
dl
rm
harfbuzz-hb-version.html
10415
0644
edit
dl
rm
harfbuzz.devhelp2
179457
0644
edit
dl
rm
HarfBuzz.png
6254
0644
edit
dl
rm
HarfBuzz.svg
6745
0644
edit
dl
rm
home.png
169
0644
edit
dl
rm
index.html
19566
0644
edit
dl
rm
install-harfbuzz.html
3787
0644
edit
dl
rm
integration-coretext.html
6483
0644
edit
dl
rm
integration-freetype.html
9293
0644
edit
dl
rm
integration-icu.html
4186
0644
edit
dl
rm
integration-python.html
3181
0644
edit
dl
rm
integration-uniscribe.html
6725
0644
edit
dl
rm
integration.html
9936
0644
edit
dl
rm
left-insensitive.png
334
0644
edit
dl
rm
left.png
185
0644
edit
dl
rm
level-2.html
7009
0644
edit
dl
rm
object-model-blobs.html
2902
0644
edit
dl
rm
object-model-lifecycle.html
4978
0644
edit
dl
rm
object-model-object-types.html
4111
0644
edit
dl
rm
object-model-user-data.html
3255
0644
edit
dl
rm
object-model.html
3978
0644
edit
dl
rm
opentype-shaping-models.html
4463
0644
edit
dl
rm
pt01.html
9417
0644
edit
dl
rm
pt02.html
12674
0644
edit
dl
rm
reordering-in-levels-0-and-1.html
3102
0644
edit
dl
rm
right-insensitive.png
233
0644
edit
dl
rm
right.png
184
0644
edit
dl
rm
setting-buffer-properties.html
7830
0644
edit
dl
rm
shaping-and-shape-plans.html
8196
0644
edit
dl
rm
shaping-concepts.html
3869
0644
edit
dl
rm
shaping-opentype-features.html
6663
0644
edit
dl
rm
shaping-operations.html
4537
0644
edit
dl
rm
shaping-plans-and-caching.html
4641
0644
edit
dl
rm
shaping-shaper-selection.html
3406
0644
edit
dl
rm
style.css
11606
0644
edit
dl
rm
text-runs.html
2533
0644
edit
dl
rm
the-distinction-between-levels-0-and-1.html
4864
0644
edit
dl
rm
unicode-character-categories.html
4204
0644
edit
dl
rm
up-insensitive.png
288
0644
edit
dl
rm
up.png
186
0644
edit
dl
rm
utilities-common-types-apis.html
4365
0644
edit
dl
rm
utilities-ucdn.html
2632
0644
edit
dl
rm
utilities.html
9274
0644
edit
dl
rm
what-harfbuzz-doesnt-do.html
5535
0644
edit
dl
rm
what-is-harfbuzz.html
5503
0644
edit
dl
rm
why-do-i-need-a-shaping-engine.html
8124
0644
edit
dl
rm
why-is-it-called-harfbuzz.html
2171
0644
edit
dl
rm
working-with-harfbuzz-clusters.html
10083
0644
edit
dl
rm
Edit:
/usr/share/gtk-doc/html/harfbuzz/why-do-i-need-a-shaping-engine.html
(8124B)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Why do I need a shaping engine?: HarfBuzz Manual</title> <meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> <link rel="home" href="index.html" title="HarfBuzz Manual"> <link rel="up" href="what-is-harfbuzz.html" title="What is HarfBuzz?"> <link rel="prev" href="what-is-harfbuzz.html" title="What is HarfBuzz?"> <link rel="next" href="ch01s03.html" title="What does HarfBuzz do?"> <meta name="generator" content="GTK-Doc V1.32 (XML mode)"> <link rel="stylesheet" href="style.css" type="text/css"> </head> <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle"> <td width="100%" align="left" class="shortcuts"></td> <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td> <td><a accesskey="u" href="what-is-harfbuzz.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td> <td><a accesskey="p" href="what-is-harfbuzz.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td> <td><a accesskey="n" href="ch01s03.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td> </tr></table> <div class="section"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> <a name="why-do-i-need-a-shaping-engine"></a>Why do I need a shaping engine?</h2></div></div></div> <p> Text shaping is an integral part of preparing text for display. Before a Unicode sequence can be rendered, the codepoints in the sequence must be mapped to the corresponding glyphs provided in the font, and those glyphs must be positioned correctly relative to each other. For many of the scripts supported in Unicode, these steps involve script-specific layout rules, including complex joining, reordering, and positioning behavior. Implementing these rules is the job of the shaping engine. </p> <p> Text shaping is a fairly low-level operation. HarfBuzz is used directly by text-handling libraries like <a class="ulink" href="https://www.pango.org/" target="_top">Pango</a>, as well as by the layout engines in Firefox, LibreOffice, and Chromium. Unless you are <span class="emphasis"><em>writing</em></span> one of these layout engines yourself, you will probably not need to use HarfBuzz: normally, a layout engine, toolkit, or other library will turn text into glyphs for you. </p> <p> However, if you <span class="emphasis"><em>are</em></span> writing a layout engine or graphics library yourself, then you will need to perform text shaping, and this is where HarfBuzz can help you. </p> <p> Here are some specific scenarios where a text-shaping engine like HarfBuzz helps you: </p> <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> <li class="listitem"> <p> OpenType fonts contain a set of glyphs (that is, shapes to represent the letters, numbers, punctuation marks, and all other symbols), which are indexed by a <code class="literal">glyph ID</code>. </p> <p> A particular glyph ID within the font does not necessarily correlate to a predictable Unicode codepoint. For instance, some fonts have the letter "a" as glyph ID 1, but many others do not. In order to retrieve the right glyph from the font to display "a", you need to consult the table inside the font (the <code class="literal">cmap</code> table) that maps Unicode codepoints to glyph IDs. In other words, <span class="emphasis"><em>text shaping turns codepoints into glyph IDs</em></span>. </p> </li> <li class="listitem"> <p> Many OpenType fonts contain ligatures: combinations of characters that are rendered as a single unit. For instance, it is common for the "f, i" letter sequence to appear in print as the single ligature glyph "fi". </p> <p> Whether you should render an "f, i" sequence as <code class="literal">fi</code> or as "fi" does not depend on the input text. Instead, it depends on the whether or not the font includes an "fi" glyph and on the level of ligature application you wish to perform. The font and the amount of ligature application used are under your control. In other words, <span class="emphasis"><em>text shaping involves querying the font's ligature tables and determining what substitutions should be made</em></span>. </p> </li> <li class="listitem"> <p> While ligatures like "fi" are optional typographic refinements, some languages <span class="emphasis"><em>require</em></span> certain substitutions to be made in order to display text correctly. </p> <p> For example, in Tamil, when the letter "TTA" (ட) letter is followed by the vowel sign "U" (ு), the pair must be replaced by the single glyph "டு". The sequence of Unicode characters "ட,ு" needs to be substituted with a single "டு" glyph from the font. </p> <p> But "டு" does not have a Unicode codepoint. To find this glyph, you need to consult the table inside the font (the <code class="literal">GSUB</code> table) that contains substitution information. In other words, <span class="emphasis"><em>text shaping chooses the correct glyph for a sequence of characters provided</em></span>. </p> </li> <li class="listitem"> <p> Similarly, each Arabic character has four different variants corresponding to the different positions it might appear in within a sequence. Inside a font, there will be separate glyphs for the initial, medial, final, and isolated forms of each letter, each at a different glyph ID. </p> <p> Unicode only assigns one codepoint per character, so a Unicode string will not tell you which glyph variant to use for each character. To decide, you need to analyze the whole string and determine the appropriate glyph for each character based on its position. In other words, <span class="emphasis"><em>text shaping chooses the correct form of the letter by its position and returns the correct glyph from the font</em></span>. </p> </li> <li class="listitem"> <p> Other languages involve marks and accents that need to be rendered in specific positions relative a base character. For instance, the Moldovan language includes the Cyrillic letter "zhe" (ж) with a breve accent, like so: "ӂ". </p> <p> Some fonts will provide this character as a single zhe-with-breve glyph, but other fonts will not and, instead, will expect the rendering engine to form the character by superimposing the separate "ж" and "˘" glyphs. </p> <p> But exactly where you should draw the breve depends on the height and width of the preceding zhe glyph. To find the right position, you need to consult the table inside the font (the <code class="literal">GPOS</code> table) that contains positioning information. In other words, <span class="emphasis"><em>text shaping tells you whether you have a precomposed glyph within your font or if you need to compose a glyph yourself out of combining marks—and, if so, where to position those marks.</em></span> </p> </li> </ul></div> <p> If tasks like these are something that you need to do, then you need a text shaping engine. You could use Uniscribe if you are writing Windows software; you could use CoreText on macOS; or you could use HarfBuzz. </p> <div class="note"><p> In the rest of this manual, the text will assume that the reader is that implementor of a text-layout engine. </p></div> </div> <div class="footer"> <hr>Generated by GTK-Doc V1.32</div> </body> </html>
Save
cmd:
run