afpic.c revision 727dee178a392d20eb050d0c446f2fcc29058fa1
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/*                                                                         */
7727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/*  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"
2341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#include "aferrors.h"
24295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
25727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
26295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifdef FT_CONFIG_OPTION_PIC
27295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
28295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* forward declaration of PIC init functions from afmodule.c */
29727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_Error
30727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_Create_Class_af_services( FT_Library           library,
31727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                               FT_ServiceDescRec**  output_class );
32727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
33727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  void
34727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_Destroy_Class_af_services( FT_Library          library,
35727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                FT_ServiceDescRec*  clazz );
36727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
37727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  void
38727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_Init_Class_af_service_properties( FT_Service_PropertiesRec*  clazz );
39727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
40727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  void FT_Init_Class_af_autofitter_interface(
41727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Library                   library,
42727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_AutoHinter_InterfaceRec*  clazz );
43727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
44295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
45295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* forward declaration of PIC init functions from script classes */
46295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "aflatin.h"
4741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#ifdef FT_OPTION_AUTOFIT2
48295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "aflatin2.h"
4941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#endif
50295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "afcjk.h"
51295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "afdummy.h"
52295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "afindic.h"
53295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
54727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
55295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  void
56aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  autofit_module_class_pic_free( FT_Library  library )
57295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  {
58aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_PIC_Container*  pic_container = &library->pic_container;
59aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Memory          memory        = library->memory;
60aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
61aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
62295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( pic_container->autofit )
63295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
64727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      AFModulePIC*  container = (AFModulePIC*)pic_container->autofit;
65727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
66727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
67727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( container->af_services )
68727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        FT_Destroy_Class_af_services( library,
69727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                      container->af_services );
70727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      container->af_services = NULL;
71727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
72727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      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;
83727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Error           error         = FT_Err_Ok;
84727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    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
94aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* initialize pointer table -                       */
95aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* this is how the module usually expects this data */
96727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    error = FT_Create_Class_af_services( library,
97727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                         &container->af_services );
98727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( error )
99727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Exit;
100727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
101727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Init_Class_af_service_properties( &container->af_service_properties );
102727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
103295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    for ( ss = 0 ; ss < AF_SCRIPT_CLASSES_REC_COUNT ; ss++ )
104295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
105aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      container->af_script_classes[ss] =
106aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        &container->af_script_classes_rec[ss];
107295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
108aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    container->af_script_classes[AF_SCRIPT_CLASSES_COUNT - 1] = NULL;
10941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
110295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* add call to initialization function when you add new scripts */
111295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ss = 0;
112aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Init_Class_af_dummy_script_class(
113aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      &container->af_script_classes_rec[ss++] );
114295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifdef FT_OPTION_AUTOFIT2
115aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Init_Class_af_latin2_script_class(
116aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      &container->af_script_classes_rec[ss++] );
117295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif
118aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Init_Class_af_latin_script_class(
119aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      &container->af_script_classes_rec[ss++] );
120aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Init_Class_af_cjk_script_class(
121aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      &container->af_script_classes_rec[ss++] );
122aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Init_Class_af_indic_script_class(
123aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      &container->af_script_classes_rec[ss++] );
124aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
125727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Init_Class_af_autofitter_interface(
126727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      library, &container->af_autofitter_interface );
127295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
128727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  Exit:
129aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( error )
130aeb407daf3711a10a27f3bc2223c5eb05158076eDavid '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