]> code.delx.au - gnu-emacs/blobdiff - src/font.h
(fast_looking_at): New function.
[gnu-emacs] / src / font.h
index a6360e1432e055485b5a8ca35aea5385ab68be52..fb66c167efeb5a022fea491eab91a0bec936b554 100644 (file)
@@ -1,6 +1,6 @@
 /* font.h -- Interface definition for font handling.
-   Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
-   Copyright (C) 2006, 2007, 2008
+   Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+   Copyright (C) 2006, 2007, 2008, 2009
      National Institute of Advanced Industrial Science and Technology (AIST)
      Registration Number H13PRO009
 
@@ -489,77 +489,6 @@ struct font_bitmap
 #define FONT_PIXEL_SIZE_QUANTUM 1
 
 struct face;
-struct composition;
-
-/* Macros for lispy glyph-string.  */
-enum lgstring_indices
-  {
-    LGSTRING_IX_FONT, LGSTRING_IX_WIDTH,
-    LGSTRING_IX_LBEARING, LGSTRING_IX_RBEARING,
-    LGSTRING_IX_ASCENT, LGSTRING_IX_DESCENT
-  };
-#define LGSTRING_SLOT(lgs, ix) AREF (AREF ((lgs), 0), ix)
-#define LGSTRING_FONT(lgs) LGSTRING_SLOT (lgs, LGSTRING_IX_FONT)
-#define LGSTRING_WIDTH(lgs) XINT (LGSTRING_SLOT (lgs, LGSTRING_IX_WIDTH))
-#define LGSTRING_LBEARING(lgs) XINT (LGSTRING_SLOT (lgs, LGSTRING_IX_LBEARING))
-#define LGSTRING_RBEARING(lgs) XINT (LGSTRING_SLOT (lgs, LGSTRING_IX_RBEARING))
-#define LGSTRING_ASCENT(lgs) XINT (LGSTRING_SLOT (lgs, LGSTRING_IX_ASCENT))
-#define LGSTRING_DESCENT(lgs) XINT (LGSTRING_SLOT (lgs, LGSTRING_IX_DESCENT))
-#define LGSTRING_SET_SLOT(lgs, ix, val) ASET (AREF ((lgs), 0), ix, (val))
-#define LGSTRING_SET_FONT(lgs, val)     \
-  LGSTRING_SET_SLOT(lgs, LGSTRING_IX_FONT, (val))
-#define LGSTRING_SET_WIDTH(lgs, val)   \
-  LGSTRING_SET_SLOT(lgs, LGSTRING_IX_WIDTH, make_number (val))
-#define LGSTRING_SET_LBEARING(lgs, val) \
-  LGSTRING_SET_SLOT(lgs, LGSTRING_IX_LBEARING, make_number (val))
-#define LGSTRING_SET_RBEARING(lgs, val)        \
-  LGSTRING_SET_SLOT(lgs, LGSTRING_IX_RBEARING, make_number (val))
-#define LGSTRING_SET_ASCENT(lgs, val)  \
-  LGSTRING_SET_SLOT(lgs, LGSTRING_IX_ASCENT, make_number (val))
-#define LGSTRING_SET_DESCENT(lgs, val) \
-  LGSTRING_SET_SLOT(lgs, LGSTRING_IX_DESCENT, make_number (val))
-
-#define LGSTRING_LENGTH(lgs) (ASIZE ((lgs)) - 1)
-#define LGSTRING_GLYPH(lgs, idx) AREF ((lgs), (idx) + 1)
-#define LGSTRING_SET_GLYPH(lgs, idx, val) ASET ((lgs), (idx) + 1, (val))
-
-/* Vector size of Lispy glyph.  */
-enum lglyph_indices
-  {
-    LGLYPH_IX_FROM, LGLYPH_IX_TO,  LGLYPH_IX_CHAR, LGLYPH_IX_CODE,
-    LGLYPH_IX_WIDTH, LGLYPH_IX_LBEARING, LGLYPH_IX_RBEARING,
-    LGLYPH_IX_ASCENT, LGLYPH_IX_DESCENT, LGLYPH_IX_ADJUSTMENT,
-    /* Not an index.  */
-    LGLYPH_SIZE
-  };
-#define LGLYPH_FROM(g) XINT (AREF ((g), LGLYPH_IX_FROM))
-#define LGLYPH_TO(g) XINT (AREF ((g), LGLYPH_IX_TO))
-#define LGLYPH_CHAR(g) XINT (AREF ((g), LGLYPH_IX_CHAR))
-#define LGLYPH_CODE(g) XUINT (AREF ((g), LGLYPH_IX_CODE))
-#define LGLYPH_WIDTH(g) XINT (AREF ((g), LGLYPH_IX_WIDTH))
-#define LGLYPH_LBEARING(g) XINT (AREF ((g), LGLYPH_IX_LBEARING))
-#define LGLYPH_RBEARING(g) XINT (AREF ((g), LGLYPH_IX_RBEARING))
-#define LGLYPH_ASCENT(g) XINT (AREF ((g), LGLYPH_IX_ASCENT))
-#define LGLYPH_DESCENT(g) XINT (AREF ((g), LGLYPH_IX_DESCENT))
-#define LGLYPH_ADJUSTMENT(g) AREF ((g), LGLYPH_IX_ADJUSTMENT)
-#define LGLYPH_SET_FROM(g, val) ASET ((g), LGLYPH_IX_FROM, make_number (val))
-#define LGLYPH_SET_TO(g, val) ASET ((g), LGLYPH_IX_TO, make_number (val))
-#define LGLYPH_SET_CHAR(g, val) ASET ((g), LGLYPH_IX_CHAR, make_number (val))
-/* FIXME: we should use make_uint_number here.  */
-#define LGLYPH_SET_CODE(g, val) ASET ((g), LGLYPH_IX_CODE, make_number (val))
-#define LGLYPH_SET_WIDTH(g, val) ASET ((g), LGLYPH_IX_WIDTH, make_number (val))
-#define LGLYPH_SET_LBEARING(g, val) ASET ((g), LGLYPH_IX_RBEARING, make_number (val))
-#define LGLYPH_SET_RBEARING(g, val) ASET ((g), LGLYPH_IX_LBEARING, make_number (val))
-#define LGLYPH_SET_ASCENT(g, val) ASET ((g), LGLYPH_IX_ASCENT, make_number (val))
-#define LGLYPH_SET_DESCENT(g, val) ASET ((g), LGLYPH_IX_DESCENT, make_number (val))
-#define LGLYPH_SET_ADJUSTMENT(g, val) ASET ((g), LGLYPH_IX_ADJUSTMENT, (val))
-
-#define LGLYPH_XOFF(g) (VECTORP (LGLYPH_ADJUSTMENT (g)) \
-                       ? XINT (AREF (LGLYPH_ADJUSTMENT (g), 0)) : 0)
-#define LGLYPH_YOFF(g) (VECTORP (LGLYPH_ADJUSTMENT (g)) \
-                       ? XINT (AREF (LGLYPH_ADJUSTMENT (g), 1)) : 0)
-#define LGLYPH_WADJUST(g) (VECTORP (LGLYPH_ADJUSTMENT (g)) \
-                          ? XINT (AREF (LGLYPH_ADJUSTMENT (g), 2)) : 0)
 
 #define FONT_INVALID_CODE 0xFFFFFFFF
 
