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/*                                                                         */
7727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/*  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  */
26ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*     `config/ftmodule.h'.  See the document `FreeType 2.0 Build        */
27ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*     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
5741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
58295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifndef FT_CONFIG_OPTION_PIC
59295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
6041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
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
8041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
81295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#else /* FT_CONFIG_OPTION_PIC */
82295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
8341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
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
9241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#define FT_USE_MODULE( type, x )                            \
9341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  FT_EXTERNC FT_Error                                       \
9441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  FT_Create_Class_ ## x( FT_Library         library,        \
9541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                         FT_Module_Class*  *output_class ); \
9641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  FT_EXTERNC void                                           \
9741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  FT_Destroy_Class_ ## x( FT_Library        library,        \
9841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                          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
10441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#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
11241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* destroy all module classes */
113295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#undef  FT_USE_MODULE
11441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#define FT_USE_MODULE( type, x )                   \
11541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  if ( classes[i] )                                \
11641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  {                                                \
11741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_Destroy_Class_ ## x( library, classes[i] ); \
11841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  }                                                \
11941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  i++;
12041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
121295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
122295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_BASE_DEF( void )
123295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  ft_destroy_default_module_classes( FT_Library  library )
124295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  {
12541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_Module_Class*  *classes;
12641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_Memory          memory;
12741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_UInt            i;
12841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    BasePIC*           pic_container = (BasePIC*)library->pic_container.base;
12941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
130295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
131295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( !pic_container->default_module_classes )
132295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return;
133295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
13441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    memory  = library->memory;
135295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    classes = pic_container->default_module_classes;
13641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    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
14441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
145295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* initialize all module classes and the pointer table */
146295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#undef  FT_USE_MODULE
14741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#define FT_USE_MODULE( type, x )                     \
14841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  error = FT_Create_Class_ ## x( library, &clazz );  \
14941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  if ( error )                                       \
15041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    goto Exit;                                       \
151295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  classes[i++] = clazz;
152295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
15341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
154295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_BASE_DEF( FT_Error )
155295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  ft_create_default_module_classes( FT_Library  library )
156295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  {
15741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_Error           error;
15841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_Memory          memory;
159727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Module_Class*  *classes = NULL;
16041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_Module_Class*   clazz;
16141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_UInt            i;
16241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    BasePIC*           pic_container = (BasePIC*)library->pic_container.base;
16341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
16441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
16541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    memory = library->memory;
16641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
167295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    pic_container->default_module_classes = 0;
168295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
169727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( FT_ALLOC( classes, sizeof ( FT_Module_Class* ) *
17041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                              ( FT_NUM_MODULE_CLASSES + 1 ) ) )
171295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return error;
17241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
173295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* initialize all pointers to 0, especially the last one */
17441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    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
18241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  Exit:
18341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( error )
18441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      ft_destroy_default_module_classes( library );
18541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    else
18641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      pic_container->default_module_classes = classes;
187295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
18841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    return error;
189295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  }
190295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
191295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
192295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif /* FT_CONFIG_OPTION_PIC */
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
19441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
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
20441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /* FT_DEFAULT_MODULES_GET dereferences `library' in PIC mode */
20541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#ifdef FT_CONFIG_OPTION_PIC
20641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( !library )
20741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      return;
20841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#endif
20941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
21041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /* GCC 4.6 warns the type difference:
21141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier     *   FT_Module_Class** != const FT_Module_Class* const*
21241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier     */
21341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    cur = (const FT_Module_Class* const*)FT_DEFAULT_MODULES_GET;
214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
21541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /* 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" ));
245727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      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