1 /***************************************************************************/ 2 /* */ 3 /* sfntpic.c */ 4 /* */ 5 /* The FreeType position independent code services for sfnt module. */ 6 /* */ 7 /* Copyright 2009, 2010 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 "sfntpic.h" 23 #include "sferrors.h" 24 25 #ifdef FT_CONFIG_OPTION_PIC 26 27 /* forward declaration of PIC init functions from sfdriver.c */ 28 FT_Error 29 FT_Create_Class_sfnt_services( FT_Library library, 30 FT_ServiceDescRec** ouput_class ); 31 32 void 33 FT_Destroy_Class_sfnt_services( FT_Library library, 34 FT_ServiceDescRec* clazz ); 35 36 void 37 FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec* clazz ); 38 39 void 40 FT_Init_Class_sfnt_interface( FT_Library library, 41 SFNT_Interface* clazz ); 42 43 void 44 FT_Init_Class_sfnt_service_glyph_dict( 45 FT_Library library, 46 FT_Service_GlyphDictRec* clazz ); 47 48 void 49 FT_Init_Class_sfnt_service_ps_name( 50 FT_Library library, 51 FT_Service_PsFontNameRec* clazz ); 52 53 void 54 FT_Init_Class_tt_service_get_cmap_info( 55 FT_Library library, 56 FT_Service_TTCMapsRec* clazz ); 57 58 void 59 FT_Init_Class_sfnt_service_sfnt_table( 60 FT_Service_SFNT_TableRec* clazz ); 61 62 /* forward declaration of PIC init functions from ttcmap.c */ 63 FT_Error 64 FT_Create_Class_tt_cmap_classes( FT_Library library, 65 TT_CMap_Class** output_class ); 66 67 void 68 FT_Destroy_Class_tt_cmap_classes( FT_Library library, 69 TT_CMap_Class* clazz ); 70 71 void sfnt_module_class_pic_free(FT_Library library)72 sfnt_module_class_pic_free( FT_Library library ) 73 { 74 FT_PIC_Container* pic_container = &library->pic_container; 75 FT_Memory memory = library->memory; 76 77 78 if ( pic_container->sfnt ) 79 { 80 sfntModulePIC* container = (sfntModulePIC*)pic_container->sfnt; 81 82 83 if ( container->sfnt_services ) 84 FT_Destroy_Class_sfnt_services( library, 85 container->sfnt_services ); 86 container->sfnt_services = NULL; 87 if ( container->tt_cmap_classes ) 88 FT_Destroy_Class_tt_cmap_classes( library, 89 container->tt_cmap_classes ); 90 container->tt_cmap_classes = NULL; 91 FT_FREE( container ); 92 pic_container->sfnt = NULL; 93 } 94 } 95 96 97 FT_Error sfnt_module_class_pic_init(FT_Library library)98 sfnt_module_class_pic_init( FT_Library library ) 99 { 100 FT_PIC_Container* pic_container = &library->pic_container; 101 FT_Error error = SFNT_Err_Ok; 102 sfntModulePIC* container; 103 FT_Memory memory = library->memory; 104 105 106 /* allocate pointer, clear and set global container pointer */ 107 if ( FT_ALLOC ( container, sizeof ( *container ) ) ) 108 return error; 109 FT_MEM_SET( container, 0, sizeof ( *container ) ); 110 pic_container->sfnt = container; 111 112 /* initialize pointer table - this is how the module usually expects this data */ 113 error = FT_Create_Class_sfnt_services( library, 114 &container->sfnt_services ); 115 if ( error ) 116 goto Exit; 117 error = FT_Create_Class_tt_cmap_classes( library, 118 &container->tt_cmap_classes ); 119 if ( error ) 120 goto Exit; 121 122 FT_Init_Class_sfnt_service_glyph_dict( 123 library, &container->sfnt_service_glyph_dict ); 124 FT_Init_Class_sfnt_service_ps_name( 125 library, &container->sfnt_service_ps_name ); 126 FT_Init_Class_tt_service_get_cmap_info( 127 library, &container->tt_service_get_cmap_info ); 128 FT_Init_Class_sfnt_service_sfnt_table( 129 &container->sfnt_service_sfnt_table ); 130 #ifdef TT_CONFIG_OPTION_BDF 131 FT_Init_Class_sfnt_service_bdf( &container->sfnt_service_bdf ); 132 #endif 133 FT_Init_Class_sfnt_interface( library, &container->sfnt_interface ); 134 135 Exit: 136 if ( error ) 137 sfnt_module_class_pic_free( library ); 138 return error; 139 } 140 141 142 143 #endif /* FT_CONFIG_OPTION_PIC */ 144 145 146 /* END */ 147