Blame src/psnames/psmodule.c

Packit cf904d
/***************************************************************************/
Packit cf904d
/*                                                                         */
Packit cf904d
/*  psmodule.c                                                             */
Packit cf904d
/*                                                                         */
Packit cf904d
/*    PSNames module implementation (body).                                */
Packit cf904d
/*                                                                         */
Packit cf904d
/*  Copyright 1996-2017 by                                                 */
Packit cf904d
/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
Packit cf904d
/*                                                                         */
Packit cf904d
/*  This file is part of the FreeType project, and may only be used,       */
Packit cf904d
/*  modified, and distributed under the terms of the FreeType project      */
Packit cf904d
/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
Packit cf904d
/*  this file you indicate that you have read the license and              */
Packit cf904d
/*  understand and accept it fully.                                        */
Packit cf904d
/*                                                                         */
Packit cf904d
/***************************************************************************/
Packit cf904d
Packit cf904d
Packit cf904d
#include <ft2build.h>
Packit cf904d
#include FT_INTERNAL_DEBUG_H
Packit cf904d
#include FT_INTERNAL_OBJECTS_H
Packit cf904d
#include FT_SERVICE_POSTSCRIPT_CMAPS_H
Packit cf904d
Packit cf904d
#include "psmodule.h"
Packit cf904d
Packit cf904d
#include "pstables.h"
Packit cf904d
#define  DEFINE_PS_TABLES
Packit cf904d
#include "pstables.h"
Packit cf904d
Packit cf904d
#include "psnamerr.h"
Packit cf904d
#include "pspic.h"
Packit cf904d
Packit cf904d
Packit cf904d
#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
Packit cf904d
Packit cf904d
Packit cf904d
#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
Packit cf904d
Packit cf904d
Packit cf904d
#define VARIANT_BIT         0x80000000UL
Packit cf904d
#define BASE_GLYPH( code )  ( (FT_UInt32)( (code) & ~VARIANT_BIT ) )
Packit cf904d
Packit cf904d
Packit cf904d
  /* Return the Unicode value corresponding to a given glyph.  Note that */
Packit cf904d
  /* we do deal with glyph variants by detecting a non-initial dot in    */
Packit cf904d
  /* the name, as in `A.swash' or `e.final'; in this case, the           */
Packit cf904d
  /* VARIANT_BIT is set in the return value.                             */
Packit cf904d
  /*                                                                     */
Packit cf904d
  static FT_UInt32
Packit cf904d
  ps_unicode_value( const char*  glyph_name )
