<div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Hi, </div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Recently I started working on a text input field for openGL that uses freetype</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">for rasterising and harfbuzz for shaping. Currently I'm trying to figure out how </div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">to find the position of the caret based on the current graphmeme and how string</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">manipulation is supposed to work in relation to a textfield and graphmemes/glyphs. </div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><b>Caret position</b></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">In my previous post on this list someone pointed me to this url which describes </div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">something similar. For clarity I'll add the link here:</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style><font face="arial, helvetica, sans-serif">        <a href="https://codereview.chromium.org/130433006#msg8">https://codereview.chromium.org/130433006#msg8</a></font><br></div><div class="gmail_default" style><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style><font face="arial, helvetica, sans-serif">If I'm correct, the `cluster` member of the `hb_glyph_info_t` struct tells me </font></div><div class="gmail_default" style><font face="arial, helvetica, sans-serif">the bytes offset where the glyph starts, or at least that's my understanding. For </font></div><div class="gmail_default" style><font face="arial, helvetica, sans-serif">example when I have the following string, looping over the found glyph infos gives me:</font></div><div class="gmail_default" style><font face="arial, helvetica, sans-serif"><br></font></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default" style><font face="monospace, monospace"><b>String:</b> 綧緁緅 襏襆贂 峷敊浭</font></div></blockquote><div class="gmail_default" style><font face="arial, helvetica, sans-serif"><br></font></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default" style><div class="gmail_default"><font face="monospace, monospace">HB: 00: codepoint: 7b11 cluster: 00, advance_x: 48, numbytes: 29</font></div></div><div class="gmail_default" style><div class="gmail_default"><font face="monospace, monospace">HB: 01: codepoint: 7b49 cluster: 03, advance_x: 48, numbytes: 29</font></div></div><div class="gmail_default" style><div class="gmail_default"><font face="monospace, monospace">HB: 02: codepoint: 7b54 cluster: 06, advance_x: 48, numbytes: 29</font></div></div><div class="gmail_default" style><div class="gmail_default"><font face="monospace, monospace">HB: 03: codepoint: 0001 cluster: 09, advance_x: 10, numbytes: 29</font></div></div><div class="gmail_default" style><div class="gmail_default"><font face="monospace, monospace">HB: 04: codepoint: 924a cluster: 10, advance_x: 48, numbytes: 29</font></div></div><div class="gmail_default" style><div class="gmail_default"><font face="monospace, monospace">HB: 05: codepoint: 923c cluster: 13, advance_x: 48, numbytes: 29</font></div></div><div class="gmail_default" style><div class="gmail_default"><font face="monospace, monospace">HB: 06: codepoint: 98db cluster: 16, advance_x: 48, numbytes: 29</font></div></div><div class="gmail_default" style><div class="gmail_default"><font face="monospace, monospace">HB: 07: codepoint: 0001 cluster: 19, advance_x: 10, numbytes: 29</font></div></div><div class="gmail_default" style><div class="gmail_default"><font face="monospace, monospace">HB: 08: codepoint: 40cc cluster: 20, advance_x: 48, numbytes: 29</font></div></div><div class="gmail_default" style><div class="gmail_default"><font face="monospace, monospace">HB: 09: codepoint: 4f6d cluster: 23, advance_x: 48, numbytes: 29</font></div></div><div class="gmail_default" style><div class="gmail_default"><font face="monospace, monospace">HB: 10: codepoint: 5d63 cluster: 26, advance_x: 48, numbytes: 29</font></div></div></blockquote><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">When I iterate over the same string using ICU, with the code pasted in the link below, I get:</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace">Boundary at position: 0</font></div></div><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace">Boundary at position: 1</font></div></div><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace">Boundary at position: 2</font></div></div><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace">Boundary at position: 3</font></div></div><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace">Boundary at position: 4</font></div></div><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace">Boundary at position: 5</font></div></div><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace">Boundary at position: 6</font></div></div><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace">Boundary at position: 7</font></div></div><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace">Boundary at position: 8</font></div></div><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace">Boundary at position: 9</font></div></div><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace">Boundary at position: 10</font></div></div><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace">Boundary at position: 11</font></div><div class="gmail_default"><font face="monospace, monospace"><br></font></div><div class="gmail_default"><span style="font-family:arial,helvetica,sans-serif"><a href="https://gist.github.com/roxlu/7d73f8928e7e8489ae65">https://gist.github.com/roxlu/7d73f8928e7e8489ae65</a></span><font face="monospace, monospace"><br></font></div></div></blockquote><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">This seems to be a 1:1 match, but my biggest question is how I can map the ICU boundaries</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">to the correct HB-buffer/clusters? </div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><b>String manipulation:</b></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">When I want the user to manipulate the text inside the input field, with e.g. delete </div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">and backspace keys, should I manipulate the graphmemes? or the UTF-8 codepoints?</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">or maybe something else? </div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Thanks</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">d</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"> </div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div></div>