1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* cffcmap.c */ 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* CFF character mapping table (cmap) support (body). */ 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 7727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* Copyright 2002-2007, 2010, 2013 by */ 8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* This file is part of the FreeType project, and may only be used, */ 11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* modified, and distributed under the terms of the FreeType project */ 12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* this file you indicate that you have read the license and */ 14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* understand and accept it fully. */ 15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 19727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include <ft2build.h> 20727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include FT_INTERNAL_DEBUG_H 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffcmap.h" 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffload.h" 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cfferrs.h" 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/ 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_cmap_encoding_init( CFF_CMapStd cmap ) 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font cff = (CFF_Font)face->extra.data; 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Encoding encoding = &cff->encoding; 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmap->gids = encoding->codes; 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_cmap_encoding_done( CFF_CMapStd cmap ) 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmap->gids = NULL; 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_UInt ) 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_cmap_encoding_char_index( CFF_CMapStd cmap, 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 char_code ) 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt result = 0; 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( char_code < 256 ) 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = cmap->gids[char_code]; 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return result; 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 70295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_CALLBACK_DEF( FT_UInt32 ) 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_cmap_encoding_char_next( CFF_CMapStd cmap, 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 *pchar_code ) 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt result = 0; 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 char_code = *pchar_code; 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *pchar_code = 0; 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( char_code < 255 ) 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt code = (FT_UInt)(char_code + 1); 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (;;) 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( code >= 256 ) 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = cmap->gids[code]; 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( result != 0 ) 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *pchar_code = code; 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project code++; 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return result; 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 104295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec, 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sizeof ( CFF_CMapStdRec ), 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_CMap_InitFunc) cff_cmap_encoding_init, 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_CMap_DoneFunc) cff_cmap_encoding_done, 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index, 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next, 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NULL, NULL, NULL, NULL, NULL 113295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner ) 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( const char* ) 125aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cff_sid_to_glyph_name( TT_Face face, 126aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_UInt idx ) 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 128aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich CFF_Font cff = (CFF_Font)face->extra.data; 129aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich CFF_Charset charset = &cff->charset; 130aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_UInt sid = charset->sids[idx]; 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 133aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return cff_index_get_sid_string( cff, sid ); 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_cmap_unicode_init( PS_Unicodes unicodes ) 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = FT_FACE_MEMORY( face ); 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font cff = (CFF_Font)face->extra.data; 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Charset charset = &cff->charset; 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* can't build Unicode map for CID-keyed font */ 148aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* because we don't know glyph names. */ 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !charset->sids ) 150727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_THROW( No_Unicode_Glyph_Name ); 151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return psnames->unicodes_init( memory, 153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unicodes, 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff->num_glyphs, 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name, 156aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich (PS_FreeGlyphNameFunc)NULL, 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_Pointer)face ); 158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_cmap_unicode_done( PS_Unicodes unicodes ) 163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Face face = FT_CMAP_FACE( unicodes ); 165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = FT_FACE_MEMORY( face ); 166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( unicodes->maps ); 169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unicodes->num_maps = 0; 170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_UInt ) 174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_cmap_unicode_char_index( PS_Unicodes unicodes, 175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 char_code ) 176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); 178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font cff = (CFF_Font)face->extra.data; 179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; 180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return psnames->unicodes_char_index( unicodes, char_code ); 183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 186295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_CALLBACK_DEF( FT_UInt32 ) 187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_cmap_unicode_char_next( PS_Unicodes unicodes, 188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 *pchar_code ) 189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); 191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font cff = (CFF_Font)face->extra.data; 192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; 193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return psnames->unicodes_char_next( unicodes, pchar_code ); 196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 199295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec, 200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sizeof ( PS_UnicodesRec ), 201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_CMap_InitFunc) cff_cmap_unicode_init, 203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_CMap_DoneFunc) cff_cmap_unicode_done, 204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index, 205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next, 206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NULL, NULL, NULL, NULL, NULL 208295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner ) 209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 211