<div dir="ltr">Hello,<div><br></div><div>I am currently implementing character replacement in <a href="https://github.com/McCLIM/McCLIM">McCLIM</a> (if a character is missing from the font, pick a different font that has the character).</div><div><br></div><div>I observe that FcFontMatch returns some unexpected values.</div><div><br></div><div>The code is written in Lisp, but I wrote a simple C program that replicates the behaviour. The program simply attempts to find a font that contains the character U+063A.</div><div><br></div><div>When I use FcMatchPattern, the program returns DejaVuSans.ttf. If I use FcMatchFont instead, it returns FreeMono.ttf.</div><div><br></div><div>The interesting thing is that none of these fonts actually contains U+0x63A (checked by reading the "charset" value).</div><div><br></div><div>What is the correct way to perform this operation?</div><div><br></div><div>A second question: What is the actual difference between FcMatchPattern and FcMatchFont? The documentation isn't very clear on that.</div><div><br></div><div>Regards,</div><div>Elias</div><div><br></div><div><font face="monospace, monospace">The test program follows:</font></div><div><font face="monospace, monospace"><br></font></div><div><div><font face="monospace, monospace">#include <fontconfig/fontconfig.h></font></div><div><font face="monospace, monospace">#include <stdio.h></font></div><div><font face="monospace, monospace">#include <stdlib.h></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">void checkError(FcBool result) {</font></div><div><font face="monospace, monospace">    if(!result) {</font></div><div><font face="monospace, monospace">        fprintf(stderr, "error from fontconfig call\n");</font></div><div><font face="monospace, monospace">        abort();</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">int main(void)</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    FcConfig *config = FcInitLoadConfigAndFonts();</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    FcPattern *pattern = FcPatternCreate();</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    FcCharSet *charset = FcCharSetCreate();</font></div><div><font face="monospace, monospace">    checkError(FcCharSetAddChar(charset, 0x63a));</font></div><div><font face="monospace, monospace">    checkError(FcPatternAddCharSet(pattern, "charset", charset));</font></div><div><font face="monospace, monospace">    FcCharSetDestroy(charset);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    checkError(FcConfigSubstitute(config, pattern, FcMatchPattern));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    FcDefaultSubstitute(pattern);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    FcResult result;</font></div><div><font face="monospace, monospace">    FcPattern *resultPattern = FcFontMatch(config, pattern, &result);</font></div><div><font face="monospace, monospace">    if(result != FcResultMatch) {</font></div><div><font face="monospace, monospace">        fprintf(stderr, "no fonts matched\n");</font></div><div><font face="monospace, monospace">        return 1;</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    FcValue value;</font></div><div><font face="monospace, monospace">    FcResult patternResult = FcPatternGet(resultPattern, "file", 0, &value);</font></div><div><font face="monospace, monospace">    if(patternResult != FcResultMatch) {</font></div><div><font face="monospace, monospace">        fprintf(stderr, "file value not found\n");</font></div><div><font face="monospace, monospace">        return 1;</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if(value.type != FcTypeString) {</font></div><div><font face="monospace, monospace">        fprintf(stderr, "expected to find a string value\n");</font></div><div><font face="monospace, monospace">        return 1;</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    printf("font file = %s\n", value.u.s);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    FcPatternDestroy(pattern);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    return 0;</font></div><div><font face="monospace, monospace">}</font></div></div><div><br></div></div>