Packit cf904d
  {
Packit cf904d
    /* If the name begins with `uni', then the glyph name may be a */
Packit cf904d
    /* hard-coded unicode character code.                          */
Packit cf904d
    if ( glyph_name[0] == 'u' &&
Packit cf904d
         glyph_name[1] == 'n' &&
Packit cf904d
         glyph_name[2] == 'i' )
Packit cf904d
    {
Packit cf904d
      /* determine whether the next four characters following are */
Packit cf904d
      /* hexadecimal.                                             */
Packit cf904d
Packit cf904d
      /* XXX: Add code to deal with ligatures, i.e. glyph names like */
Packit cf904d
      /*      `uniXXXXYYYYZZZZ'...                                   */
Packit cf904d
Packit cf904d
      FT_Int       count;
Packit cf904d
      FT_UInt32    value = 0;
Packit cf904d
      const char*  p     = glyph_name + 3;
Packit cf904d
Packit cf904d
Packit cf904d
      for ( count = 4; count > 0; count--, p++ )
Packit cf904d
      {
Packit cf904d
        char          c = *p;
Packit cf904d
        unsigned int  d;
Packit cf904d
Packit cf904d
Packit cf904d
        d = (unsigned char)c - '0';
Packit cf904d
        if ( d >= 10 )
Packit cf904d
        {
Packit cf904d
          d = (unsigned char)c - 'A';
Packit cf904d
          if ( d >= 6 )
Packit cf904d
            d = 16;
Packit cf904d
          else
Packit cf904d
            d += 10;
Packit cf904d
        }
Packit cf904d
Packit cf904d
        /* Exit if a non-uppercase hexadecimal character was found   */
Packit cf904d
        /* -- this also catches character codes below `0' since such */
Packit cf904d
        /* negative numbers cast to `unsigned int' are far too big.  */
Packit cf904d
        if ( d >= 16 )
Packit cf904d
          break;
Packit cf904d
Packit cf904d
        value = ( value << 4 ) + d;
Packit cf904d
      }
Packit cf904d
Packit cf904d
      /* there must be exactly four hex digits */
Packit cf904d
      if ( count == 0 )
Packit cf904d
      {
Packit cf904d
        if ( *p == '\0' )
Packit cf904d
          return value;
Packit cf904d
        if ( *p == '.' )
Packit cf904d
          return (FT_UInt32)( value | VARIANT_BIT );
Packit cf904d
      }
Packit cf904d
    }
Packit cf904d
Packit cf904d
    /* If the name begins with `u', followed by four to six uppercase */
Packit cf904d
    /* hexadecimal digits, it is a hard-coded unicode character code. */
Packit cf904d
    if ( glyph_name[0] == 'u' )
Packit cf904d
    {
Packit cf904d
      FT_Int       count;
Packit cf904d
      FT_UInt32    value = 0;
Packit cf904d
      const char*  p     = glyph_name + 1;
Packit cf904d
Packit cf904d
Packit cf904d
      for ( count = 6; count > 0; count--, p++ )
Packit cf904d
      {
Packit cf904d
        char          c = *p;
Packit cf904d
        unsigned int  d;
Packit cf904d
Packit cf904d
Packit cf904d
        d = (unsigned char)c - '0';
Packit cf904d
        if ( d >= 10 )
Packit cf904d
        {
Packit cf904d
          d = (unsigned char)c - 'A';
Packit cf904d
          if ( d >= 6 )
Packit cf904d
            d = 16;
Packit cf904d
          else
Packit cf904d
            d += 10;
Packit cf904d
        }
Packit cf904d
Packit cf904d
        if ( d >= 16 )
Packit cf904d
          break;
Packit cf904d
Packit cf904d
        value = ( value << 4 ) + d;
Packit cf904d
      }
Packit cf904d
Packit cf904d
      if ( count <= 2 )
Packit cf904d
      {
Packit cf904d
        if ( *p == '\0' )
Packit cf904d
          return value;
Packit cf904d
        if ( *p == '.' )
Packit cf904d
          return (FT_UInt32)( value | VARIANT_BIT );
Packit cf904d
      }
Packit cf904d
    }
Packit cf904d
Packit cf904d
    /* Look for a non-initial dot in the glyph name in order to */
Packit cf904d
    /* find variants like `A.swash', `e.final', etc.            */
Packit cf904d
    {
Packit cf904d
      const char*  p   = glyph_name;
Packit cf904d
      const char*  dot = NULL;
Packit cf904d
Packit cf904d
Packit cf904d
      for ( ; *p; p++ )
Packit cf904d
      {
Packit cf904d
        if ( *p == '.' && p > glyph_name )
Packit cf904d
        {
Packit cf904d
          dot = p;
Packit cf904d
          break;
Packit cf904d
        }
Packit cf904d
      }
Packit cf904d
Packit cf904d
      /* now look up the glyph in the Adobe Glyph List */
Packit cf904d
      if ( !dot )
Packit cf904d
        return (FT_UInt32)ft_get_adobe_glyph_index( glyph_name, p );
Packit cf904d
      else
Packit cf904d
        return (FT_UInt32)( ft_get_adobe_glyph_index( glyph_name, dot ) |
Packit cf904d
                            VARIANT_BIT );
Packit cf904d
    }
Packit cf904d
  }
Packit cf904d
Packit cf904d
Packit cf904d
  /* ft_qsort callback to sort the unicode map */
Packit cf904d
  FT_CALLBACK_DEF( int )
