1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* t1objs.c */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Type 1 objects manager (body). */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Copyright 1996-2009, 2011, 2013 by */ 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This file is part of the FreeType project, and may only be used, */ 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* modified, and distributed under the terms of the FreeType project */ 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* this file you indicate that you have read the license and */ 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* understand and accept it fully. */ 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/ft2build.h" 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftcalc.h" 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftdebug.h" 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftstream.h" 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/ttnameid.h" 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "t1gload.h" 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "t1load.h" 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "t1errors.h" 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef T1_CONFIG_OPTION_NO_AFM 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "t1afm.h" 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svpscmap.h" 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/psaux.h" 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* messages during execution. */ 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_COMPONENT 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT trace_t1objs 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* SIZE FUNCTIONS */ 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* note that we store the global hints in the size's "internal" root */ 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* field */ 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static PSH_Globals_Funcs 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Size_Get_Globals_Funcs( T1_Size size ) 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face face = (T1_Face)size->root.face; 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PSHinter_Service pshinter = (PSHinter_Service)face->pshinter; 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Module module; 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov module = FT_Get_Module( size->root.face->driver->root.library, 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "pshinter" ); 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ( module && pshinter && pshinter->get_globals_funcs ) 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ? pshinter->get_globals_funcs( module ) 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov : 0 ; 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( void ) 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Size_Done( FT_Size t1size ) /* T1_Size */ 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Size size = (T1_Size)t1size; 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( size->root.internal ) 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PSH_Globals_Funcs funcs; 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov funcs = T1_Size_Get_Globals_Funcs( size ); 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( funcs ) 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov funcs->destroy( (PSH_Globals)size->root.internal ); 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size->root.internal = 0; 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( FT_Error ) 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Size_Init( FT_Size t1size ) /* T1_Size */ 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Size size = (T1_Size)t1size; 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size ); 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( funcs ) 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PSH_Globals globals; 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face face = (T1_Face)size->root.face; 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = funcs->create( size->root.face->memory, 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &face->type1.private_dict, &globals ); 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size->root.internal = (FT_Size_Internal)(void*)globals; 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( FT_Error ) 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Size_Request( FT_Size t1size, /* T1_Size */ 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Size_Request req ) 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Size size = (T1_Size)t1size; 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size ); 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Request_Metrics( size->root.face, req ); 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( funcs ) 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov funcs->set_scale( (PSH_Globals)size->root.internal, 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size->root.metrics.x_scale, 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size->root.metrics.y_scale, 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, 0 ); 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* SLOT FUNCTIONS */ 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( void ) 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_GlyphSlot_Done( FT_GlyphSlot slot ) 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov slot->internal->glyph_hints = 0; 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( FT_Error ) 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_GlyphSlot_Init( FT_GlyphSlot slot ) 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face face; 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PSHinter_Service pshinter; 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = (T1_Face)slot->face; 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pshinter = (PSHinter_Service)face->pshinter; 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( pshinter ) 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Module module; 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov module = FT_Get_Module( slot->face->driver->root.library, 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "pshinter" ); 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( module ) 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Hints_Funcs funcs; 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov funcs = pshinter->get_t1_funcs( module ); 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov slot->internal->glyph_hints = (void*)funcs; 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FACE FUNCTIONS */ 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* T1_Face_Done */ 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The face object destructor. */ 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* face :: A typeless pointer to the face object to destroy. */ 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( void ) 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face_Done( FT_Face t1face ) /* T1_Face */ 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face face = (T1_Face)t1face; 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory; 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Font type1; 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !face ) 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memory = face->root.memory; 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov type1 = &face->type1; 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* release multiple masters information */ 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) ); 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( face->buildchar ) 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( face->buildchar ); 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face->buildchar = NULL; 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face->len_buildchar = 0; 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Done_Blend( face ); 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face->blend = 0; 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* release font info strings */ 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PS_FontInfo info = &type1->font_info; 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( info->version ); 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( info->notice ); 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( info->full_name ); 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( info->family_name ); 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( info->weight ); 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* release top dictionary */ 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( type1->charstrings_len ); 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( type1->charstrings ); 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( type1->glyph_names ); 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( type1->subrs ); 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( type1->subrs_len ); 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( type1->subrs_block ); 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( type1->charstrings_block ); 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( type1->glyph_names_block ); 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( type1->encoding.char_index ); 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( type1->encoding.char_name ); 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( type1->font_name ); 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef T1_CONFIG_OPTION_NO_AFM 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* release afm data if present */ 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( face->afm_data ) 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data ); 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* release unicode map, if any */ 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( face->unicode_map_rec.maps ); 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face->unicode_map_rec.num_maps = 0; 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face->unicode_map = NULL; 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face->root.family_name = NULL; 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face->root.style_name = NULL; 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* T1_Face_Init */ 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The face object constructor. */ 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* stream :: input stream where to load font data. */ 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* face_index :: The index of the font face in the resource. */ 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* num_params :: Number of additional generic parameters. Ignored. */ 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* params :: Additional generic parameters. Ignored. */ 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <InOut> */ 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* face :: The face record to build. */ 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Return> */ 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FreeType error code. 0 means success. */ 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( FT_Error ) 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face_Init( FT_Stream stream, 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Face t1face, /* T1_Face */ 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int face_index, 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int num_params, 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Parameter* params ) 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Face face = (T1_Face)t1face; 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_PsCMaps psnames; 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PSAux_Service psaux; 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Font type1 = &face->type1; 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PS_FontInfo info = &type1->font_info; 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( num_params ); 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( params ); 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( stream ); 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face->root.num_faces = 1; 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face->psnames = psnames; 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "psaux" ); 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov psaux = (PSAux_Service)face->psaux; 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !psaux ) 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ERROR(( "T1_Face_Init: cannot access `psaux' module\n" )); 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_THROW( Missing_Module ); 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "pshinter" ); 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRACE2(( "Type 1 driver\n" )); 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* open the tokenizer; this will also check the font format */ 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = T1_Open_Face( face ); 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* if we just wanted to check the format, leave successfully now */ 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( face_index < 0 ) 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* check the face index */ 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( face_index > 0 ) 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ERROR(( "T1_Face_Init: invalid face index\n" )); 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_THROW( Invalid_Argument ); 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* now load the font program into the face object */ 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* initialize the face object fields */ 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* set up root face fields */ 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Face root = (FT_Face)&face->root; 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->num_glyphs = type1->num_glyphs; 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->face_index = 0; 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->face_flags = FT_FACE_FLAG_SCALABLE | 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FACE_FLAG_HORIZONTAL | 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FACE_FLAG_GLYPH_NAMES | 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FACE_FLAG_HINTER; 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( info->is_fixed_pitch ) 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( face->blend ) 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* XXX: TODO -- add kerning with .afm support */ 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The following code to extract the family and the style is very */ 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* simplistic and might get some things wrong. For a full-featured */ 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* algorithm you might have a look at the whitepaper given at */ 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* http://blogs.msdn.com/text/archive/2007/04/23/wpf-font-selection-model.aspx */ 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* get style name -- be careful, some broken fonts only */ 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* have a `/FontName' dictionary entry! */ 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->family_name = info->family_name; 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->style_name = NULL; 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( root->family_name ) 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* full = info->full_name; 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* family = root->family_name; 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( full ) 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bool the_same = TRUE; 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while ( *full ) 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( *full == *family ) 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov family++; 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov full++; 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( *full == ' ' || *full == '-' ) 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov full++; 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else if ( *family == ' ' || *family == '-' ) 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov family++; 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov the_same = FALSE; 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !*family ) 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->style_name = full; 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( the_same ) 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->style_name = (char *)"Regular"; 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* do we have a `/FontName'? */ 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( type1->font_name ) 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->family_name = type1->font_name; 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !root->style_name ) 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( info->weight ) 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->style_name = info->weight; 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* assume `Regular' style because we don't know better */ 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->style_name = (char *)"Regular"; 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* compute style flags */ 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->style_flags = 0; 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( info->italic_angle ) 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->style_flags |= FT_STYLE_FLAG_ITALIC; 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( info->weight ) 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !ft_strcmp( info->weight, "Bold" ) || 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov !ft_strcmp( info->weight, "Black" ) ) 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->style_flags |= FT_STYLE_FLAG_BOLD; 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* no embedded bitmap support */ 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->num_fixed_sizes = 0; 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->available_sizes = 0; 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->bbox.xMin = type1->font_bbox.xMin >> 16; 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->bbox.yMin = type1->font_bbox.yMin >> 16; 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* no `U' suffix here to 0xFFFF! */ 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFF ) >> 16; 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFF ) >> 16; 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Set units_per_EM if we didn't set it in t1_parse_font_matrix. */ 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !root->units_per_EM ) 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->units_per_EM = 1000; 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->ascender = (FT_Short)( root->bbox.yMax ); 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->descender = (FT_Short)( root->bbox.yMin ); 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->height = (FT_Short)( ( root->units_per_EM * 12 ) / 10 ); 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( root->height < root->ascender - root->descender ) 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->height = (FT_Short)( root->ascender - root->descender ); 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* now compute the maximum advance width */ 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->max_advance_width = 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Short)( root->bbox.xMax ); 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Pos max_advance; 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = T1_Compute_Max_Advance( face, &max_advance ); 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* in case of error, keep the standard width */ 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->max_advance_width = (FT_Short)FIXED_TO_INT( max_advance ); 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Err_Ok; /* clear error */ 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->max_advance_height = root->height; 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->underline_position = (FT_Short)info->underline_position; 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->underline_thickness = (FT_Short)info->underline_thickness; 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Face root = &face->root; 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( psnames ) 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CharMapRec charmap; 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_CMap_Classes cmap_classes = psaux->t1_cmap_classes; 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CMap_Class clazz; 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charmap.face = root; 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* first of all, try to synthesize a Unicode charmap */ 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charmap.platform_id = TT_PLATFORM_MICROSOFT; 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charmap.encoding_id = TT_MS_ID_UNICODE_CS; 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charmap.encoding = FT_ENCODING_UNICODE; 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL ); 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error && 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) ) 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Err_Ok; 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* now, generate an Adobe Standard encoding when appropriate */ 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charmap.platform_id = TT_PLATFORM_ADOBE; 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov clazz = NULL; 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch ( type1->encoding_type ) 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case T1_ENCODING_TYPE_STANDARD: 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charmap.encoding = FT_ENCODING_ADOBE_STANDARD; 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charmap.encoding_id = TT_ADOBE_ID_STANDARD; 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov clazz = cmap_classes->standard; 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case T1_ENCODING_TYPE_EXPERT: 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charmap.encoding = FT_ENCODING_ADOBE_EXPERT; 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charmap.encoding_id = TT_ADOBE_ID_EXPERT; 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov clazz = cmap_classes->expert; 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case T1_ENCODING_TYPE_ARRAY: 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charmap.encoding = FT_ENCODING_ADOBE_CUSTOM; 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charmap.encoding_id = TT_ADOBE_ID_CUSTOM; 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov clazz = cmap_classes->custom; 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case T1_ENCODING_TYPE_ISOLATIN1: 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charmap.encoding = FT_ENCODING_ADOBE_LATIN_1; 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charmap.encoding_id = TT_ADOBE_ID_LATIN_1; 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov clazz = cmap_classes->unicode; 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ; 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( clazz ) 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_CMap_New( clazz, NULL, &charmap, NULL ); 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Select default charmap */ 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (root->num_charmaps) 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov root->charmap = root->charmaps[0]; 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Exit: 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* T1_Driver_Init */ 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Initializes a given Type 1 driver object. */ 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* driver :: A handle to the target driver object. */ 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Return> */ 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FreeType error code. 0 means success. */ 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( FT_Error ) 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Driver_Init( FT_Module driver ) 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( driver ); 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* T1_Driver_Done */ 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Finalizes a given Type 1 driver. */ 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* driver :: A handle to the target Type 1 driver. */ 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( void ) 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Driver_Done( FT_Module driver ) 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( driver ); 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 617