@@ -618,10 +547,10 @@ struct font_driver
   void (*done_face) P_ ((FRAME_PTR f, struct face *face));
 
   /* Optional.
-     If FONT_ENTITY has a glyph for character C (Unicode code point),
-     return 1.  If not, return 0.  If a font must be opened to check
-     it, return -1.  */
-  int (*has_char) P_ ((Lisp_Object entity, int c));
+     If FONT (FONT-ENTITY or FONT-OBJECT) has a glyph for character C
+     (Unicode code point), return 1.  If not, return 0.  If FONT is
+     FONT-ENTITY and it must be opened to check it, return -1.  */
+  int (*has_char) P_ ((Lisp_Object font, int c));
 
   /* Return a glyph code of FONT for characer C (Unicode code point).
      If FONT doesn't have such a glyph, return FONT_INVALID_CODE.  */
@@ -696,7 +625,7 @@ struct font_driver
 
   /* Optional.
      Make the font driver ready for frame F.  Usually this function
-     makes some data specific to F and store it in F by calling
+     makes some data specific to F and stores it in F by calling
      font_put_frame_data ().  */
   int (*start_for_frame) P_ ((FRAME_PTR f));
   
@@ -707,24 +636,35 @@ struct font_driver
 
   /* Optional.
 
-     Shape text in LGSTRING.  See the docstring of `font-make-gstring'
-     for the format of LGSTRING.  If the (N+1)th element of LGSTRING
-     is nil, input of shaping is from the 1st to (N)th elements.  In
-     each input glyph, FROM, TO, CHAR, and CODE are already set.
+     Shape text in GSTRING.  See the docstring of
+     `composition-get-gstring' for the format of GSTRING.  If the
+     (N+1)th element of GSTRING is nil, input of shaping is from the
+     1st to (N)th elements.  In each input glyph, FROM, TO, CHAR, and
+     CODE are already set.
 
      This function updates all fields of the input glyphs.  If the
      output glyphs (M) are more than the input glyphs (N), (N+1)th
-     through (M)th elements of LGSTRING are updated possibly by making
-     a new glyph object and storing it in LGSTRING.  If (M) is greater
-     than the length of LGSTRING, nil should be return.  In that case,
-     this function is called again with the larger LGSTRING.  */
+     through (M)th elements of GSTRING are updated possibly by making
+     a new glyph object and storing it in GSTRING.  If (M) is greater
+     than the length of GSTRING, nil should be return.  In that case,
+     this function is called again with the larger GSTRING.  */
   Lisp_Object (*shape) P_ ((Lisp_Object lgstring));
 
   /* Optional.
 
      If FONT is usable on frame F, return 0.  Otherwise return -1.
-   */
+     This method is used only for debugging.  If this method is NULL,
+     Emacs assumes that the font is usable on any frame.  */
   int (*check) P_ ((FRAME_PTR F, struct font *font));
