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