X-Git-Url: https://ecere.com/cgi-bin/gitweb.cgi?p=sdk;a=blobdiff_plain;f=ecere%2Fsrc%2Fgfx%2FfontManagement.ec;h=3673df2de10552a54a4e6504b203c9e013745e42;hp=b69d8f043f2742056c8d3439c377542d61bbacca;hb=6140362c0fb30227364952a8bbf1dfe6fed6e556;hpb=8d4a267a681da78408bf758106ca32be3a021dd7 diff --git a/ecere/src/gfx/fontManagement.ec b/ecere/src/gfx/fontManagement.ec index b69d8f0..3673df2 100644 --- a/ecere/src/gfx/fontManagement.ec +++ b/ecere/src/gfx/fontManagement.ec @@ -27,7 +27,7 @@ static int CALLBACK MyFontProc(ENUMLOGFONTEX * font, NEWTEXTMETRICEX *lpntme, in //if(fontType == TRUETYPE_FONTTYPE) { FontData * fontData = (FontData *) lParam; - char * fileName = (char *)lParam; + char * fileName = fontData->fileName; HKEY key; int weight = (fontData->flags.bold) ? FW_BOLD : FW_NORMAL; int italic = (fontData->flags.italic) ? 1 : 0; @@ -304,13 +304,16 @@ public Array ResolveFont(const String faceName, float size, FontFlags #endif while(true) { - FaceInfo faceInfo + if(FileExists(fileName)) { - fileName = CopyString(fileName), - fakeItalic = fakeItalic, - fontID = fontID - }; - fileNames.Add(faceInfo); + FaceInfo faceInfo + { + fileName = CopyString(fileName), + fakeItalic = fakeItalic, + fontID = fontID + }; + fileNames.Add(faceInfo); + } { int c; char ch; @@ -394,9 +397,56 @@ public Array ResolveFont(const String faceName, float size, FontFlags #endif #endif + if(!fileNames.count) + delete fileNames; return fileNames; } +import "AVLTree" + +public struct FontInfo +{ + bool fixedPitch; + bool defaultOrAnsiCharSet; +}; + +#if defined(__WIN32__) +static int CALLBACK fontLister(ENUMLOGFONTEXW * font, NEWTEXTMETRICEX *lpntme, int fontType, LPARAM lParam) +{ + // const String faceName = font->elfLogFont.lfFaceName; + uint16 * faceName = font->elfLogFont.lfFaceName; + String s = UTF16toUTF8(faceName); + if(s[0] != '@') + { + Map fonts = (Map)lParam; + MapIterator it { map = fonts }; + if(!it.Index(s, true)) + it.data = { (font->elfLogFont.lfPitchAndFamily & 3) == FIXED_PITCH, defaultOrAnsiCharSet = (font->elfLogFont.lfCharSet == ANSI_CHARSET || font->elfLogFont.lfCharSet == DEFAULT_CHARSET) }; + } + delete s; + return 1; +} +#endif + +public Map ListAvailableFonts() +{ + Map fonts { }; + +#if defined(__WIN32__) + LOGFONTW logFont = { 0 }; + HDC hdc = GetDC(0); + logFont.lfCharSet = DEFAULT_CHARSET; + + EnumFontFamiliesExW(hdc, &logFont, (void *)fontLister, (LPARAM)fonts, 0); + + ReleaseDC(0, hdc); + +#elif !defined(ECERE_NOFONTCONFIG) + +#endif + return fonts; +} + public FaceInfo ResolveCharFont(const String faceName, float size, FontFlags flags, const String lang, unichar testChar) { FaceInfo info = null;