[Fontconfig] How to use FcFontMatch to find a font with a given character

Elias MÃ¥rtenson lokedhs at gmail.com
Fri Jun 29 10:12:40 UTC 2018


Hello,

I am currently implementing character replacement in McCLIM
<https://github.com/McCLIM/McCLIM> (if a character is missing from the
font, pick a different font that has the character).

I observe that FcFontMatch returns some unexpected values.

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.

When I use FcMatchPattern, the program returns DejaVuSans.ttf. If I use
FcMatchFont instead, it returns FreeMono.ttf.

The interesting thing is that none of these fonts actually contains U+0x63A
(checked by reading the "charset" value).

What is the correct way to perform this operation?

A second question: What is the actual difference between FcMatchPattern and
FcMatchFont? The documentation isn't very clear on that.

Regards,
Elias

The test program follows:

#include <fontconfig/fontconfig.h>
#include <stdio.h>
#include <stdlib.h>

void checkError(FcBool result) {
    if(!result) {
        fprintf(stderr, "error from fontconfig call\n");
        abort();
    }
}

int main(void)
{
    FcConfig *config = FcInitLoadConfigAndFonts();

    FcPattern *pattern = FcPatternCreate();

    FcCharSet *charset = FcCharSetCreate();
    checkError(FcCharSetAddChar(charset, 0x63a));
    checkError(FcPatternAddCharSet(pattern, "charset", charset));
    FcCharSetDestroy(charset);

    checkError(FcConfigSubstitute(config, pattern, FcMatchPattern));

    FcDefaultSubstitute(pattern);

    FcResult result;
    FcPattern *resultPattern = FcFontMatch(config, pattern, &result);
    if(result != FcResultMatch) {
        fprintf(stderr, "no fonts matched\n");
        return 1;
    }

    FcValue value;
    FcResult patternResult = FcPatternGet(resultPattern, "file", 0, &value);
    if(patternResult != FcResultMatch) {
        fprintf(stderr, "file value not found\n");
        return 1;
    }

    if(value.type != FcTypeString) {
        fprintf(stderr, "expected to find a string value\n");
        return 1;
    }

    printf("font file = %s\n", value.u.s);

    FcPatternDestroy(pattern);

    return 0;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/fontconfig/attachments/20180629/087c3af0/attachment.html>


More information about the Fontconfig mailing list