(mface_put_prop): If the new value is the same as the
[m17n/m17n-lib.git] / src / font.h
index 1c64bb9..d17c363 100644 (file)
@@ -23,7 +23,7 @@
 #ifndef _M17N_FONT_H_
 #define _M17N_FONT_H_
 
-/** Type of font stored in MFont->property[MFONT_TYPE].  */
+/** Type of font.  Now obsolete.  */
 
 enum MFontType
   {
@@ -52,7 +52,6 @@ enum MFontProperty
     MFONT_REGISTRY,
     MFONT_SIZE,
     MFONT_RESY,
-    MFONT_TYPE,
     /* anchor */
     MFONT_PROPERTY_MAX
   };
@@ -145,6 +144,12 @@ struct MRealizedFont
   short ascent, descent;
 
   MFontEncoding *encoding;
+
+  /* Type of the font: Mx, Mfreetype, or Mxft.  */
+  MSymbol type;
+
+  /* Pointer to the font structure.  */
+  void *fontp;
 };
 
 /** Structure to hold a list of fonts of each registry.  */
@@ -159,24 +164,22 @@ typedef struct
 
 struct MFontDriver
 {
-  /** Return a font best matching with SPEC.  */
+  /** Return a font satisfying REQUEST and best matching with SPEC.
+      For the moment, LIMITTED_SIZE is ignored.  */
   MRealizedFont *(*select) (MFrame *frame, MFont *spec, MFont *request,
                            int limitted_size);
 
   /** Open a font specified by RFONT.  */
   int (*open) (MRealizedFont *rfont);
 
-  /** Close a font specified by RFONT.   */
-  void (*close) (MRealizedFont *rfont);
-
   /** Set metrics of glyphs in GSTRING from FROM to TO.  */
   void (*find_metric) (MRealizedFont *rfont, MGlyphString *gstring,
                       int from, int to);
 
-  /** Encode C into the glyph code the font.  CODE is a code point of
-      C in rfont->encoder->encoding_charset.  If the font has no glyph
-      for C, return MCHAR_INVALID_CODE.  */
-  unsigned (*encode_char) (MRealizedFont *rfont, int c, unsigned code);
+  /** Encode CODE into a glyph code the font.  CODE is a code point of
+      a character in rfont->encoder->encoding_charset.  If the font
+      has no glyph for CODE, return MCHAR_INVALID_CODE.  */
+  unsigned (*encode_char) (MRealizedFont *rfont, unsigned code);
 
   /** Draw glyphs from FROM to TO (exclusive) on window WIN of FRAME
       at coordinate (X, Y) relative to WIN.  */
@@ -189,9 +192,6 @@ struct MFontDriver
 
 #define MFONT_INIT(font) memset ((font), 0, sizeof (MFont))
 
-
-extern MFontDriver *mfont__driver_list[MFONT_TYPE_MAX];
-
 extern MSymbol Mlayouter;
 
 extern int mfont__flt_init ();
@@ -202,16 +202,45 @@ extern void mfont__flt_fini ();
 #include <ft2build.h>
 #include FT_FREETYPE_H
 
+#ifdef HAVE_OTF
+#include <otf.h>
+#endif /* HAVE_OTF */
+
+typedef struct
+{
+  M17NObject control;
+  MFont font;
+  char *filename;
+  int otf_flag;        /* This font is OTF (1), may be OTF (0), is not OTF (-1).  */
+  MPlist *charmap_list;
+  int charmap_index;
+  FT_Face ft_face;
+#ifdef HAVE_OTF
+  OTF *otf;
+#endif /* HAVE_OTF */
+  void *extra_info;            /* Xft uses this member.  */
+} MFTInfo;
+
+extern MFontDriver mfont__ft_driver;
+
 extern int mfont__ft_init ();
 
 extern void mfont__ft_fini ();
 
+extern int mfont__ft_parse_name (char *name, MFont *font);
+
+extern char *mfont__ft_unparse_name (MFont *font);
+
+#ifdef HAVE_OTF
+
 extern int mfont__ft_drive_otf (MGlyphString *gstring, int from, int to,
-                               MRealizedFont *rfont,
                                MSymbol script, MSymbol langsys,
                                MSymbol gsub_features, MSymbol gpos_features);
+
 extern int mfont__ft_decode_otf (MGlyph *g);
 
+#endif /* HAVE_OTF */
+
 #endif /* HAVE_FREETYPE */
 
 extern void mfont__free_realized (MRealizedFont *rfont);
@@ -227,9 +256,6 @@ extern MSymbol mfont__set_spec_from_plist (MFont *spec, MPlist *plist);
 
 extern void mfont__resize (MFont *spec, MFont *request);
 
-extern int mfont__encodable_p (MRealizedFont *rfont, MSymbol layouter_name,
-                              int c);
-
 extern unsigned mfont__encode_char (MRealizedFont *rfont, int c);
 
 extern MRealizedFont *mfont__select (MFrame *frame, MFont *spec,
@@ -238,8 +264,6 @@ extern MRealizedFont *mfont__select (MFrame *frame, MFont *spec,
 
 extern int mfont__open (MRealizedFont *rfont);
 
-extern void mfont__close (MRealizedFont *rfont);
-
 extern void mfont__get_metric (MGlyphString *gstring, int from, int to);
 
 extern void mfont__set_property (MFont *font, enum MFontProperty key,
@@ -252,6 +276,9 @@ extern void mfont__set_spec (MFont *font,
                             MSymbol attrs[MFONT_PROPERTY_MAX],
                             unsigned short size, unsigned short resy);
 
+extern int mfont__parse_name_into_font (char *name, MSymbol format,
+                                       MFont *font);
+
 extern unsigned mfont__flt_encode_char (MSymbol layouter_name, int c);
 
 extern int mfont__flt_run (MGlyphString *gstring, int from, int to,