dynwind fixes
[bpt/emacs.git] / src / font.h
index 7781816..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,40 +203,44 @@ 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)
 #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)
 #define FONT_HEIGHT(f) ((f)->height)
 #define FONT_BASE(f) ((f)->ascent)
 #define FONT_DESCENT(f) ((f)->descent)
@@ -265,9 +271,6 @@ struct font_entity
 {
   struct vectorlike_header header;
   Lisp_Object props[FONT_ENTITY_MAX];
 {
   struct vectorlike_header header;
   Lisp_Object props[FONT_ENTITY_MAX];
-#ifdef HAVE_NS
-  struct font_driver *driver;
-#endif
 };
 
 /* A value which may appear in the member `encoding' of struct font
 };
 
 /* A value which may appear in the member `encoding' of struct font
@@ -319,9 +322,6 @@ struct font
 
 #if defined (HAVE_WINDOW_SYSTEM)
 
 
 #if defined (HAVE_WINDOW_SYSTEM)
 
-  /* The frame where the font was opened.  */
-  struct frame *frame;
-
   /* 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;
@@ -430,19 +430,19 @@ struct font_bitmap
 
 /* 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)
 
@@ -454,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).  */
@@ -561,11 +564,9 @@ struct font_driver
   /* Close FONT.  NOTE: this can be called by GC.  */
   void (*close) (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.  */
@@ -741,7 +742,6 @@ extern Lisp_Object merge_font_spec (Lisp_Object, Lisp_Object);
 
 extern Lisp_Object font_make_entity (void);
 extern Lisp_Object font_make_object (int, Lisp_Object, int);
 
 extern Lisp_Object font_make_entity (void);
 extern Lisp_Object font_make_object (int, Lisp_Object, int);
-extern void font_close_object (Lisp_Object);
 
 extern Lisp_Object find_font_encoding (Lisp_Object);
 extern int font_registry_charsets (Lisp_Object, struct charset **,
 
 extern Lisp_Object find_font_encoding (Lisp_Object);
 extern int font_registry_charsets (Lisp_Object, struct charset **,
@@ -791,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 *,
@@ -823,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
@@ -855,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 */