*** empty log message ***
[m17n/m17n-lib.git] / src / font.h
index 6c77228..592fa2a 100644 (file)
@@ -1,5 +1,5 @@
 /* font.h -- header file for the font module.
-   Copyright (C) 2003, 2004
+   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
      National Institute of Advanced Industrial Science and Technology (AIST)
      Registration Number H15PRO112
 
 
    You should have received a copy of the GNU Lesser General Public
    License along with the m17n library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    02111-1307, USA.  */
 
 #ifndef _M17N_FONT_H_
 #define _M17N_FONT_H_
 
-/** Type of font stored in MFont->property[MFONT_TYPE].  */
-
-enum MFontType
-  {
-    /** Fonts supproted by a window system natively.  On X Window
-       System, it is an X font.  */
-    MFONT_TYPE_WIN,
-
-    /** Fonts supported by FreeType library.  */
-    MFONT_TYPE_FT,
-
-    /** anchor */
-    MFONT_TYPE_MAX
-  };
-
-
 enum MFontProperty
   {
     /* The order of MFONT_FOUNDRY to MFONT_ADSTYLE must be the same as
@@ -50,13 +34,41 @@ enum MFontProperty
     MFONT_STRETCH,
     MFONT_ADSTYLE,
     MFONT_REGISTRY,
-    MFONT_SIZE,
     MFONT_RESY,
-    MFONT_TYPE,
+    /* The follwoings should not be used as an index to
+       MFont->propperty.  */
+    MFONT_SIZE,
+    MFONT_SPACING,
     /* anchor */
-    MFONT_PROPERTY_MAX
+    MFONT_PROPERTY_MAX = MFONT_SIZE
   };
 
+enum MFontType
+  {
+    MFONT_TYPE_SPEC,
+    MFONT_TYPE_OBJECT,
+    MFONT_TYPE_REALIZED,
+    MFONT_TYPE_FAILURE
+  };
+
+enum MFontSource
+  {
+    MFONT_SOURCE_UNDECIDED = 0,
+    MFONT_SOURCE_X = 1,
+    MFONT_SOURCE_FT = 2
+  };
+
+enum MFontSpacing
+  {
+    MFONT_SPACING_UNDECIDED,
+    MFONT_SPACING_PROPORTIONAL,
+    MFONT_SPACING_MONO,
+    MFONT_SPACING_CHARCELL
+  };
+
+typedef struct MFontEncoding MFontEncoding;
+typedef struct MFontDriver MFontDriver;
+
 /** Information about a font.  This structure is used in three ways:
     FONT-OBJ, FONT-OPENED, and FONT-SPEC.  
 
@@ -81,19 +93,31 @@ struct MFont
       means that the correponding property is not specified (i.e. wild
       card).
 
-      <property>[MFONT_SIZE] is the size of the font in 1/10 pixels.
-
       For FONT-OBJ: If the value is 0, the font is scalable or
       auto-scaled.
 
       For FONT-OPENED: The actual size of opened font.
 
-      <prperty>[MFONT_RESY] is the designed resolution of the font in
+      <property>[MFONT_RESY] is the designed resolution of the font in
       DPI, or zero.  Zero means that the font is scalable.
 
       For the time being, we mention only Y-resolution (resy) and
       assume that resx is always equal to resy.  */
   unsigned short property[MFONT_PROPERTY_MAX];
+  unsigned type : 2;
+  unsigned source : 2;
+  unsigned spacing : 2;
+  unsigned for_full_width : 1;
+  /* For FONT-OBJ, 1 means `size' is a logical or of bit masks for
+     available pixel sizes (Nth bit corresponds to (6 + N) pixels), 0
+     means `size' is an actual pixel size * 10.  For FONT-SPEC and
+     FONT-OPENED, this is always 0, and `size' is an actual pixel
+     size * 10.  */
+  unsigned multiple_sizes : 1;
+  unsigned size : 24;
+  MSymbol file;
+  MSymbol capability;
+  MFontEncoding *encoding;
 };
 
 typedef struct
@@ -107,133 +131,226 @@ extern MFontPropertyTable mfont__property_table[MFONT_REGISTRY + 1];
 
 /** Return the symbol of the Nth font property of FONT.  */
 #define FONT_PROPERTY(font, n) \
