XFA: merge patch from CL 817753002
[pdfium.git] / core / src / fxge / fx_freetype / fxft2.5.01 / src / base / fxft_ftinit.c
1 #if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
2 /***************************************************************************/
3 /*                                                                         */
4 /*  ftinit.c                                                               */
5 /*                                                                         */
6 /*    FreeType initialization layer (body).                                */
7 /*                                                                         */
8 /*  Copyright 1996-2002, 2005, 2007, 2009, 2012, 2013 by                   */
9 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
10 /*                                                                         */
11 /*  This file is part of the FreeType project, and may only be used,       */
12 /*  modified, and distributed under the terms of the FreeType project      */
13 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
14 /*  this file you indicate that you have read the license and              */
15 /*  understand and accept it fully.                                        */
16 /*                                                                         */
17 /***************************************************************************/
18
19   /*************************************************************************/
20   /*                                                                       */
21   /*  The purpose of this file is to implement the following two           */
22   /*  functions:                                                           */
23   /*                                                                       */
24   /*  FT_Add_Default_Modules():                                            */
25   /*     This function is used to add the set of default modules to a      */
26   /*     fresh new library object.  The set is taken from the header file  */
27   /*     `freetype/config/ftmodule.h'.  See the document `FreeType 2.0     */
28   /*     Build System' for more information.                               */
29   /*                                                                       */
30   /*  FT_Init_FreeType():                                                  */
31   /*     This function creates a system object for the current platform,   */
32   /*     builds a library out of it, then calls FT_Default_Drivers().      */
33   /*                                                                       */
34   /*  Note that even if FT_Init_FreeType() uses the implementation of the  */
35   /*  system object defined at build time, client applications are still   */
36   /*  able to provide their own `ftsystem.c'.                              */
37   /*                                                                       */
38   /*************************************************************************/
39
40 #define FT2_BUILD_LIBRARY
41 #include "../../include/ft2build.h"
42 #include "../../include/freetype/config/ftconfig.h"
43 #include "../../include/freetype/internal/ftobjs.h"
44 #include "../../include/freetype/internal/ftdebug.h"
45 #include "../../include/freetype/ftmodapi.h"
46 #include "basepic.h"
47
48
49   /*************************************************************************/
50   /*                                                                       */
51   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
52   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
53   /* messages during execution.                                            */
54   /*                                                                       */
55 #undef  FT_COMPONENT
56 #define FT_COMPONENT  trace_init
57
58
59 #ifndef FT_CONFIG_OPTION_PIC
60
61
62 #undef  FT_USE_MODULE
63 #ifdef __cplusplus
64 #define FT_USE_MODULE( type, x )  extern "C" const type  x;
65 #else
66 #define FT_USE_MODULE( type, x )  extern const type  x;
67 #endif
68
69 #include "../../include/freetype/config/ftmodule.h"
70
71 #undef  FT_USE_MODULE
72 #define FT_USE_MODULE( type, x )  (const FT_Module_Class*)&(x),
73
74   static
75   const FT_Module_Class*  const ft_default_modules[] =
76   {
77 #include "../../include/freetype/config/ftmodule.h"
78     0
79   };
80
81
82 #else /* FT_CONFIG_OPTION_PIC */
83
84
85 #ifdef __cplusplus
86 #define FT_EXTERNC  extern "C"
87 #else
88 #define FT_EXTERNC  extern
89 #endif
90
91   /* declare the module's class creation/destruction functions */
92 #undef  FT_USE_MODULE
93 #define FT_USE_MODULE( type, x )                            \
94   FT_EXTERNC FT_Error                                       \
95   FT_Create_Class_ ## x( FT_Library         library,        \
96                          FT_Module_Class*  *output_class ); \
97   FT_EXTERNC void                                           \
98   FT_Destroy_Class_ ## x( FT_Library        library,        \
99                           FT_Module_Class*  clazz );
100
101 #include "../../include/freetype/config/ftmodule.h"
102
103   /* count all module classes */
104 #undef  FT_USE_MODULE
105 #define FT_USE_MODULE( type, x )  MODULE_CLASS_ ## x,
106
107   enum
108   {
109 #include "../../include/freetype/config/ftmodule.h"
110     FT_NUM_MODULE_CLASSES
111   };
112
113   /* destroy all module classes */
114 #undef  FT_USE_MODULE
115 #define FT_USE_MODULE( type, x )                   \
116   if ( classes[i] )                                \
117   {                                                \
118     FT_Destroy_Class_ ## x( library, classes[i] ); \
119   }                                                \
120   i++;
121
122
123   FT_BASE_DEF( void )
124   ft_destroy_default_module_classes( FT_Library  library )
125   {
126     FT_Module_Class*  *classes;
127     FT_Memory          memory;
128     FT_UInt            i;
129     BasePIC*           pic_container = (BasePIC*)library->pic_container.base;
130
131
132     if ( !pic_container->default_module_classes )
133       return;
134
135     memory  = library->memory;
136     classes = pic_container->default_module_classes;
137     i       = 0;
138
139 #include "../../include/freetype/config/ftmodule.h"
140
141     FT_FREE( classes );
142     pic_container->default_module_classes = 0;
143   }
144
145
146   /* initialize all module classes and the pointer table */
147 #undef  FT_USE_MODULE
148 #define FT_USE_MODULE( type, x )                     \
149   error = FT_Create_Class_ ## x( library, &clazz );  \
150   if ( error )                                       \
151     goto Exit;                                       \
152   classes[i++] = clazz;
153
154
155   FT_BASE_DEF( FT_Error )
156   ft_create_default_module_classes( FT_Library  library )
157   {
158     FT_Error           error;
159     FT_Memory          memory;
160     FT_Module_Class*  *classes = NULL;
161     FT_Module_Class*   clazz;
162     FT_UInt            i;
163     BasePIC*           pic_container = (BasePIC*)library->pic_container.base;
164
165
166     memory = library->memory;
167
168     pic_container->default_module_classes = 0;
169
170     if ( FT_ALLOC( classes, sizeof ( FT_Module_Class* ) *
171                               ( FT_NUM_MODULE_CLASSES + 1 ) ) )
172       return error;
173
174     /* initialize all pointers to 0, especially the last one */
175     for ( i = 0; i < FT_NUM_MODULE_CLASSES; i++ )
176       classes[i] = 0;
177     classes[FT_NUM_MODULE_CLASSES] = 0;
178
179     i = 0;
180
181 #include "../../include/freetype/config/ftmodule.h"
182
183   Exit:
184     if ( error )
185       ft_destroy_default_module_classes( library );
186     else
187       pic_container->default_module_classes = classes;
188
189     return error;
190   }
191
192
193 #endif /* FT_CONFIG_OPTION_PIC */
194
195
196   /* documentation is in ftmodapi.h */
197
198   FT_EXPORT_DEF( void )
199   FT_Add_Default_Modules( FT_Library  library )
200   {
201     FT_Error                       error;
202     const FT_Module_Class* const*  cur;
203
204
205     /* FT_DEFAULT_MODULES_GET dereferences `library' in PIC mode */
206 #ifdef FT_CONFIG_OPTION_PIC
207     if ( !library )
208       return;
209 #endif
210
211     /* GCC 4.6 warns the type difference:
212      *   FT_Module_Class** != const FT_Module_Class* const*
213      */
214     cur = (const FT_Module_Class* const*)FT_DEFAULT_MODULES_GET;
215
216     /* test for valid `library' delayed to FT_Add_Module() */
217     while ( *cur )
218     {
219       error = FT_Add_Module( library, *cur );
220       /* notify errors, but don't stop */
221       if ( error )
222         FT_TRACE0(( "FT_Add_Default_Module:"
223                     " Cannot install `%s', error = 0x%x\n",
224                     (*cur)->module_name, error ));
225       cur++;
226     }
227   }
228
229
230   /* documentation is in freetype.h */
231
232   FT_EXPORT_DEF( FT_Error )
233   FT_Init_FreeType( FT_Library  *alibrary )
234   {
235     FT_Error   error;
236     FT_Memory  memory;
237
238
239     /* First of all, allocate a new system object -- this function is part */
240     /* of the system-specific component, i.e. `ftsystem.c'.                */
241
242     memory = FT_New_Memory();
243     if ( !memory )
244     {
245       FT_ERROR(( "FT_Init_FreeType: cannot find memory manager\n" ));
246       return FT_THROW( Unimplemented_Feature );
247     }
248
249     /* build a library out of it, then fill it with the set of */
250     /* default drivers.                                        */
251
252     error = FT_New_Library( memory, alibrary );
253     if ( error )
254       FT_Done_Memory( memory );
255     else
256       FT_Add_Default_Modules( *alibrary );
257
258     return error;
259   }
260
261
262   /* documentation is in freetype.h */
263
264   FT_EXPORT_DEF( FT_Error )
265   FT_Done_FreeType( FT_Library  library )
266   {
267     if ( library )
268     {
269       FT_Memory  memory = library->memory;
270
271
272       /* Discard the library object */
273       FT_Done_Library( library );
274
275       /* discard memory manager */
276       FT_Done_Memory( memory );
277     }
278
279     return FT_Err_Ok;
280   }
281
282
283 /* END */
284 #endif
285