<div dir="ltr">On Wed, Mar 15, 2017 at 12:14 PM, Clerk Ma <span dir="ltr"><<a href="mailto:clerkma@gmail.com" target="_blank">clerkma@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I found that '_cairo_quartz_ucs4_to_index' in cairo-quartz-font.c was broken<br>
(ucs4 was cast to uint16_t/UniChar). A workable patch is here:<br>
<br>
static unsigned long<br>
_cairo_quartz_ucs4_to_index (void *abstract_font,<br>
                 uint32_t ucs4)<br>
{<br>
    cairo_quartz_scaled_font_t *font = (cairo_quartz_scaled_font_t*)<br>
abstract_font;<br>
    cairo_quartz_font_face_t *ffont = _cairo_quartz_scaled_to_face(f<wbr>ont);<br>
    CGGlyph glyph[2];<br>
    UniChar utf16[2];<br>
<br>
    size_t len = CFStringGetSurrogatePairForLon<wbr>gCharacter (ucs4, utf16) ? 2 : 1;<br>
    CGFontGetGlyphsForUnicharsPtr (ffont->cgFont, utf16, glyph, len);<br>
<br>
    return glyph[0];<br>
}<br></blockquote><div><br>The lack of documentation on CGFontGetGlyphsForUnichars() (and its older implementation 
CGFontGetGlyphsForUnicodes()) left me wondering if it is actually able to handle surrogate pairs or not.<br>I wrote a test (attached) that confirms they both work as expected  :D<br>Even on 10.4 you can get the glyphs for surrogate pairs using 
CGFontGetGlyphsForUnicodes()<br><br><div>Unfortunately CFStringGetSurrogatePairForLon<wbr>gCharacter() is only available since 10.6.<br>Luckily it is easy to refactor the UCS4 to UTF16 conversion from cairo-unicode.c into a separate function and reuse it :)<br></div><br><div>I published a branch that should fix this at <a href="https://cgit.freedesktop.org/~ranma42/cairo/log/?h=quartz-ucs4-to-utf16">https://cgit.freedesktop.org/~ranma42/cairo/log/?h=quartz-ucs4-to-utf16</a><br></div><div>Can you confirm it fixes the issue?<br></div><div><br></div><div>A better fix would probably involve CTFontGetGlyphsForCharacters()<wbr>,
but that is probably best suited for the (much desired, but not really a
 high priority in my todo-list) CoreText-based font backend.<br><br>Andrea</div></div></div></div></div>