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/*                                                                         */
7a2527749993cb7f25560e4b1266787f1874435d4Jungshik Shin/*  Copyright 2009-2017 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"
239c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#include "afglobal.h"
2441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#include "aferrors.h"
25295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
26727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
27295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifdef FT_CONFIG_OPTION_PIC
28295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
29295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  /* forward declaration of PIC init functions from afmodule.c */
30727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_Error
31727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_Create_Class_af_services( FT_Library           library,
32727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                               FT_ServiceDescRec**  output_class );
33727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
34727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  void
35727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_Destroy_Class_af_services( FT_Library          library,
36727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                FT_ServiceDescRec*  clazz );
37727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
38727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  void
39727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_Init_Class_af_service_properties( FT_Service_PropertiesRec*  clazz );
40727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
41727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  void FT_Init_Class_af_autofitter_interface(
42727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Library                   library,
43727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_AutoHinter_InterfaceRec*  clazz );
44727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
45295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
469c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /* forward declaration of PIC init functions from writing system classes */
47ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef  WRITING_SYSTEM
48ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define WRITING_SYSTEM( ws, WS )  /* empty */
49ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
50ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "afwrtsys.h"
51295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
52727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
53295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  void
54aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  autofit_module_class_pic_free( FT_Library  library )
55295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  {
56aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_PIC_Container*  pic_container = &library->pic_container;
57aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Memory          memory        = library->memory;
58aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
59aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
60295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( pic_container->autofit )
61295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
62727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      AFModulePIC*  container = (AFModulePIC*)pic_container->autofit;
63727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
64727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
65727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( container->af_services )
66727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        FT_Destroy_Class_af_services( library,
67727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                      container->af_services );
68727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      container->af_services = NULL;
69727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
70727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      FT_FREE( container );
71295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      pic_container->autofit = NULL;
72295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
73295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  }
74295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
75aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
76295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_Error
77aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  autofit_module_class_pic_init( FT_Library  library )
78295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  {
79aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_PIC_Container*  pic_container = &library->pic_container;
80aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_UInt            ss;
81727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Error           error         = FT_Err_Ok;
82727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    AFModulePIC*       container     = NULL;
83aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_Memory          memory        = library->memory;
84aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
85295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
86295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* allocate pointer, clear and set global container pointer */
87295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( FT_ALLOC ( container, sizeof ( *container ) ) )
88295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return error;
89aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_MEM_SET( container, 0, sizeof ( *container ) );
90295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    pic_container->autofit = container;
91295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
92aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* initialize pointer table -                       */
93aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* this is how the module usually expects this data */
94727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    error = FT_Create_Class_af_services( library,
95727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                         &container->af_services );
96727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( error )
97727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Exit;
98727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
99727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Init_Class_af_service_properties( &container->af_service_properties );
100727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
1019c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    for ( ss = 0; ss < AF_WRITING_SYSTEM_MAX; ss++ )
102ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      container->af_writing_system_classes[ss] =
103ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        &container->af_writing_system_classes_rec[ss];
1049c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    container->af_writing_system_classes[AF_WRITING_SYSTEM_MAX] = NULL;
105ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1069c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    for ( ss = 0; ss < AF_SCRIPT_MAX; ss++ )
107aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      container->af_script_classes[ss] =
108aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        &container->af_script_classes_rec[ss];
1099c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    container->af_script_classes[AF_SCRIPT_MAX] = NULL;
1109c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
1119c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    for ( ss = 0; ss < AF_STYLE_MAX; ss++ )
1129c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      container->af_style_classes[ss] =
1139c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        &container->af_style_classes_rec[ss];
1149c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    container->af_style_classes[AF_STYLE_MAX] = NULL;
115ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
116ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef  WRITING_SYSTEM
117ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define WRITING_SYSTEM( ws, WS )                             \
118ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        FT_Init_Class_af_ ## ws ## _writing_system_class(    \
119ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          &container->af_writing_system_classes_rec[ss++] );
120ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
121ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    ss = 0;
122ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "afwrtsys.h"
123ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
124ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef  SCRIPT
125055aee28cedc3631434b2636fc6093c0d4d818abJungshik Shin#define SCRIPT( s, S, d, h, H, sss )                 \
126ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        FT_Init_Class_af_ ## s ## _script_class(     \
127ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          &container->af_script_classes_rec[ss++] );
12841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
129295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    ss = 0;
130ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "afscript.h"
131aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
1329c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#undef  STYLE
1339c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#define STYLE( s, S, d, ws, sc, bss, c )            \
1349c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        FT_Init_Class_af_ ## s ## _style_class(     \
1359c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          &container->af_style_classes_rec[ss++] );
1369c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
1379c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ss = 0;
1389c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#include "afstyles.h"
1399c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
140727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Init_Class_af_autofitter_interface(
141727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      library, &container->af_autofitter_interface );
142295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
143727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  Exit:
144aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( error )
145aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      autofit_module_class_pic_free( library );
146295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    return error;
147295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  }
148295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
149295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif /* FT_CONFIG_OPTION_PIC */
150295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
151295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
152295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* END */
153