[Fontconfig] editing FcConfig in code

Idriss Fekir mcsm224 at gmail.com
Fri Apr 14 17:35:09 UTC 2023


On 4/14/23 15:55, Akira TAGOH wrote:
> Oops, correctly "fullname". No space.
> 
> 2023年4月14日(金) 23:53 Akira TAGOH <akira at tagoh.org 
> <mailto:akira at tagoh.org>>:
> 
> 
> 
>     2023年4月14日(金) 23:11 Idriss Fekir <mcsm224 at gmail.com
>     <mailto:mcsm224 at gmail.com>>:
> 
> 
> 
>         On 4/14/23 12:16, Akira TAGOH wrote:
>          > On Thu, Apr 13, 2023 at 10:48 PM Idriss Fekir
>         <mcsm224 at gmail.com <mailto:mcsm224 at gmail.com>> wrote:
>          >> 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".
>          >
>          > No. we could guess a postscript name from family and/or
>         fullname but
>          > it is't perfect because they are stored as independent
>         metadata. they
>          > are free to set regardless of regularity.
>          >
>          > So you need to do compare "family" and "postscriptname"
>         separately.
>          >
>          >>>> 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.
>          >
>          > You want to substitute it with Noto Sans no matter what they
>         exist and
>          > change the weight and the slant too?
> 
>         No, i just want for the font to match correctly,
>         `fc-match "Isoveka Extrabold Extended Oblique"` should output
>         `iosevka-extrabold.ttc: "Iosevka" "Extrabold Extended Oblique"`
>         but it doesn't output that. It outputs `NotoSans-Regular.ttf: "Noto
>         Sans" "Regular"`, which is wrong since i do have that Iosevka font
>         installed.
> 
> 
>     Ah, got it. You set the wrong query string then. What you want to
>     would be:
> 
>     $ fc-match ":full name=Isoveka Extrabold Extended Oblique"
> 
>     Or
> 
>     $ fc-match "Isoveka:style=Extrabold Extended Oblique"

Unfortunately none of these work correctly, they both output 
`NotoSans-Regular.ttf: "Noto Sans" "Regular"` (the exact same output as 
`fc-match "Isoveka Extrabold Extended Oblique"`).

>     Though I'm not sure what the real issue was then. I presume that you
>     wanted to reproduce your issue on some application with fc-match?

Yes, i'm working on GIMP (it relies on pango) and since current pango 
doesn't support querying through psname i'm using fullname instead, 
which works in some cases but in this case doesn't (in general if 
fc-match outputs the correct font when given the fullname it will work 
on pango).

> 
>         The only way i'm getting the correct font is with
>         `fc-match ":postscriptname=Iosevka-Extrabold-Extended-Oblique"`
>         i just want the output of:
>         `fc-match "Isoveka Extrabold Extended Oblique"`
>         to be identical to the output of:
>         `fc-match ":postscriptname=Iosevka-Extrabold-Extended-Oblique"`
>         (because matching like this with the psname outputs the correct
>         font)
> 
>         Really sorry that my previous question wasn't clear enough.
> 
>          > I didn't test but this may *theoretically* works:
>          >
>          > <match>
>          >    <test name="fullname">
>          >      <string>Isoveka Extrabold Extended Oblique</string>
>          >    </test>
>          >    <edit name="family" mode="prepend">
>          >      <string>Noto Sans</string>
>          >    </edit>
>          >    <edit name="weight" mode="prepend">
>          >      <const>regular</const>
>          >    </edit>
>          >    <edit name="slant" mode="prepend">
>          >      <const>roman</const>
>          >    </edit>
>          > </match>
>          >
>          > This assumes that applications request a font with fullname.
>         you may
>          > need to replace it with "family", and "style" or "weight" and
>         "slant"
>          > in some case.
>          > If you want to fallback only when they aren't available, that
>         may be
>          > much more complicated.
>          >
>          >> Another question, what does `FcConfigSubstituteWithPat` do,
>         i couldn't
>          >> understand from the man page.
>          >
>          > Well, there are three matching patterns in fontconfig. "pattern",
>          > "font", and "scan". These patterns are performed only when
>         "kind" is
>          > the same. however, if you call FcConfigSubstituteWithPat(config,
>          > pfont, ppat, FcMatchFont) then, you can get both "pattern" in
>         ppat and
>          > "font" in pfont FcPatterns. see FcFontRenderPrepare() for more
>          > details.
>          >
>          >>
>          >> Sorry for asking so many questions.
>          >>
>          >> Thank.
>          >> --
>          >> Idriss
>          >
>          >
>          >
> 
>         Thank a lot.
>         -- 
>         Idriss
> Thanks a lot.
So sorry, i didn't add the mailing list email in CC.
-- 
Idriss


More information about the Fontconfig mailing list