1 module fontconfig;
2
3 public import fontconfig.fctypes;
4 public import fontconfig.functions;
5
6 import bindbc.loader;
7
8 enum FCSupport {
9 noLibrary,
10 badLibrary,
11 // TODO: real versions and stuff
12 fc100 = 100,
13 }
14
15 private {
16 SharedLib lib;
17 FCSupport loadedVersion;
18 }
19
20
21 @nogc nothrow:
22 void unloadFC()
23 {
24 if(lib != invalidHandle) {
25 lib.unload();
26 }
27 }
28
29
30 FCSupport loadedFCVersion() { return loadedVersion; }
31
32 bool isFCLoaded()
33 {
34 return lib != invalidHandle;
35 }
36
37
38 FCSupport loadFC()
39 {
40 // #1778 prevents from using static arrays here :(
41 version(Windows) {
42 const(char)[][1] libNames = [ "libfontconfig-1.dll"];
43 }
44 else version(OSX) {
45 const(char)[][1] libNames = [
46 "/usr/local/lib/libfontconfig.dylib"
47 ];
48 }
49 else version(Posix) {
50 const(char)[][2] libNames = [
51 "libfontconfig.so.1",
52 "libfontconfig.so"
53 ];
54 }
55 else static assert(0, "bindbc-fc is not yet supported on this platform.");
56
57 FCSupport ret;
58 foreach(name; libNames) {
59 ret = loadFC(name.ptr);
60 if(ret != FCSupport.noLibrary) break;
61 }
62 return ret;
63 }
64
65 FCSupport loadFC(const(char)* libName)
66 {
67 lib = load(libName);
68 if(lib == invalidHandle) {
69 return FCSupport.noLibrary;
70 }
71
72 auto errCount = errorCount();
73 loadedVersion = FCSupport.badLibrary;
74
75 lib.bindSymbol( cast( void** )&FcObjectSetBuild, "FcObjectSetBuild" );
76 lib.bindSymbol( cast( void** )&FcPatternCreate, "FcPatternCreate" );
77 lib.bindSymbol( cast( void** )&FcPatternAddBool, "FcPatternAddBool" );
78 lib.bindSymbol( cast( void** )&FcFontList, "FcFontList" );
79 lib.bindSymbol( cast( void** )&FcPatternDestroy, "FcPatternDestroy" );
80 lib.bindSymbol( cast( void** )&FcObjectSetDestroy, "FcObjectSetDestroy" );
81 lib.bindSymbol( cast( void** )&FcPatternGetString, "FcPatternGetString" );
82 lib.bindSymbol( cast( void** )&FcPatternGetInteger, "FcPatternGetInteger" );
83 lib.bindSymbol( cast( void** )&FcPatternGetBool, "FcPatternGetBool" );
84 lib.bindSymbol( cast( void** )&FcFontSetDestroy, "FcFontSetDestroy" );
85
86 if(errorCount() != errCount) return FCSupport.badLibrary;
87 else loadedVersion = FCSupport.fc100;
88
89 return loadedVersion;
90 }