1 /***************************************************************************/ 2 /* */ 3 /* afpic.c */ 4 /* */ 5 /* The FreeType position independent code services for autofit module. */ 6 /* */ 7 /* Copyright 2009-2013 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 "aferrors.h" 24 25 26 #ifdef FT_CONFIG_OPTION_PIC 27 28 /* forward declaration of PIC init functions from afmodule.c */ 29 FT_Error 30 FT_Create_Class_af_services( FT_Library library, 31 FT_ServiceDescRec** output_class ); 32 33 void 34 FT_Destroy_Class_af_services( FT_Library library, 35 FT_ServiceDescRec* clazz ); 36 37 void 38 FT_Init_Class_af_service_properties( FT_Service_PropertiesRec* clazz ); 39 40 void FT_Init_Class_af_autofitter_interface( 41 FT_Library library, 42 FT_AutoHinter_InterfaceRec* clazz ); 43 44 45 /* forward declaration of PIC init functions from script classes */ 46 #include "aflatin.h" 47 #ifdef FT_OPTION_AUTOFIT2 48 #include "aflatin2.h" 49 #endif 50 #include "afcjk.h" 51 #include "afdummy.h" 52 #include "afindic.h" 53 54 55 void 56 autofit_module_class_pic_free( FT_Library library ) 57 { 58 FT_PIC_Container* pic_container = &library->pic_container; 59 FT_Memory memory = library->memory; 60 61 62 if ( pic_container->autofit ) 63 { 64 AFModulePIC* container = (AFModulePIC*)pic_container->autofit; 65 66 67 if ( container->af_services ) 68 FT_Destroy_Class_af_services( library, 69 container->af_services ); 70 container->af_services = NULL; 71 72 FT_FREE( container ); 73 pic_container->autofit = NULL; 74 } 75 } 76 77 78 FT_Error 79 autofit_module_class_pic_init( FT_Library library ) 80 { 81 FT_PIC_Container* pic_container = &library->pic_container; 82 FT_UInt ss; 83 FT_Error error = FT_Err_Ok; 84 AFModulePIC* container = NULL; 85 FT_Memory memory = library->memory; 86 87 88 /* allocate pointer, clear and set global container pointer */ 89 if ( FT_ALLOC ( container, sizeof ( *container ) ) ) 90 return error; 91 FT_MEM_SET( container, 0, sizeof ( *container ) ); 92 pic_container->autofit = container; 93 94 /* initialize pointer table - */ 95 /* this is how the module usually expects this data */ 96 error = FT_Create_Class_af_services( library, 97 &container->af_services ); 98 if ( error ) 99 goto Exit; 100 101 FT_Init_Class_af_service_properties( &container->af_service_properties ); 102 103 for ( ss = 0 ; ss < AF_SCRIPT_CLASSES_REC_COUNT ; ss++ ) 104 { 105 container->af_script_classes[ss] = 106 &container->af_script_classes_rec[ss]; 107 } 108 container->af_script_classes[AF_SCRIPT_CLASSES_COUNT - 1] = NULL; 109 110 /* add call to initialization function when you add new scripts */ 111 ss = 0; 112 FT_Init_Class_af_dummy_script_class( 113 &container->af_script_classes_rec[ss++] ); 114 #ifdef FT_OPTION_AUTOFIT2 115 FT_Init_Class_af_latin2_script_class( 116 &container->af_script_classes_rec[ss++] ); 117 #endif 118 FT_Init_Class_af_latin_script_class( 119 &container->af_script_classes_rec[ss++] ); 120 FT_Init_Class_af_cjk_script_class( 121 &container->af_script_classes_rec[ss++] ); 122 FT_Init_Class_af_indic_script_class( 123 &container->af_script_classes_rec[ss++] ); 124 125 FT_Init_Class_af_autofitter_interface( 126 library, &container->af_autofitter_interface ); 127 128 Exit: 129 if ( error ) 130 autofit_module_class_pic_free( library ); 131 return error; 132 } 133 134 #endif /* FT_CONFIG_OPTION_PIC */ 135 136 137 /* END */ 138