Use pscmap service in CFF module.

* src/cff/cffcmap.c (cff_cmap_uni_pair_compare): Removed.
(cff_sid_to_glyph_name): New function.
(cff_cmap_unicode_init, cff_cmap_unicode_done,
cff_cmap_unicode_char_index, cff_cmap_unicode_char next): Use pscmap
service.
(cff_cmap_unicode_class_rec): Updated.
* src/cff/cffcmap.h (CFF_CMapUnicode, CFF_CMap_UniPair): Removed.


* src/psnames/psmodule.c (ps_unicodes_char_next): Fix `unicode'
return value.


* src/psaux/afmparse.c (afm_parser_read_vals): Use double casting
to avoid type-punning compiler warnings.
diff --git a/ChangeLog b/ChangeLog
index 9d5c0bf..a1b78bc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2006-01-17  Werner Lemberg  <wl@gnu.org>
+
+	Use pscmap service in CFF module.
+
+	* src/cff/cffcmap.c (cff_cmap_uni_pair_compare): Removed.
+	(cff_sid_to_glyph_name): New function.
+	(cff_cmap_unicode_init, cff_cmap_unicode_done,
+	cff_cmap_unicode_char_index, cff_cmap_unicode_char next): Use pscmap
+	service.
+	(cff_cmap_unicode_class_rec): Updated.
+	* src/cff/cffcmap.h (CFF_CMapUnicode, CFF_CMap_UniPair): Removed.
+
+
+	* src/psnames/psmodule.c (ps_unicodes_char_next): Fix `unicode'
+	return value.
+
+
+	* src/psaux/afmparse.c (afm_parser_read_vals): Use double casting
+	to avoid type-punning compiler warnings.
+
 2006-01-16  Chia-I Wu  <b90201047@ntu.edu.tw>
 
 	* src/psaux/afmparse.c, src/psaux/afmparse.h: New files which
diff --git a/include/freetype/freetype.h b/include/freetype/freetype.h
index c862e2c..736987e 100644
--- a/include/freetype/freetype.h
+++ b/include/freetype/freetype.h
@@ -147,7 +147,6 @@
   /*    FT_Attach_File                                                     */
   /*    FT_Attach_Stream                                                   */
   /*                                                                       */
-  /*    FT_Select_Size                                                     */
   /*    FT_Size_Request_Type                                               */
   /*    FT_Size_Request                                                    */
   /*    FT_Request_Size                                                    */
@@ -1976,18 +1975,18 @@
   /*    Select a bitmap strike.                                            */
   /*                                                                       */
   /* <InOut>                                                               */
-  /*    face  :: A handle to a target face object.                         */
+  /*    face :: A handle to a target face object.                          */
   /*                                                                       */
   /* <Input>                                                               */
-  /*    index :: The index of the bitmap strike in the `available_sizes'   */
-  /*             field of @FT_FaceRec structure.                           */
+  /*    idx  :: The index of the bitmap strike in the `available_sizes'    */
+  /*            field of @FT_FaceRec structure.                            */
   /*                                                                       */
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Select_Size( FT_Face  face,
-                  FT_Int   index );
+                  FT_Int   idx );
 
 
   /*************************************************************************/
diff --git a/src/cff/cffcmap.c b/src/cff/cffcmap.c
index 88169d0..a486d34 100644
--- a/src/cff/cffcmap.c
+++ b/src/cff/cffcmap.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CFF character mapping table (cmap) support (body).                   */
 /*                                                                         */
-/*  Copyright 2002, 2003, 2004, 2005 by                                    */
+/*  Copyright 2002, 2003, 2004, 2005, 2006 by                              */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -119,30 +119,23 @@
   /*************************************************************************/
   /*************************************************************************/
 