Packit cf904d
  compare_uni_maps( const void*  a,
Packit cf904d
                    const void*  b )
Packit cf904d
  {
Packit cf904d
    PS_UniMap*  map1 = (PS_UniMap*)a;
Packit cf904d
    PS_UniMap*  map2 = (PS_UniMap*)b;
Packit cf904d
    FT_UInt32   unicode1 = BASE_GLYPH( map1->unicode );
Packit cf904d
    FT_UInt32   unicode2 = BASE_GLYPH( map2->unicode );
Packit cf904d
Packit cf904d
Packit cf904d
    /* sort base glyphs before glyph variants */
Packit cf904d
    if ( unicode1 == unicode2 )
Packit cf904d
    {
Packit cf904d
      if ( map1->unicode > map2->unicode )
Packit cf904d
        return 1;
Packit cf904d
      else if ( map1->unicode < map2->unicode )
Packit cf904d
        return -1;
Packit cf904d
      else
Packit cf904d
        return 0;
Packit cf904d
    }
Packit cf904d
    else
Packit cf904d
    {
Packit cf904d
      if ( unicode1 > unicode2 )
Packit cf904d
        return 1;
Packit cf904d
      else if ( unicode1 < unicode2 )
Packit cf904d
        return -1;
Packit cf904d
      else
Packit cf904d
        return 0;
Packit cf904d
    }
Packit cf904d
  }
Packit cf904d
Packit cf904d
Packit cf904d
  /* support for extra glyphs not handled (well) in AGL; */
Packit cf904d
  /* we add extra mappings for them if necessary         */
Packit cf904d
Packit cf904d
#define EXTRA_GLYPH_LIST_SIZE  10
Packit cf904d
Packit cf904d
  static const FT_UInt32  ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE] =
Packit cf904d
  {
Packit cf904d
    /* WGL 4 */
Packit cf904d
    0x0394,
Packit cf904d
    0x03A9,
Packit cf904d
    0x2215,
Packit cf904d
    0x00AD,
Packit cf904d
    0x02C9,
Packit cf904d
    0x03BC,
Packit cf904d
    0x2219,
Packit cf904d
    0x00A0,
Packit cf904d
    /* Romanian */
Packit cf904d
    0x021A,
Packit cf904d
    0x021B
Packit cf904d
  };
Packit cf904d
Packit cf904d
  static const char  ft_extra_glyph_names[] =
Packit cf904d
  {
Packit cf904d
    'D','e','l','t','a',0,
Packit cf904d
    'O','m','e','g','a',0,
Packit cf904d
    'f','r','a','c','t','i','o','n',0,
Packit cf904d
    'h','y','p','h','e','n',0,
Packit cf904d
    'm','a','c','r','o','n',0,
Packit cf904d
    'm','u',0,
Packit cf904d
    'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0,
Packit cf904d
    's','p','a','c','e',0,
Packit cf904d
    'T','c','o','m','m','a','a','c','c','e','n','t',0,
Packit cf904d
    't','c','o','m','m','a','a','c','c','e','n','t',0
Packit cf904d
  };
Packit cf904d
Packit cf904d
  static const FT_Int
Packit cf904d
  ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE] =
Packit cf904d
  {
Packit cf904d
     0,
Packit cf904d
     6,
Packit cf904d
    12,
Packit cf904d
    21,
Packit cf904d
    28,
Packit cf904d
    35,
Packit cf904d
    38,
Packit cf904d
    53,
Packit cf904d
    59,
Packit cf904d
    72
Packit cf904d
  };
Packit cf904d
Packit cf904d
Packit cf904d
  static void
Packit cf904d
  ps_check_extra_glyph_name( const char*  gname,
Packit cf904d
                             FT_UInt      glyph,
Packit cf904d
                             FT_UInt*     extra_glyphs,
Packit cf904d
                             FT_UInt     *states )
