/* font.h -- Interface definition for font handling.
- Copyright (C) 2006-2015 Free Software Foundation, Inc.
+ Copyright (C) 2006-2016 Free Software Foundation, Inc.
Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011
National Institute of Advanced Industrial Science and Technology (AIST)
Registration Number H13PRO009
GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
#ifndef EMACS_FONT_H
#define EMACS_FONT_H
-#include "ccl.h"
-#include "frame.h"
+struct composition_it;
+struct face;
+struct glyph_string;
INLINE_HEADER_BEGIN
/* Predicates to check various font-related objects. */
/* True iff X is one of font-spec, font-entity, and font-object. */
-#define FONTP(x) PSEUDOVECTORP (x, PVEC_FONT)
+INLINE bool
+FONTP (Lisp_Object x)
+{
+ return PSEUDOVECTORP (x, PVEC_FONT);
+}
+
/* True iff X is font-spec. */
-#define FONT_SPEC_P(x) \
- (FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_SPEC_MAX)
+INLINE bool
+FONT_SPEC_P (Lisp_Object x)
+{
+ return FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_SPEC_MAX;
+}
+
+/* Like FONT_SPEC_P, but can be used in the garbage collector. */
+INLINE bool
+GC_FONT_SPEC_P (Lisp_Object x)
+{
+ return FONTP (x) && (gc_asize (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_SPEC_MAX;
+}
+
/* True iff X is font-entity. */
-#define FONT_ENTITY_P(x) \
- (FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_ENTITY_MAX)
+INLINE bool
+FONT_ENTITY_P (Lisp_Object x)
+{
+ return FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_ENTITY_MAX;
+}
+
+/* Like FONT_ENTITY_P, but can be used in the garbage collector. */
+INLINE bool
+GC_FONT_ENTITY_P (Lisp_Object x)
+{
+ return FONTP (x) && (gc_asize (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_ENTITY_MAX;
+}
+
/* True iff X is font-object. */
-#define FONT_OBJECT_P(x) \
- (FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_OBJECT_MAX)
-
-/* Check macros for various font-related objects. */
-
-#define CHECK_FONT(x) \
- 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 (false)
-#define CHECK_FONT_ENTITY(x) \
- 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 (false)
-
-#define CHECK_FONT_GET_OBJECT(x, font) \
- do { \
- CHECK_FONT_OBJECT (x); \
- font = XFONT_OBJECT (x); \
- } while (false)
+INLINE bool
+FONT_OBJECT_P (Lisp_Object x)
+{
+ return FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_OBJECT_MAX;
+}
+
+/* Like FONT_OBJECT_P, but can be used in the garbage collector. */
+INLINE bool
+GC_FONT_OBJECT_P (Lisp_Object x)
+{
+ return FONTP (x) && (gc_asize (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_OBJECT_MAX;
+}
+
+/* Type checking functions for various font-related objects. */
+
+INLINE void
+CHECK_FONT (Lisp_Object x)
+{
+ CHECK_TYPE (FONTP (x), Qfont, x);
+}
+
+INLINE void
+CHECK_FONT_SPEC (Lisp_Object x)
+{
+ CHECK_TYPE (FONT_SPEC_P (x), Qfont_spec, x);
+}
+
+INLINE void
+CHECK_FONT_ENTITY (Lisp_Object x)
+{
+ CHECK_TYPE (FONT_ENTITY_P (x), Qfont_entity, x);
+}
+
+INLINE void
+CHECK_FONT_OBJECT (Lisp_Object x)
+{
+ CHECK_TYPE (FONT_OBJECT_P (x), Qfont_object, x);
+}
+
+/* C pointer extraction functions for various font-related objects. */
+
+INLINE struct font_spec *
+XFONT_SPEC (Lisp_Object p)
+{
+ eassert (FONT_SPEC_P (p));
+ return XUNTAG (p, Lisp_Vectorlike);
+}
+
+INLINE struct font_spec *
+GC_XFONT_SPEC (Lisp_Object p)
+{
+ eassert (GC_FONT_SPEC_P (p));
+ return XUNTAG (p, Lisp_Vectorlike);
+}
+
+INLINE struct font_entity *
+XFONT_ENTITY (Lisp_Object p)
+{
+ eassert (FONT_ENTITY_P (p));
+ return XUNTAG (p, Lisp_Vectorlike);
+}
+
+INLINE struct font_entity *
+GC_XFONT_ENTITY (Lisp_Object p)
+{
+ eassert (GC_FONT_ENTITY_P (p));
+ return XUNTAG (p, Lisp_Vectorlike);
+}
+
+INLINE struct font *
+XFONT_OBJECT (Lisp_Object p)
+{
+ eassert (FONT_OBJECT_P (p));
+ return XUNTAG (p, Lisp_Vectorlike);
+}
+
+INLINE struct font *
+GC_XFONT_OBJECT (Lisp_Object p)
+{
+ eassert (GC_FONT_OBJECT_P (p));
+ return XUNTAG (p, Lisp_Vectorlike);
+}
-#define XFONT_SPEC(p) \
- (eassert (FONT_SPEC_P (p)), (struct font_spec *) XUNTAG (p, Lisp_Vectorlike))
-#define XFONT_ENTITY(p) \
- (eassert (FONT_ENTITY_P (p)), \
- (struct font_entity *) XUNTAG (p, Lisp_Vectorlike))
-#define XFONT_OBJECT(p) \
- (eassert (FONT_OBJECT_P (p)), (struct font *) XUNTAG (p, Lisp_Vectorlike))
#define XSETFONT(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_FONT))
+INLINE struct font *
+CHECK_FONT_GET_OBJECT (Lisp_Object x)
+{
+ CHECK_FONT_OBJECT (x);
+ return XFONT_OBJECT (x);
+}
+
/* Number of pt per inch (from the TeXbook). */
#define PT_PER_INCH 72.27
bool (*cached_font_ok) (struct frame *f,
Lisp_Object font_object,
Lisp_Object entity);
+
+ /* Optional
+
+ Return non-nil if the driver support rendering of combining
+ characters for FONT according to Unicode combining class. */
+ Lisp_Object (*combining_capability) (struct font *font);
};
extern void syms_of_ftxfont (void);
#ifdef HAVE_XFT
extern struct font_driver xftfont_driver;
-extern void syms_of_xftfont (void);
#endif
#if defined HAVE_FREETYPE || defined HAVE_XFT
extern struct font_driver ftxfont_driver;
+extern void syms_of_xftfont (void);
#endif
#ifdef HAVE_BDFFONT
extern void syms_of_bdffont (void);
extern void syms_of_nsfont (void);
extern void syms_of_macfont (void);
#endif /* HAVE_NS */
+#ifdef USE_CAIRO
+extern struct font_driver ftcrfont_driver;
+extern void syms_of_ftcrfont (void);
+#endif
#ifndef FONT_DEBUG
#define FONT_DEBUG