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 */