dynwind fixes
[bpt/emacs.git] / src / font.h
index 3ee579a..fb55915 100644 (file)
@@ -1,5 +1,5 @@
 /* font.h -- Interface definition for font handling.
 /* font.h -- Interface definition for font handling.
-   Copyright (C) 2006-2013 Free Software Foundation, Inc.
+   Copyright (C) 2006-2014 Free Software Foundation, Inc.
    Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011
      National Institute of Advanced Industrial Science and Technology (AIST)
      Registration Number H13PRO009
    Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011
      National Institute of Advanced Industrial Science and Technology (AIST)
      Registration Number H13PRO009
@@ -25,6 +25,8 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include "ccl.h"
 #include "frame.h"
 
 #include "ccl.h"
 #include "frame.h"
 
+INLINE_HEADER_BEGIN
+
 /* We have three types of Lisp objects related to font.
 
    FONT-SPEC
 /* We have three types of Lisp objects related to font.
 
    FONT-SPEC
@@ -117,7 +119,7 @@ enum font_property_index
        font.  */
     FONT_AVGWIDTH_INDEX,
 
        font.  */
     FONT_AVGWIDTH_INDEX,
 
-#if 0
+#if false
     /* The following two members are to substitute for the above 6
        members (FONT_WEIGHT_INDEX to FONT_AVGWIDTH_INDEX excluding
        FONT_SIZE_INDEX) if it is found that font-entities consumes too
     /* The following two members are to substitute for the above 6
        members (FONT_WEIGHT_INDEX to FONT_AVGWIDTH_INDEX excluding
        FONT_SIZE_INDEX) if it is found that font-entities consumes too
@@ -201,38 +203,47 @@ enum font_property_index
    ? (XINT (AREF ((font), FONT_WIDTH_INDEX)) >> 8) : -1)
 /* Return the symbolic weight value of FONT.  */
 #define FONT_WEIGHT_SYMBOLIC(font)     \
    ? (XINT (AREF ((font), FONT_WIDTH_INDEX)) >> 8) : -1)
 /* Return the symbolic weight value of FONT.  */
 #define FONT_WEIGHT_SYMBOLIC(font)     \
-  font_style_symbolic (font, FONT_WEIGHT_INDEX, 0)
+  font_style_symbolic (font, FONT_WEIGHT_INDEX, false)
 /* Return the symbolic slant value of FONT.  */
 #define FONT_SLANT_SYMBOLIC(font)      \
 /* Return the symbolic slant value of FONT.  */
 #define FONT_SLANT_SYMBOLIC(font)      \
-  font_style_symbolic (font, FONT_SLANT_INDEX, 0)
+  font_style_symbolic (font, FONT_SLANT_INDEX, false)
 /* Return the symbolic width value of FONT.  */
 #define FONT_WIDTH_SYMBOLIC(font)      \
 /* Return the symbolic width value of FONT.  */
 #define FONT_WIDTH_SYMBOLIC(font)      \
-  font_style_symbolic (font, FONT_WIDTH_INDEX, 0)
+  font_style_symbolic (font, FONT_WIDTH_INDEX, false)
 /* Return the face-weight corresponding to the weight of FONT.  */
 #define FONT_WEIGHT_FOR_FACE(font)     \
 /* Return the face-weight corresponding to the weight of FONT.  */
 #define FONT_WEIGHT_FOR_FACE(font)     \
-  font_style_symbolic (font, FONT_WEIGHT_INDEX, 1)
+  font_style_symbolic (font, FONT_WEIGHT_INDEX, true)
 /* Return the face-slant corresponding to the slant of FONT.  */
 #define FONT_SLANT_FOR_FACE(font)      \
 /* Return the face-slant corresponding to the slant of FONT.  */
 #define FONT_SLANT_FOR_FACE(font)      \
