xref: /aosp_15_r20/external/harfbuzz_ng/docs/features.dot (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1digraph {
2  graph [outputorder=edgefirst];
3	node [shape="record", fontname="Noto Sans Mono SemiBold", fontsize=15];
4	edge [fontname="Verdana", fontsize=12,labeldistance=7.5 ];
5	fontname="Verdana";
6  ranksep=0.02; nodesep=0.5;
7
8subgraph {
9	ranksep="0.02 equally";
10	preprocessing[style=filled,fillcolor="lightgreen",fontname="Verdana",label="Glyph pre-processing"];
11	orthographic[style=filled,fillcolor="lightblue",fontname="Verdana",label="Orthographic Unit Shaping"];
12	reordering[style=filled, fillcolor="lightcoral",fontname="Verdana",label="Reordering group (USE)"];
13	topographic[style=filled,fillcolor="lightgoldenrod",fontname="Verdana",label="Topographical Features‡"];
14	typographic[style=filled,fillcolor="lightpink",fontname="Verdana",label="Typographic Presentation"];
15	positioning[style=filled,fillcolor="lightsalmon",fontname="Verdana",label="Positioning"];
16	preprocessing->reordering->orthographic->topographic->typographic->positioning;
17}
18
19	decision1 [shape="diamond", label="Script\ndirection?",fontname="Verdana"];
20	rvrn->decision1;
21
22	ltrfeatures [label="{ltra|ltrm}", fillcolor="lightgreen",style="filled"];
23	{
24	rtlfeatures [label="{rtla|rtlm¹}", fillcolor="lightgreen",style="filled"];
25	}
26	{
27		rank=same;
28		fracfeatures [label="frac²|numr³|dnom⁴", fillcolor="lightpink",style="filled"];
29		fracnotes [fontname="Verdana",shape=plaintext,label=<<table border="0" cellborder="0" cellspacing="0">
30			<tr><td align="left">¹ rtlm is scoped to characters with a Unicode mirroring property</td></tr>
31			<tr><td align="left">² frac is scoped to numr + the slash + dnom</td></tr>
32			<tr><td align="left">³ numr is scoped to all decimal numbers before a U+2044 FRACTION SLASH.</td></tr>
33			<tr><td align="left">⁴ dnom is scoped to all decimal numbers after a U+2044 FRACTION SLASH.</td></tr>
34	</table>
35		>];
36
37	}
38	rand [fillcolor="lightpink",style="filled"];
39
40	decision1 -> ltrfeatures [label="Left-to-right"];
41	decision1 -> rtlfeatures [label="Right-to-left"];
42
43	decision1 -> fracfeatures [label="Other"];
44
45	ltrfeatures -> fracfeatures;
46	rtlfeatures -> fracfeatures;
47	fracfeatures->rand;
48
49	decision2 [shape="diamond", label="Script?",fontname="Verdana"];
50
51{rank=same; HARF [label="{Harf|HARF}"]; notes;}
52	rand -> trak -> HARF -> decision2;
53
54	commonfeatures [shape=none,label=<<table border="0" cellspacing="0">
55                    <tr>
56                    	<td border="1" bgcolor="lightsalmon">abvm</td>
57                    	<td border="1" bgcolor="lightsalmon">blwm</td>
58                    	<td border="1" bgcolor="lightgreen">ccmp</td>
59                    	<td border="1" bgcolor="lightgreen">locl</td>
60                    	<td border="1" bgcolor="lightsalmon">mark</td>
61                    	<td border="1" bgcolor="lightsalmon">mkmk</td>
62                    	<td border="1" bgcolor="lightpink">rlig</td>
63                    </tr>
64                </table>>
65    ];
66
67	decision3 [shape="diamond", label="Script\ndirection?",fontname="Verdana"];
68
69	BUZZ  [label="{Buzz|BUZZ}"];
70	BUZZ -> commonfeatures -> decision3;
71
72	horizontalfeatures [
73	shape=none,label=<<table border="0" cellspacing="0">
74                    <tr><td border="1" bgcolor="lightpink">calt <font face="Verdana">(not Hangul)</font></td></tr>
75                    <tr><td border="1" bgcolor="lightpink">clig <font face="Verdana">(not Khmer)</font></td></tr>
76                    <tr><td border="1" bgcolor="lightsalmon">curs</td></tr>
77                    <tr><td border="1" bgcolor="lightsalmon">dist</td></tr>
78                    <tr><td border="1" bgcolor="lightsalmon">kern</td></tr>
79                    <tr><td border="1" bgcolor="lightpink">liga <font face="Verdana">(not Khmer)</font></td></tr>
80                    <tr><td border="1" bgcolor="lightpink">rclt</td></tr>
81                </table>>
82                ];
83	vert [label="vert",style=filled,fillcolor="lightpink"];
84
85	decision3 -> horizontalfeatures [label="Horizontal"];
86	decision3 -> vert [label="Vertical"];
87
88	discretionary [label="User-selected\ndiscretionary\nfeatures",fontname="Verdana"];
89
90	horizontalfeatures -> discretionary;
91	vert -> discretionary;
92
93	decision2->stch;
94
95	BUZZ;
96
97subgraph shapers {
98	subgraph cluster_arabic {
99		bgcolor="lightyellow"
100		label="Arabic, Syriac";
101	stch [ style="filled", fillcolor="lightgreen",label="stch"];
102	ccmplocl [ style="filled", label="ccmp|locl", fillcolor="lightgreen"];
103	arabicfeatures [label="isol|fina|fin2|fin3|medi|med2|init", style="filled", fillcolor="lightgoldenrod"];
104	arabicfeatures2 [label="rclt|calt", style="filled",fillcolor="lightpink"];
105rlig[style="filled",fillcolor="lightpink"];
106mset [fillcolor="lightpink",style="filled"]
107	stch->ccmplocl->arabicfeatures->rlig->arabicfeatures2->mset;
108	}
109	mset->BUZZ:n;
110
111	subgraph cluster_hangul {
112		bgcolor="lightyellow"
113		label="Hangul";
114		hangulfeatures [label="ljmo|vjmo|tjmo", style="filled",fillcolor="lightgoldenrod"]
115	}
116	  hangulfeatures->BUZZ:n;
117
118	subgraph cluster_indic {
119		label="Indic";
120		bgcolor="lightyellow"
121		// Preprocessing
122		loclccmpindic [label="locl†|ccmp†",style=filled,fillcolor="lightgreen"];
123		node[style=filled,fillcolor="lightgreen"];
124		nukt [label="nukt†"];
125		akhn [label="akhn†"];
126		loclccmpindic->indic_reorder_1->nukt->akhn;
127		indic_reorder_1[label="Initial reordering", fontname="Verdana",fillcolor="lightgrey",shape=ellipse,style=filled]
128
129		// Orthographic
130		node[style=filled,fillcolor="lightblue"]
131		rphf [label="rphf⁵"];
132		rkpf [label="rkpf†"];
133		pref [label="pref⁶"];
134		blwf [label="blwf⁷"];
135		abvf [label="abvf⁸"];
136		half [label="half⁹"];
137		pstf [label="pstf⁸"];
138		vatu [label="vatu†"];
139		cjct [label="cjct†"];
140		akhn ->rphf -> rkpf -> pref -> blwf -> abvf -> half -> pstf -> vatu -> cjct;
141		// Typographic presentation
142		indic_typographic[style=filled,fillcolor="lightpink",label="init|pres|abvs|blws|psts|haln"]
143		indic_reorder_2[label="Final reordering",fillcolor="lightgrey",fontname="Verdana", shape=ellipse,style=filled]
144		cjct->indic_reorder_2->indic_typographic;
145
146	notes2 [fontname="Verdana",shape=plaintext,style="",label=<<table border="0" cellborder="0" cellspacing="0">
147<tr><td align="right">⁵ rphf is scoped to pre-base ra+halant sequences</td></tr>
148<tr><td align="right">⁶ pref is scoped to the two glyphs after the base; outputs are reordered</td></tr>
149<tr><td align="right">⁷ blwf is usually scoped to the whole syllable, except in Telugu and Kannada where it is post-base</td></tr>
150<tr><td align="right">⁸ abvf and pstf are scoped to post-base</td></tr>
151<tr><td align="right">⁹ half is scoped to pre-base</td></tr>
152</table>
153>];
154		indic_typographic -> notes2 [style=invis];
155	}
156
157
158	subgraph cluster_khmer {
159		label="Khmer";
160		bgcolor="lightyellow"
161
162		khmerbasic [style=filled,fillcolor="lightgreen",label="locl†|ccmp†|pref†|bwlf†|abvf†|pstf†|cfar†"]
163		khmerother [style=filled,fillcolor="lightpink",label="pres|abvs|blws|psts"]
164		khmerbasic -> khmerother -> khmerclig;
165				khmerclig [label="clig",style=filled,fillcolor="lightpink"];
166	}
167
168	subgraph cluster_myanmar {
169		label="Myanmar";
170		bgcolor="lightyellow"
171		loclccmpmyanmar [label="locl†|ccmp†",style=filled,fillcolor="lightgreen"];
172		rphfmymr [label="rphf†",style=filled,fillcolor="lightblue"]
173		prefmymr [label="pref†",style=filled,fillcolor="lightblue"]
174		blwfmymr [label="blwf†",style=filled,fillcolor="lightblue"]
175		pstfmymr [label="pstf†",style=filled,fillcolor="lightblue"]
176		myanmarother [label="pres|abvs|blws|psts",style=filled,fillcolor="lightpink"];
177		reorder_myanmar[label="Reordering", shape=ellipse,style=filled,fontname="Verdana"]
178		loclccmpmyanmar -> reorder_myanmar-> rphfmymr -> prefmymr -> blwfmymr -> pstfmymr -> myanmarother;
179	}
180
181	subgraph cluster_use {
182		label="Universal Shaping Engine"
183		bgcolor="lightyellow"
184		use_preprocessing [style=filled, label="locl†|ccmp†|nukt†|akhn†", fillcolor="lightgreen"];
185		// Reoredering
186		rphfuse [label="rphf¹⁰", style=filled, fillcolor="lightcoral"];
187		prefuse [label="pref¹¹", style=filled, fillcolor="lightcoral"];
188		// Orthographic
189		orthographicuse [label="rkrf†|abvf†|blwf†|half†|pstf†|vatu†|cjct†", style="filled", fillcolor="lightblue"];
190		topographicaluse [label="isol|init|medi|fina", style="filled", fillcolor="lightgoldenrod"];
191		typographicaluse [label="abvs|blws|haln|pres|psts", style="filled", fillcolor="lightpink"];
192		reorder_use[label="Reordering", shape=ellipse,style=filled,fontname="Verdana"]
193		use_preprocessing -> rphfuse -> prefuse->orthographicuse ->reorder_use -> topographicaluse -> typographicaluse;
194			notes3 [fontname="Verdana",shape=plaintext,label=<<table border="0" cellborder="0" cellspacing="0">
195		<tr><td align="left">¹⁰ Outputs are reordered as category R</td></tr>
196		<tr><td align="left">¹¹ Outputs are reordered to before base</td></tr>
197		</table>
198		>];
199		typographicaluse -> notes3 [style=invis];
200	}
201
202}
203
204	indic_typographic->BUZZ:n;
205	typographicaluse->BUZZ:n;
206	khmerclig -> BUZZ:n;
207	myanmarother -> BUZZ:n;
208
209
210	decision2->hangulfeatures;
211	decision2->loclccmpindic;
212	decision2->khmerbasic;
213	decision2->loclccmpmyanmar;
214	decision2->use_preprocessing;
215	decision2->BUZZ [label="  Hebrew, Thai,\n  Lao, other"];
216
217notes [fontname="Verdana",shape=box,label=<<table border="0" cellborder="0" cellspacing="0">
218	<tr><td align="left">
219<b>Indic</b> scripts are: Bengali, Devanagari,
220 Gujarati, Gurmukhi, Kannada,
221 Malayalam, Oriya, Tamil,
222 Telugu
223</td></tr>
224
225	<tr><td align="left">
226<b>USE</b> scripts are:
227 Adlam, Ahom, Balinese, Batak, Bhaiksuki, Brahmi, Buginese,
228 Buhid, Chakma, Cham, Chorasmian, Dives Akuru, Dogra, Duployan,
229</td></tr>
230	<tr><td align="left">
231Egyptian hieroglyphs, Elymaic, Grantha, Gunjala Ggondi, Hanifi Rohingya,
232 Hanunoo, Javanese, Kaithi, Kayah li, Kharoshthi, Khojki,
233</td></tr>
234	<tr><td align="left">
235Khudawadi, Lepcha, Limbu, Mahajani, Makasar, Mandaic, Manichaean,
236 Marchen, Masaram Gondi, Medefaidrin, Meetei Mayek, Miao, Modi,
237</td></tr>
238	<tr><td align="left">
239Mongolian, Multani, Nandinagari, Newa, Nko, Nyiakeng Puachue Hmong,
240 Old Sogdian, Pahawh Hmong, Phags Pa, Psalter Pahlavi, Rejang,
241</td></tr>
242	<tr><td align="left">
243Saurashtra, Sharada, Siddham, Sinhala, Sogdian, Soyombo, Sundanese,
244 Syloti Nagri, Tagalog, Tagbanwa, Tai Le, Tai Tham, Tai Viet,
245</td></tr>
246	<tr><td align="left">
247Takri, Tibetan, Tifinagh, Tirhuta, Wancho, Zanabazar square,
248</td></tr>
249
250</table>>]
251
252
253	footnote[fontname="Verdana",label=<<table border="0" cellborder="0" cellspacing="0">
254		<tr><td align="left">† Feature is scoped to each syllable</td></tr>
255		<tr><td align="left">‡ All topographic features are scoped based on topographic position</td></tr>
256		</table>>];
257	notes3->footnote[style=invis];
258
259}
260