<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Mangal;
        panose-1:2 4 5 3 5 2 3 3 2 2;}
@font-face
        {font-family:Latha;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:DengXian;
        panose-1:3 0 5 9 0 0 0 0 0 0;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
        {font-family:"\@DengXian";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Vijaya;
        panose-1:2 2 6 4 2 2 2 2 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;}
span.EmailStyle22
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">I agree, the font question does seem to be irrelevant. I was just responding to Cody’s comments. However, I’m still lost on getting the correct ligature back from the HarfBuzz shaping engine when I give it a simple Tamil word comprised
 of the Tamil characters ii, tta and u. According to Google, this word “<span lang="TA" style="font-family:"Latha",sans-serif">ஈடு</span>” translates to the verb “compensate.”<span lang="TA" style="font-family:"Latha",sans-serif">
</span>“<span lang="TA" style="font-family:"Latha",sans-serif">ஈடு</span>” is the two glyphs
<span lang="TA" style="font-family:"Latha",sans-serif">ஈ</span><span lang="TA"> </span>
and <span lang="TA" style="font-family:"Latha",sans-serif">டு</span><span lang="TA">
</span>, the latter of which is the ligature formed by the codepoints corresponding to the glyphs
<span lang="TA" style="font-family:"Latha",sans-serif">ட</span><span lang="TA"> </span>
and <span lang="TA" style="font-family:"Vijaya",serif">உ</span>.  <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">So is it a question of enabling the correct font features? Is there something beyond the basic examples that’s required to get the shaper to return the ligature for the tta and u consonant-vowel combination? Do I have a basic misunderstanding
 of what HarfBuzz does? <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Here’s a bit of the code I’m using. It’s derived from the example found in git here: tangrams/harfbuzz-example (<a href="https://github.com/tangrams/harfbuzz-example/tree/a267a0032aa429b2f86959a9f083c607c506bed7">https://github.com/tangrams/harfbuzz-example/tree/a267a0032aa429b2f86959a9f083c607c506bed7</a>).<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">In that last loop in FDHBShaper, I understand that the glyph id’s are NOT Unicode code points but are the id’s assigned in the font. What I’m getting back (the output) are the same id’s that correspond to my input. Should I be getting two
 glyph id’s back (<span lang="TA" style="font-family:"Latha",sans-serif">ஈ</span> and
<span lang="TA" style="font-family:"Latha",sans-serif">டு</span><span lang="TA"> </span>
) for the three I input ( <span lang="TA" style="font-family:"Latha",sans-serif">
ஈ</span>,<span lang="TA" style="font-family:"Latha",sans-serif"> ட</span><span lang="TA">
</span>and <span lang="TA" style="font-family:"Vijaya",serif">உ</span><span lang="TA">
</span>) to the shaper?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:gray">#pragma</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:gray">once</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:gray">#include</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">"hb.h"</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:gray">#include</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">"hb-ft.h"</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:gray">#include</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515"><vector></span><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">using</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">namespace</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> std;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">typedef</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">struct</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">unsigned</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">char</span><span style="font-size:9.5pt;font-family:Consolas;color:black">* buffer;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">unsigned</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> width;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">unsigned</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> height;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">float</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> bearing_x;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">float</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> bearing_y;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">}
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">Glyph</span><span style="font-size:9.5pt;font-family:Consolas;color:black">;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">typedef</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">struct</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       std::</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">string</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
 data;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       std::</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">string</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
 language;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_script_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> script;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_direction_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> direction;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">const</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">char</span><span style="font-size:9.5pt;font-family:Consolas;color:black">* c_data() {
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">return</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> data.c_str(); };<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">}
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">HBText</span><span style="font-size:9.5pt;font-family:Consolas;color:black">;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">namespace</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> HBFeature {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">const</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_tag_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> KernTag =
</span><span style="font-size:9.5pt;font-family:Consolas;color:#6F008A">HB_TAG</span><span style="font-size:9.5pt;font-family:Consolas;color:black">(</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'k'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">,
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'e'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">,
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'r'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">,
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'n'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">);
</span><span style="font-size:9.5pt;font-family:Consolas;color:green">// kerning operations</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">const</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_tag_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> LigaTag =
</span><span style="font-size:9.5pt;font-family:Consolas;color:#6F008A">HB_TAG</span><span style="font-size:9.5pt;font-family:Consolas;color:black">(</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'l'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">,
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'i'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">,
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'g'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">,
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'a'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">);
</span><span style="font-size:9.5pt;font-family:Consolas;color:green">// standard ligature substitution</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">const</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_tag_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> CligTag =
</span><span style="font-size:9.5pt;font-family:Consolas;color:#6F008A">HB_TAG</span><span style="font-size:9.5pt;font-family:Consolas;color:black">(</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'c'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">,
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'l'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">,
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'i'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">,
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'g'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">);
</span><span style="font-size:9.5pt;font-family:Consolas;color:green">// contextual ligature substitution</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">const</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_tag_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> PstsTag =
</span><span style="font-size:9.5pt;font-family:Consolas;color:#6F008A">HB_TAG</span><span style="font-size:9.5pt;font-family:Consolas;color:black">(</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'p'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">,
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'s'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">,
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'t'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">,
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">'s'</span><span style="font-size:9.5pt;font-family:Consolas;color:black">);
</span><span style="font-size:9.5pt;font-family:Consolas;color:green">// ? ligature substitution</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">static</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_feature_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> LigatureOff = { LigaTag, 0, 0, std::</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">numeric_limits</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">unsigned</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:9.5pt;font-family:Consolas;color:black">>::max() };<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">static</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_feature_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> LigatureOn = { LigaTag, 1, 0, std::</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">numeric_limits</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">unsigned</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:9.5pt;font-family:Consolas;color:black">>::max() };<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">static</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_feature_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> KerningOff = { KernTag, 0, 0, std::</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">numeric_limits</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">unsigned</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:9.5pt;font-family:Consolas;color:black">>::max() };<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">static</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_feature_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> KerningOn = { KernTag, 1, 0, std::</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">numeric_limits</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">unsigned</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:9.5pt;font-family:Consolas;color:black">>::max() };<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">static</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_feature_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> CligOff = { CligTag, 0, 0, std::</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">numeric_limits</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">unsigned</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:9.5pt;font-family:Consolas;color:black">>::max() };<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">static</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_feature_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> CligOn = { CligTag, 1, 0, std::</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">numeric_limits</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">unsigned</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:9.5pt;font-family:Consolas;color:black">>::max() };<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">static</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_feature_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> PstsOff = { PstsTag, 0, 0, std::</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">numeric_limits</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">unsigned</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:9.5pt;font-family:Consolas;color:black">>::max() };<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">static</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_feature_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> PstsOn = { PstsTag, 1, 0, std::</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">numeric_limits</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">unsigned</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:9.5pt;font-family:Consolas;color:black">>::max() };<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">}<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">class</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">FDHBShaper</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">{<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">public</span><span style="font-size:9.5pt;font-family:Consolas;color:black">:<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       FDHBShaper(</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">const</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">string</span><span style="font-size:9.5pt;font-family:Consolas;color:black">&
</span><span style="font-size:9.5pt;font-family:Consolas;color:gray">fontFile</span><span style="font-size:9.5pt;font-family:Consolas;color:black">);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">virtual</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> ~FDHBShaper();<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">void</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> init();<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">void</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> initText(</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">HBText</span><span style="font-size:9.5pt;font-family:Consolas;color:black">&
</span><span style="font-size:9.5pt;font-family:Consolas;color:gray">text</span><span style="font-size:9.5pt;font-family:Consolas;color:black">);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">void</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> addFeature(</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_feature_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:gray">feature</span><span style="font-size:9.5pt;font-family:Consolas;color:black">);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">private</span><span style="font-size:9.5pt;font-family:Consolas;color:black">:<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">FT_Library</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> lib;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">FT_Face</span><span style="font-size:9.5pt;font-family:Consolas;color:black">* face;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_font_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black">* font;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_buffer_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black">* buffer;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">vector</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_feature_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black">>
 features;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">};<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">FDHBShaper</span><span style="font-size:9.5pt;font-family:Consolas;color:black">::FDHBShaper(</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">const</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">string</span><span style="font-size:9.5pt;font-family:Consolas;color:black">&
</span><span style="font-size:9.5pt;font-family:Consolas;color:gray">fontFile</span><span style="font-size:9.5pt;font-family:Consolas;color:black">)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">{<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">FT_Error</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> error = FT_Init_FreeType(&lib);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:#6F008A">assert</span><span style="font-size:9.5pt;font-family:Consolas;color:black">(!error);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">float</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> size = 50;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       face =
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">new</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">FT_Face</span><span style="font-size:9.5pt;font-family:Consolas;color:black">;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       error = FT_New_Face(lib,
</span><span style="font-size:9.5pt;font-family:Consolas;color:gray">fontFile</span><span style="font-size:9.5pt;font-family:Consolas;color:black">.c_str(), 0, face);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:#6F008A">assert</span><span style="font-size:9.5pt;font-family:Consolas;color:black">(!error);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">}<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">FDHBShaper</span><span style="font-size:9.5pt;font-family:Consolas;color:black">::~FDHBShaper()<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">{<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       hb_buffer_destroy(buffer);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       hb_font_destroy(font);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       FT_Done_Face(*face);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">delete</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> face;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">}<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">void</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">FDHBShaper</span><span style="font-size:9.5pt;font-family:Consolas;color:black">::addFeature(</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_feature_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:gray">feature</span><span style="font-size:9.5pt;font-family:Consolas;color:black">)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">{<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       features.push_back(</span><span style="font-size:9.5pt;font-family:Consolas;color:gray">feature</span><span style="font-size:9.5pt;font-family:Consolas;color:black">);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">}<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">void</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">FDHBShaper</span><span style="font-size:9.5pt;font-family:Consolas;color:black">::init()<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">{<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       font = hb_ft_font_create(*face,
</span><span style="font-size:9.5pt;font-family:Consolas;color:#6F008A">NULL</span><span style="font-size:9.5pt;font-family:Consolas;color:black">);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       buffer = hb_buffer_create();<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       hb_buffer_allocation_successful(buffer);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">}<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">void</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">FDHBShaper</span><span style="font-size:9.5pt;font-family:Consolas;color:black">::initText(</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">HBText</span><span style="font-size:9.5pt;font-family:Consolas;color:black">&
</span><span style="font-size:9.5pt;font-family:Consolas;color:gray">text</span><span style="font-size:9.5pt;font-family:Consolas;color:black">)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">{<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       hb_buffer_reset(buffer);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       hb_buffer_set_direction(buffer,
</span><span style="font-size:9.5pt;font-family:Consolas;color:gray">text</span><span style="font-size:9.5pt;font-family:Consolas;color:black">.direction);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       hb_buffer_set_script(buffer,
</span><span style="font-size:9.5pt;font-family:Consolas;color:gray">text</span><span style="font-size:9.5pt;font-family:Consolas;color:black">.script);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       hb_buffer_set_language(buffer, hb_language_from_string(</span><span style="font-size:9.5pt;font-family:Consolas;color:gray">text</span><span style="font-size:9.5pt;font-family:Consolas;color:black">.language.c_str(),
</span><span style="font-size:9.5pt;font-family:Consolas;color:gray">text</span><span style="font-size:9.5pt;font-family:Consolas;color:black">.language.size()));<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">size_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> length =
</span><span style="font-size:9.5pt;font-family:Consolas;color:gray">text</span><span style="font-size:9.5pt;font-family:Consolas;color:black">.data.size();<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       hb_buffer_add_utf8(buffer,
</span><span style="font-size:9.5pt;font-family:Consolas;color:gray">text</span><span style="font-size:9.5pt;font-family:Consolas;color:black">.c_data(), length, 0, length);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       hb_shape(font, buffer, features.empty() ?
</span><span style="font-size:9.5pt;font-family:Consolas;color:#6F008A">NULL</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> : &features</span><span style="font-size:9.5pt;font-family:Consolas;color:teal">[</span><span style="font-size:9.5pt;font-family:Consolas;color:black">0</span><span style="font-size:9.5pt;font-family:Consolas;color:teal">]</span><span style="font-size:9.5pt;font-family:Consolas;color:black">,
 features.size());<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">unsigned</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> glyphCount;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_glyph_info_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> *glyphInfo = hb_buffer_get_glyph_infos(buffer, &glyphCount);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_glyph_position_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> *glyphPos = hb_buffer_get_glyph_positions(buffer, &glyphCount);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">for</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> (</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">unsigned</span><span style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> i = 0; i < glyphCount; ++i)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black">             
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">hb_codepoint_t</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> glyphid = glyphInfo[i].codepoint;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black">       }<o:p></o:p></span></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><b>From:</b> Behdad Esfahbod <behdad@behdad.org> <br>
<b>Sent:</b> April 11, 2019 8:58 AM<br>
<b>To:</b> Bobby de Vos <bobby_devos@sil.org><br>
<b>Cc:</b> Paul Daughetee <Daughetee@finaldraft.com>; Cody Planteen <planteen@gmail.com>; harfbuzz@lists.freedesktop.org<br>
<b>Subject:</b> Re: [HarfBuzz] Question on converting UTF-8 codepoints to complex glyphs<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">What you say seems irrelevant to me. Jonathan is correct.<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Thu, Apr 11, 2019, 11:34 AM Bobby de Vos <<a href="mailto:bobby_devos@sil.org">bobby_devos@sil.org</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<p>Paul,<o:p></o:p></p>
<p>You don't need to convert the Google Tamil font to OpenType, Google has already done that at<o:p></o:p></p>
<p><a href="https://github.com/googlei18n/noto-fonts/tree/master/phaseIII_only/unhinted/otf/NotoSansTamil" target="_blank">https://github.com/googlei18n/noto-fonts/tree/master/phaseIII_only/unhinted/otf/NotoSansTamil</a><o:p></o:p></p>
<p>However, I don't think those fonts will solve your issue. The list of shapers that you mention are different technologies to specify the complex shaping (such ligatures, positioning, sub forms, half foms, etc). Indeed, OpenType is one such technology. SIL
 Graphite and Apple Advanced Typography (AAT) are other technologies to do this.<o:p></o:p></p>
<p>TrueType fonts can contain OpenType shaping instructions. You do not have to have an OpenType font format to use OpenType shaping.<o:p></o:p></p>
<p>TrueType fonts have quadratic Bézier curves for their glyphs. Fonts in the OpenType font format can use the same quadratic Bézier curves, or cubic Bézier curves. The OTF files I mentioned above have cubic Bézier curves.<o:p></o:p></p>
<p><a href="https://en.wikipedia.org/wiki/B%C3%A9zier_curve#Fonts" target="_blank">https://en.wikipedia.org/wiki/B%C3%A9zier_curve#Fonts</a><o:p></o:p></p>
<p>If I have mis-understood your situation, and/or made any errors if what I wrote, I apologize.<o:p></o:p></p>
<p>Bobby<o:p></o:p></p>
<div>
<p class="MsoNormal">On 2019-04-10 3:25 p.m., Paul Daughetee wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Thanks for the quick response. I’m a licensed user of FontCreator Professional Edition from High-Logic and have the most recent update to version 11.5 installed.  The correct ligature
 is displayed when I type the tta and u Tamil characters into the test string edit box in the OpenType Designer dialog. In the box just below the test string the two characters are displayed unless I check either the _shaper or psts feature check box. If one
 of those is checked, then the correct ligature is displayed. So I guess Google did get the Tamil font right but I cannot seem to get HarfBuzz to return a single glyph id when presented with a buffer containing the tta and u Tamil characters. I’ve tried adding
 various features when calling hb_shape but that doesn’t seem to change anything.<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I noticed that when I list shapers using a call to hb_shape_list_shapers, the only shaper listed is “ot”. So I guess my next try will be to convert the Google Tamil true type font
 to an open type font and see if that makes any difference. If it does, I guess I’ll be having a “duh” moment.
<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><b>From:</b> Cody Planteen
<a href="mailto:planteen@gmail.com" target="_blank"><planteen@gmail.com></a> <br>
<b>Sent:</b> April 10, 2019 12:38 PM<br>
<b>To:</b> Paul Daughetee <a href="mailto:Daughetee@finaldraft.com" target="_blank">
<Daughetee@finaldraft.com></a><br>
<b>Cc:</b> <a href="mailto:harfbuzz@lists.freedesktop.org" target="_blank">harfbuzz@lists.freedesktop.org</a><br>
<b>Subject:</b> Re: [HarfBuzz] Question on converting UTF-8 codepoints to complex glyphs<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<div>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">It's possible your font isn't doing what you think it should be. You can test this theory with the tool High-Logic FontCreator for Windows. I believe there is a free evaluation.
 You can open up your font, then go to Font -> OpenType Designer. In this dialog, you can enter your test string and see what glyphs come out.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><a href="https://www.high-logic.com/font-editor/fontcreator" target="_blank">https://www.high-logic.com/font-editor/fontcreator</a><o:p></o:p></p>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">On Wed, Apr 10, 2019 at 1:19 PM Paul Daughetee <<a href="mailto:Daughetee@finaldraft.com" target="_blank">Daughetee@finaldraft.com</a>> wrote:<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Let me give you a little more info. I just recently built and installed vcpkg and used it to install HarfBuzz on Windows 10. It installed version 2.3.1-3 of the static libraries
 for Window x86. I linked my app to the HarfBuzz library and its dependencies. I added code to my app to capture single words that I could send to be processed by HarfBuzz as they were typed by the user. I installed Google’s NotoSansTamil true type font after
 verifying that it properly defined substitutions for the ligature that is formed by the Tamil consonant “tta” when paired with a vowel such as “u” or “I”. After processing a UTF-8 string containing the consonant and the vowel “tta” and “u” [0xE0, 0xAE, 0x9F,
 0xE0, 0xAE, 0x89], the hb_glyph_info_t object I get back has tow glyph indices, the same indices as the “tta” and “u” (17, 10) rather than the index for the “ttauvowelsign” (116) ligature I expected. My code is virtually identical to the examples found in
 the HarfBuzz wiki and to several examples found in git. Any help here would be greatly appreciated.<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><b>From:</b> Behdad Esfahbod <<a href="mailto:behdad@behdad.org" target="_blank">behdad@behdad.org</a>>
<br>
<b>Sent:</b> April 8, 2019 1:47 PM<br>
<b>To:</b> Paul Daughetee <<a href="mailto:Daughetee@finaldraft.com" target="_blank">Daughetee@finaldraft.com</a>><br>
<b>Cc:</b> <a href="mailto:harfbuzz@lists.freedesktop.org" target="_blank">harfbuzz@lists.freedesktop.org</a><br>
<b>Subject:</b> Re: [HarfBuzz] Question on converting UTF-8 codepoints to complex glyphs<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">On Mon, Apr 8, 2019 at 4:12 PM Paul Daughetee <<a href="mailto:Daughetee@finaldraft.com" target="_blank">Daughetee@finaldraft.com</a>> wrote:<o:p></o:p></p>
</div>
<div>
<blockquote style="border:none;border-left:solid windowtext 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt;border-color:currentcolor currentcolor currentcolor rgb(204,204,204)">
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I’m new to HarfBuzz and attempting to use it for converting a UTF-8 string that contains one or more sets of codepoints that should combine to form single complex glyphs to the
 correct string of glyphs. I’ve followed numerous examples and they all lead me to the point where I use hb_buffer_get_glyph_infos to get what I thought would be a hb_glyph_info object that contains the codepoints for the glyphs I seek. So my first question
 is as follows. Is that what I should be getting? I ask because I’m not getting what I would expect to get.<o:p></o:p></p>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Yes.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid windowtext 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt;border-color:currentcolor currentcolor currentcolor rgb(204,204,204)">
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I can’t even successfully get a complex glyph to represent the combination of the letter A and the grave accent. So if I’m just confused as to how or what HarfBuzz does, please
 help me find a better path. Thanks!<o:p></o:p></p>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">What do you get?  A + grave-accent only forms one glyph if the font was designed so.  It may very well be represented by two glyphs. <o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid windowtext 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt;border-color:currentcolor currentcolor currentcolor rgb(204,204,204)">
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">_______________________________________________<br>
HarfBuzz mailing list<br>
<a href="mailto:HarfBuzz@lists.freedesktop.org" target="_blank">HarfBuzz@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/harfbuzz" target="_blank">https://lists.freedesktop.org/mailman/listinfo/harfbuzz</a><o:p></o:p></p>
</blockquote>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><br clear="all">
<o:p></o:p></p>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">--
<o:p></o:p></p>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">behdad<br>
<a href="http://behdad.org/" target="_blank">http://behdad.org/</a><o:p></o:p></p>
</div>
</div>
</div>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">_______________________________________________<br>
HarfBuzz mailing list<br>
<a href="mailto:HarfBuzz@lists.freedesktop.org" target="_blank">HarfBuzz@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/harfbuzz" target="_blank">https://lists.freedesktop.org/mailman/listinfo/harfbuzz</a><o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<pre>_______________________________________________<o:p></o:p></pre>
<pre>HarfBuzz mailing list<o:p></o:p></pre>
<pre><a href="mailto:HarfBuzz@lists.freedesktop.org" target="_blank">HarfBuzz@lists.freedesktop.org</a><o:p></o:p></pre>
<pre><a href="https://lists.freedesktop.org/mailman/listinfo/harfbuzz" target="_blank">https://lists.freedesktop.org/mailman/listinfo/harfbuzz</a><o:p></o:p></pre>
</blockquote>
<div>
<p class="MsoNormal">-- <br>
Bobby de Vos<br>
<em><span style="font-family:"Calibri",sans-serif"><a href="mailto:bobby_devos@sil.org" target="_blank">bobby_devos@sil.org</a></span></em><o:p></o:p></p>
</div>
</div>
<p class="MsoNormal">_______________________________________________<br>
HarfBuzz mailing list<br>
<a href="mailto:HarfBuzz@lists.freedesktop.org" target="_blank">HarfBuzz@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/harfbuzz" target="_blank">https://lists.freedesktop.org/mailman/listinfo/harfbuzz</a><o:p></o:p></p>
</blockquote>
</div>
</div>
</body>
</html>