Packit cf904d
  {
Packit cf904d
    FT_UInt  n;
Packit cf904d
Packit cf904d
Packit cf904d
    for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
Packit cf904d
    {
Packit cf904d
      if ( ft_strcmp( ft_extra_glyph_names +
Packit cf904d
                        ft_extra_glyph_name_offsets[n], gname ) == 0 )
Packit cf904d
      {
Packit cf904d
        if ( states[n] == 0 )
Packit cf904d
        {
Packit cf904d
          /* mark this extra glyph as a candidate for the cmap */
Packit cf904d
          states[n]     = 1;
Packit cf904d
          extra_glyphs[n] = glyph;
Packit cf904d
        }
Packit cf904d
Packit cf904d
        return;
Packit cf904d
      }
Packit cf904d
    }
Packit cf904d
  }
Packit cf904d
Packit cf904d
Packit cf904d
  static void
Packit cf904d
  ps_check_extra_glyph_unicode( FT_UInt32  uni_char,
Packit cf904d
                                FT_UInt   *states )
Packit cf904d
  {
Packit cf904d
    FT_UInt  n;
Packit cf904d
Packit cf904d
Packit cf904d
    for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
Packit cf904d
    {
Packit cf904d
      if ( uni_char == ft_extra_glyph_unicodes[n] )
Packit cf904d
      {
Packit cf904d
        /* disable this extra glyph from being added to the cmap */
Packit cf904d
        states[n] = 2;
Packit cf904d
Packit cf904d
        return;
Packit cf904d
      }
Packit cf904d
    }
Packit cf904d
  }
Packit cf904d
Packit cf904d
Packit cf904d
  /* Build a table that maps Unicode values to glyph indices. */
Packit cf904d
  static FT_Error
Packit cf904d
  ps_unicodes_init( FT_Memory             memory,
Packit cf904d
                    PS_Unicodes           table,
Packit cf904d
                    FT_UInt               num_glyphs,
Packit cf904d
                    PS_GetGlyphNameFunc   get_glyph_name,
Packit cf904d
                    PS_FreeGlyphNameFunc  free_glyph_name,
Packit cf904d
                    FT_Pointer            glyph_data )
Packit cf904d
  {
Packit cf904d
    FT_Error  error;
Packit cf904d
Packit cf904d
    FT_UInt  extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
Packit cf904d
    FT_UInt  extra_glyphs[EXTRA_GLYPH_LIST_SIZE];
Packit cf904d
Packit cf904d
Packit cf904d
    /* we first allocate the table */
Packit cf904d
    table->num_maps = 0;
Packit cf904d
    table->maps     = NULL;
Packit cf904d
Packit cf904d
    if ( !FT_NEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE ) )