-  FT_CALLBACK_DEF( FT_Int )
-  cff_cmap_uni_pair_compare( const void*  pair1,
-                             const void*  pair2 )
+  const char *
+  cff_sid_to_glyph_name( CFF_Font  cff,
+                         FT_UInt   idx )
   {
-    FT_UInt32  u1 = ((CFF_CMapUniPair)pair1)->unicode;
-    FT_UInt32  u2 = ((CFF_CMapUniPair)pair2)->unicode;
+    CFF_Charset         charset = &cff->charset;
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
+    FT_UInt             sid     = charset->sids[idx];
 
 
-    if ( u1 < u2 )
-      return -1;
-
-    if ( u1 > u2 )
-      return +1;
-
-    return 0;
+    return cff_index_get_sid_string( &cff->string_index, sid, psnames );
   }
 
 
   FT_CALLBACK_DEF( FT_Error )
-  cff_cmap_unicode_init( CFF_CMapUnicode  cmap )
+  cff_cmap_unicode_init( PS_Unicodes  unicodes )
   {
-    FT_Error            error;
-    FT_UInt             count;
-    TT_Face             face    = (TT_Face)FT_CMAP_FACE( cmap );
+    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
     FT_Memory           memory  = FT_FACE_MEMORY( face );
     CFF_Font            cff     = (CFF_Font)face->extra.data;
     CFF_Charset         charset = &cff->charset;
@@ -151,178 +144,58 @@
 
     /* can't build Unicode map for CID-keyed font */
     if ( !charset->sids )
-    {
-      error = CFF_Err_Invalid_Argument;
-      goto Exit;
-    }
+      return CFF_Err_Invalid_Argument;
 
-    cmap->num_pairs = 0;
-    cmap->pairs     = NULL;
-
-    count = cff->num_glyphs;
-
-    if ( !FT_NEW_ARRAY( cmap->pairs, count ) )
-    {
-      FT_UInt          n, new_count;
-      CFF_CMapUniPair  pair;
-      FT_UInt32        uni_code;
-
-
-      pair = cmap->pairs;
-      for ( n = 0; n < count; n++ )
-      {
-        FT_UInt      sid = charset->sids[n];
-        const char*  gname;
-
-
-        gname = cff_index_get_sid_string( &cff->string_index, sid, psnames );
-
-        /* build unsorted pair table by matching glyph names */
-        if ( gname )
-        {
-          uni_code = psnames->unicode_value( gname );
-
-          if ( uni_code != 0 )
-          {
-            pair->unicode = uni_code;
-            pair->gindex  = n;
-            pair++;
-          }
-
-          FT_FREE( gname );
-        }
-      }
-
-      new_count = (FT_UInt)( pair - cmap->pairs );
-      if ( new_count == 0 )
-      {
-        /* there are no unicode characters in here! */
-        FT_FREE( cmap->pairs );
-        error = CFF_Err_Invalid_Argument;
-      }
-      else
-      {
-        /* re-allocate if the new array is much smaller than the original */
-        /* one                                                            */
-        if ( new_count != count && new_count < count / 2 )
-        {
-          (void)FT_RENEW_ARRAY( cmap->pairs, count, new_count );
-          error = CFF_Err_Ok;
-        }
-
-        /* sort the pairs table to allow efficient binary searches */
-        ft_qsort( cmap->pairs,
-                  new_count,
-                  sizeof ( CFF_CMapUniPairRec ),
-                  cff_cmap_uni_pair_compare );
-
-        cmap->num_pairs = new_count;
-      }
-    }
-
-  Exit:
-    return error;
+    return psnames->unicodes_init( memory,
+                                   unicodes,
+                                   cff->num_glyphs,
+                                   (PS_Glyph_NameFunc)&cff_sid_to_glyph_name,
+                                   (FT_Pointer)cff );
   }
 
 
   FT_CALLBACK_DEF( void )
-  cff_cmap_unicode_done( CFF_CMapUnicode  cmap )
+  cff_cmap_unicode_done( PS_Unicodes  unicodes )
   {
-    FT_Face    face   = FT_CMAP_FACE( cmap );
+    FT_Face    face   = FT_CMAP_FACE( unicodes );
     FT_Memory  memory = FT_FACE_MEMORY( face );
 
 
-    FT_FREE( cmap->pairs );
-    cmap->num_pairs = 0;
+    FT_FREE( unicodes->maps );
+    unicodes->num_maps = 0;
   }
 
 
   FT_CALLBACK_DEF( FT_UInt )
