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