Packit cf904d
    {
Packit cf904d
      FT_UInt     n;
Packit cf904d
      FT_UInt     count;
Packit cf904d
      PS_UniMap*  map;
Packit cf904d
      FT_UInt32   uni_char;
Packit cf904d
Packit cf904d
Packit cf904d
      map = table->maps;
Packit cf904d
Packit cf904d
      for ( n = 0; n < num_glyphs; n++ )
Packit cf904d
      {
Packit cf904d
        const char*  gname = get_glyph_name( glyph_data, n );
Packit cf904d
Packit cf904d
Packit cf904d
        if ( gname )
Packit cf904d
        {
Packit cf904d
          ps_check_extra_glyph_name( gname, n,
Packit cf904d
                                     extra_glyphs, extra_glyph_list_states );
Packit cf904d
          uni_char = ps_unicode_value( gname );
Packit cf904d
Packit cf904d
          if ( BASE_GLYPH( uni_char ) != 0 )
Packit cf904d
          {
Packit cf904d
            ps_check_extra_glyph_unicode( uni_char,
Packit cf904d
                                          extra_glyph_list_states );
Packit cf904d
            map->unicode     = uni_char;
Packit cf904d
            map->glyph_index = n;
Packit cf904d
            map++;
Packit cf904d
          }
Packit cf904d
Packit cf904d
          if ( free_glyph_name )
Packit cf904d
            free_glyph_name( glyph_data, gname );
Packit cf904d
        }
Packit cf904d
      }
Packit cf904d
Packit cf904d
      for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
Packit cf904d
      {
Packit cf904d
        if ( extra_glyph_list_states[n] == 1 )
Packit cf904d
        {
Packit cf904d
          /* This glyph name has an additional representation. */
Packit cf904d
          /* Add it to the cmap.                               */
Packit cf904d
Packit cf904d
          map->unicode     = ft_extra_glyph_unicodes[n];
Packit cf904d
          map->glyph_index = extra_glyphs[n];
Packit cf904d
          map++;
Packit cf904d
        }
Packit cf904d
      }
Packit cf904d
Packit cf904d
      /* now compress the table a bit */
Packit cf904d
      count = (FT_UInt)( map - table->maps );
Packit cf904d
Packit cf904d
      if ( count == 0 )
Packit cf904d
      {
Packit cf904d
        /* No unicode chars here! */
Packit cf904d
        FT_FREE( table->maps );
Packit cf904d
        if ( !error )
Packit cf904d
          error = FT_THROW( No_Unicode_Glyph_Name );
Packit cf904d
      }
Packit cf904d
      else
Packit cf904d
      {
Packit cf904d
        /* Reallocate if the number of used entries is much smaller. */
Packit cf904d
        if ( count < num_glyphs / 2 )
Packit cf904d
        {
Packit cf904d
          (void)FT_RENEW_ARRAY( table->maps, num_glyphs, count );
Packit cf904d
          error = FT_Err_Ok;
Packit cf904d
        }
Packit cf904d
Packit cf904d
        /* Sort the table in increasing order of unicode values, */
Packit cf904d
        /* taking care of glyph variants.                        */
Packit cf904d
        ft_qsort( table->maps, count, sizeof ( PS_UniMap ),
Packit cf904d
                  compare_uni_maps );
Packit cf904d
      }
Packit cf904d
Packit cf904d
      table->num_maps = count;
Packit cf904d
    }
Packit cf904d
Packit cf904d
    return error;
Packit cf904d
  }
Packit cf904d
Packit cf904d
Packit cf904d
  static FT_UInt
Packit cf904d
  ps_unicodes_char_index( PS_Unicodes  table,
Packit cf904d
                          FT_UInt32    unicode )
Packit cf904d
  {
Packit cf904d
    PS_UniMap  *min, *max, *mid, *result = NULL;
Packit cf904d
Packit cf904d
Packit cf904d
    /* Perform a binary search on the table. */
Packit cf904d
Packit cf904d
    min = table->maps;
Packit cf904d
    max = min + table->num_maps - 1;
Packit cf904d
Packit cf904d
    while ( min <= max )
Packit cf904d
    {
Packit cf904d
      FT_UInt32  base_glyph;
Packit cf904d
Packit cf904d
Packit cf904d
      mid = min + ( ( max - min ) >> 1 );
Packit cf904d
Packit cf904d
      if ( mid->unicode == unicode )
Packit cf904d
      {
Packit cf904d
        result = mid;
Packit cf904d
        break;
Packit cf904d
      }
Packit cf904d
Packit cf904d
      base_glyph = BASE_GLYPH( mid->unicode );
Packit cf904d
Packit cf904d
      if ( base_glyph == unicode )
Packit cf904d
        result = mid; /* remember match but continue search for base glyph */
Packit cf904d
Packit cf904d
      if ( min == max )
Packit cf904d
        break;
Packit cf904d
Packit cf904d
      if ( base_glyph < unicode )
Packit cf904d
        min = mid + 1;
Packit cf904d
      else
Packit cf904d
        max = mid - 1;
Packit cf904d
    }
Packit cf904d
Packit cf904d
    if ( result )
Packit cf904d
      return result->glyph_index;
Packit cf904d
    else
Packit cf904d
      return 0;
Packit cf904d
  }
Packit cf904d
Packit cf904d
Packit cf904d
  static FT_UInt32
Packit cf904d
  ps_unicodes_char_next( PS_Unicodes  table,
Packit cf904d
                         FT_UInt32   *unicode )
