diff mupdf-source/thirdparty/harfbuzz/docs/features.dot @ 3:2c135c81b16c

MERGE: upstream PyMuPDF 1.26.4 with MuPDF 1.26.7
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:44:09 +0200
parents b50eed0cc0ef
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mupdf-source/thirdparty/harfbuzz/docs/features.dot	Mon Sep 15 11:44:09 2025 +0200
@@ -0,0 +1,259 @@
+digraph {
+  graph [outputorder=edgefirst];
+	node [shape="record", fontname="Noto Sans Mono SemiBold", fontsize=15];
+	edge [fontname="Verdana", fontsize=12,labeldistance=7.5 ];
+	fontname="Verdana";
+  ranksep=0.02; nodesep=0.5;
+
+subgraph {
+	ranksep="0.02 equally";
+	preprocessing[style=filled,fillcolor="lightgreen",fontname="Verdana",label="Glyph pre-processing"];
+	orthographic[style=filled,fillcolor="lightblue",fontname="Verdana",label="Orthographic Unit Shaping"];
+	reordering[style=filled, fillcolor="lightcoral",fontname="Verdana",label="Reordering group (USE)"];
+	topographic[style=filled,fillcolor="lightgoldenrod",fontname="Verdana",label="Topographical Features‡"];
+	typographic[style=filled,fillcolor="lightpink",fontname="Verdana",label="Typographic Presentation"];
+	positioning[style=filled,fillcolor="lightsalmon",fontname="Verdana",label="Positioning"];
+	preprocessing->reordering->orthographic->topographic->typographic->positioning;
+}
+
+	decision1 [shape="diamond", label="Script\ndirection?",fontname="Verdana"];
+	rvrn->decision1;
+
+	ltrfeatures [label="{ltra|ltrm}", fillcolor="lightgreen",style="filled"];
+	{
+	rtlfeatures [label="{rtla|rtlm¹}", fillcolor="lightgreen",style="filled"];
+	}
+	{
+		rank=same;
+		fracfeatures [label="frac²|numr³|dnom⁴", fillcolor="lightpink",style="filled"];
+		fracnotes [fontname="Verdana",shape=plaintext,label=<<table border="0" cellborder="0" cellspacing="0">
+			<tr><td align="left">¹ rtlm is scoped to characters with a Unicode mirroring property</td></tr>
+			<tr><td align="left">² frac is scoped to numr + the slash + dnom</td></tr>
+			<tr><td align="left">³ numr is scoped to all decimal numbers before a U+2044 FRACTION SLASH.</td></tr>
+			<tr><td align="left">⁴ dnom is scoped to all decimal numbers after a U+2044 FRACTION SLASH.</td></tr>
+	</table>
+		>];
+
+	}
+	rand [fillcolor="lightpink",style="filled"];
+
+	decision1 -> ltrfeatures [label="Left-to-right"];
+	decision1 -> rtlfeatures [label="Right-to-left"];
+
+	decision1 -> fracfeatures [label="Other"];
+
+	ltrfeatures -> fracfeatures;
+	rtlfeatures -> fracfeatures;
+	fracfeatures->rand;
+
+	decision2 [shape="diamond", label="Script?",fontname="Verdana"];
+
+{rank=same; HARF [label="{Harf|HARF}"]; notes;}
+	rand -> trak -> HARF -> decision2;
+
+	commonfeatures [shape=none,label=<<table border="0" cellspacing="0">
+                    <tr>
+                    	<td border="1" bgcolor="lightsalmon">abvm</td>
+                    	<td border="1" bgcolor="lightsalmon">blwm</td>
+                    	<td border="1" bgcolor="lightgreen">ccmp</td>
+                    	<td border="1" bgcolor="lightgreen">locl</td>
+                    	<td border="1" bgcolor="lightsalmon">mark</td>
+                    	<td border="1" bgcolor="lightsalmon">mkmk</td>
+                    	<td border="1" bgcolor="lightpink">rlig</td>
+                    </tr>
+                </table>>
+    ];
+
+	decision3 [shape="diamond", label="Script\ndirection?",fontname="Verdana"];
+
+	BUZZ  [label="{Buzz|BUZZ}"];
+	BUZZ -> commonfeatures -> decision3;
+
+	horizontalfeatures [
+	shape=none,label=<<table border="0" cellspacing="0">
+                    <tr><td border="1" bgcolor="lightpink">calt <font face="Verdana">(not Hangul)</font></td></tr>
+                    <tr><td border="1" bgcolor="lightpink">clig <font face="Verdana">(not Khmer)</font></td></tr>
+                    <tr><td border="1" bgcolor="lightsalmon">curs</td></tr>
+                    <tr><td border="1" bgcolor="lightsalmon">dist</td></tr>
+                    <tr><td border="1" bgcolor="lightsalmon">kern</td></tr>
+                    <tr><td border="1" bgcolor="lightpink">liga <font face="Verdana">(not Khmer)</font></td></tr>
+                    <tr><td border="1" bgcolor="lightpink">rclt</td></tr>
+                </table>>
+                ];
+	vert [label="vert",style=filled,fillcolor="lightpink"];
+
+	decision3 -> horizontalfeatures [label="Horizontal"];
+	decision3 -> vert [label="Vertical"];
+
+	discretionary [label="User-selected\ndiscretionary\nfeatures",fontname="Verdana"];
+
+	horizontalfeatures -> discretionary;
+	vert -> discretionary;
+
+	decision2->stch;
+
+	BUZZ;
+
+subgraph shapers {
+	subgraph cluster_arabic {
+		bgcolor="lightyellow"
+		label="Arabic, Syriac";
+	stch [ style="filled", fillcolor="lightgreen",label="stch"];
+	ccmplocl [ style="filled", label="ccmp|locl", fillcolor="lightgreen"];
+	arabicfeatures [label="isol|fina|fin2|fin3|medi|med2|init", style="filled", fillcolor="lightgoldenrod"];
+	arabicfeatures2 [label="rclt|calt", style="filled",fillcolor="lightpink"];
+rlig[style="filled",fillcolor="lightpink"];
+mset [fillcolor="lightpink",style="filled"]
+	stch->ccmplocl->arabicfeatures->rlig->arabicfeatures2->mset;
+	}
+	mset->BUZZ:n;
+
+	subgraph cluster_hangul {
+		bgcolor="lightyellow"
+		label="Hangul";
+		hangulfeatures [label="ljmo|vjmo|tjmo", style="filled",fillcolor="lightgoldenrod"]
+	}
+	  hangulfeatures->BUZZ:n;
+
+	subgraph cluster_indic {
+		label="Indic";
+		bgcolor="lightyellow"
+		// Preprocessing
+		loclccmpindic [label="locl†|ccmp†",style=filled,fillcolor="lightgreen"];
+		node[style=filled,fillcolor="lightgreen"];
+		nukt [label="nukt†"];
+		akhn [label="akhn†"];
+		loclccmpindic->indic_reorder_1->nukt->akhn;
+		indic_reorder_1[label="Initial reordering", fontname="Verdana",fillcolor="lightgrey",shape=ellipse,style=filled]
+
+		// Orthographic
+		node[style=filled,fillcolor="lightblue"]
+		rphf [label="rphf⁵"];
+		rkpf [label="rkpf†"];
+		pref [label="pref⁶"];
+		blwf [label="blwf⁷"];
+		abvf [label="abvf⁸"];
+		half [label="half⁹"];
+		pstf [label="pstf⁸"];
+		vatu [label="vatu†"];
+		cjct [label="cjct†"];
+		akhn ->rphf -> rkpf -> pref -> blwf -> abvf -> half -> pstf -> vatu -> cjct;
+		// Typographic presentation
+		indic_typographic[style=filled,fillcolor="lightpink",label="init|pres|abvs|blws|psts|haln"]
+		indic_reorder_2[label="Final reordering",fillcolor="lightgrey",fontname="Verdana", shape=ellipse,style=filled]
+		cjct->indic_reorder_2->indic_typographic;
+
+	notes2 [fontname="Verdana",shape=plaintext,style="",label=<<table border="0" cellborder="0" cellspacing="0">
+<tr><td align="right">⁵ rphf is scoped to pre-base ra+halant sequences</td></tr>
+<tr><td align="right">⁶ pref is scoped to the two glyphs after the base; outputs are reordered</td></tr>
+<tr><td align="right">⁷ blwf is usually scoped to the whole syllable, except in Telugu and Kannada where it is post-base</td></tr>
+<tr><td align="right">⁸ abvf and pstf are scoped to post-base</td></tr>
+<tr><td align="right">⁹ half is scoped to pre-base</td></tr>
+</table>
+>];
+		indic_typographic -> notes2 [style=invis];
+	}
+
+
+	subgraph cluster_khmer {
+		label="Khmer";
+		bgcolor="lightyellow"
+
+		khmerbasic [style=filled,fillcolor="lightgreen",label="locl†|ccmp†|pref†|bwlf†|abvf†|pstf†|cfar†"]
+		khmerother [style=filled,fillcolor="lightpink",label="pres|abvs|blws|psts"]
+		khmerbasic -> khmerother -> khmerclig;
+				khmerclig [label="clig",style=filled,fillcolor="lightpink"];
+	}
+
+	subgraph cluster_myanmar {
+		label="Myanmar";
+		bgcolor="lightyellow"
+		loclccmpmyanmar [label="locl†|ccmp†",style=filled,fillcolor="lightgreen"];
+		rphfmymr [label="rphf†",style=filled,fillcolor="lightblue"]
+		prefmymr [label="pref†",style=filled,fillcolor="lightblue"]
+		blwfmymr [label="blwf†",style=filled,fillcolor="lightblue"]
+		pstfmymr [label="pstf†",style=filled,fillcolor="lightblue"]
+		myanmarother [label="pres|abvs|blws|psts",style=filled,fillcolor="lightpink"];
+		reorder_myanmar[label="Reordering", shape=ellipse,style=filled,fontname="Verdana"]
+		loclccmpmyanmar -> reorder_myanmar-> rphfmymr -> prefmymr -> blwfmymr -> pstfmymr -> myanmarother;
+	}
+
+	subgraph cluster_use {
+		label="Universal Shaping Engine"
+		bgcolor="lightyellow"
+		use_preprocessing [style=filled, label="locl†|ccmp†|nukt†|akhn†", fillcolor="lightgreen"];
+		// Reoredering
+		rphfuse [label="rphf¹⁰", style=filled, fillcolor="lightcoral"];
+		prefuse [label="pref¹¹", style=filled, fillcolor="lightcoral"];
+		// Orthographic
+		orthographicuse [label="rkrf†|abvf†|blwf†|half†|pstf†|vatu†|cjct†", style="filled", fillcolor="lightblue"];
+		topographicaluse [label="isol|init|medi|fina", style="filled", fillcolor="lightgoldenrod"];
+		typographicaluse [label="abvs|blws|haln|pres|psts", style="filled", fillcolor="lightpink"];
+		reorder_use[label="Reordering", shape=ellipse,style=filled,fontname="Verdana"]
+		use_preprocessing -> rphfuse -> prefuse->orthographicuse ->reorder_use -> topographicaluse -> typographicaluse;
+			notes3 [fontname="Verdana",shape=plaintext,label=<<table border="0" cellborder="0" cellspacing="0">
+		<tr><td align="left">¹⁰ Outputs are reordered as category R</td></tr>
+		<tr><td align="left">¹¹ Outputs are reordered to before base</td></tr>
+		</table>
+		>];
+		typographicaluse -> notes3 [style=invis];
+	}
+
+}
+
+	indic_typographic->BUZZ:n;
+	typographicaluse->BUZZ:n;
+	khmerclig -> BUZZ:n;
+	myanmarother -> BUZZ:n;
+
+
+	decision2->hangulfeatures;
+	decision2->loclccmpindic;
+	decision2->khmerbasic;
+	decision2->loclccmpmyanmar;
+	decision2->use_preprocessing;
+	decision2->BUZZ [label="  Hebrew, Thai,\n  Lao, other"];
+
+notes [fontname="Verdana",shape=box,label=<<table border="0" cellborder="0" cellspacing="0">
+	<tr><td align="left">
+<b>Indic</b> scripts are: Bengali, Devanagari,
+ Gujarati, Gurmukhi, Kannada,
+ Malayalam, Oriya, Tamil,
+ Telugu
+</td></tr>
+
+	<tr><td align="left">
+<b>USE</b> scripts are:
+ Adlam, Ahom, Balinese, Batak, Bhaiksuki, Brahmi, Buginese,
+ Buhid, Chakma, Cham, Chorasmian, Dives Akuru, Dogra, Duployan,
+</td></tr>
+	<tr><td align="left">
+Egyptian hieroglyphs, Elymaic, Grantha, Gunjala Ggondi, Hanifi Rohingya,
+ Hanunoo, Javanese, Kaithi, Kayah li, Kharoshthi, Khojki,
+</td></tr>
+	<tr><td align="left">
+Khudawadi, Lepcha, Limbu, Mahajani, Makasar, Mandaic, Manichaean,
+ Marchen, Masaram Gondi, Medefaidrin, Meetei Mayek, Miao, Modi,
+</td></tr>
+	<tr><td align="left">
+Mongolian, Multani, Nandinagari, Newa, Nko, Nyiakeng Puachue Hmong,
+ Old Sogdian, Pahawh Hmong, Phags Pa, Psalter Pahlavi, Rejang,
+</td></tr>
+	<tr><td align="left">
+Saurashtra, Sharada, Siddham, Sinhala, Sogdian, Soyombo, Sundanese,
+ Syloti Nagri, Tagalog, Tagbanwa, Tai Le, Tai Tham, Tai Viet,
+</td></tr>
+	<tr><td align="left">
+Takri, Tibetan, Tifinagh, Tirhuta, Wancho, Zanabazar square,
+</td></tr>
+
+</table>>]
+
+
+	footnote[fontname="Verdana",label=<<table border="0" cellborder="0" cellspacing="0">
+		<tr><td align="left">† Feature is scoped to each syllable</td></tr>
+		<tr><td align="left">‡ All topographic features are scoped based on topographic position</td></tr>
+		</table>>];
+	notes3->footnote[style=invis];
+
+}