I’m using prebuilt versions of Pango on Windows and macOS. On Windows I’m using the Pango build provided by MSYS2 and on macOS I’m using the one provided by Macports. How can I find out which OS-specific backends are used by the builds?
Specifically, I want to find out the following:
Does the build use fontconfig or some Windows/macOS-specific API to match fonts?
Does the build use freetype2 or CoreText on macOS?
Does the build use freetype2 or GDI/DirectWrite on Windows?
Well, it depends on which objects you create (mostly). When not using PangoCairo, you have the option of creating the following font maps:
PangoFcFontMap (Linux, Windows, macOS)
PangoWin32FontMap (Windows - used GDI until Pango 1.50.12, uses DirectWrite since then)
PangoCoreTextFontMap (macOS)
That tells you what’s used for font discovery and font fallback. For the rendering part, you have the option of creating:
FreeType2 fonts (Linux, Windows, macOS)
Win32 fonts (Windows - uses GDI for rendering)
Xft fonts (Linux, perhaps even macOS?)
CoreText fonts (macOS)
These fonts render on native surfaces, i.e you can render onto FT_BitMap, HDC, XftDraw or even a Xft Picture. For CoreText fonts instead it’s a bit different though - you get a CTFontRef back and render yourself using native macOS APIs.
When using PangoCairo, instead, you can set the environment variable PANGOCAIRO_BACKEND to one of fc, win32, coretext to use a specific Cairo backend. Otherwise you can call pango_cairo_font_map_new_for_font_type() passing wither CAIRO_FONT_TYPE_QUARTZ, CAIRO_FONT_TYPE_WIN32, CAIRO_FONT_TYPE_FT, it’s the same.
PANGOCAIRO_BACKEND=fc: PangoCairo uses PangoFcFontMap to discover fonts on the system
PANGOCAIRO_BACKEND=win32: PangoCairo uses PangoWin32FontMap to discover fonts. Cairo fonts created that way use DirectWrite for rendering if Cairo was compiled DirectWrite support, otherwise uses GDI
PANGOCAIRO_BACKEND=coretext: PangoCairo uses PangoCoreTextFontMap to discover fonts
Thanks for your elaborate reply but how can I find out the backend if I don’t specify it explicitly? I’m using PangoCairo and I create my fonts like this:
So how can I find out which backend Cairo uses in that case? The documentation on pango_cairo_font_map_new says that Cairo will use the “particular font backend Cairo was compiled to use” but that doesn’t help me because I didn’t compile Cairo myself. How can I find out what’s the default backend in that case?
Basically, it’s FontConfig (discovery) & FreeType (rendering) on Linux, GDI/DirectWrite on Windows and CoreText on macOS. You can also override that using pango_cairo_font_map_new_for_font_type()
The documentation for PangoCairo.FontMap.new() specifically says
Note that the type of the returned object will depend on the particular font backend Cairo was compiled to use
What this means is that PangoCairo.FontMap.new() will not return an object of type PangoCairo.FontMap. Instead, it will return an object of its subclass.
So, you can use G_OBJECT_TYPE_NAME() macro to get type name of the returned object. Once you know the type names for all backends you are interested in, you can use <LIB_NAME>_IS_<TYPE_NAME>() style macros e.g. PANGO_FC_IS_FONT_MAP(), PANGO_XFT_IS_FONT_MAP(), etc. to find out if the object is of the specified type or not. This will effectively let you know, what backend is being used.
Edit: It seems like backend-specific classes are private. So, you cannot use PANGO_CAIRO_IS_<CLASS_NAME>() macros e.g PANGO_CAIRO_IS_FC_FONT_MAP(). Therefore, you’ll have to do string comparisons on the string returned by G_OBJECT_TYPE_NAME() in order to find out what backend is being used.