1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  ftinit.c                                                               */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    FreeType initialization layer (body).                                */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang/*  Copyright 1996-2002, 2005, 2007, 2009, 2012, 2013 by                   */
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  This file is part of the FreeType project, and may only be used,       */
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  modified, and distributed under the terms of the FreeType project      */
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  this file you indicate that you have read the license and              */
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  understand and accept it fully.                                        */
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  The purpose of this file is to implement the following two           */
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  functions:                                                           */
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  FT_Add_Default_Modules():                                            */
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*     This function is used to add the set of default modules to a      */
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*     fresh new library object.  The set is taken from the header file  */
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*     `freetype/config/ftmodule.h'.  See the document `FreeType 2.0     */
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*     Build System' for more information.                               */
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  FT_Init_FreeType():                                                  */
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*     This function creates a system object for the current platform,   */
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*     builds a library out of it, then calls FT_Default_Drivers().      */
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Note that even if FT_Init_FreeType() uses the implementation of the  */
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  system object defined at build time, client applications are still   */
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  able to provide their own `ftsystem.c'.                              */
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h>
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_CONFIG_CONFIG_H
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_OBJECTS_H
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_MODULE_H
45295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "basepic.h"
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* messages during execution.                                            */
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FT_COMPONENT
55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT  trace_init
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
57e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
58295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifndef FT_CONFIG_OPTION_PIC
59295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
60e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FT_USE_MODULE
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef __cplusplus
630a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#define FT_USE_MODULE( type, x )  extern "C" const type  x;
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
650a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#define FT_USE_MODULE( type, x )  extern const type  x;
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_CONFIG_MODULES_H
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FT_USE_MODULE
710a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#define FT_USE_MODULE( type, x )  (const FT_Module_Class*)&(x),
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  const FT_Module_Class*  const ft_default_modules[] =
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_CONFIG_MODULES_H
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    0
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
80e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
81295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#else /* FT_CONFIG_OPTION_PIC */
82295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
83e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
84295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifdef __cplusplus
85295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#define FT_EXTERNC  extern "C"
86295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#else
87295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#define FT_EXTERNC  extern
88295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif
89295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
90295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* declare the module's class creation/destruction functions */
91295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#undef  FT_USE_MODULE
92e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#define FT_USE_MODULE( type, x )                            \
93e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  FT_EXTERNC FT_Error                                       \
94e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  FT_Create_Class_ ## x( FT_Library         library,        \
95e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang                         FT_Module_Class*  *output_class ); \
96e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  FT_EXTERNC void                                           \
97e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  FT_Destroy_Class_ ## x( FT_Library        library,        \
98e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang                          FT_Module_Class*  clazz );
99295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
100295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include FT_CONFIG_MODULES_H
101295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
102295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* count all module classes */
103295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#undef  FT_USE_MODULE
104e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#define FT_USE_MODULE( type, x )  MODULE_CLASS_ ## x,
105295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
106aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  enum
107aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  {
108295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include FT_CONFIG_MODULES_H
109295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    FT_NUM_MODULE_CLASSES
110295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  };
111295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
112e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  /* destroy all module classes */
113295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#undef  FT_USE_MODULE
114e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#define FT_USE_MODULE( type, x )                   \
115e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  if ( classes[i] )                                \
116e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  {                                                \
117e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    FT_Destroy_Class_ ## x( library, classes[i] ); \
118e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  }                                                \
119e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  i++;
120e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
121295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
122295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_BASE_DEF( void )
123295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  ft_destroy_default_module_classes( FT_Library  library )
124295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  {
125e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    FT_Module_Class*  *classes;
126e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    FT_Memory          memory;
127e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    FT_UInt            i;
128e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    BasePIC*           pic_container = (BasePIC*)library->pic_container.base;
129e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
130295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
131295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( !pic_container->default_module_classes )
132295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return;
133295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
134e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    memory  = library->memory;
135295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    classes = pic_container->default_module_classes;
136e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    i       = 0;
137295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
138295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include FT_CONFIG_MODULES_H
139295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
140295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    FT_FREE( classes );
141295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    pic_container->default_module_classes = 0;
142295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  }
143295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
144e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
145295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* initialize all module classes and the pointer table */
146295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#undef  FT_USE_MODULE
147e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#define FT_USE_MODULE( type, x )                     \
148e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  error = FT_Create_Class_ ## x( library, &clazz );  \
149e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  if ( error )                                       \
150e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    goto Exit;                                       \
151295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  classes[i++] = clazz;
152295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
153e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
154295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_BASE_DEF( FT_Error )
155295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  ft_create_default_module_classes( FT_Library  library )
156295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  {
157e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    FT_Error           error;
158e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    FT_Memory          memory;
159a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_Module_Class*  *classes = NULL;
160e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    FT_Module_Class*   clazz;
161e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    FT_UInt            i;
162e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    BasePIC*           pic_container = (BasePIC*)library->pic_container.base;
163e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
164e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
165e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    memory = library->memory;
166e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
167295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    pic_container->default_module_classes = 0;
168295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
169a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    if ( FT_ALLOC( classes, sizeof ( FT_Module_Class* ) *
170e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang                              ( FT_NUM_MODULE_CLASSES + 1 ) ) )
171295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return error;
172e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
173295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* initialize all pointers to 0, especially the last one */
174e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    for ( i = 0; i < FT_NUM_MODULE_CLASSES; i++ )
175295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      classes[i] = 0;
176295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    classes[FT_NUM_MODULE_CLASSES] = 0;
177295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
178295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    i = 0;
179295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
180295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include FT_CONFIG_MODULES_H
181295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
182e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  Exit:
183e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    if ( error )
184e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang      ft_destroy_default_module_classes( library );
185e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    else
186e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang      pic_container->default_module_classes = classes;
187295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
188e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    return error;
189295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  }
190295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
191295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
192295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif /* FT_CONFIG_OPTION_PIC */
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
194e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* documentation is in ftmodapi.h */
196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_EXPORT_DEF( void )
198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_Add_Default_Modules( FT_Library  library )
199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error                       error;
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    const FT_Module_Class* const*  cur;
202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
204e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    /* FT_DEFAULT_MODULES_GET dereferences `library' in PIC mode */
205e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#ifdef FT_CONFIG_OPTION_PIC
206e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    if ( !library )
207e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang      return;
208e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#endif
209e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
210e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    /* GCC 4.6 warns the type difference:
211e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang     *   FT_Module_Class** != const FT_Module_Class* const*
212e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang     */
213e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    cur = (const FT_Module_Class* const*)FT_DEFAULT_MODULES_GET;
214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
215e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    /* test for valid `library' delayed to FT_Add_Module() */
216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( *cur )
217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = FT_Add_Module( library, *cur );
219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* notify errors, but don't stop */
220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
221295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        FT_TRACE0(( "FT_Add_Default_Module:"
222295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                    " Cannot install `%s', error = 0x%x\n",
223aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                    (*cur)->module_name, error ));
224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cur++;
225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* documentation is in freetype.h */
230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_EXPORT_DEF( FT_Error )
232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_Init_FreeType( FT_Library  *alibrary )
233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error   error;
235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory;
236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* First of all, allocate a new system object -- this function is part */
239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* of the system-specific component, i.e. `ftsystem.c'.                */
240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    memory = FT_New_Memory();
242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !memory )
243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_ERROR(( "FT_Init_FreeType: cannot find memory manager\n" ));
245a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Unimplemented_Feature );
246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* build a library out of it, then fill it with the set of */
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* default drivers.                                        */
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = FT_New_Library( memory, alibrary );
252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Done_Memory( memory );
254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Add_Default_Modules( *alibrary );
256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* documentation is in freetype.h */
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_EXPORT_DEF( FT_Error )
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_Done_FreeType( FT_Library  library )
265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( library )
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Memory  memory = library->memory;
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Discard the library object */
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Done_Library( library );
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* discard memory manager */
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Done_Memory( memory );
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return FT_Err_Ok;
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
283