1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* cidobjs.c */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* CID objects manager (body). */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Copyright 1996-2006, 2008, 2010-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/ftdebug.h" 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftstream.h" 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cidgload.h" 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cidload.h" 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svpscmap.h" 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/psaux.h" 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/pshints.h" 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ciderrs.h" 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* messages during execution. */ 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_COMPONENT 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT trace_cidobjs 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* SLOT FUNCTIONS */ 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( void ) 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_slot_done( FT_GlyphSlot slot ) 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov slot->internal->glyph_hints = 0; 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( FT_Error ) 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_slot_init( FT_GlyphSlot slot ) 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CID_Face face; 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PSHinter_Service pshinter; 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face = (CID_Face)slot->face; 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pshinter = (PSHinter_Service)face->pshinter; 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( pshinter ) 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Module module; 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov module = FT_Get_Module( slot->face->driver->root.library, 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "pshinter" ); 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( module ) 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov T1_Hints_Funcs funcs; 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov funcs = pshinter->get_t1_funcs( module ); 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov slot->internal->glyph_hints = (void*)funcs; 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* SIZE FUNCTIONS */ 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static PSH_Globals_Funcs 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_size_get_globals_funcs( CID_Size size ) 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CID_Face face = (CID_Face)size->root.face; 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PSHinter_Service pshinter = (PSHinter_Service)face->pshinter; 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Module module; 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov module = FT_Get_Module( size->root.face->driver->root.library, 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "pshinter" ); 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ( module && pshinter && pshinter->get_globals_funcs ) 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ? pshinter->get_globals_funcs( module ) 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov : 0; 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( void ) 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_size_done( FT_Size cidsize ) /* CID_Size */ 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CID_Size size = (CID_Size)cidsize; 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cidsize->internal ) 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PSH_Globals_Funcs funcs; 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov funcs = cid_size_get_globals_funcs( size ); 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( funcs ) 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov funcs->destroy( (PSH_Globals)cidsize->internal ); 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidsize->internal = 0; 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( FT_Error ) 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_size_init( FT_Size cidsize ) /* CID_Size */ 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CID_Size size = (CID_Size)cidsize; 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PSH_Globals_Funcs funcs = cid_size_get_globals_funcs( size ); 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( funcs ) 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PSH_Globals globals; 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CID_Face face = (CID_Face)cidsize->face; 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CID_FaceDict dict = face->cid.font_dicts + face->root.face_index; 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PS_Private priv = &dict->private_dict; 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = funcs->create( cidsize->face->memory, priv, &globals ); 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidsize->internal = (FT_Size_Internal)(void*)globals; 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL( FT_Error ) 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_size_request( FT_Size size, 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Size_Request req ) 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PSH_Globals_Funcs funcs; 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Request_Metrics( size->face, req ); 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov funcs = cid_size_get_globals_funcs( (CID_Size)size ); 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( funcs ) 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov funcs->set_scale( (PSH_Globals)size->internal, 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size->metrics.x_scale, 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size->metrics.y_scale, 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, 0 ); 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FACE FUNCTIONS */ 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* cid_face_done */ 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Finalizes a given face object. */ 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* face :: A pointer to the face object to destroy. */ 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( void ) 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_face_done( FT_Face cidface ) /* CID_Face */ 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CID_Face face = (CID_Face)cidface; 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory; 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CID_FaceInfo cid; 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PS_FontInfo info; 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !face ) 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid = &face->cid; 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov info = &cid->font_info; 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memory = cidface->memory; 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* release subrs */ 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( face->subrs ) 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int n; 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( n = 0; n < cid->num_dicts; n++ ) 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CID_Subrs subr = face->subrs + n; 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( subr->code ) 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( subr->code[0] ); 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( subr->code ); 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( face->subrs ); 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* release FontInfo strings */ 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( info->version ); 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( info->notice ); 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( info->full_name ); 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( info->family_name ); 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( info->weight ); 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* release font dictionaries */ 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( cid->font_dicts ); 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid->num_dicts = 0; 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* release other strings */ 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( cid->cid_font_name ); 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( cid->registry ); 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( cid->ordering ); 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->family_name = 0; 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->style_name = 0; 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( face->binary_data ); 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( face->cid_stream ); 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* cid_face_init */ 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Initializes a given CID face object. */ 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* stream :: The source font stream. */ 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* face_index :: The index of the font face in the resource. */ 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* num_params :: Number of additional generic parameters. Ignored. */ 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* params :: Additional generic parameters. Ignored. */ 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <InOut> */ 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* face :: The newly built face object. */ 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Return> */ 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FreeType error code. 0 means success. */ 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( FT_Error ) 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_face_init( FT_Stream stream, 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Face cidface, /* CID_Face */ 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int face_index, 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int num_params, 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Parameter* params ) 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CID_Face face = (CID_Face)cidface; 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PSAux_Service psaux; 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PSHinter_Service pshinter; 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( num_params ); 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( params ); 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( stream ); 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->num_faces = 1; 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov psaux = (PSAux_Service)face->psaux; 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !psaux ) 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov psaux = (PSAux_Service)FT_Get_Module_Interface( 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FACE_LIBRARY( face ), "psaux" ); 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !psaux ) 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ERROR(( "cid_face_init: cannot access `psaux' module\n" )); 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_THROW( Missing_Module ); 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face->psaux = psaux; 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pshinter = (PSHinter_Service)face->pshinter; 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !pshinter ) 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pshinter = (PSHinter_Service)FT_Get_Module_Interface( 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FACE_LIBRARY( face ), "pshinter" ); 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov face->pshinter = pshinter; 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRACE2(( "CID driver\n" )); 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* open the tokenizer; this will also check the font format */ 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_STREAM_SEEK( 0 ) ) 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = cid_face_open( face, face_index ); 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* if we just wanted to check the format, leave successfully now */ 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( face_index < 0 ) 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* check the face index */ 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* XXX: handle CID fonts with more than a single face */ 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( face_index != 0 ) 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ERROR(( "cid_face_init: invalid face index\n" )); 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_THROW( Invalid_Argument ); 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* now load the font program into the face object */ 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* initialize the face object fields */ 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* set up root face fields */ 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CID_FaceInfo cid = &face->cid; 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PS_FontInfo info = &cid->font_info; 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->num_glyphs = cid->cid_count; 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->num_charmaps = 0; 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->face_index = face_index; 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->face_flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */ 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FACE_FLAG_HINTER; /* has native hinter */ 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( info->is_fixed_pitch ) 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* XXX: TODO: add kerning with .afm support */ 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* get style name -- be careful, some broken fonts only */ 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* have a /FontName dictionary entry! */ 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->family_name = info->family_name; 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* assume "Regular" style if we don't know better */ 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->style_name = (char *)"Regular"; 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cidface->family_name ) 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* full = info->full_name; 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* family = cidface->family_name; 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( full ) 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while ( *full ) 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( *full == *family ) 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov family++; 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov full++; 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( *full == ' ' || *full == '-' ) 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov full++; 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else if ( *family == ' ' || *family == '-' ) 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov family++; 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !*family ) 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->style_name = full; 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* do we have a `/FontName'? */ 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cid->cid_font_name ) 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->family_name = cid->cid_font_name; 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* compute style flags */ 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->style_flags = 0; 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( info->italic_angle ) 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->style_flags |= FT_STYLE_FLAG_ITALIC; 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( info->weight ) 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !ft_strcmp( info->weight, "Bold" ) || 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov !ft_strcmp( info->weight, "Black" ) ) 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->style_flags |= FT_STYLE_FLAG_BOLD; 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* no embedded bitmap support */ 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->num_fixed_sizes = 0; 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->available_sizes = 0; 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->bbox.xMin = cid->font_bbox.xMin >> 16; 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->bbox.yMin = cid->font_bbox.yMin >> 16; 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* no `U' suffix here to 0xFFFF! */ 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFF ) >> 16; 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFF ) >> 16; 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !cidface->units_per_EM ) 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->units_per_EM = 1000; 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->ascender = (FT_Short)( cidface->bbox.yMax ); 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->descender = (FT_Short)( cidface->bbox.yMin ); 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 ); 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cidface->height < cidface->ascender - cidface->descender ) 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->height = (FT_Short)( cidface->ascender - cidface->descender ); 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->underline_position = (FT_Short)info->underline_position; 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cidface->underline_thickness = (FT_Short)info->underline_thickness; 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Exit: 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* cid_driver_init */ 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Initializes a given CID driver object. */ 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* driver :: A handle to the target driver object. */ 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Return> */ 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FreeType error code. 0 means success. */ 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( FT_Error ) 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_driver_init( FT_Module driver ) 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( driver ); 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* cid_driver_done */ 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Finalizes a given CID driver. */ 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* driver :: A handle to the target CID driver. */ 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( void ) 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cid_driver_done( FT_Module driver ) 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( driver ); 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 492