psmodule.c revision fbeb41d93d84b6f6dfa2ec8a8b43bafe0fe7696c
1a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/***************************************************************************/ 2a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/* */ 3a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/* psmodule.c */ 4a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/* */ 5a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/* PSNames module implementation (body). */ 6a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/* */ 7a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/* Copyright 1996-2000 by */ 8a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/* */ 10a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/* This file is part of the FreeType project, and may only be used, */ 11a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/* modified, and distributed under the terms of the FreeType project */ 12a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/* this file you indicate that you have read the license and */ 14a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/* understand and accept it fully. */ 15a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/* */ 16a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/***************************************************************************/ 17a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 18a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 19aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner#include <freetype/internal/psnames.h> 20aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner#include <freetype/internal/ftobjs.h> 21aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner#include <psmodule.h> 22a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 23a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg#include <stdlib.h> /* for qsort() */ 24a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg#include <string.h> /* for strcmp(), strncpy() */ 25a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 26aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 27aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner#ifndef FT_CONFIG_OPTION_NO_POSTSCRIPT_NAMES 28aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 29a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 30a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg /* see the Python script `freetype2/docs/glnames.py' which is used */ 31a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg /* to generate the following file */ 32aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner#include <pstables.h> 33aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 34a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 35aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST 36a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 37a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 38a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg /* return the Unicode value corresponding to a given glyph. Note that */ 39a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg /* we do deal with glyph variants by detecting a non-initial dot in */ 40a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg /* the name, as in `A.swash' or `e.final', etc. */ 41a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg /* */ 42aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner static 43a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg FT_ULong PS_Unicode_Value( const char* glyph_name ) 44aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 45aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner FT_Int n; 46aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner char first = glyph_name[0]; 47aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner char temp[64]; 48aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 49a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 50a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg /* if the name begins with `uni', then the glyph name may be a */ 51a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg /* hard-coded unicode character code. */ 52aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner if ( glyph_name[0] == 'u' && 53aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner glyph_name[1] == 'n' && 54aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner glyph_name[2] == 'i' ) 55aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 56a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg /* determine whether the next four characters following are */ 57a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg /* hexadecimal. */ 58a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg 59a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg /* XXX: Add code to deal with ligatures, i.e. glyph names like */ 60a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg /* `uniXXXXYYYYZZZZ'... */ 61a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg 62a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg FT_Int count; 63a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg FT_ULong value = 0; 64a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg const char* p = glyph_name + 4; 65a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 66aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 67a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg for ( count = 4; count > 0; count--, p++ ) 68aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 69aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner char c = *p; 70aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner unsigned char d; 71aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 72a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 73a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg d = (unsigned char)c - '0'; 74a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg if ( d >= 10 ) 75aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 76aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner d = (unsigned char)c - 'A'; 77aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner if ( d >= 6 ) 78aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner d = 16; 79aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner else 80aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner d += 10; 81aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 82a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg 83a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg /* exit if a non-uppercase hexadecimal character was found */ 84a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg if ( d >= 16 ) 85aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner break; 86aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 87a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg value = ( value << 4 ) + d; 88a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg 89a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg if ( count == 0 ) 90aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner return value; 91aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 92aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 93aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 94aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner /* look for a non-initial dot in the glyph name in order to */ 95a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg /* sort-out variants like `A.swash', `e.final', etc. */ 96aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 97aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner const char* p; 98aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner int len; 99aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 100a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 101aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner p = glyph_name; 102a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg 103a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg while ( *p && *p != '.' ) 104a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg p++; 105a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg 106a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg len = p - glyph_name; 107aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 108aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner if ( *p && len < 64 ) 109aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 110aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner strncpy( temp, glyph_name, len ); 111aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner temp[len] = 0; 112aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner glyph_name = temp; 113aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 114aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 115aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 116a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg /* now, look up the glyph in the Adobe Glyph List */ 117aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner for ( n = 0; n < NUM_ADOBE_GLYPHS; n++ ) 118aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 119aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner const char* name = t1_standard_glyphs[n]; 120aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 121a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 122aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner if ( first == name[0] && strcmp( glyph_name, name ) == 0 ) 123aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner return names_to_unicode[n]; 124aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 125a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 126aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner /* not found, there is probably no Unicode value for this glyph name */ 127aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner return 0; 128aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 129aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 130aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 131a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg /* qsort callback to sort the unicode map */ 132aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner static 133a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg int compare_uni_maps( const void* a, 134a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg const void* b ) 135aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 136aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner PS_UniMap* map1 = (PS_UniMap*)a; 137aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner PS_UniMap* map2 = (PS_UniMap*)b; 138aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 139a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 140e0bba32291f5ca7b3fc7be4c1277d7a8f406daeaDavid Turner return ( map1->unicode - map2->unicode ); 141aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 142aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 143aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 144a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg /* Builds a table that maps Unicode values to glyph indices */ 145aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner static 146aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner FT_Error PS_Build_Unicode_Table( FT_Memory memory, 147aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner FT_UInt num_glyphs, 148aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner const char** glyph_names, 149a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg PS_Unicodes* table ) 150aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 151aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner FT_Error error; 152aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 153a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 154aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner /* we first allocate the table */ 155aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner table->num_maps = 0; 156aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner table->maps = 0; 157aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 158aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner if ( !ALLOC_ARRAY( table->maps, num_glyphs, PS_UniMap ) ) 159aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 160aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner FT_UInt n; 161aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner FT_UInt count; 162aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner PS_UniMap* map; 163aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner FT_ULong uni_char; 164aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 165a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 166aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner map = table->maps; 167a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg 168aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner for ( n = 0; n < num_glyphs; n++ ) 169aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 170aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner const char* gname = glyph_names[n]; 171a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 172a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 173a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg if ( gname ) 174aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 175a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg uni_char = PS_Unicode_Value( gname ); 176a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg 177a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg if ( uni_char && uni_char != 0xFFFF ) 178aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 179aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner map->unicode = uni_char; 180aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner map->glyph_index = n; 181aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner map++; 182aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 183aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 184aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 185aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 186aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner /* now, compress the table a bit */ 187aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner count = map - table->maps; 188a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg 189aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner if ( count > 0 && REALLOC( table->maps, 190a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg num_glyphs * sizeof ( PS_UniMap ), 191a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg count * sizeof ( PS_UniMap ) ) ) 192aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner count = 0; 193aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 194a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg if ( count == 0 ) 195aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 196aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner FREE( table->maps ); 197a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg if ( !error ) 198a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg error = FT_Err_Invalid_Argument; /* no unicode chars here! */ 199aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 200aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner else 201aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner /* sort the table in increasing order of unicode values */ 202a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg qsort( table->maps, count, sizeof ( PS_UniMap ), compare_uni_maps ); 203aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 204aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner table->num_maps = count; 205aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 206a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 207aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner return error; 208aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 209aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 210a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 211aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner static 212aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner FT_UInt PS_Lookup_Unicode( PS_Unicodes* table, 213aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner FT_ULong unicode ) 214aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 215aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner PS_UniMap *min, *max, *mid; 216a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 217a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 218aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner /* perform a binary search on the table */ 219a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg 220aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner min = table->maps; 221aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner max = min + table->num_maps - 1; 222aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 223a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg while ( min <= max ) 224aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 225a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg mid = min + ( max - min ) / 2; 226aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner if ( mid->unicode == unicode ) 227aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner return mid->glyph_index; 228aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 229a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg if ( min == max ) 230aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner break; 231aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 232a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg if ( mid->unicode < unicode ) 233a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg min = mid + 1; 234a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg else 235a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg max = mid - 1; 236aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 237aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 238aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner return 0xFFFF; 239aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 240aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 241aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 242a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ 243aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 244aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 245aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner static 246aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner const char* PS_Macintosh_Name( FT_UInt name_index ) 247aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 248a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg if ( name_index >= 258 ) 249aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner name_index = 0; 250aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 251a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg return standard_glyph_names[mac_standard_names[name_index]]; 252aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 253aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 254aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 255aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner static 256aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner const char* PS_Standard_Strings( FT_UInt sid ) 257aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 258a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg return ( sid < NUM_STD_GLYPHS ? t1_standard_glyphs[sid] : 0 ); 259aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner } 260aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 261aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 262a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg static const PSNames_Interface psnames_interface = 263aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 264aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST 265a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 266a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg (PS_Unicode_Value_Func) PS_Unicode_Value, 267a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg (PS_Build_Unicodes_Func) PS_Build_Unicode_Table, 268a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg (PS_Lookup_Unicode_Func) PS_Lookup_Unicode, 269a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 270aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner#else 271a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 272aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 0, 273aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 0, 274aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 0, 275aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 276a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ 277a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 278a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg (PS_Macintosh_Name_Func) PS_Macintosh_Name, 279a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg (PS_Adobe_Std_Strings_Func)PS_Standard_Strings, 280aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 281aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner t1_standard_encoding, 282aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner t1_expert_encoding 283aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner }; 284aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 285aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 286a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg#endif /* !FT_CONFIG_OPTION_NO_POSTSCRIPT_NAMES */ 287aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 288aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 289aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner const FT_Module_Class psnames_module_class = 290aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner { 291aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 0, /* this is not a font driver, nor a renderer */ 292a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg sizeof( FT_ModuleRec ), 293aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 294aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner "psnames", /* driver name */ 295a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg 0x10000L, /* driver version */ 296a8bbc267a20c62806a87c8755e2c4bf58acfc7b5Werner Lemberg 0x20000L, /* driver requires FreeType 2 or above */ 297aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 298aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner#ifdef FT_CONFIG_OPTION_NO_POSTSCRIPT_NAMES 299aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 0, 300aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner#else 301aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner (void*)&psnames_interface, /* module specific interface */ 302aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner#endif 303fbeb41d93d84b6f6dfa2ec8a8b43bafe0fe7696cWerner Lemberg 304a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg (FT_Module_Constructor)0, 305a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg (FT_Module_Destructor) 0, 306a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg (FT_Module_Requester) 0 307aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner }; 308aa4c28f9fe5debca5822217eb3cf8dcebe7dd6a7David Turner 309a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg 310a929ba9b205c9756f1c0d3c261185e3bacf7fdadWerner Lemberg/* END */ 311