1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  cffpic.c                                                               */
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*    The FreeType position independent code services for cff module.      */
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  Copyright 2009, 2010, 2012, 2013 by                                    */
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  Oran Agra and Mickey Gabel.                                            */
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  This file is part of the FreeType project, and may only be used,       */
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  modified, and distributed under the terms of the FreeType project      */
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  this file you indicate that you have read the license and              */
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  understand and accept it fully.                                        */
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/ft2build.h"
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/freetype.h"
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftobjs.h"
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cffcmap.h"
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cffpic.h"
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cfferrs.h"
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_CONFIG_OPTION_PIC
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* forward declaration of PIC init functions from cffdrivr.c */
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Error
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Create_Class_cff_services( FT_Library           library,
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                FT_ServiceDescRec**  output_class );
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Destroy_Class_cff_services( FT_Library          library,
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                 FT_ServiceDescRec*  clazz );
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Init_Class_cff_service_ps_info( FT_Library             library,
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                     FT_Service_PsInfoRec*  clazz );
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Init_Class_cff_service_glyph_dict( FT_Library                library,
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        FT_Service_GlyphDictRec*  clazz );
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Init_Class_cff_service_ps_name( FT_Library                 library,
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                     FT_Service_PsFontNameRec*  clazz );
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Init_Class_cff_service_get_cmap_info( FT_Library              library,
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                           FT_Service_TTCMapsRec*  clazz );
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Init_Class_cff_service_cid_info( FT_Library          library,
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                      FT_Service_CIDRec*  clazz );
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* forward declaration of PIC init functions from cffparse.c */
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Error
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Create_Class_cff_field_handlers( FT_Library           library,
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                      CFF_Field_Handler**  output_class );
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Destroy_Class_cff_field_handlers( FT_Library          library,
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                       CFF_Field_Handler*  clazz );
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_driver_class_pic_free( FT_Library  library )
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_PIC_Container*  pic_container = &library->pic_container;
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Memory          memory        = library->memory;
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( pic_container->cff )
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      CffModulePIC*  container = (CffModulePIC*)pic_container->cff;
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( container->cff_services )
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_Destroy_Class_cff_services( library,
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                       container->cff_services );
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      container->cff_services = NULL;
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( container->cff_field_handlers )
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_Destroy_Class_cff_field_handlers(
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          library, container->cff_field_handlers );
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      container->cff_field_handlers = NULL;
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_FREE( container );
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      pic_container->cff = NULL;
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Error
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_driver_class_pic_init( FT_Library  library )
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_PIC_Container*  pic_container = &library->pic_container;
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error           error         = FT_Err_Ok;
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CffModulePIC*      container     = NULL;
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Memory          memory        = library->memory;
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* allocate pointer, clear and set global container pointer */
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( FT_ALLOC ( container, sizeof ( *container ) ) )
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return error;
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_MEM_SET( container, 0, sizeof ( *container ) );
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pic_container->cff = container;
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* initialize pointer table -                       */
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* this is how the module usually expects this data */
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    error = FT_Create_Class_cff_services( library,
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                          &container->cff_services );
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( error )
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      goto Exit;
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    error = FT_Create_Class_cff_field_handlers(
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov              library, &container->cff_field_handlers );
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( error )
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      goto Exit;
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Init_Class_cff_service_ps_info(
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      library, &container->cff_service_ps_info );
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Init_Class_cff_service_glyph_dict(
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      library, &container->cff_service_glyph_dict );
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Init_Class_cff_service_ps_name(
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      library, &container->cff_service_ps_name );
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Init_Class_cff_service_get_cmap_info(
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      library, &container->cff_service_get_cmap_info );
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Init_Class_cff_service_cid_info(
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      library, &container->cff_service_cid_info );
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Init_Class_cff_cmap_encoding_class_rec(
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      library, &container->cff_cmap_encoding_class_rec );
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Init_Class_cff_cmap_unicode_class_rec(
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      library, &container->cff_cmap_unicode_class_rec );
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  Exit:
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( error )
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      cff_driver_class_pic_free( library );
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* FT_CONFIG_OPTION_PIC */
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */
139