Commit | Line | Data |
---|---|---|
cabec872 RR |
1 | /***************************************************************************/ |
2 | /* */ | |
3 | /* ftinit.c */ | |
4 | /* */ | |
5 | /* FreeType initialization layer (body). */ | |
6 | /* */ | |
7 | /* Copyright 1996-2000 by */ | |
8 | /* David Turner, Robert Wilhelm, and Werner Lemberg. */ | |
9 | /* */ | |
10 | /* This file is part of the FreeType project, and may only be used, */ | |
11 | /* modified, and distributed under the terms of the FreeType project */ | |
12 | /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ | |
13 | /* this file you indicate that you have read the license and */ | |
14 | /* understand and accept it fully. */ | |
15 | /* */ | |
16 | /***************************************************************************/ | |
17 | ||
18 | /*************************************************************************/ | |
19 | /* */ | |
20 | /* The purpose of this file is to implement the following two */ | |
21 | /* functions: */ | |
22 | /* */ | |
23 | /* FT_Add_Default_Modules(): */ | |
24 | /* This function is used to add the set of default modules to a */ | |
25 | /* fresh new library object. The set is taken from the header file */ | |
26 | /* `freetype/config/ftmodule.h'. See the document `FreeType 2.0 */ | |
27 | /* Build System' for more information. */ | |
28 | /* */ | |
29 | /* FT_Init_FreeType(): */ | |
30 | /* This function creates a system object for the current platform, */ | |
31 | /* builds a library out of it, then calls FT_Default_Drivers(). */ | |
32 | /* */ | |
33 | /* Note that even if FT_Init_FreeType() uses the implementation of the */ | |
34 | /* system object defined at build time, client applications are still */ | |
35 | /* able to provide their own `ftsystem.c'. */ | |
36 | /* */ | |
37 | /*************************************************************************/ | |
38 | ||
39 | ||
40 | #include <freetype/config/ftconfig.h> | |
41 | #include <freetype/internal/ftobjs.h> | |
42 | #include <freetype/internal/ftdebug.h> | |
43 | #include <freetype/ftmodule.h> | |
44 | ||
45 | ||
46 | /*************************************************************************/ | |
47 | /* */ | |
48 | /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ | |
49 | /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ | |
50 | /* messages during execution. */ | |
51 | /* */ | |
52 | #undef FT_COMPONENT | |
53 | #define FT_COMPONENT trace_init | |
54 | ||
55 | #undef FT_USE_MODULE | |
56 | #define FT_USE_MODULE( x ) extern const FT_Module_Class* x; | |
57 | ||
58 | #ifdef macintosh | |
59 | FT_USE_MODULE(fond_driver_class) | |
60 | #endif | |
61 | #include <freetype/config/ftmodule.h> | |
62 | ||
63 | #undef FT_USE_MODULE | |
64 | #define FT_USE_MODULE( x ) (const FT_Module_Class*)&x, | |
65 | ||
66 | static | |
67 | const FT_Module_Class* ft_default_modules[] = | |
68 | { | |
69 | #ifdef macintosh | |
70 | FT_USE_MODULE(fond_driver_class) | |
71 | #endif | |
72 | #include <freetype/config/ftmodule.h> | |
73 | 0 | |
74 | }; | |
75 | ||
76 | ||
77 | /*************************************************************************/ | |
78 | /* */ | |
79 | /* <Function> */ | |
80 | /* FT_Add_Default_Modules */ | |
81 | /* */ | |
82 | /* <Description> */ | |
83 | /* Adds the set of default drivers to a given library object. */ | |
84 | /* This is only useful when you create a library object with */ | |
85 | /* FT_New_Library() (usually to plug a custom memory manager). */ | |
86 | /* */ | |
87 | /* <InOut> */ | |
88 | /* library :: A handle to a new library object. */ | |
89 | /* */ | |
90 | FT_EXPORT_FUNC( void ) FT_Add_Default_Modules( FT_Library library ) | |
91 | { | |
92 | FT_Error error; | |
93 | const FT_Module_Class** cur; | |
94 | ||
95 | ||
96 | /* test for valid `library' delayed to FT_Add_Module() */ | |
97 | ||
98 | cur = ft_default_modules; | |
99 | while ( *cur ) | |
100 | { | |
101 | error = FT_Add_Module( library, *cur ); | |
102 | /* notify errors, but don't stop */ | |
103 | if ( error ) | |
104 | { | |
105 | FT_ERROR(( "FT_Add_Default_Module: Cannot install `%s', error = %x\n", | |
106 | (*cur)->module_name, error )); | |
107 | } | |
108 | cur++; | |
109 | } | |
110 | } | |
111 | ||
112 | ||
113 | /*************************************************************************/ | |
114 | /* */ | |
115 | /* <Function> */ | |
116 | /* FT_Init_FreeType */ | |
117 | /* */ | |
118 | /* <Description> */ | |
119 | /* Initializes a new FreeType library object. The set of drivers */ | |
120 | /* that are registered by this function is determined at build time. */ | |
121 | /* */ | |
122 | /* <Output> */ | |
123 | /* library :: A handle to a new library object. */ | |
124 | /* */ | |
125 | /* <Return> */ | |
126 | /* FreeType error code. 0 means success. */ | |
127 | /* */ | |
128 | FT_EXPORT_FUNC( FT_Error ) FT_Init_FreeType( FT_Library* library ) | |
129 | { | |
130 | FT_Error error; | |
131 | FT_Memory memory; | |
132 | ||
133 | ||
134 | /* First of all, allocate a new system object -- this function is part */ | |
135 | /* of the system-specific component, i.e. `ftsystem.c'. */ | |
136 | ||
137 | memory = FT_New_Memory(); | |
138 | if ( !memory ) | |
139 | { | |
140 | FT_ERROR(( "FT_Init_FreeType: cannot find memory manager\n" )); | |
141 | return FT_Err_Unimplemented_Feature; | |
142 | } | |
143 | ||
144 | /* build a library out of it, then fill it with the set of */ | |
145 | /* default drivers. */ | |
146 | ||
147 | error = FT_New_Library( memory, library ); | |
148 | if ( !error ) | |
149 | FT_Add_Default_Modules( *library ); | |
150 | ||
151 | return error; | |
152 | } | |
153 | ||
154 | ||
155 | /* END */ |