Packit cf904d
  {
Packit cf904d
    FT_UInt    result    = 0;
Packit cf904d
    FT_UInt32  char_code = *unicode + 1;
Packit cf904d
Packit cf904d
Packit cf904d
    {
Packit cf904d
      FT_UInt     min = 0;
Packit cf904d
      FT_UInt     max = table->num_maps;
Packit cf904d
      FT_UInt     mid;
Packit cf904d
      PS_UniMap*  map;
Packit cf904d
      FT_UInt32   base_glyph;
Packit cf904d
Packit cf904d
Packit cf904d
      while ( min < max )
Packit cf904d
      {
Packit cf904d
        mid = min + ( ( max - min ) >> 1 );
Packit cf904d
        map = table->maps + mid;
Packit cf904d
Packit cf904d
        if ( map->unicode == char_code )
Packit cf904d
        {
Packit cf904d
          result = map->glyph_index;
Packit cf904d
          goto Exit;
Packit cf904d
        }
Packit cf904d
Packit cf904d
        base_glyph = BASE_GLYPH( map->unicode );
Packit cf904d
Packit cf904d
        if ( base_glyph == char_code )
Packit cf904d
          result = map->glyph_index;
Packit cf904d
Packit cf904d
        if ( base_glyph < char_code )
Packit cf904d
          min = mid + 1;
Packit cf904d
        else
Packit cf904d
          max = mid;
Packit cf904d
      }
Packit cf904d
Packit cf904d
      if ( result )
Packit cf904d
        goto Exit;               /* we have a variant glyph */
Packit cf904d
Packit cf904d
      /* we didn't find it; check whether we have a map just above it */
Packit cf904d
      char_code = 0;
Packit cf904d
Packit cf904d
      if ( min < table->num_maps )
Packit cf904d
      {
Packit cf904d
        map       = table->maps + min;
Packit cf904d
        result    = map->glyph_index;
Packit cf904d
        char_code = BASE_GLYPH( map->unicode );
Packit cf904d
      }
Packit cf904d
    }
Packit cf904d
Packit cf904d
  Exit:
Packit cf904d
    *unicode = char_code;
Packit cf904d
    return result;
Packit cf904d
  }
Packit cf904d
Packit cf904d
Packit cf904d
#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
Packit cf904d
Packit cf904d
Packit cf904d
  static const char*
Packit cf904d
  ps_get_macintosh_name( FT_UInt  name_index )
Packit cf904d
  {
Packit cf904d
    if ( name_index >= FT_NUM_MAC_NAMES )
Packit cf904d
      name_index = 0;
Packit cf904d
Packit cf904d
    return ft_standard_glyph_names + ft_mac_names[name_index];
Packit cf904d
  }
Packit cf904d
Packit cf904d
Packit cf904d
  static const char*
Packit cf904d
  ps_get_standard_strings( FT_UInt  sid )
Packit cf904d
  {
Packit cf904d
    if ( sid >= FT_NUM_SID_NAMES )
Packit cf904d
      return 0;
Packit cf904d
Packit cf904d
    return ft_standard_glyph_names + ft_sid_names[sid];
Packit cf904d
  }
