/* libwmf ("font.h"): library for wmf conversion
   Copyright (C) 2000,2001 Francis James Franklin

   The libwmf Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   The libwmf Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public
   License along with the libwmf Library; see the file COPYING.  If not,
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */


#ifndef WMF_FONT_H
#define WMF_FONT_H

#include <ft2build.h>

#include FT_FREETYPE_H
#include FT_GLYPH_H

static void ipa_font_add_wmf (wmfAPI*,wmfFontMap*);
static void ipa_font_add_sub (wmfAPI*,wmfMapping*);
static void ipa_font_add_ps (wmfAPI*,wmfMapping*);
static void ipa_font_add_cache (wmfAPI*,wmfFT_CacheEntry*);
static void ipa_font_add_api (wmfAPI*,char*);

static float ipa_char_position (wmfAPI*,wmfFont*,char*,char*);

static wmfXML_FontInfo* ipa_font_sys_map (wmfAPI*,wmfFont*);
static FT_Face          ipa_font_sys_face (wmfAPI*,wmfFont*,wmfXML_FontInfo*);

#ifdef HAVE_EXPAT
static void exml_start (void*,const char*,const char**);
static void exmlfontmap_read (wmfAPI*,wmfXML_FontData*,char*);

typedef struct _EXML_FontData EXML_FontData;

struct _EXML_FontData
{	wmfAPI* API;

	wmfXML_FontData* FD;
};
#endif /* HAVE_EXPAT */

#ifdef HAVE_LIBXML2
static void xml2_start (void*,const char*,const char**);
static void xml2fontmap_read (wmfAPI*,wmfXML_FontData*,char*);

typedef struct _XML2_FontData XML2_FontData;

struct _XML2_FontData
{	wmfAPI* API;

	wmfXML_FontData* FD;
};
#endif /* HAVE_LIBXML2 */

static void            ipa_font_gs_file (wmfAPI* API,wmfGS_FontData* FD,char* file);
static void            ipa_font_gs_add (wmfAPI* API,wmfGS_FontData* FD,char* name,char* alias);
static char*           ipa_font_gs_alias (wmfAPI* API,wmfGS_FontData* FD,char* name);
static char*           ipa_font_gs_readline (wmfAPI* API,FILE* in);
static wmfGS_FontInfo* ipa_font_gs_map (wmfAPI* API,wmfFont* font);
static FT_Face         ipa_font_gs_face (wmfAPI* API,wmfFont* font,wmfGS_FontInfo* FI);

static FT_Face ipa_font_face (wmfAPI* API,wmfFont* font,char* ps_name);
static FT_Face ipa_font_face_open (wmfAPI* API,char* ps_name,char* glyphs,char* metrics);
static FT_Face ipa_font_face_cached (wmfAPI* API,wmfFont* font,char* ps_name);

static char* ipa_font_path_find (wmfAPI* API,char* file_name);

static char* ipa_font_std (wmfAPI* API,wmfFont* font);

/* postscript (standard 13) font name mapping to type 1 font file
 */
static wmfMapping PSFontMap[13] = {
	{	"Courier",		"n022003l.pfb",	ft_encoding_adobe_standard	},
	{	"Courier-Oblique",	"n022023l.pfb",	ft_encoding_adobe_standard	},
	{	"Courier-Bold",		"n022004l.pfb",	ft_encoding_adobe_standard	},
	{	"Courier-BoldOblique",	"n022024l.pfb",	ft_encoding_adobe_standard	},
	{	"Helvetica",		"n019003l.pfb",	ft_encoding_adobe_standard	},
	{	"Helvetica-Oblique",	"n019023l.pfb",	ft_encoding_adobe_standard	},
	{	"Helvetica-Bold",	"n019004l.pfb",	ft_encoding_adobe_standard	},
	{	"Helvetica-BoldOblique","n019024l.pfb",	ft_encoding_adobe_standard	},
	{	"Times-Roman",		"n021003l.pfb",	ft_encoding_adobe_standard	},
	{	"Times-Italic",		"n021023l.pfb",	ft_encoding_adobe_standard	},
	{	"Times-Bold",		"n021004l.pfb",	ft_encoding_adobe_standard	},
	{	"Times-BoldItalic",	"n021024l.pfb",	ft_encoding_adobe_standard	},
	{	"Symbol",		"s050000l.pfb",	ft_encoding_adobe_custom  	}};

/* exact WMF font name to postscript (standard 13) equivalent...
 * well, yeah, I know. :-(
 */
static wmfFontMap WMFFontMap[] = {
{ "Courier",		"Courier",     "Courier-Oblique",   "Courier-Bold",   "Courier-BoldOblique"   },
{ "Helvetica",		"Helvetica",   "Helvetica-Oblique", "Helvetica-Bold", "Helvetica-BoldOblique" },
{ "Modern",		"Courier",     "Courier-Oblique",   "Courier-Bold",   "Courier-BoldOblique"   },
{ "Monotype Corsiva",	"Courier",     "Courier-Oblique",   "Courier-Bold",   "Courier-BoldOblique"   },
{ "News Gothic",	"Helvetica",   "Helvetica-Oblique", "Helvetica-Bold", "Helvetica-BoldOblique" },
{ "Symbol",		"Symbol",      "Symbol",            "Symbol",         "Symbol"                },
{ "System",		"Courier",     "Courier-Oblique",   "Courier-Bold",   "Courier-BoldOblique"   },
{ "Times",		"Times-Roman", "Times-Italic",      "Times-Bold",     "Times-BoldItalic"      }};

/* Sub-string match if not in the above list;
 */
static wmfMapping SubFontMap[] = {
	{	"Arial",		"Helvetica"	},
	{	"Courier",		"Courier"	},
	{	"Fixed",		"Courier"	},
	{	"Helvetica",		"Helvetica"	},
	{	"Sans",			"Helvetica"	},
	{	"Sym",			"Symbol"	},
	{	"Terminal",		"Courier"	},
	{	"Times",		"Times"		},
	{	"Wingdings",		"Symbol"	}};

/* If all else fails, assume Times
 */
static char* DefaultFontMapping = "Times";

#endif /* ! WMF_FONT_H */