+
+  /* Optional.
+
+     Return the number of variation glyphs of character C supported by
+     FONT.  VARIATIONS is an array of 256 elements.  If the variation
+     selector N (1..256) defines a glyph, that glyph code is stored in
+     the (N-1)th element of VARIATIONS.  */
+  int (*get_variation_glyphs) P_ ((struct font *font,
+                                  int c, unsigned variations[256]));
 };
 
 
@@ -827,12 +767,10 @@ extern void free_font_driver_list P_ ((FRAME_PTR f));
 extern Lisp_Object font_update_drivers P_ ((FRAME_PTR f, Lisp_Object list));
 extern Lisp_Object font_at P_ ((int c, EMACS_INT pos, struct face *face,
                                struct window *w, Lisp_Object object));
-extern EMACS_INT font_range P_ ((EMACS_INT pos, EMACS_INT limit,
-                                struct face *face, FRAME_PTR f,
-                                Lisp_Object object));
-
-extern struct font *font_prepare_composition P_ ((struct composition *cmp,
-                                                 FRAME_PTR f));
+extern Lisp_Object font_range (EMACS_INT, EMACS_INT *,
+                              struct window *, struct face *,
+                              Lisp_Object);
+extern void font_fill_lglyph_metrics P_ ((Lisp_Object, Lisp_Object));
 
 extern Lisp_Object font_put_extra P_ ((Lisp_Object font, Lisp_Object prop,
                                        Lisp_Object val));
@@ -857,9 +795,6 @@ extern struct font_driver xftfont_driver;
 extern struct font_driver w32font_driver;
 extern struct font_driver uniscribe_font_driver;
 #endif /* WINDOWSNT */
-#ifdef MAC_OS
-extern struct font_driver atmfont_driver;
-#endif /* MAC_OS */
 #ifdef HAVE_NS
 extern struct font_driver nsfont_driver;
 #endif /* HAVE_NS */
@@ -869,6 +804,7 @@ extern struct font_driver nsfont_driver;
 #endif
 
 extern void font_add_log P_ ((char *, Lisp_Object, Lisp_Object));
+extern void font_deferred_log P_ ((char *, Lisp_Object, Lisp_Object));
 
 #ifdef FONT_DEBUG
 #define font_assert(X) do {if (!(X)) abort ();} while (0)