-  cff_cmap_unicode_char_index( CFF_CMapUnicode  cmap,
-                               FT_UInt32        char_code )
+  cff_cmap_unicode_char_index( PS_Unicodes  unicodes,
+                               FT_UInt32    char_code )
   {
-    FT_UInt          min = 0;
-    FT_UInt          max = cmap->num_pairs;
-    FT_UInt          mid;
-    CFF_CMapUniPair  pair;
+    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
+    CFF_Font            cff     = (CFF_Font)face->extra.data;
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
 
 
-    while ( min < max )
-    {
-      mid  = min + ( max - min ) / 2;
-      pair = cmap->pairs + mid;
-
-      if ( pair->unicode == char_code )
-        return pair->gindex;
-
-      if ( pair->unicode < char_code )
-        min = mid + 1;
-      else
-        max = mid;
-    }
-    return 0;
+    return psnames->unicodes_char_index( unicodes, char_code );
   }
 
 
   FT_CALLBACK_DEF( FT_UInt )
-  cff_cmap_unicode_char_next( CFF_CMapUnicode  cmap,
-                              FT_UInt32       *pchar_code )
+  cff_cmap_unicode_char_next( PS_Unicodes  unicodes,
+                              FT_UInt32   *pchar_code )
   {
-    FT_UInt    result    = 0;
-    FT_UInt32  char_code = *pchar_code + 1;
+    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
+    CFF_Font            cff     = (CFF_Font)face->extra.data;
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
 
 
-  Restart:
-    {
-      FT_UInt          min = 0;
-      FT_UInt          max = cmap->num_pairs;
-      FT_UInt          mid;
-      CFF_CMapUniPair  pair;
-
-
-      while ( min < max )
-      {
-        mid  = min + ( ( max - min ) >> 1 );
-        pair = cmap->pairs + mid;
-
-        if ( pair->unicode == char_code )
-        {
-          result = pair->gindex;
-          if ( result != 0 )
-            goto Exit;
-
-          char_code++;
-          goto Restart;
-        }
-
-        if ( pair->unicode < char_code )
-          min = mid+1;
-        else
-          max = mid;
-      }
-
-      /* we didn't find it, but we have a pair just above it */
-      char_code = 0;
-
-      if ( min < cmap->num_pairs )
-      {
-        pair   = cmap->pairs + min;
-        result = pair->gindex;
-        if ( result != 0 )
-          char_code = pair->unicode;
-      }
-    }
-
-  Exit:
-    *pchar_code = char_code;
-    return result;
+    return psnames->unicodes_char_next( unicodes, pchar_code );
   }
 
 
   FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
   cff_cmap_unicode_class_rec =
   {
-    sizeof ( CFF_CMapUnicodeRec ),
+    sizeof ( PS_UnicodesRec ),
 
     (FT_CMap_InitFunc)     cff_cmap_unicode_init,
     (FT_CMap_DoneFunc)     cff_cmap_unicode_done,
diff --git a/src/cff/cffcmap.h b/src/cff/cffcmap.h
index ceb32cd..f3d8e7a 100644
--- a/src/cff/cffcmap.h
+++ b/src/cff/cffcmap.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CFF character mapping table (cmap) support (specification).          */
 /*                                                                         */
-/*  Copyright 2002, 2003 by                                                */
+/*  Copyright 2002, 2003, 2006 by                                          */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -56,24 +56,6 @@
   /*************************************************************************/
 
   /* unicode (synthetic) cmaps */
-  typedef struct CFF_CMapUnicodeRec_*  CFF_CMapUnicode;
-
-  typedef struct  CFF_CMapUniPairRec_
-  {
-    FT_UInt32  unicode;
-    FT_UInt    gindex;
-  
-  } CFF_CMapUniPairRec, *CFF_CMapUniPair;
-
-
-  typedef struct  CFF_CMapUnicodeRec_
-  {
-    FT_CMapRec       cmap;
-    FT_UInt          num_pairs;
-    CFF_CMapUniPair  pairs;
-
-  } CFF_CMapUnicodeRec;
-
 
   FT_CALLBACK_TABLE const FT_CMap_ClassRec
   cff_cmap_unicode_class_rec;
diff --git a/src/psaux/afmparse.c b/src/psaux/afmparse.c
index 4c6f94f..fa33fba 100644
--- a/src/psaux/afmparse.c
+++ b/src/psaux/afmparse.c
@@ -383,10 +383,11 @@
 
     for ( i = 0; i < n; i++ )
     {
-      FT_UInt  len;
+      FT_UInt    len;
+      AFM_Value  val = vals + i;
 
 
-      if ( vals[i].type == AFM_VALUE_TYPE_STRING )
+      if ( val->type == AFM_VALUE_TYPE_STRING )
         str = afm_stream_read_string( stream );
       else
         str = afm_stream_read_one( stream );
@@ -396,41 +397,38 @@
 
       len = AFM_STREAM_KEY_LEN( stream, str );
 
-      switch ( vals[i].type )
+      switch ( val->type )
       {
       case AFM_VALUE_TYPE_STRING:
       case AFM_VALUE_TYPE_NAME:
         if ( !FT_QAlloc( parser->memory, len + 1,
-                         (void**)&vals[i].u.s  ) )
+                         (void**)&(val->u.s)  ) )
         {
-          ft_memcpy( vals[i].u.s, str, len );
-          vals[i].u.s[len] = '\0';
+          ft_memcpy( val->u.s, str, len );
+          val->u.s[len] = '\0';
         }
         break;
 
       case AFM_VALUE_TYPE_FIXED:
-        vals[i].u.f = PS_Conv_ToFixed( (FT_Byte**)&str,
-                                       (FT_Byte*)str + len,
-                                       0 );
+        val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str,
+                                    (FT_Byte*)str + len, 0 );
         break;
 
       case AFM_VALUE_TYPE_INTEGER:
