File: level-2.html

package info (click to toggle)
harfbuzz 6.0.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 109,068 kB
  • sloc: cpp: 91,977; ansic: 18,134; sh: 4,651; xml: 4,528; python: 4,087; makefile: 1,171
file content (185 lines) | stat: -rw-r--r-- 7,009 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Level 2: 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="clusters.html" title="Clusters">
<link rel="prev" href="the-distinction-between-levels-0-and-1.html" title="The distinction between levels 0 and 1">
<link rel="next" href="utilities.html" title="Utilities">
<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="clusters.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
<td><a accesskey="p" href="the-distinction-between-levels-0-and-1.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
<td><a accesskey="n" href="utilities.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="level-2"></a>Level 2</h2></div></div></div>
<p>
      HarfBuzz's level 2 cluster behavior uses a significantly
      different model than that of level 0 and level 1.
    </p>
<p>
      The level 2 behavior is easy to describe, but it may be
      difficult to understand in practical terms. In brief, level 2 
      performs no merging of clusters whatsoever.
    </p>
<p>
      This means that there is no initial base-and-mark merging step
      (as is done in level 0), and it means that reordering moves and
      ligature substitutions do not trigger a cluster merge.
    </p>
<p>
      Only one shaping operation directly affects clusters when using
      level 2:
    </p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>
	  When a cluster <span class="emphasis"><em>decomposes</em></span>, all of the
	  resulting child clusters inherit as their cluster value the
	  cluster value of the parent cluster.
	</p></li></ul></div>
<p>
      When glyphs do form a ligature (or when some other feature
      substitutes multiple glyphs with one glyph) the cluster value
      of the first glyph is retained as the cluster value for the
      resulting ligature.
    </p>
<p>
      This occurrence sounds similar to a cluster merge, but it is
      different. In particular, no subsequent characters —
      including marks and modifiers — are affected. They retain
      their previous cluster values. 
    </p>
<p>
      Level 2 cluster behavior is ultimately less complex than level 0
      or level 1, but there are several cases for which processing
      cluster values produced at level 2 may be tricky. 
    </p>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="ligatures-with-combining-marks-in-level-2"></a>Ligatures with combining marks in level 2</h3></div></div></div>
<p>
	The first example of how HarfBuzz's level 2 cluster behavior
	can be tricky is when the text to be shaped includes combining
	marks attached to ligatures.
      </p>
<p>
	Let us start with an input sequence with the following
	characters (top row) and initial cluster values (bottom row):
      </p>
<pre class="programlisting">
	A,acute,B,breve,C,circumflex
	0,1    ,2,3    ,4,5
      </pre>
<p>
	If the sequence <code class="literal">A,B,C</code> forms a ligature,
	then these are the cluster values HarfBuzz will return under
	the various cluster levels:
      </p>
<p>
	Level 0:
      </p>
<pre class="programlisting">
	ABC,acute,breve,circumflex
	0  ,0    ,0    ,0
      </pre>
<p>
	Level 1:
      </p>
<pre class="programlisting">
	ABC,acute,breve,circumflex
	0  ,0    ,0    ,5
      </pre>
<p>
	Level 2:
      </p>
<pre class="programlisting">
	ABC,acute,breve,circumflex
	0  ,1    ,3    ,5
      </pre>
<p>
	Making sense of the level 2 result is the hardest for a client
	program, because there is nothing in the cluster values that
	indicates that <code class="literal">B</code> and <code class="literal">C</code>
	formed a ligature with <code class="literal">A</code>.
      </p>
<p>
	In contrast, the "merged" cluster values of the mark glyphs
	that are seen in the level 0 and level 1 output are evidence
	that a ligature substitution took place. 
      </p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="reordering-in-level-2"></a>Reordering in level 2</h3></div></div></div>
<p>
	Another example of how HarfBuzz's level 2 cluster behavior
	can be tricky is when glyphs reorder. Consider an input sequence
	with the following characters (top row) and initial cluster
	values (bottom row):
      </p>
<pre class="programlisting">
	A,B,C,D,E
	0,1,2,3,4
      </pre>
<p>
	Now imagine <code class="literal">D</code> moves before
	<code class="literal">B</code> in a reordering operation. The cluster
	values will then be:
      </p>
<pre class="programlisting">
	A,D,B,C,E
	0,3,1,2,4
      </pre>
<p>
	Next, if <code class="literal">D</code> forms a ligature with
	<code class="literal">B</code>, the output is:
      </p>
<pre class="programlisting">
	A,DB,C,E
	0,3 ,2,4
      </pre>
<p>
	However, in a different scenario, in which the shaping rules
	of the script instead caused <code class="literal">A</code> and
	<code class="literal">B</code> to form a ligature
	<span class="emphasis"><em>before</em></span> the <code class="literal">D</code> reordered, the
	result would be:
      </p>
<pre class="programlisting">
	AB,D,C,E
	0 ,3,2,4   
      </pre>
<p>
	There is no way for a client program to differentiate between
	these two scenarios based on the cluster values
	alone. Consequently, client programs that use level 2 might
	need to undertake additional work in order to manage cursor
	positioning, text attributes, or other desired features.
      </p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="other-considerations-in-level-2"></a>Other considerations in level 2</h3></div></div></div>
<p>
	There may be other problems encountered with ligatures under
	level 2, such as if the direction of the text is forced to
	the opposite of its natural direction (for example, Arabic text
	that is forced into left-to-right directionality). But,
	generally speaking, these other scenarios are minor corner
	cases that are too obscure for most client programs to need to
	worry about.
      </p>
</div>
</div>
<div class="footer">
<hr>Generated by GTK-Doc V1.32</div>
</body>
</html>