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