-        vals[i].u.i = PS_Conv_ToInt( (FT_Byte**)&str,
-                                     (FT_Byte*)str + len );
+        val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str,
+                                  (FT_Byte*)str + len );
         break;
 
       case AFM_VALUE_TYPE_BOOL:
-        vals[i].u.b = ( len == 4                          &&
-                        ft_strncmp( str, "true", 4 ) == 0 );
+        val->u.b = ( len == 4                          &&
+                     ft_strncmp( str, "true", 4 ) == 0 );
         break;
 
       case AFM_VALUE_TYPE_INDEX:
         if ( parser->get_index )
-          vals[i].u.i = parser->get_index( str,
-                                           len,
-                                           parser->user_data );
+          val->u.i = parser->get_index( str, len, parser->user_data );
         else
-          vals[i].u.i = 0;
+          val->u.i = 0;
         break;
       }
     }
diff --git a/src/psaux/afmparse.h b/src/psaux/afmparse.h
index 11eadcd..192727a 100644
--- a/src/psaux/afmparse.h
+++ b/src/psaux/afmparse.h
@@ -53,10 +53,10 @@
   };
 
 
-  typedef struct
+  typedef struct  AFM_ValueRec_
   {
     enum AFM_ValueType_  type;
-    union  {
+    union {
       char*     s;
       FT_Fixed  f;
       FT_Int    i;
diff --git a/src/psaux/psconv.h b/src/psaux/psconv.h
index 61b24d5..82c3707 100644
--- a/src/psaux/psconv.h
+++ b/src/psaux/psconv.h
@@ -26,7 +26,7 @@
 FT_BEGIN_HEADER
 
 
-  FT_LOCAL_DEF( FT_Int )
+  FT_LOCAL( FT_Int )
   PS_Conv_Strtol( FT_Byte**  cursor,
                   FT_Byte*   limit,
                   FT_Int     base );
diff --git a/src/psnames/psmodule.c b/src/psnames/psmodule.c
index 144a991..631eafd 100644
--- a/src/psnames/psmodule.c
+++ b/src/psnames/psmodule.c
@@ -345,9 +345,9 @@
 
       if ( min < table->num_maps )
       {
-        map    = table->maps + min;
-        result = map->glyph_index;
-        char_code = map->unicode;
+        map       = table->maps + min;
+        result    = map->glyph_index;
+        char_code = BASE_GLYPH( map->unicode );
       }
     }