From fb9c1e59b3c6250adc99bd7594404a2de814ce5f Mon Sep 17 00:00:00 2001 From: Jerome St-Louis Date: Thu, 4 Aug 2016 09:35:53 -0400 Subject: [PATCH] ecere/gfx/fontManagement: Listing fonts with Fontconfig --- ecere/src/gfx/fontManagement.ec | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/ecere/src/gfx/fontManagement.ec b/ecere/src/gfx/fontManagement.ec index 3673df2..d811a60 100644 --- a/ecere/src/gfx/fontManagement.ec +++ b/ecere/src/gfx/fontManagement.ec @@ -440,9 +440,47 @@ public Map ListAvailableFonts() EnumFontFamiliesExW(hdc, &logFont, (void *)fontLister, (LPARAM)fonts, 0); ReleaseDC(0, hdc); - #elif !defined(ECERE_NOFONTCONFIG) + int i; + FcPattern * pattern; + FcObjectSet * objectSet; + FcFontSet * fontSet; + + if(!fcConfig) + fcConfig = FcInitLoadConfigAndFonts(); + + pattern = FcPatternCreate(); + objectSet = FcObjectSetBuild(FC_FAMILY, FC_SPACING, FC_CHARSET, null); + fontSet = FcFontList(fcConfig, pattern, objectSet); + if(fontSet) + { + MapIterator it { map = fonts }; + for(i = 0; i < fontSet->nfont; i++) + { + FcPattern * font = fontSet->fonts[i]; + String family; + int spacing; + FcCharSet * charSet; + if(FcPatternGetString(font, FC_FAMILY, 0, (byte **)&family) == FcResultMatch && + FcPatternGetInteger(font, FC_SPACING, 0, &spacing) == FcResultMatch && + FcPatternGetCharSet(font, FC_CHARSET, 0, &charSet) == FcResultMatch) + { + if(!it.Index(family, true)) + { + it.data = + { + fixedPitch = spacing == FC_MONO, + defaultOrAnsiCharSet = + FcCharSetHasChar(charSet, '[') && FcCharSetHasChar(charSet, '{') && + FcCharSetHasChar(charSet, 'a') && FcCharSetHasChar(charSet, 'Z'); + }; + } + } + } + } + if(pattern) FcPatternDestroy(pattern); + if(fontSet) FcFontSetDestroy(fontSet); #endif return fonts; } -- 1.8.3.1