-  mfont__property_table[(n)].names[(font)->property[(n)]]
-
-typedef struct MFontEncoding MFontEncoding;
+  (mfont__property_table[(n)].names[(font)->property[(n)]])
 
 struct MRealizedFont
 {
-  /* Frame on which the font is realized.  */
-  MFrame *frame;
-
-  /* Font spec used to find the font.  */
+  /* Font spec used to find the font.
+     MRealizedFont::spec.property[MFONT_TYPE] is MFONT_TYPE_REALIZED
+     so that this object can be distingushed from MFont.  */
   MFont spec;
 
-  /* Font spec requested by a face.  */
-  MFont request;
+  /* Font identifier. */
+  MSymbol id;
 
-  /* The found font.  */
-  MFont font;
+  /* Frame on which the font is realized.  */
+  MFrame *frame;
 
-  /* How well <font> matches with <request>.  */
-  int score;
+  /* The found font.  */
+  MFont *font;
 
   MFontDriver *driver;
 
-  /* Font Layout Table for the font.  */
+  /* Font Layout Table for the font.  This is just a container to
+     carry the infomation.  */
   MSymbol layouter;
 
-  /* 0: not yet tried to open
-     -1: failed to open
-     1: succeessfully opened.  */
-  int status;
+  /* 1 iff the font is opend by encapsulating client-side font data.  */
+  int encapsulating;
 
-  /* Extra information set by <driver>->select or <driver>->open.  If
+  /* Extra information set by MRealizedFont::driver->open.  If
      non-NULL, it must be a pointer to a managed object.  */
   void *info;
 
-  short ascent, descent;
+  int x_ppem, y_ppem;
 
-  MFontEncoding *encoding;
+  int ascent, descent, max_advance, average_width, baseline_offset;
+
+  /* Pointer to the font structure.  */
+  void *fontp;
+
+  MRealizedFont *next;
 };
 
-/** Structure to hold a list of fonts of each registry.  */
+typedef struct MFLTFontForRealized {
+  MFLTFont font;
+  MRealizedFont *rfont;
+} MFLTFontForRealized;
+
+typedef struct {
+  MFont *font;
+  int score;
+} MFontScore;
+
+/** Structure to hold a list of fonts.  */
 
 typedef struct
 {
-  MSymbol tag;
+  MFont object;
+  MFontScore *fonts;
   int nfonts;
-  MFont *fonts;
 } MFontList;
 
-
 struct MFontDriver
 {
-  /** Return a font best matching with SPEC.  */
-  MRealizedFont *(*select) (MFrame *frame, MFont *spec, MFont *request,
-                           int limitted_size);
+  /** Return a font best matching with FONT.  */
+  MFont *(*select) (MFrame *frame, MFont *font, int limited_size);
 
   /** Open a font specified by RFONT.  */
-  int (*open) (MRealizedFont *rfont);
+  MRealizedFont *(*open) (MFrame *frame, MFont *font, MFont *spec,
+                         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);
 
-  void (*find_metric) (MRealizedFont *rfont, MGlyph *g);
+  /** Check if the font has a glyph for CODE.  CODE is a code point of
+      a character in font->encoder->encoding_charset.  Return nonzero
+      iff the font has the glyph.  */
+  int (*has_char) (MFrame *frame, MFont *font, MFont *spec,
+                  int c, unsigned code);
 
-  /** 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) (MFrame *frame, MFont *font, MFont *spec,
+                          unsigned code);
 
   /** Draw glyphs from FROM to TO (exclusive) on window WIN of FRAME
       at coordinate (X, Y) relative to WIN.  */
   void (*render) (MDrawWindow win, int x, int y,
                  MGlyphString *gstring, MGlyph *from, MGlyph *to,
                  int reverse, MDrawRegion region);
+
+  /** Push to PLIST fonts matching with FONT.  MAXNUM if greater than
+      0 limits the number of listed fonts.  Return the number of fonts
+      listed.  */
+  int (*list) (MFrame *frame, MPlist *plist, MFont *font, int maxnum);
+
+  /** Push to PLIST font family names (symbol) available on FRAME.  */
+  void (*list_family_names) (MFrame *frame, MPlist *plist);
+
+  /** Check if RFONT support CAPABILITY.  */
+  int (*check_capability) (MRealizedFont *rfont, MSymbol capability);
+
+  /** Open a font by encapsulating DATA.  */
+  MRealizedFont *(*encapsulate) (MFrame *frame, MSymbol source, void *data);
+
+  void (*close) (MRealizedFont *rfont);
+
+  int (*check_otf) (MFLTFont *font, MFLTOtfSpec *spec);
+
+  int (*drive_otf) (MFLTFont *font, MFLTOtfSpec *spec,
+                   MFLTGlyphString *in, int from, int to,
+                   MFLTGlyphString *out, MFLTGlyphAdjustment *adjustment);
+
+  int (*try_otf) (MFLTFont *font, MFLTOtfSpec *spec,
+                 MFLTGlyphString *in, int from, int to);
+
+  int (*iterate_otf_feature) (struct _MFLTFont *font, MFLTOtfSpec *spec,
+                             int from, int to, unsigned char *table);
 };
 
 /** Initialize the members of FONT.  */
 
 #define MFONT_INIT(font) memset ((font), 0, sizeof (MFont))
 
