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