[Fontconfig] editing FcConfig in code

Idriss Fekir mcsm224 at gmail.com
Thu Apr 13 13:48:34 UTC 2023



On 4/13/23 07:33, Akira TAGOH wrote:
> Nevermind. you can simply drop the 3rd test then.
> 
>> Is there a way to match fonts by their PostScript name?
> 
> Yes. you can use "postscriptname" property.

Sorry, my question wasn't clear, what i meant is, is there a way in in 
the config file to say, "if given this string, match it to this psname, 
or this full_name", e.g: if given "Iosevka Extrabold Extended Oblique" 
match it to the font with psname:"Iosevka-Extrabold-Extended-Oblique".

>> My goal is, at application startup to check for fonts that aren't
>> matched properly, then remap then load the config, is there a general
>> solution?
> 
> That depends on the meaning of "not matched". speaking of the fallback
> font, that is exactly what fontconfig does. In case of your issue,
> that is the case-by-case. If there are any generally useful solutions,
> please let us know.
> 

What could be done in this particular case? that is,
`fc-match "Isoveka Extrabold Extended Oblique"` outputs
`Noto Sans Regular` instead of the correct font.

> On Thu, Apr 13, 2023 at 8:04 AM Idriss Fekir <mcsm224 at gmail.com> wrote:
>>
>>
>>
>> On 4/12/23 08:45, Akira TAGOH wrote:
>>> First of all, Please note that "Regular" style is default style
>>> though, most applications request *Regular weight* instead of style
>>> name. So the correct command to represent a request is `fc-match
>>> "Amber Whiskey:weight=regular".
>>> Based on that, let's see what happened.
>>>
>>> AmberWhiskey-Aged.otf has two family names. one is "Amber Whiskey" and
>>> one is "Amber Whiskey Aged". And, weight is set to 80 which is the
>>> same as FC_WEIGHT_REGULAR. So the behavior itself isn't wrong.
>>>
>>> Second, I don't recommend using the above config because that will
>>> break non-Regular selection. I didn't test but this may works instead:
>>>
>>> <match>
>>>     <test name="family">
>>>       <string>Amber Whiskey</string>
>>>     </test>
>>>     <test name="weight">
>>>       <const>regular</const>
>>>     </test>
>>>     <test qual="all" name="style" compare="eq">
>>>       <string></string>
>>>     </test>
>>>     <edit name="style">
>>>       <string>Regular</string>
>>>     </edit>
>>> </match>
>>>
>>> This will add Regular to style property only when weight is set to
>>> "regular" and no styles is set. you can still pick up the aged variant
>>> with "Amber Whiskey:style=Aged".
>>>
>>> If you don't want to see the aged variant as a part of "Amber
>>> Whiskey", things would be much simpler. you may have another
>>> workaround like this:
>>>
>>> <match target="scan">
>>>     <test name="family">
>>>       <string>Amber Whiskey</string>
>>>     </test>
>>>     <test name="family">
>>>       <string>Amber Whiskey Aged</string>
>>>     </test>
>>>     <edit name="family" mode="delete" />
>>> </match>
>>>
>>> This will modify the fontconfig cache. AmberWhiskey-Aged.otf is then
>>> represented as "Amber Whiskey Aged" only.
>>>
>>> For your original question, if there are any reasons you can't put
>>> something into a config file, you can use
>>> FcConfigParseAndLoadFromMemory() function as said in other mail.
>>> otherwise you can create your own config for a workaround and put it
>>> into $HOME/.config/fontconfig or something like that.
>>>
>>> Hope that helps,
>>>
>>> On Wed, Apr 12, 2023 at 9:12 AM Idriss Fekir <mcsm224 at gmail.com> wrote:
>>>>
>>>> Hi,
>>>>
>>>> Some fonts aren't matched by fontconfig correctly e.g: the Amber Whiskey
>>>> family has 4 faces Regular, Aged, Full Color, Shadow.
>>>> `fc-match "Amber Whiskey"` outputs "Aged" instead of "Regular", And
>>>> since Pango relies on fontconfig for that, it also exhibits the same
>>>> behavior (e.g: Inkscape an gimp, both rely on pango, would pick the
>>>> "Aged" variant). This could be worked around with a rule:
>>>>
>>>> ```
>>>> <match target="pattern">
>>>>        <test name="family">
>>>>            <string>Amber Whiskey</string>
>>>>        </test>
>>>>        <edit name="style">
>>>>            <string>Regular</string>
>>>>        </edit>
>>>> </match>
>>>> ```
>>>>
>>>> My question is how can i do that but in code (in C), that is
>>>> how can i check what fc-match would output, then if the output is wrong
>>>> add a rule like the following to the FcConfig?
>>>>
>>>> I'm open to suggestions if there are better ways.
>>>>
>>>> I did read the docs but i couldn't figure out how.
>>>>
>>>> The man page for FcFontMatch says that it should only be called after
>>>> FcConfigSubstitute and FcDefaultSubstitute have been called for
>>>> the pattern, i don't understand what that means exactly.
>>>>
>>>> Thanks a lot.
>>>
>>>
>>>
>> Thanks for your replies Jean and Akira.
>>
>> Akira, your first solution worked, but i don't understand what you meant
>> that my config breaks non-regular selection, all other variants are
>> matched correctly.
>>
>> Some faces of Iosevka (e.g Iosevka Fixed Extrabold Extended Oblique is
>> matched as NotoSans Italic) also have this problem but fc-match returns
>> the fallback font, so I'm not sure how to fix that .
>>
>> Is there a way to match fonts by their PostScript name?
>>
>> My goal is, at application startup to check for fonts that aren't
>> matched properly, then remap then load the config, is there a general
>> solution?
>>
>> Thanks
>> --
>> Idriss
> 
> 
> 

Another question, what does `FcConfigSubstituteWithPat` do, i couldn't 
understand from the man page.

Sorry for asking so many questions.

Thank.
-- 
Idriss


More information about the Fontconfig mailing list