/* 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
#include "ccl.h"
#include "frame.h"
+INLINE_HEADER_BEGIN
+
/* We have three types of Lisp objects related to font.
FONT-SPEC
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
? (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) \
- 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) \
- 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) \
- 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) \
- 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) \
- 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) \
- (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) \
- (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) \
- (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) \
- 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;
/* 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;
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. */
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. */
};
int left;
int top;
int advance;
- void *extra;
};
/* 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)
-/* 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)
-/* 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)
-/* 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)
-/* 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)
/* 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) \
- 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) \
- 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) \
- 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); \
- } while (0)
+ } while (false)
#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)), \
- (struct font_entity *) XUNTAG (p, Lisp_Vectorlike))
+ (struct font_entity *) SCM_SMOB_DATA (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). */
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. */
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 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
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)); \
- } while (0)
+ } while (false)
+
+INLINE_HEADER_END
#endif /* not EMACS_FONT_H */