1 /***************************************************************************/
2 /*                                                                         */
3 /*  afpic.c                                                                */
4 /*                                                                         */
5 /*    The FreeType position independent code services for autofit module.  */
6 /*                                                                         */
7 /*  Copyright 2009-2018 by                                                 */
8 /*  Oran Agra and Mickey Gabel.                                            */
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 #include <ft2build.h>
20 #include FT_FREETYPE_H
21 #include FT_INTERNAL_OBJECTS_H
22 #include "afpic.h"
23 #include "afglobal.h"
24 #include "aferrors.h"
25 
26 
27 #ifdef FT_CONFIG_OPTION_PIC
28 
29   /* forward declaration of PIC init functions from afmodule.c */
30   FT_Error
31   FT_Create_Class_af_services( FT_Library           library,
32                                FT_ServiceDescRec**  output_class );
33 
34   void
35   FT_Destroy_Class_af_services( FT_Library          library,
36                                 FT_ServiceDescRec*  clazz );
37 
38   void
39   FT_Init_Class_af_service_properties( FT_Service_PropertiesRec*  clazz );
40 
41   void FT_Init_Class_af_autofitter_interface(
42     FT_Library                   library,
43     FT_AutoHinter_InterfaceRec*  clazz );
44 
45 
46   /* forward declaration of PIC init functions from writing system classes */
47 #undef  WRITING_SYSTEM
48 #define WRITING_SYSTEM( ws, WS )  /* empty */
49 
50 #include "afwrtsys.h"
51 
52 
53   void
54   autofit_module_class_pic_free( FT_Library  library )
55   {
56     FT_PIC_Container*  pic_container = &library->pic_container;
57     FT_Memory          memory        = library->memory;
58 
59 
60     if ( pic_container->autofit )
61     {
62       AFModulePIC*  container = (AFModulePIC*)pic_container->autofit;
63 
64 
65       if ( container->af_services )
66         FT_Destroy_Class_af_services( library,
67                                       container->af_services );
68       container->af_services = NULL;
69 
70       FT_FREE( container );
71       pic_container->autofit = NULL;
72     }
73   }
74 
75 
76   FT_Error
77   autofit_module_class_pic_init( FT_Library  library )
78   {
79     FT_PIC_Container*  pic_container = &library->pic_container;
80     FT_UInt            ss;
81     FT_Error           error         = FT_Err_Ok;
82     AFModulePIC*       container     = NULL;
83     FT_Memory          memory        = library->memory;
84 
85 
86     /* allocate pointer, clear and set global container pointer */
87     if ( FT_ALLOC ( container, sizeof ( *container ) ) )
88       return error;
89     FT_MEM_SET( container, 0, sizeof ( *container ) );
90     pic_container->autofit = container;
91 
92     /* initialize pointer table -                       */
93     /* this is how the module usually expects this data */
94     error = FT_Create_Class_af_services( library,
95                                          &container->af_services );
96     if ( error )
97       goto Exit;
98 
99     FT_Init_Class_af_service_properties( &container->af_service_properties );
100 
101     for ( ss = 0; ss < AF_WRITING_SYSTEM_MAX; ss++ )
102       container->af_writing_system_classes[ss] =
103         &container->af_writing_system_classes_rec[ss];
104     container->af_writing_system_classes[AF_WRITING_SYSTEM_MAX] = NULL;
105 
106     for ( ss = 0; ss < AF_SCRIPT_MAX; ss++ )
107       container->af_script_classes[ss] =
108         &container->af_script_classes_rec[ss];
109     container->af_script_classes[AF_SCRIPT_MAX] = NULL;
110 
111     for ( ss = 0; ss < AF_STYLE_MAX; ss++ )
112       container->af_style_classes[ss] =
113         &container->af_style_classes_rec[ss];
114     container->af_style_classes[AF_STYLE_MAX] = NULL;
115 
116 #undef  WRITING_SYSTEM
117 #define WRITING_SYSTEM( ws, WS )                             \
118         FT_Init_Class_af_ ## ws ## _writing_system_class(    \
119           &container->af_writing_system_classes_rec[ss++] );
120 
121     ss = 0;
122 #include "afwrtsys.h"
123 
124 #undef  SCRIPT
125 #define SCRIPT( s, S, d, h, H, sss )                 \
126         FT_Init_Class_af_ ## s ## _script_class(     \
127           &container->af_script_classes_rec[ss++] );
128 
129     ss = 0;
130 #include "afscript.h"
131 
132 #undef  STYLE
133 #define STYLE( s, S, d, ws, sc, bss, c )            \
134         FT_Init_Class_af_ ## s ## _style_class(     \
135           &container->af_style_classes_rec[ss++] );
136 
137     ss = 0;
138 #include "afstyles.h"
139 
140     FT_Init_Class_af_autofitter_interface(
141       library, &container->af_autofitter_interface );
142 
143   Exit:
144     if ( error )
145       autofit_module_class_pic_free( library );
146     return error;
147   }
148 
149 #endif /* FT_CONFIG_OPTION_PIC */
150 
151 
152 /* END */
153