From d256a617034be131afd53f7f496fbffa3aca4093 Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Sun, 29 Jul 2007 01:47:18 +0000 Subject: [PATCH] Implemented font config file lister, except that it doesn't work. Originally committed to SVN as r1453. --- aegisub/font_file_lister.cpp | 10 +++------ aegisub/font_file_lister_fontconfig.cpp | 30 +++++++++++++++++++++---- aegisub/font_file_lister_fontconfig.h | 5 +++++ 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/aegisub/font_file_lister.cpp b/aegisub/font_file_lister.cpp index e8b46efa7..24b297da1 100644 --- a/aegisub/font_file_lister.cpp +++ b/aegisub/font_file_lister.cpp @@ -43,8 +43,10 @@ #include "standard_paths.h" #ifdef WIN32 #include "font_file_lister_freetype.h" +#define FontListerClass FreetypeFontFileLister #else #include "font_file_lister_fontconfig.h" +#define FontListerClass FontConfigFontFileLister #endif @@ -68,13 +70,7 @@ FontFileLister::~FontFileLister() { //////////////// // Get instance void FontFileLister::GetInstance() { - if (!instance) { -#ifdef WIN32 - instance = new FreetypeFontFileLister(); -#else - instance = new FontConfigFontFileLister(); -#endif - } + if (!instance) instance = new FontListerClass(); } diff --git a/aegisub/font_file_lister_fontconfig.cpp b/aegisub/font_file_lister_fontconfig.cpp index 097cf0195..89597b839 100644 --- a/aegisub/font_file_lister_fontconfig.cpp +++ b/aegisub/font_file_lister_fontconfig.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2007, Rodrigo Braz Monteiro +// Copyright (c) 2007, David Lamparter, Rodrigo Braz Monteiro // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -46,7 +46,25 @@ wxArrayString FontConfigFontFileLister::DoGetFilesWithFace(wxString facename) { wxArrayString results; - // TODO: implement this + // Code stolen from asa + FcPattern *final, *tmp1, *tmp2; + FcResult res; + FcChar8 *filename; + char buffer[1024]; + strcpy(buffer,facename.mb_str(wxConvUTF8)); + + // Get data from fconfig or something + tmp1 = FcPatternBuild(NULL,FC_FAMILY, FcTypeString,buffer,NULL); + if (!tmp1) return results; + tmp2 = FcFontRenderPrepare(fontconf, tmp1, aux); + FcPatternDestroy(tmp1); + final = FcFontMatch(fontconf, tmp2, &res); + FcPatternDestroy(tmp2); + if (!final) return results; + if (FcPatternGetString(final, FC_FILE, 0, &filename) == FcResultMatch) { + results.Add(wxString((char*) filename,wxConvLocal)); + } + FcPatternDestroy(final); return results; } @@ -55,14 +73,18 @@ wxArrayString FontConfigFontFileLister::DoGetFilesWithFace(wxString facename) { ////////////// // Initialize void FontConfigFontFileLister::DoInitialize() { - // TODO: implement this + fontconf = FcInitLoadConfigAndFonts(); + aux = FcPatternCreate(); } //////////// // Clean up void FontConfigFontFileLister::DoClearData() { - // TODO: implement this + if (aux) FcPatternDestroy(aux); +#ifdef HAVE_FCFINI + FcFini(); +#endif } #endif diff --git a/aegisub/font_file_lister_fontconfig.h b/aegisub/font_file_lister_fontconfig.h index 40be0da65..242c60892 100644 --- a/aegisub/font_file_lister_fontconfig.h +++ b/aegisub/font_file_lister_fontconfig.h @@ -39,6 +39,8 @@ //////////// // Includes +#include +#include #include "font_file_lister.h" @@ -47,6 +49,9 @@ class FontConfigFontFileLister : public FontFileLister { friend class FontFileLister; private: + FcConfig *fontconf; + FcPattern *aux; + wxArrayString DoGetFilesWithFace(wxString facename); void DoInitialize(); void DoClearData();