-  font_style_symbolic (font, FONT_SLANT_INDEX, 1)
+  font_style_symbolic (font, FONT_SLANT_INDEX, true)
 /* Return the face-swidth corresponding to the slant of FONT.  */
 #define FONT_WIDTH_FOR_FACE(font)      \
 /* Return the face-swidth corresponding to the slant of FONT.  */
 #define FONT_WIDTH_FOR_FACE(font)      \
-  font_style_symbolic (font, FONT_WIDTH_INDEX, 1)
+  font_style_symbolic (font, FONT_WIDTH_INDEX, true)
 
 /* Return the numeric weight value corresponding ot the symbol NAME.  */
 #define FONT_WEIGHT_NAME_NUMERIC(name) \
 
 /* Return the numeric weight value corresponding ot the symbol NAME.  */
 #define FONT_WEIGHT_NAME_NUMERIC(name) \
-  (font_style_to_value (FONT_WEIGHT_INDEX, (name), 0) >> 8)
+  (font_style_to_value (FONT_WEIGHT_INDEX, (name), false) >> 8)
 /* Return the numeric slant value corresponding ot the symbol NAME.  */
 #define FONT_SLANT_NAME_NUMERIC(name)  \
 /* Return the numeric slant value corresponding ot the symbol NAME.  */
 #define FONT_SLANT_NAME_NUMERIC(name)  \
-  (font_style_to_value (FONT_SLANT_INDEX, (name), 0) >> 8)
+  (font_style_to_value (FONT_SLANT_INDEX, (name), false) >> 8)
 /* Return the numeric width value corresponding ot the symbol NAME.  */
 #define FONT_WIDTH_NAME_NUMERIC(name)  \
 /* Return the numeric width value corresponding ot the symbol NAME.  */
 #define FONT_WIDTH_NAME_NUMERIC(name)  \
-  (font_style_to_value (FONT_WIDTH_INDEX, (name), 0) >> 8)
+  (font_style_to_value (FONT_WIDTH_INDEX, (name), false) >> 8)
 
 /* Set the font property PROP of FONT to VAL.  PROP is one of
    style-related font property index (FONT_WEIGHT/SLANT/WIDTH_INDEX).
    VAL (integer or symbol) is the numeric or symbolic style value.  */
 #define FONT_SET_STYLE(font, prop, val)        \
 
 /* Set the font property PROP of FONT to VAL.  PROP is one of
    style-related font property index (FONT_WEIGHT/SLANT/WIDTH_INDEX).
    VAL (integer or symbol) is the numeric or symbolic style value.  */
 #define FONT_SET_STYLE(font, prop, val)        \
-  ASET ((font), prop, make_number (font_style_to_value (prop, val, 1)))
+  ASET ((font), prop, make_number (font_style_to_value (prop, val, true)))
+
+#ifndef MSDOS
+#define FONT_WIDTH(f) ((f)->max_width)
+#else
+#define FONT_WIDTH(f) 1
+#endif
+#define FONT_HEIGHT(f) ((f)->height)
+#define FONT_BASE(f) ((f)->ascent)
+#define FONT_DESCENT(f) ((f)->descent)
 
 extern Lisp_Object QCspacing, QCdpi, QCscalable, QCotf, QClang, QCscript;
 extern Lisp_Object QCavgwidth, QCantialias, QCfont_entity;
 
 extern Lisp_Object QCspacing, QCdpi, QCscalable, QCotf, QClang, QCscript;
 extern Lisp_Object QCavgwidth, QCantialias, QCfont_entity;
@@ -307,6 +318,10 @@ struct font
   /* Ascent and descent of the font (in pixels).  */
   int ascent, descent;
 
   /* Ascent and descent of the font (in pixels).  */
   int ascent, descent;
 
+  /* The following members makes sense on graphic displays only.  */
+
+#if defined (HAVE_WINDOW_SYSTEM)
+
   /* Vertical pixel width of the underline.  If is zero if that
      information is not in the font.  */
   int underline_thickness;
   /* Vertical pixel width of the underline.  If is zero if that
      information is not in the font.  */
   int underline_thickness;
