/***************************************************************************/
/*                                                                         */
/*  fttype1.c                                                              */
/*                                                                         */
/*    FreeType utility file for PS names support (body).                   */
/*                                                                         */
/*  Copyright 2002 by                                                      */
/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
/*                                                                         */
/*  This file is part of the FreeType project, and may only be used,       */
/*  modified, and distributed under the terms of the FreeType project      */
/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
/*  this file you indicate that you have read the license and              */
/*  understand and accept it fully.                                        */
/*                                                                         */
/***************************************************************************/


#include <ft2build.h>
#include FT_INTERNAL_TYPE1_TYPES_H
#include FT_INTERNAL_TYPE42_TYPES_H
#include FT_INTERNAL_OBJECTS_H


  /* documentation is in t1tables.h */

  FT_EXPORT_DEF( FT_Error )
  FT_Get_PS_Font_Info( FT_Face          face,
                       PS_FontInfoRec*  afont_info )
  {
    PS_FontInfo  font_info = NULL;
    FT_Error     error     = FT_Err_Invalid_Argument;
    const char*  driver_name;


    if ( face && face->driver && face->driver->root.clazz )
    {
      driver_name = face->driver->root.clazz->module_name;
      if ( ft_strcmp( driver_name, "type1" ) == 0 )
        font_info = &((T1_Face)face)->type1.font_info;
      else if ( ft_strcmp( driver_name, "t1cid" ) == 0 )
        font_info = &((CID_Face)face)->cid.font_info;
      else if ( ft_strcmp( driver_name, "type42" ) == 0 )
        font_info = &((T42_Face)face)->type1.font_info;
    }
    if ( font_info != NULL )
    {
      *afont_info = *font_info;
      error = FT_Err_Ok;
    }

    return error;
  }


  /* XXX: Bad hack, but I didn't want to change several drivers here. */

  /* documentation is in t1tables.h */

  FT_EXPORT_DEF( FT_Int )
  FT_Has_PS_Glyph_Names( FT_Face  face )
  {
    FT_Int       result = 0;
    const char*  driver_name;


    if ( face && face->driver && face->driver->root.clazz )
    {
      /* Currently, only the type1, type42 and cff drivers provide reliable */
      /* glyph names...                                                     */

      /* We could probably hack the TrueType driver to recognize    */
      /* certain cases where the glyph names are most certainly     */
      /* correct (e.g. using a 20 or 22 format `post' table), but   */
      /* this will probably happen later...                         */

      driver_name = face->driver->root.clazz->module_name;
      result      = ( ft_strcmp( driver_name, "type1"  ) == 0 ||
                      ft_strcmp( driver_name, "type42" ) == 0 ||
                      ft_strcmp( driver_name, "cff"    ) == 0 );
    }

    return result;
  }


/* END */
