| /***************************************************************************/ |
| /* */ |
| /* autohint.h */ |
| /* */ |
| /* High-level `autohint' module-specific interface (specification). */ |
| /* */ |
| /* Copyright 1996-2015 by */ |
| /* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
| /* */ |
| /* This file is part of the FreeType project, and may only be used, */ |
| /* modified, and distributed under the terms of the FreeType project */ |
| /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
| /* this file you indicate that you have read the license and */ |
| /* understand and accept it fully. */ |
| /* */ |
| /***************************************************************************/ |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* The auto-hinter is used to load and automatically hint glyphs if a */ |
| /* format-specific hinter isn't available. */ |
| /* */ |
| /*************************************************************************/ |
| |
| |
| #ifndef __AUTOHINT_H__ |
| #define __AUTOHINT_H__ |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* A small technical note regarding automatic hinting in order to */ |
| /* clarify this module interface. */ |
| /* */ |
| /* An automatic hinter might compute two kinds of data for a given face: */ |
| /* */ |
| /* - global hints: Usually some metrics that describe global properties */ |
| /* of the face. It is computed by scanning more or less */ |
| /* aggressively the glyphs in the face, and thus can be */ |
| /* very slow to compute (even if the size of global */ |
| /* hints is really small). */ |
| /* */ |
| /* - glyph hints: These describe some important features of the glyph */ |
| /* outline, as well as how to align them. They are */ |
| /* generally much faster to compute than global hints. */ |
| /* */ |
| /* The current FreeType auto-hinter does a pretty good job while */ |
| /* performing fast computations for both global and glyph hints. */ |
| /* However, we might be interested in introducing more complex and */ |
| /* powerful algorithms in the future, like the one described in the John */ |
| /* D. Hobby paper, which unfortunately requires a lot more horsepower. */ |
| /* */ |
| /* Because a sufficiently sophisticated font management system would */ |
| /* typically implement an LRU cache of opened face objects to reduce */ |
| /* memory usage, it is a good idea to be able to avoid recomputing */ |
| /* global hints every time the same face is re-opened. */ |
| /* */ |
| /* We thus provide the ability to cache global hints outside of the face */ |
| /* object, in order to speed up font re-opening time. Of course, this */ |
| /* feature is purely optional, so most client programs won't even notice */ |
| /* it. */ |
| /* */ |
| /* I initially thought that it would be a good idea to cache the glyph */ |
| /* hints too. However, my general idea now is that if you really need */ |
| /* to cache these too, you are simply in need of a new font format, */ |
| /* where all this information could be stored within the font file and */ |
| /* decoded on the fly. */ |
| /* */ |
| /*************************************************************************/ |
| |
| |
| #include <ft2build.h> |
| #include FT_FREETYPE_H |
| |
| |
| FT_BEGIN_HEADER |
| |
| |
| typedef struct FT_AutoHinterRec_ *FT_AutoHinter; |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* <FuncType> */ |
| /* FT_AutoHinter_GlobalGetFunc */ |
| /* */ |
| /* <Description> */ |
| /* Retrieve the global hints computed for a given face object. The */ |
| /* resulting data is dissociated from the face and will survive a */ |
| /* call to FT_Done_Face(). It must be discarded through the API */ |
| /* FT_AutoHinter_GlobalDoneFunc(). */ |
| /* */ |
| /* <Input> */ |
| /* hinter :: A handle to the source auto-hinter. */ |
| /* */ |
| /* face :: A handle to the source face object. */ |
| /* */ |
| /* <Output> */ |
| /* global_hints :: A typeless pointer to the global hints. */ |
| /* */ |
| /* global_len :: The size in bytes of the global hints. */ |
| /* */ |
| typedef void |
| (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter hinter, |
| FT_Face face, |
| void** global_hints, |
| long* global_len ); |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* <FuncType> */ |
| /* FT_AutoHinter_GlobalDoneFunc */ |
| /* */ |
| /* <Description> */ |
| /* Discard the global hints retrieved through */ |
| /* FT_AutoHinter_GlobalGetFunc(). This is the only way these hints */ |
| /* are freed from memory. */ |
| /* */ |
| /* <Input> */ |
| /* hinter :: A handle to the auto-hinter module. */ |
| /* */ |
| /* global :: A pointer to retrieved global hints to discard. */ |
| /* */ |
| typedef void |
| (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter hinter, |
| void* global ); |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* <FuncType> */ |
| /* FT_AutoHinter_GlobalResetFunc */ |
| /* */ |
| /* <Description> */ |
| /* This function is used to recompute the global metrics in a given */ |
| /* font. This is useful when global font data changes (e.g. Multiple */ |
| /* Masters fonts where blend coordinates change). */ |
| /* */ |
| /* <Input> */ |
| /* hinter :: A handle to the source auto-hinter. */ |
| /* */ |
| /* face :: A handle to the face. */ |
| /* */ |
| typedef void |
| (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter hinter, |
| FT_Face face ); |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* <FuncType> */ |
| /* FT_AutoHinter_GlyphLoadFunc */ |
| /* */ |
| /* <Description> */ |
| /* This function is used to load, scale, and automatically hint a */ |
| /* glyph from a given face. */ |
| /* */ |
| /* <Input> */ |
| /* face :: A handle to the face. */ |
| /* */ |
| /* glyph_index :: The glyph index. */ |
| /* */ |
| /* load_flags :: The load flags. */ |
| /* */ |
| /* <Note> */ |
| /* This function is capable of loading composite glyphs by hinting */ |
| /* each sub-glyph independently (which improves quality). */ |
| /* */ |
| /* It will call the font driver with @FT_Load_Glyph, with */ |
| /* @FT_LOAD_NO_SCALE set. */ |
| /* */ |
| typedef FT_Error |
| (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter hinter, |
| FT_GlyphSlot slot, |
| FT_Size size, |
| FT_UInt glyph_index, |
| FT_Int32 load_flags ); |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* <Struct> */ |
| /* FT_AutoHinter_InterfaceRec */ |
| /* */ |
| /* <Description> */ |
| /* The auto-hinter module's interface. */ |
| /* */ |
| typedef struct FT_AutoHinter_InterfaceRec_ |
| { |
| FT_AutoHinter_GlobalResetFunc reset_face; |
| FT_AutoHinter_GlobalGetFunc get_global_hints; |
| FT_AutoHinter_GlobalDoneFunc done_global_hints; |
| FT_AutoHinter_GlyphLoadFunc load_glyph; |
| |
| } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface; |
| |
| |
| #ifndef FT_CONFIG_OPTION_PIC |
| |
| #define FT_DEFINE_AUTOHINTER_INTERFACE( \ |
| class_, \ |
| reset_face_, \ |
| get_global_hints_, \ |
| done_global_hints_, \ |
| load_glyph_ ) \ |
| FT_CALLBACK_TABLE_DEF \ |
| const FT_AutoHinter_InterfaceRec class_ = \ |
| { \ |
| reset_face_, \ |
| get_global_hints_, \ |
| done_global_hints_, \ |
| load_glyph_ \ |
| }; |
| |
| #else /* FT_CONFIG_OPTION_PIC */ |
| |
| #define FT_DEFINE_AUTOHINTER_INTERFACE( \ |
| class_, \ |
| reset_face_, \ |
| get_global_hints_, \ |
| done_global_hints_, \ |
| load_glyph_ ) \ |
| void \ |
| FT_Init_Class_ ## class_( FT_Library library, \ |
| FT_AutoHinter_InterfaceRec* clazz ) \ |
| { \ |
| FT_UNUSED( library ); \ |
| \ |
| clazz->reset_face = reset_face_; \ |
| clazz->get_global_hints = get_global_hints_; \ |
| clazz->done_global_hints = done_global_hints_; \ |
| clazz->load_glyph = load_glyph_; \ |
| } |
| |
| #endif /* FT_CONFIG_OPTION_PIC */ |
| |
| FT_END_HEADER |
| |
| #endif /* __AUTOHINT_H__ */ |
| |
| |
| /* END */ |