-
-extern MFontDriver *mfont__driver_list[MFONT_TYPE_MAX];
-
 extern MSymbol Mlayouter;
+extern MSymbol Miso8859_1, Miso10646_1, Municode_bmp, Municode_full;
+extern MSymbol Mapple_roman;
 
 extern int mfont__flt_init ();
 
 extern void mfont__flt_fini ();
 
 #ifdef HAVE_FREETYPE
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#endif
+
+#ifdef HAVE_FONTCONFIG
+#include <fontconfig/fontconfig.h>
+#endif
+
+#ifdef HAVE_OTF
+#include <otf.h>
+#else  /* not HAVE_OTF */
+typedef unsigned OTF_Tag;
+#endif /* not HAVE_OTF */
+
+enum MFontOpenTypeTable
+  {
+    MFONT_OTT_GSUB,
+    MFONT_OTT_GPOS,
+    MFONT_OTT_MAX
+  };
+
+typedef struct
+{
+  M17NObject control;
+  MSymbol language;
+  MSymbol script;
+  MSymbol otf;
+  OTF_Tag script_tag;
+  OTF_Tag langsys_tag;
+  struct {
+    char *str;
+    int nfeatures;
+    OTF_Tag *tags;
+  } features[MFONT_OTT_MAX];
+} MFontCapability;
+
+#ifdef HAVE_FREETYPE
+extern MFontDriver mfont__ft_driver;
+
 extern int mfont__ft_init ();
 
 extern void mfont__ft_fini ();
 
+extern int mfont__ft_parse_name (const 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,
-                               MSymbol script, MSymbol langsys,
-                               MSymbol gsub_features, MSymbol gpos_features);
+                               MFontCapability *capability);
+
 extern int mfont__ft_decode_otf (MGlyph *g);
 
+#endif /* HAVE_OTF */
+
 #endif /* HAVE_FREETYPE */
 
 extern void mfont__free_realized (MRealizedFont *rfont);
 
 extern int mfont__match_p (MFont *font, MFont *spec, int prop);
 
-extern int mfont__score (MFont *font, MFont *spec, MFont *request,
-                        int limitted_size);
+extern int mfont__merge (MFont *dst, MFont *src, int error_on_conflict);
 
 extern void mfont__set_spec_from_face (MFont *spec, MFace *face);
 
 extern MSymbol mfont__set_spec_from_plist (MFont *spec, MPlist *plist);
 
-extern void mfont__resize (MFont *spec, MFont *request);
+extern int mfont__has_char (MFrame *frame, MFont *font, MFont *spec, int c);
 
-extern int mfont__encodable_p (MRealizedFont *rfont, MSymbol layouter_name,
-                              int c);
+extern unsigned mfont__encode_char (MFrame *frame, MFont *font, MFont *spec,
+                                   int c);
 
-extern unsigned mfont__encode_char (MRealizedFont *rfont, int c);
+extern int mfont__get_glyph_id (MFLTFont *font, MFLTGlyphString *gstring,
+                               int from, int to);
 
-extern MRealizedFont *mfont__select (MFrame *frame, MFont *spec,
-                                    MFont *request, int limitted_size);
+extern MFont *mfont__select (MFrame *frame, MFont *font, int max_size);
 
-extern int mfont__open (MRealizedFont *rfont);
+extern MFontList *mfont__list (MFrame *frame, MFont *spec, MFont *request,
+                              int limited_size);
 
-extern void mfont__close (MRealizedFont *rfont);
+extern MRealizedFont *mfont__open (MFrame *frame, MFont *font, MFont *spec);
 
-extern void mfont__get_metric (MRealizedFont *rfont, MGlyph *g);
+extern void mfont__get_metric (MGlyphString *gstring, int from, int to);
+
+extern int mfont__get_metrics (MFLTFont *font, MFLTGlyphString *gstring,
+                              int from, int to);
 
 extern void mfont__set_property (MFont *font, enum MFontProperty key,
                                 MSymbol val);
@@ -241,13 +358,18 @@ extern void mfont__set_property (MFont *font, enum MFontProperty key,
 extern int mfont__split_name (char *name, int *property_idx,
                              unsigned short *point, unsigned short *resy);
 
-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 (const char *name, MSymbol format,
+                                       MFont *font);
+
+extern MPlist *mfont__encoding_list (void);
+
+extern MFontCapability *mfont__get_capability (MSymbol sym);
+
+extern int mfont__check_capability (MRealizedFont *rfont, MSymbol capability);
 
 extern unsigned mfont__flt_encode_char (MSymbol layouter_name, int c);
 
 extern int mfont__flt_run (MGlyphString *gstring, int from, int to,
-                          MSymbol layouter_name, MRealizedFace *ascii_rface);
+                          MRealizedFace *rface);
 
 #endif /* _M17N_FONT_H_ */