<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 1 July 2018 at 10:30, Lawrence D'Oliveiro <span dir="ltr"><<a href="mailto:ldo@geek-central.gen.nz" target="_blank">ldo@geek-central.gen.nz</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">On Sun, 1 Jul 2018 00:41:01 +0800, Elias Mårtenson wrote:<br>
<br>
</span>> Bug in Fontconfig?<br>
<br>
Check your version of Fontconfig:<br>
<br>
    ldo@theon:python_fontconfig> python3 -ic "import fontconfig"<br>
    >>> fontconfig.get_version()<br>
    21300<br>
<br>
I previously reported what I thought was a problem, only to discover<br>
that it had already been fixed.</blockquote><div><br></div><div>When I was younger I occasionally made fun of people that rush to blame their</div><div>tools rather than their own code. It's time for be to accept some of that ridicule</div><div>myself.</div><div><br></div><div>I had made an error in my code, causing it to escape the loop early and only ever</div><div>checking the first page returned from FcCharSet*Page(). After fixing that,</div><div>I now confirm that of course there is no bug in Fontconfig.</div><div><br></div><div>That said, I did find a bug in the documentation. The manual for FcCharSetFirstPage:</div><div><a href="https://www.freedesktop.org/software/fontconfig/fontconfig-devel/fccharsetfirstpage.html">https://www.freedesktop.org/software/fontconfig/fontconfig-devel/fccharsetfirstpage.html</a><br></div><div><br></div><div>The documentation states:<br></div><div><p style="color:rgb(0,0,0);font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><i>""""""""</i></p><p style="color:rgb(0,0,0);font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><i>Builds an array of bits in <tt class="gmail-PARAMETER">map</tt> marking the first page of Unicode coverage of <tt class="gmail-PARAMETER">a</tt>. <tt class="gmail-PARAMETER">*next</tt> is set to contains the base code point for the next page in <tt class="gmail-PARAMETER">a</tt>. Returns the base code point for the page, or <code class="gmail-CONSTANT">FC_CHARSET_DONE</code> if <tt class="gmail-PARAMETER">a</tt> contains no pages. As an example, if <tt class="gmail-FUNCTION">FcCharSetFirstPage</tt> returns <tt class="gmail-LITERAL">0x300</tt> and fills <tt class="gmail-PARAMETER">map</tt> with</i></p><table border="0" bgcolor="#E0E0E0" width="100%" style="color:rgb(0,0,0);font-family:"Times New Roman";text-decoration-style:initial;text-decoration-color:initial"><tbody><tr><td><pre class="gmail-LITERALLAYOUT">0xffffffff 0xffffffff 0x01000008 0x44300002 0xffffd7f0 0xfffffffb 0xffff7fff 0xffff0003</pre></td></tr></tbody></table><i><span style="color:rgb(0,0,0);font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Then the page contains code points<span> </span></span><tt class="gmail-LITERAL" style="color:rgb(0,0,0);background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">0x300</tt><span style="color:rgb(0,0,0);font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span> </span>through<span> </span></span><tt class="gmail-LITERAL" style="color:rgb(0,0,0);background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">0x33f</tt><span style="color:rgb(0,0,0);font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span> </span>(the first 64 code points on the page) because<span> </span></span><tt class="gmail-PARAMETER" style="color:rgb(0,0,0);background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">map[0]</tt><span style="color:rgb(0,0,0);font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span> </span>and<span> </span></span><tt class="gmail-PARAMETER" style="color:rgb(0,0,0);background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">map[1]</tt><span style="color:rgb(0,0,0);font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span> </span>both have all their bits set. It also contains code points<span> </span></span><tt class="gmail-LITERAL" style="color:rgb(0,0,0);background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">0x343</tt><span style="color:rgb(0,0,0);font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span> </span>(</span><tt class="gmail-PARAMETER" style="color:rgb(0,0,0);background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">0x300 + 32*2 + (4-1)</tt><span style="color:rgb(0,0,0);font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">) and<span> </span></span><tt class="gmail-LITERAL" style="color:rgb(0,0,0);background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">0x35e</tt><span style="color:rgb(0,0,0);font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span> </span>(</span><tt class="gmail-PARAMETER" style="color:rgb(0,0,0);background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">0x300 + 32*2 + (31-1)</tt><span style="font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><font color="#000000">) </font><b><font color="#ff0000">because </font></b></span><tt class="gmail-PARAMETER" style="background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><b><font color="#ff0000">map[2]</font></b></tt><span style="font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><b><font color="#ff0000"> has the 4th and 31st bits set.</font></b><font color="#000000"> The code points represented by</font><span style="color:rgb(0,0,0)"> </span></span><tt class="gmail-LITERAL" style="color:rgb(0,0,0);background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">map[3]</tt><span style="color:rgb(0,0,0);font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"> and later are left as an excercise for the reader ;).</span></i><br></div><div><i><span style="color:rgb(0,0,0);font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br></span></i></div><div><i><span style="color:rgb(0,0,0);font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">""""""""</span></i></div><div><i><span style="color:rgb(0,0,0);font-family:"Times New Roman";background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br></span></i></div><div><span style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">The highlighted quote: <i>"<b>because map[2] has the 4th and 31st bits set</b>"</i> is wrong. map[2] has the value 0x01000008 which doesn't have the 31'st bit set.</span><br></div><div><span style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br></span></div><div><span style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Regards,</span></div><div><span style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Elias</span></div></div></div></div>