Packit cf904d
Packit cf904d
Packit cf904d
#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
Packit cf904d
Packit cf904d
  FT_DEFINE_SERVICE_PSCMAPSREC(
Packit cf904d
    pscmaps_interface,
Packit cf904d
Packit cf904d
    (PS_Unicode_ValueFunc)     ps_unicode_value,        /* unicode_value         */
Packit cf904d
    (PS_Unicodes_InitFunc)     ps_unicodes_init,        /* unicodes_init         */
Packit cf904d
    (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index,  /* unicodes_char_index   */
Packit cf904d
    (PS_Unicodes_CharNextFunc) ps_unicodes_char_next,   /* unicodes_char_next    */
Packit cf904d
Packit cf904d
    (PS_Macintosh_NameFunc)    ps_get_macintosh_name,   /* macintosh_name        */
Packit cf904d
    (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, /* adobe_std_strings     */
Packit cf904d
Packit cf904d
    t1_standard_encoding,                               /* adobe_std_encoding    */
Packit cf904d
    t1_expert_encoding                                  /* adobe_expert_encoding */
Packit cf904d
  )
Packit cf904d
Packit cf904d
#else
Packit cf904d
Packit cf904d
  FT_DEFINE_SERVICE_PSCMAPSREC(
Packit cf904d
    pscmaps_interface,
Packit cf904d
Packit cf904d
    NULL,                                               /* unicode_value         */
Packit cf904d
    NULL,                                               /* unicodes_init         */
Packit cf904d
    NULL,                                               /* unicodes_char_index   */
Packit cf904d
    NULL,                                               /* unicodes_char_next    */
Packit cf904d
Packit cf904d
    (PS_Macintosh_NameFunc)    ps_get_macintosh_name,   /* macintosh_name        */
Packit cf904d
    (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, /* adobe_std_strings     */
Packit cf904d
Packit cf904d
    t1_standard_encoding,                               /* adobe_std_encoding    */
Packit cf904d
    t1_expert_encoding                                  /* adobe_expert_encoding */
Packit cf904d
  )
Packit cf904d
Packit cf904d
#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
Packit cf904d
Packit cf904d
Packit cf904d
  FT_DEFINE_SERVICEDESCREC1(
Packit cf904d
    pscmaps_services,
Packit cf904d
Packit cf904d
    FT_SERVICE_ID_POSTSCRIPT_CMAPS, &PSCMAPS_INTERFACE_GET )
Packit cf904d
Packit cf904d
Packit cf904d
  static FT_Pointer
Packit cf904d
  psnames_get_service( FT_Module    module,
Packit cf904d
                       const char*  service_id )
Packit cf904d
  {
Packit cf904d
    /* PSCMAPS_SERVICES_GET dereferences `library' in PIC mode */
Packit cf904d
#ifdef FT_CONFIG_OPTION_PIC
Packit cf904d
    FT_Library  library;
Packit cf904d
Packit cf904d
Packit cf904d
    if ( !module )
Packit cf904d
      return NULL;
Packit cf904d
    library = module->library;
Packit cf904d
    if ( !library )
Packit cf904d
      return NULL;
Packit cf904d
#else
Packit cf904d
    FT_UNUSED( module );
Packit cf904d
#endif
Packit cf904d
Packit cf904d
    return ft_service_list_lookup( PSCMAPS_SERVICES_GET, service_id );
Packit cf904d
  }
Packit cf904d
Packit cf904d
#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
Packit cf904d
Packit cf904d
Packit cf904d
#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
Packit cf904d
#define PUT_PS_NAMES_SERVICE( a )  NULL
Packit cf904d
#else
Packit cf904d
#define PUT_PS_NAMES_SERVICE( a )  a
Packit cf904d
#endif
Packit cf904d
Packit cf904d
  FT_DEFINE_MODULE(
Packit cf904d
    psnames_module_class,
Packit cf904d
Packit cf904d
    0,  /* this is not a font driver, nor a renderer */
Packit cf904d
    sizeof ( FT_ModuleRec ),
Packit cf904d
Packit cf904d
    "psnames",  /* driver name                         */
Packit cf904d
    0x10000L,   /* driver version                      */
Packit cf904d
    0x20000L,   /* driver requires FreeType 2 or above */
Packit cf904d
Packit cf904d
    PUT_PS_NAMES_SERVICE(
Packit cf904d
      (void*)&PSCMAPS_INTERFACE_GET ),   /* module specific interface */
Packit cf904d
Packit cf904d
    (FT_Module_Constructor)NULL,                                       /* module_init   */
Packit cf904d
    (FT_Module_Destructor) NULL,                                       /* module_done   */
Packit cf904d
    (FT_Module_Requester)  PUT_PS_NAMES_SERVICE( psnames_get_service ) /* get_interface */
Packit cf904d
  )
Packit cf904d
Packit cf904d
Packit cf904d
/* END */