1295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/***************************************************************************/
2295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/*                                                                         */
3295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/*  afpic.c                                                                */
4295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/*                                                                         */
5295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/*    The FreeType position independent code services for autofit module.  */
6295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/*                                                                         */
7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang/*  Copyright 2009-2013 by                                                 */
8295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/*  Oran Agra and Mickey Gabel.                                            */
9295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/*                                                                         */
10295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/*  This file is part of the FreeType project, and may only be used,       */
11295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/*  modified, and distributed under the terms of the FreeType project      */
12295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/*  this file you indicate that you have read the license and              */
14295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/*  understand and accept it fully.                                        */
15295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/*                                                                         */
16295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/***************************************************************************/
17295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
18295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
19295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include <ft2build.h>
20295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include FT_FREETYPE_H
21295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include FT_INTERNAL_OBJECTS_H
22295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "afpic.h"
23e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#include "aferrors.h"
24295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
25a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
26295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifdef FT_CONFIG_OPTION_PIC
27295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
28295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* forward declaration of PIC init functions from afmodule.c */
29a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  FT_Error
30a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  FT_Create_Class_af_services( FT_Library           library,
31a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                               FT_ServiceDescRec**  output_class );
32a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
33a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  void
34a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  FT_Destroy_Class_af_services( FT_Library          library,
35a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                                FT_ServiceDescRec*  clazz );
36a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
37a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  void
38a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  FT_Init_Class_af_service_properties( FT_Service_PropertiesRec*  clazz );
39a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
40a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  void FT_Init_Class_af_autofitter_interface(
41a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_Library                   library,
42a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_AutoHinter_InterfaceRec*  clazz );
43a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
44295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
45295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* forward declaration of PIC init functions from script classes */
46295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "aflatin.h"
47e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#ifdef FT_OPTION_AUTOFIT2
48295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "aflatin2.h"
49e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#endif
50295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "afcjk.h"
51295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "afdummy.h"
52295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "afindic.h"
53295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
54a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
55295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  void
56c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  autofit_module_class_pic_free( FT_Library  library )
57295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  {
58c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_PIC_Container*  pic_container = &library->pic_container;
59c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_Memory          memory        = library->memory;
60c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
61c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
62295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( pic_container->autofit )
63295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
64a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      AFModulePIC*  container = (AFModulePIC*)pic_container->autofit;
65a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
66a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
67a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      if ( container->af_services )
68a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        FT_Destroy_Class_af_services( library,
69a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                                      container->af_services );
70a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      container->af_services = NULL;
71a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
72a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      FT_FREE( container );
73295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      pic_container->autofit = NULL;
74295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
75295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  }
76295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
77aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
78295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_Error
79aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  autofit_module_class_pic_init( FT_Library  library )
80295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  {
81aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_PIC_Container*  pic_container = &library->pic_container;
82aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_UInt            ss;
83a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_Error           error         = FT_Err_Ok;
84a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    AFModulePIC*       container     = NULL;
85aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_Memory          memory        = library->memory;
86aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
87295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
88295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* allocate pointer, clear and set global container pointer */
89295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( FT_ALLOC ( container, sizeof ( *container ) ) )
90295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return error;
91aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_MEM_SET( container, 0, sizeof ( *container ) );
92295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    pic_container->autofit = container;
93295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
94c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    /* initialize pointer table -                       */
95c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    /* this is how the module usually expects this data */
96a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    error = FT_Create_Class_af_services( library,
97a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                                         &container->af_services );
98a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    if ( error )
99a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      goto Exit;
100a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
101a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_Init_Class_af_service_properties( &container->af_service_properties );
102a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
103295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    for ( ss = 0 ; ss < AF_SCRIPT_CLASSES_REC_COUNT ; ss++ )
104295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
105c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner      container->af_script_classes[ss] =
106c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner        &container->af_script_classes_rec[ss];
107295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
108c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    container->af_script_classes[AF_SCRIPT_CLASSES_COUNT - 1] = NULL;
109e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
110295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* add call to initialization function when you add new scripts */
111295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ss = 0;
112c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_Init_Class_af_dummy_script_class(
113c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner      &container->af_script_classes_rec[ss++] );
114295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifdef FT_OPTION_AUTOFIT2
115c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_Init_Class_af_latin2_script_class(
116c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner      &container->af_script_classes_rec[ss++] );
117295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif
118c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_Init_Class_af_latin_script_class(
119c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner      &container->af_script_classes_rec[ss++] );
120c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_Init_Class_af_cjk_script_class(
121c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner      &container->af_script_classes_rec[ss++] );
122c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_Init_Class_af_indic_script_class(
123c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner      &container->af_script_classes_rec[ss++] );
124c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
125a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_Init_Class_af_autofitter_interface(
126a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      library, &container->af_autofitter_interface );
127295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
128a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  Exit:
129c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    if ( error )
130c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner      autofit_module_class_pic_free( library );
131295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    return error;
132295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  }
133295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
134295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif /* FT_CONFIG_OPTION_PIC */
135295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
136295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
137295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* END */
138