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