afpic.c revision ec0bab5697bb31ba980810145f62e3799946ec60
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 */
46ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef  WRITING_SYSTEM
47ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define WRITING_SYSTEM( ws, WS )  /* empty */
48ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
49ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "afwrtsys.h"
50295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
51727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
52295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  void
53aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  autofit_module_class_pic_free( FT_Library  library )
54295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  {
55aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_PIC_Container*  pic_container = &library->pic_container;
56aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Memory          memory        = library->memory;
57aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
58aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
59295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( pic_container->autofit )
60295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
61727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      AFModulePIC*  container = (AFModulePIC*)pic_container->autofit;
62727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
63727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
64727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( container->af_services )
65727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        FT_Destroy_Class_af_services( library,
66727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                      container->af_services );
67727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      container->af_services = NULL;
68727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
69727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      FT_FREE( container );
70295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      pic_container->autofit = NULL;
71295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
72295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  }
73295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
74aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
75295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_Error
76aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  autofit_module_class_pic_init( FT_Library  library )
77295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  {
78aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_PIC_Container*  pic_container = &library->pic_container;
79aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_UInt            ss;
80727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Error           error         = FT_Err_Ok;
81727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    AFModulePIC*       container     = NULL;
82aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_Memory          memory        = library->memory;
83aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
84295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
85295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* allocate pointer, clear and set global container pointer */
86295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( FT_ALLOC ( container, sizeof ( *container ) ) )
87295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return error;
88aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_MEM_SET( container, 0, sizeof ( *container ) );
89295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    pic_container->autofit = container;
90295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
91aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* initialize pointer table -                       */
92aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* this is how the module usually expects this data */
93727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    error = FT_Create_Class_af_services( library,
94727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                         &container->af_services );
95727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( error )
96727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Exit;
97727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
98727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Init_Class_af_service_properties( &container->af_service_properties );
99727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
100ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    for ( ss = 0; ss < AF_WRITING_SYSTEM_MAX - 1; ss++ )
101ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      container->af_writing_system_classes[ss] =
102ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        &container->af_writing_system_classes_rec[ss];
103ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    container->af_writing_system_classes[AF_WRITING_SYSTEM_MAX - 1] = NULL;
104ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
105ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    for ( ss = 0; ss < AF_SCRIPT_MAX - 1; ss++ )
106aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      container->af_script_classes[ss] =
107aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        &container->af_script_classes_rec[ss];
108ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    container->af_script_classes[AF_SCRIPT_MAX - 1] = NULL;
109ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
110ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef  WRITING_SYSTEM
111ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define WRITING_SYSTEM( ws, WS )                             \
112ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        FT_Init_Class_af_ ## ws ## _writing_system_class(    \
113ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          &container->af_writing_system_classes_rec[ss++] );
114ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
115ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    ss = 0;
116ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "afwrtsys.h"
117ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
118ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef  SCRIPT
119ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define SCRIPT( s, S, d )                            \
120ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        FT_Init_Class_af_ ## s ## _script_class(     \
121ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          &container->af_script_classes_rec[ss++] );
12241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
123295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ss = 0;
124ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "afscript.h"
125aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
126727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Init_Class_af_autofitter_interface(
127727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      library, &container->af_autofitter_interface );
128295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
129727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  Exit:
130aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( error )
131aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      autofit_module_class_pic_free( library );
132295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    return error;
133295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  }
134295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
135295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif /* FT_CONFIG_OPTION_PIC */
136295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
137295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
138295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* END */
139