1 | /***************************************************************************/ |
2 | /* */ |
3 | /* cffpic.c */ |
4 | /* */ |
5 | /* The FreeType position independent code services for cff 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 "cffcmap.h" |
23 | #include "cffpic.h" |
24 | #include "cfferrs.h" |
25 | |
26 | |
27 | #ifdef FT_CONFIG_OPTION_PIC |
28 | |
29 | /* forward declaration of PIC init functions from cffdrivr.c */ |
30 | FT_Error |
31 | FT_Create_Class_cff_services( FT_Library library, |
32 | FT_ServiceDescRec** output_class ); |
33 | void |
34 | FT_Destroy_Class_cff_services( FT_Library library, |
35 | FT_ServiceDescRec* clazz ); |
36 | void |
37 | FT_Init_Class_cff_service_ps_info( FT_Library library, |
38 | FT_Service_PsInfoRec* clazz ); |
39 | void |
40 | FT_Init_Class_cff_service_glyph_dict( FT_Library library, |
41 | FT_Service_GlyphDictRec* clazz ); |
42 | void |
43 | FT_Init_Class_cff_service_ps_name( FT_Library library, |
44 | FT_Service_PsFontNameRec* clazz ); |
45 | void |
46 | FT_Init_Class_cff_service_get_cmap_info( FT_Library library, |
47 | FT_Service_TTCMapsRec* clazz ); |
48 | void |
49 | FT_Init_Class_cff_service_cid_info( FT_Library library, |
50 | FT_Service_CIDRec* clazz ); |
51 | |
52 | /* forward declaration of PIC init functions from cffparse.c */ |
53 | FT_Error |
54 | FT_Create_Class_cff_field_handlers( FT_Library library, |
55 | CFF_Field_Handler** output_class ); |
56 | void |
57 | FT_Destroy_Class_cff_field_handlers( FT_Library library, |
58 | CFF_Field_Handler* clazz ); |
59 | |
60 | |
61 | void |
62 | cff_driver_class_pic_free( FT_Library library ) |
63 | { |
64 | FT_PIC_Container* pic_container = &library->pic_container; |
65 | FT_Memory memory = library->memory; |
66 | |
67 | |
68 | if ( pic_container->cff ) |
69 | { |
70 | CffModulePIC* container = (CffModulePIC*)pic_container->cff; |
71 | |
72 | |
73 | if ( container->cff_services ) |
74 | FT_Destroy_Class_cff_services( library, |
75 | container->cff_services ); |
76 | container->cff_services = NULL; |
77 | if ( container->cff_field_handlers ) |
78 | FT_Destroy_Class_cff_field_handlers( |
79 | library, container->cff_field_handlers ); |
80 | container->cff_field_handlers = NULL; |
81 | FT_FREE( container ); |
82 | pic_container->cff = NULL; |
83 | } |
84 | } |
85 | |
86 | |
87 | FT_Error |
88 | cff_driver_class_pic_init( FT_Library library ) |
89 | { |
90 | FT_PIC_Container* pic_container = &library->pic_container; |
91 | FT_Error error = FT_Err_Ok; |
92 | CffModulePIC* container = NULL; |
93 | FT_Memory memory = library->memory; |
94 | |
95 | |
96 | /* allocate pointer, clear and set global container pointer */ |
97 | if ( FT_ALLOC ( container, sizeof ( *container ) ) ) |
98 | return error; |
99 | FT_MEM_SET( container, 0, sizeof ( *container ) ); |
100 | pic_container->cff = container; |
101 | |
102 | /* initialize pointer table - */ |
103 | /* this is how the module usually expects this data */ |
104 | error = FT_Create_Class_cff_services( library, |
105 | &container->cff_services ); |
106 | if ( error ) |
107 | goto Exit; |
108 | |
109 | error = FT_Create_Class_cff_field_handlers( |
110 | library, &container->cff_field_handlers ); |
111 | if ( error ) |
112 | goto Exit; |
113 | |
114 | FT_Init_Class_cff_service_ps_info( |
115 | library, &container->cff_service_ps_info ); |
116 | FT_Init_Class_cff_service_glyph_dict( |
117 | library, &container->cff_service_glyph_dict ); |
118 | FT_Init_Class_cff_service_ps_name( |
119 | library, &container->cff_service_ps_name ); |
120 | FT_Init_Class_cff_service_get_cmap_info( |
121 | library, &container->cff_service_get_cmap_info ); |
122 | FT_Init_Class_cff_service_cid_info( |
123 | library, &container->cff_service_cid_info ); |
124 | FT_Init_Class_cff_cmap_encoding_class_rec( |
125 | library, &container->cff_cmap_encoding_class_rec ); |
126 | FT_Init_Class_cff_cmap_unicode_class_rec( |
127 | library, &container->cff_cmap_unicode_class_rec ); |
128 | |
129 | Exit: |
130 | if ( error ) |
131 | cff_driver_class_pic_free( library ); |
132 | return error; |
133 | } |
134 | |
135 | #endif /* FT_CONFIG_OPTION_PIC */ |
136 | |
137 | |
138 | /* END */ |
139 | |