@@ -369,12 +384,6 @@ struct font
      registered in char-table `use-default-ascent'.  */
   int default_ascent;
 
      registered in char-table `use-default-ascent'.  */
   int default_ascent;
 
-  /* CCL program to calculate code points of the font.  */
-  struct ccl_program *font_encoder;
-
-  /* Font-driver for the font.  */
-  struct font_driver *driver;
-
   /* Charset to encode a character code into a glyph code of the font.
      -1 means that the font doesn't require this information to encode
      a character.  */
   /* Charset to encode a character code into a glyph code of the font.
      -1 means that the font doesn't require this information to encode
      a character.  */
@@ -385,6 +394,11 @@ struct font
      determine it.  */
   int repertory_charset;
 
      determine it.  */
   int repertory_charset;
 
+#endif /* HAVE_WINDOW_SYSTEM */
+
+  /* Font-driver for the font.  */
+  struct font_driver *driver;
+
   /* There are more members in this structure, but they are private
      to the font-driver.  */
 };
   /* There are more members in this structure, but they are private
      to the font-driver.  */
 };
@@ -412,24 +426,23 @@ struct font_bitmap
   int left;
   int top;
   int advance;
   int left;
   int top;
   int advance;
-  void *extra;
 };
 
 /* Predicates to check various font-related objects.  */
 
 };
 
 /* Predicates to check various font-related objects.  */
 
-/* 1 iff X is one of font-spec, font-entity, and font-object.  */
+/* True iff X is one of font-spec, font-entity, and font-object.  */
 #define FONTP(x) PSEUDOVECTORP (x, PVEC_FONT)
 #define FONTP(x) PSEUDOVECTORP (x, PVEC_FONT)
-/* 1 iff X is font-spec.  */
+/* True iff X is font-spec.  */
 #define FONT_SPEC_P(x) \
   (FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_SPEC_MAX)
 #define FONT_SPEC_P(x) \
   (FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_SPEC_MAX)
-/* 1 iff X is font-entity.  */
+/* True iff X is font-entity.  */
 #define FONT_ENTITY_P(x)       \
   (FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_ENTITY_MAX)
 #define FONT_ENTITY_P(x)       \
   (FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_ENTITY_MAX)
-/* 1 iff X is font-object.  */
+/* True iff X is font-object.  */
 #define FONT_OBJECT_P(x)       \
   (FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_OBJECT_MAX)
 
 #define FONT_OBJECT_P(x)       \
   (FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_OBJECT_MAX)
 
-/* 1 iff ENTITY can't be loaded.  */
+/* True iff ENTITY can't be loaded.  */
 #define FONT_ENTITY_NOT_LOADABLE(entity)       \
   EQ (AREF (entity, FONT_OBJLIST_INDEX), Qt)
 
 #define FONT_ENTITY_NOT_LOADABLE(entity)       \
   EQ (AREF (entity, FONT_OBJLIST_INDEX), Qt)
 
@@ -441,27 +454,30 @@ struct font_bitmap
 /* Check macros for various font-related objects.  */
 
 #define CHECK_FONT(x)  \
 /* Check macros for various font-related objects.  */
 
 #define CHECK_FONT(x)  \
-  do { if (! FONTP (x)) wrong_type_argument (Qfont, x); } while (0)
+  do { if (! FONTP (x)) wrong_type_argument (Qfont, x); } while (false)
 #define CHECK_FONT_SPEC(x)     \
 #define CHECK_FONT_SPEC(x)     \
-  do { if (! FONT_SPEC_P (x)) wrong_type_argument (Qfont_spec, x); } while (0)
+  do { if (! FONT_SPEC_P (x)) wrong_type_argument (Qfont_spec, x); } \
+  while (false)
 #define CHECK_FONT_ENTITY(x)   \
 #define CHECK_FONT_ENTITY(x)   \
-  do { if (! FONT_ENTITY_P (x)) wrong_type_argument (Qfont_entity, x); } while (0)
+  do { if (! FONT_ENTITY_P (x)) wrong_type_argument (Qfont_entity, x); } \
+  while (false)
 #define CHECK_FONT_OBJECT(x)   \
 #define CHECK_FONT_OBJECT(x)   \
