static FT_UInt
  CID_Get_Char_Index( FT_CharMap  charmap,
                      FT_Long     charcode )
  {
    T1_Face          face;
    FT_UInt          result = 0;
    PSNames_Service  psnames;


    face = (T1_Face)charmap->face;
    psnames = (PSNames_Service)face->psnames;
    if ( psnames )
      switch ( charmap->encoding )
      {
        /*******************************************************************/
        /*                                                                 */
        /* Unicode encoding support                                        */
        /*                                                                 */
      case ft_encoding_unicode:
        /* use the `PSNames' module to synthetize the Unicode charmap */
        result = psnames->lookup_unicode( &face->unicode_map,
                                          (FT_ULong)charcode );

        /* the function returns 0xFFFF if the Unicode charcode has */
        /* no corresponding glyph.                                 */
        if ( result == 0xFFFF )
          result = 0;
        goto Exit;

        /*******************************************************************/
        /*                                                                 */
        /* Custom Type 1 encoding                                          */
        /*                                                                 */
      case ft_encoding_adobe_custom:
        {
          T1_Encoding  encoding = &face->type1.encoding;


          if ( charcode >= encoding->code_first &&
               charcode <= encoding->code_last  )
            result = encoding->char_index[charcode];
          goto Exit;
        }

        /*******************************************************************/
        /*                                                                 */
        /* Adobe Standard & Expert encoding support                        */
        /*                                                                 */
      default:
        if ( charcode < 256 )
        {
          FT_UInt      code;
          FT_Int       n;
          const char*  glyph_name;


          code = psnames->adobe_std_encoding[charcode];
          if ( charmap->encoding == ft_encoding_adobe_expert )
            code = psnames->adobe_expert_encoding[charcode];

          glyph_name = psnames->adobe_std_strings( code );
          if ( !glyph_name )
            break;

          for ( n = 0; n < face->type1.num_glyphs; n++ )
          {
            const char*  gname = face->type1.glyph_names[n];


            if ( gname && gname[0] == glyph_name[0] &&
                 ft_strcmp( gname, glyph_name ) == 0   )
            {
              result = n;
              break;
            }
          }
        }
      }

  Exit:
    return result;
  }
Example #2
0
  T42_CMap_CharIndex( FT_CharMap  charmap,
                      FT_Long     charcode )
  {
    T42_Face         face;
    FT_UInt          result = 0;
    PSNames_Service  psnames;


    face    = (T42_Face)charmap->face;
    psnames = (PSNames_Service)face->psnames;
    if (!psnames )
      goto Exit;

    switch ( charmap->encoding )
    {
      /*******************************************************************/
      /*                                                                 */
      /* Unicode encoding support                                        */
      /*                                                                 */
    case ft_encoding_unicode:
      /* if this charmap is used, we ignore the encoding of the font and */
      /* use the `PSNames' module to synthetize the Unicode charmap      */
      result = psnames->lookup_unicode( &face->unicode_map,
                                        (FT_ULong)charcode );

      /* the function returns 0xFFFF if the Unicode charcode has */
      /* no corresponding glyph                                  */
      if ( result == 0xFFFFU )
        result = 0;

      /* The result returned is the index (position)in the CharStrings */
      /* array.  This must be used now to get the value associated to  */
      /* that glyph_name, which is the real index within the truetype  */
      /* structure.                                                    */
      result = ft_atoi( (const char*)face->type1.charstrings[result] );
      goto Exit;

      /*******************************************************************/
      /*                                                                 */
      /* ISOLatin1 encoding support                                      */
      /*                                                                 */
    case ft_encoding_latin_1:
      /* ISOLatin1 is the first page of Unicode */
      if ( charcode < 256 && psnames->unicode_value )
      {
        result = psnames->lookup_unicode( &face->unicode_map,
                                          (FT_ULong)charcode );

        /* the function returns 0xFFFF if the Unicode charcode has */
        /* no corresponding glyph                                  */
        if ( result == 0xFFFFU )
          result = 0;
      }
      goto Exit;

      /*******************************************************************/
      /*                                                                 */
      /* Custom Type 1 encoding                                          */
      /*                                                                 */
    case ft_encoding_adobe_custom:
      {
        T1_Encoding  encoding = &face->type1.encoding;


        if ( charcode >= encoding->code_first &&
             charcode <= encoding->code_last  )
        {
          FT_UInt idx = encoding->char_index[charcode];


          result = ft_atoi( (const char *)face->type1.charstrings[idx] );
        }
        goto Exit;
      }

      /*******************************************************************/
      /*                                                                 */
      /* Adobe Standard & Expert encoding support                        */
      /*                                                                 */
    default:
      if ( charcode < 256 )
      {
        FT_UInt      code;
        FT_Int       n;
        const char*  glyph_name;


        code = psnames->adobe_std_encoding[charcode];
        if ( charmap->encoding == ft_encoding_adobe_expert )
          code = psnames->adobe_expert_encoding[charcode];

        glyph_name = psnames->adobe_std_strings( code );
        if ( !glyph_name )
          break;

        for ( n = 0; n < face->type1.num_glyphs; n++ )
        {
          const char*  gname = face->type1.glyph_names[n];

          if ( gname && ( ft_strcmp( gname, glyph_name ) == 0 ) )
          {
            result = ft_atoi( (const char *)face->type1.charstrings[n] );
            break;
          }
        }
      }
    }

  Exit:
    return result;
  }