1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* cffcmap.c */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* CFF character mapping table (cmap) support (body). */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Copyright 2002-2007, 2010, 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 "cffcmap.h" 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cffload.h" 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cfferrs.h" 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /***** *****/ 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/ 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /***** *****/ 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_Error ) 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_cmap_encoding_init( CFF_CMapStd cmap ) 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Font cff = (CFF_Font)face->extra.data; 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Encoding encoding = &cff->encoding; 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->gids = encoding->codes; 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( void ) 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_cmap_encoding_done( CFF_CMapStd cmap ) 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->gids = NULL; 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_UInt ) 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_cmap_encoding_char_index( CFF_CMapStd cmap, 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt32 char_code ) 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt result = 0; 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( char_code < 256 ) 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result = cmap->gids[char_code]; 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return result; 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_UInt32 ) 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_cmap_encoding_char_next( CFF_CMapStd cmap, 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt32 *pchar_code ) 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt result = 0; 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt32 char_code = *pchar_code; 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pchar_code = 0; 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( char_code < 255 ) 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt code = (FT_UInt)(char_code + 1); 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (;;) 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( code >= 256 ) 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result = cmap->gids[code]; 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( result != 0 ) 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pchar_code = code; 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov code++; 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return result; 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec, 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( CFF_CMapStdRec ), 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_InitFunc) cff_cmap_encoding_init, 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_DoneFunc) cff_cmap_encoding_done, 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index, 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next, 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov NULL, NULL, NULL, NULL, NULL 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /***** *****/ 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /***** *****/ 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( const char* ) 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_sid_to_glyph_name( TT_Face face, 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt idx ) 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Font cff = (CFF_Font)face->extra.data; 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Charset charset = &cff->charset; 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt sid = charset->sids[idx]; 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return cff_index_get_sid_string( cff, sid ); 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_Error ) 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_cmap_unicode_init( PS_Unicodes unicodes ) 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory = FT_FACE_MEMORY( face ); 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Font cff = (CFF_Font)face->extra.data; 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Charset charset = &cff->charset; 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* can't build Unicode map for CID-keyed font */ 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* because we don't know glyph names. */ 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !charset->sids ) 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( No_Unicode_Glyph_Name ); 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return psnames->unicodes_init( memory, 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unicodes, 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff->num_glyphs, 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name, 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_FreeGlyphNameFunc)NULL, 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Pointer)face ); 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( void ) 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_cmap_unicode_done( PS_Unicodes unicodes ) 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Face face = FT_CMAP_FACE( unicodes ); 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory = FT_FACE_MEMORY( face ); 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( unicodes->maps ); 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unicodes->num_maps = 0; 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_UInt ) 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_cmap_unicode_char_index( PS_Unicodes unicodes, 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt32 char_code ) 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Font cff = (CFF_Font)face->extra.data; 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return psnames->unicodes_char_index( unicodes, char_code ); 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_UInt32 ) 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_cmap_unicode_char_next( PS_Unicodes unicodes, 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt32 *pchar_code ) 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Font cff = (CFF_Font)face->extra.data; 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return psnames->unicodes_char_next( unicodes, pchar_code ); 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec, 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( PS_UnicodesRec ), 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_InitFunc) cff_cmap_unicode_init, 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_DoneFunc) cff_cmap_unicode_done, 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index, 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next, 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov NULL, NULL, NULL, NULL, NULL 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 211