-  do { if (! FONT_OBJECT_P (x)) wrong_type_argument (Qfont_object, x); } while (0)
+  do { if (! FONT_OBJECT_P (x)) wrong_type_argument (Qfont_object, x); } \
+  while (false)
 
 #define CHECK_FONT_GET_OBJECT(x, font) \
   do {                                 \
     CHECK_FONT_OBJECT (x);             \
     font = XFONT_OBJECT (x);           \
 
 #define CHECK_FONT_GET_OBJECT(x, font) \
   do {                                 \
     CHECK_FONT_OBJECT (x);             \
     font = XFONT_OBJECT (x);           \
-  } while (0)
+  } while (false)
 
 #define XFONT_SPEC(p)  \
 
 #define XFONT_SPEC(p)  \
-  (eassert (FONT_SPEC_P (p)), (struct font_spec *) XUNTAG (p, Lisp_Vectorlike))
+  (eassert (FONT_SPEC_P (p)), (struct font_spec *) SCM_SMOB_DATA (p))
 #define XFONT_ENTITY(p)        \
   (eassert (FONT_ENTITY_P (p)), \
 #define XFONT_ENTITY(p)        \
   (eassert (FONT_ENTITY_P (p)), \
-   (struct font_entity *) XUNTAG (p, Lisp_Vectorlike))
+   (struct font_entity *) SCM_SMOB_DATA (p))
 #define XFONT_OBJECT(p)        \
 #define XFONT_OBJECT(p)        \
-  (eassert (FONT_OBJECT_P (p)), (struct font *) XUNTAG (p, Lisp_Vectorlike))
+  (eassert (FONT_OBJECT_P (p)), (struct font *) SCM_SMOB_DATA (p))
 #define XSETFONT(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_FONT))
 
 /* Number of pt per inch (from the TeXbook).  */
 #define XSETFONT(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_FONT))
 
 /* Number of pt per inch (from the TeXbook).  */
@@ -545,14 +561,12 @@ struct font_driver
   Lisp_Object (*open) (struct frame *f, Lisp_Object font_entity,
                        int pixel_size);
 
   Lisp_Object (*open) (struct frame *f, Lisp_Object font_entity,
                        int pixel_size);
 
-  /* Close FONT on frame F.  */
-  void (*close) (struct frame *f, struct font *font);
+  /* Close FONT.  NOTE: this can be called by GC.  */
+  void (*close) (struct font *font);
 
 
-  /* Optional (if FACE->extra is not used).
-     Prepare FACE for displaying characters by FONT on frame F by
-     storing some data in FACE->extra.  If successful, return 0.
-     Otherwise, return -1.  */
-  int (*prepare_face) (struct frame *f, struct face *face);
+  /* Prepare FACE for displaying characters by FONT on frame F by
+     storing some data in FACE->extra.  */
+  void (*prepare_face) (struct frame *f, struct face *face);
 
   /* Optional.
      Done FACE for displaying characters by FACE->font on frame F.  */
 
   /* Optional.
      Done FACE for displaying characters by FACE->font on frame F.  */
@@ -575,6 +589,8 @@ struct font_driver
                        unsigned *code, int nglyphs,
                        struct font_metrics *metrics);
 
                        unsigned *code, int nglyphs,
                        struct font_metrics *metrics);
 
+#ifdef HAVE_WINDOW_SYSTEM
+
   /* Optional.
      Draw glyphs between FROM and TO of S->char2b at (X Y) pixel
      position of frame F with S->FACE and S->GC.  If WITH_BACKGROUND,
   /* Optional.
      Draw glyphs between FROM and TO of S->char2b at (X Y) pixel
      position of frame F with S->FACE and S->GC.  If WITH_BACKGROUND,
@@ -595,6 +611,8 @@ struct font_driver
      Free bitmap data in BITMAP.  */
   void (*free_bitmap) (struct font *font, struct font_bitmap *bitmap);
 
      Free bitmap data in BITMAP.  */
   void (*free_bitmap) (struct font *font, struct font_bitmap *bitmap);
 
