Home | History | Annotate | Download | only in cff
      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