1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  afmodule.c                                                             */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    Auto-fitter module implementation (body).                            */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
79c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod/*  Copyright 2003-2006, 2009, 2011-2014 by                                */
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  This file is part of the FreeType project, and may only be used,       */
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  modified, and distributed under the terms of the FreeType project      */
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  this file you indicate that you have read the license and              */
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  understand and accept it fully.                                        */
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
19727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include "afglobal.h"
20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "afmodule.h"
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "afloader.h"
22727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include "aferrors.h"
23295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "afpic.h"
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
25aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#ifdef FT_DEBUG_AUTOFIT
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  int    _af_debug_disable_horz_hints;
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  int    _af_debug_disable_vert_hints;
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  int    _af_debug_disable_blue_hints;
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  void*  _af_debug_hints;
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_OBJECTS_H
33727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include FT_INTERNAL_DEBUG_H
34727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include FT_AUTOHINTER_H
35727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include FT_SERVICE_PROPERTIES_H
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
38727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*************************************************************************/
39727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*                                                                       */
40727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
41727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
42727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /* messages during execution.                                            */
43727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*                                                                       */
44727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#undef  FT_COMPONENT
45727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define FT_COMPONENT  trace_afmodule
46727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
47727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
489c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  static FT_Error
49727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  af_property_get_face_globals( FT_Face          face,
50727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                AF_FaceGlobals*  aglobals,
51727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                AF_Module        module )
52727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  {
53727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Error        error = FT_Err_Ok;
54727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    AF_FaceGlobals  globals;
55727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
56727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
57727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( !face )
58727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return FT_THROW( Invalid_Argument );
59727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
60727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    globals = (AF_FaceGlobals)face->autohint.data;
61727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( !globals )
62727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
639c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      /* trigger computation of the global style data */
649c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      /* in case it hasn't been done yet              */
65727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = af_face_globals_new( face, &globals, module );
66727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( !error )
67727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
68727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        face->autohint.data =
69727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          (FT_Pointer)globals;
70727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        face->autohint.finalizer =
71727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          (FT_Generic_Finalizer)af_face_globals_free;
72727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
73727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
74727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
75727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( !error )
76727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      *aglobals = globals;
77727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
78727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return error;
79727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  }
80727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
81727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
829c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  static FT_Error
83727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  af_property_set( FT_Module    ft_module,
84727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   const char*  property_name,
85727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   const void*  value )
86727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  {
87727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Error   error  = FT_Err_Ok;
88727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    AF_Module  module = (AF_Module)ft_module;
89727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
90727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
91727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( !ft_strcmp( property_name, "fallback-script" ) )
92727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
93727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      FT_UInt*  fallback_script = (FT_UInt*)value;
94727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
959c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      FT_UInt  ss;
96727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
979c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
989c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      /* We translate the fallback script to a fallback style that uses */
999c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      /* `fallback-script' as its script and `AF_COVERAGE_NONE' as its  */
1009c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      /* coverage value.                                                */
1019c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      for ( ss = 0; AF_STYLE_CLASSES_GET[ss]; ss++ )
1029c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      {
1039c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        AF_StyleClass  style_class = AF_STYLE_CLASSES_GET[ss];
1049c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
1059c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
1069c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        if ( (FT_UInt)style_class->script == *fallback_script &&
1079c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod             style_class->coverage == AF_COVERAGE_DEFAULT     )
1089c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        {
1099c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          module->fallback_style = ss;
1109c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          break;
1119c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        }
1129c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      }
1139c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
1149c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      if ( !AF_STYLE_CLASSES_GET[ss] )
1159c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      {
1169c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        FT_TRACE0(( "af_property_set: Invalid value %d for property `%s'\n",
1179c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                    fallback_script, property_name ));
1189c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        return FT_THROW( Invalid_Argument );
1199c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      }
1209c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
1219c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      return error;
1229c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    }
1239c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    else if ( !ft_strcmp( property_name, "default-script" ) )
1249c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    {
1259c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      FT_UInt*  default_script = (FT_UInt*)value;
1269c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
1279c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
1289c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      module->default_script = *default_script;
129727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
130727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return error;
131727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
132727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else if ( !ft_strcmp( property_name, "increase-x-height" ) )
133727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
134727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      FT_Prop_IncreaseXHeight*  prop = (FT_Prop_IncreaseXHeight*)value;
135727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      AF_FaceGlobals            globals;
136727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
137727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
138727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = af_property_get_face_globals( prop->face, &globals, module );
139727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( !error )
140727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        globals->increase_x_height = prop->limit;
141727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
142727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return error;
143727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
144727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
145727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_TRACE0(( "af_property_set: missing property `%s'\n",
146727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                property_name ));
147727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_THROW( Missing_Property );
148727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  }
149727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
150727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
1519c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  static FT_Error
152727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  af_property_get( FT_Module    ft_module,
153727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   const char*  property_name,
154727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   void*        value )
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1569c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    FT_Error   error          = FT_Err_Ok;
1579c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_Module  module         = (AF_Module)ft_module;
1589c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    FT_UInt    fallback_style = module->fallback_style;
1599c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    FT_UInt    default_script = module->default_script;
160727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
161727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
162727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( !ft_strcmp( property_name, "glyph-to-script-map" ) )
163727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
164727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      FT_Prop_GlyphToScriptMap*  prop = (FT_Prop_GlyphToScriptMap*)value;
165727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      AF_FaceGlobals             globals;
166727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
167727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
168727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = af_property_get_face_globals( prop->face, &globals, module );
169727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( !error )
1709c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod        prop->map = globals->glyph_styles;
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
172727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return error;
173727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
174727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else if ( !ft_strcmp( property_name, "fallback-script" ) )
175727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
176727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      FT_UInt*  val = (FT_UInt*)value;
177727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
1789c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      AF_StyleClass  style_class = AF_STYLE_CLASSES_GET[fallback_style];
1799c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
1809c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
1819c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      *val = style_class->script;
1829c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
1839c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      return error;
1849c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    }
1859c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    else if ( !ft_strcmp( property_name, "default-script" ) )
1869c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    {
1879c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      FT_UInt*  val = (FT_UInt*)value;
1889c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
189727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
1909c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      *val = default_script;
191727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
192727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return error;
193727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
194727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else if ( !ft_strcmp( property_name, "increase-x-height" ) )
195727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
196727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      FT_Prop_IncreaseXHeight*  prop = (FT_Prop_IncreaseXHeight*)value;
197727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      AF_FaceGlobals            globals;
198727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
199727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
200727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      error = af_property_get_face_globals( prop->face, &globals, module );
201727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( !error )
202727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        prop->limit = globals->increase_x_height;
203727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
204727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return error;
205727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
206727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
207727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
208727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_TRACE0(( "af_property_get: missing property `%s'\n",
209727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                property_name ));
210727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_THROW( Missing_Property );
211727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  }
212727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
213727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
214727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_DEFINE_SERVICE_PROPERTIESREC(
215727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    af_service_properties,
216727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    (FT_Properties_SetFunc)af_property_set,
217727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    (FT_Properties_GetFunc)af_property_get )
218727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
219727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
220727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_DEFINE_SERVICEDESCREC1(
221727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    af_services,
222727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_SERVICE_ID_PROPERTIES, &AF_SERVICE_PROPERTIES_GET )
223727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
224727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
225727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_CALLBACK_DEF( FT_Module_Interface )
226727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  af_get_interface( FT_Module    module,
227727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                    const char*  module_interface )
228727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  {
229727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* AF_SERVICES_GET derefers `library' in PIC mode */
230727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef FT_CONFIG_OPTION_PIC
231727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Library  library;
232727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
233727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
234727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( !module )
235727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return NULL;
236727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    library = module->library;
237727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( !library )
238727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return NULL;
239727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#else
240727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UNUSED( module );
241727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif
242727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
243727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return ft_service_list_lookup( AF_SERVICES_GET, module_interface );
244727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  }
245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_Error )
248727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  af_autofitter_init( FT_Module  ft_module )      /* AF_Module */
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
250727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    AF_Module  module = (AF_Module)ft_module;
251727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
252727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
2539c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    module->fallback_style = AF_STYLE_FALLBACK;
2549c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    module->default_script = AF_SCRIPT_DEFAULT;
255727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
256727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return af_loader_init( module );
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
261727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  af_autofitter_done( FT_Module  ft_module )      /* AF_Module */
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
263727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    AF_Module  module = (AF_Module)ft_module;
264727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
265727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
266727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    af_loader_done( module );
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_Error )
271727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  af_autofitter_load_glyph( AF_Module     module,
272727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                            FT_GlyphSlot  slot,
273727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                            FT_Size       size,
274727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                            FT_UInt       glyph_index,
275727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                            FT_Int32      load_flags )
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( size );
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
279727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return af_loader_load_glyph( module, slot->face,
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                 glyph_index, load_flags );
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
284727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_DEFINE_AUTOHINTER_INTERFACE(
285727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    af_autofitter_interface,
286727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    NULL,                                                    /* reset_face */
287727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    NULL,                                              /* get_global_hints */
288727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    NULL,                                             /* done_global_hints */
289727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    (FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph )  /* load_glyph */
290727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
292aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  FT_DEFINE_MODULE(
293aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    autofit_module_class,
294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_MODULE_HINTER,
296727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    sizeof ( AF_ModuleRec ),
297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "autofitter",
299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    0x10000L,   /* version 1.0 of the autofitter  */
300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    0x20000L,   /* requires FreeType 2.0 or above */
301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
302727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    (const void*)&AF_INTERFACE_GET,
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Module_Constructor)af_autofitter_init,
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_Module_Destructor) af_autofitter_done,
306727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    (FT_Module_Requester)  af_get_interface )
307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
310