+#endif /* HAVE_WINDOW_SYSTEM */
+
   /* Optional.
      Return an outline data for glyph-code CODE of FONT.  The format
      of the outline data depends on the font-driver.  */
   /* Optional.
      Return an outline data for glyph-code CODE of FONT.  The format
      of the outline data depends on the font-driver.  */
@@ -773,6 +791,15 @@ extern int font_unparse_fcname (Lisp_Object font, int pixel_size,
                                 char *name, int bytes);
 extern void register_font_driver (struct font_driver *driver, struct frame *f);
 extern void free_font_driver_list (struct frame *f);
                                 char *name, int bytes);
 extern void register_font_driver (struct font_driver *driver, struct frame *f);
 extern void free_font_driver_list (struct frame *f);
+#ifdef ENABLE_CHECKING
+extern bool valid_font_driver (struct font_driver *);
+#else
+INLINE bool
+valid_font_driver (struct font_driver *d)
+{
+  return true;
+}
+#endif
 extern Lisp_Object font_update_drivers (struct frame *f, Lisp_Object list);
 extern Lisp_Object font_range (ptrdiff_t, ptrdiff_t, ptrdiff_t *,
                               struct window *, struct face *,
 extern Lisp_Object font_update_drivers (struct frame *f, Lisp_Object list);
 extern Lisp_Object font_range (ptrdiff_t, ptrdiff_t, ptrdiff_t *,
                               struct window *, struct face *,
@@ -805,7 +832,8 @@ extern void syms_of_ftxfont (void);
 extern Lisp_Object Qxft;
 extern struct font_driver xftfont_driver;
 extern void syms_of_xftfont (void);
 extern Lisp_Object Qxft;
 extern struct font_driver xftfont_driver;
 extern void syms_of_xftfont (void);
-#elif defined HAVE_FREETYPE
+#endif
+#if defined HAVE_FREETYPE || defined HAVE_XFT
 extern struct font_driver ftxfont_driver;
 #endif
 #ifdef HAVE_BDFFONT
 extern struct font_driver ftxfont_driver;
 #endif
 #ifdef HAVE_BDFFONT
@@ -821,6 +849,7 @@ extern void syms_of_w32font (void);
 extern Lisp_Object Qfontsize;
 extern struct font_driver nsfont_driver;
 extern void syms_of_nsfont (void);
 extern Lisp_Object Qfontsize;
 extern struct font_driver nsfont_driver;
 extern void syms_of_nsfont (void);
+extern void syms_of_macfont (void);
 #endif /* HAVE_NS */
 
 #ifndef FONT_DEBUG
 #endif /* HAVE_NS */
 
 #ifndef FONT_DEBUG
@@ -836,12 +865,14 @@ extern void font_deferred_log (const char *, Lisp_Object, Lisp_Object);
   do {                                         \
     if (! EQ (Vfont_log, Qt))                  \
       font_add_log ((ACTION), (ARG), (RESULT));        \
   do {                                         \
     if (! EQ (Vfont_log, Qt))                  \
       font_add_log ((ACTION), (ARG), (RESULT));        \
-  } while (0)
+  } while (false)
 
 #define FONT_DEFERRED_LOG(ACTION, ARG, RESULT)         \
   do {                                                 \
     if (! EQ (Vfont_log, Qt))                          \
       font_deferred_log ((ACTION), (ARG), (RESULT));   \
 
 #define FONT_DEFERRED_LOG(ACTION, ARG, RESULT)         \
   do {                                                 \
     if (! EQ (Vfont_log, Qt))                          \
       font_deferred_log ((ACTION), (ARG), (RESULT));   \
-  } while (0)
+  } while (false)
+
+INLINE_HEADER_END
 
 #endif /* not EMACS_FONT_H */
 
 #endif /* not EMACS_FONT_H */