/* Fontset handler.
-Copyright (C) 2001-2012 Free Software Foundation, Inc.
+Copyright (C) 2001-2013 Free Software Foundation, Inc.
Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
2005, 2006, 2007, 2008, 2009, 2010, 2011
National Institute of Advanced Industrial Science and Technology (AIST)
#include <config.h>
#include <stdio.h>
-#include <setjmp.h>
#include "lisp.h"
#include "blockinput.h"
#ifdef HAVE_X_WINDOWS
#include "xterm.h"
#endif
-#ifdef WINDOWSNT
+#ifdef HAVE_NTGUI
#include "w32term.h"
#endif
#ifdef HAVE_NS
/* Prototype declarations for static functions. */
-static Lisp_Object fontset_add (Lisp_Object, Lisp_Object, Lisp_Object,
- Lisp_Object);
-static Lisp_Object fontset_find_font (Lisp_Object, int, struct face *,
- int, int);
-static void reorder_font_vector (Lisp_Object, struct font *);
-static Lisp_Object fontset_font (Lisp_Object, int, struct face *, int);
static Lisp_Object make_fontset (Lisp_Object, Lisp_Object, Lisp_Object);
-static Lisp_Object fontset_pattern_regexp (Lisp_Object);
-static void accumulate_script_ranges (Lisp_Object, Lisp_Object,
- Lisp_Object);
-static void set_fontset_font (Lisp_Object, Lisp_Object);
-/* Return 1 if ID is a valid fontset id, else return 0.
+/* Return true if ID is a valid fontset id.
Optimized away if ENABLE_CHECKING is not defined. */
-static int
+static bool
fontset_id_valid_p (int id)
{
return (id >= 0 && id < ASIZE (Vfontset_table) - 1);
/* Return the fontset with ID. No check of ID's validness. */
#define FONTSET_FROM_ID(id) AREF (Vfontset_table, id)
-/* Macros to access special values of FONTSET. */
+/* Access special values of FONTSET. */
#define FONTSET_ID(fontset) XCHAR_TABLE (fontset)->extras[0]
-#define SET_FONTSET_ID(fontset, id) \
- set_char_table_extras ((fontset), 0, (id))
+static void
+set_fontset_id (Lisp_Object fontset, Lisp_Object id)
+{
+ set_char_table_extras (fontset, 0, id);
+}
-/* Macros to access special values of (base) FONTSET. */
+/* Access special values of (base) FONTSET. */
#define FONTSET_NAME(fontset) XCHAR_TABLE (fontset)->extras[1]
-#define SET_FONTSET_NAME(fontset, name) \
- set_char_table_extras ((fontset), 1, (name))
+static void
+set_fontset_name (Lisp_Object fontset, Lisp_Object name)
+{
+ set_char_table_extras (fontset, 1, name);
+}
#define FONTSET_ASCII(fontset) XCHAR_TABLE (fontset)->extras[4]
-#define SET_FONTSET_ASCII(fontset, ascii) \
- set_char_table_extras ((fontset), 4, (ascii))
+static void
+set_fontset_ascii (Lisp_Object fontset, Lisp_Object ascii)
+{
+ set_char_table_extras (fontset, 4, ascii);
+}
-/* Macros to access special values of (realized) FONTSET. */
+/* Access special values of (realized) FONTSET. */
#define FONTSET_BASE(fontset) XCHAR_TABLE (fontset)->extras[2]
-#define SET_FONTSET_BASE(fontset, base) \
- set_char_table_extras ((fontset), 2, (base))
+static void
+set_fontset_base (Lisp_Object fontset, Lisp_Object base)
+{
+ set_char_table_extras (fontset, 2, base);
+}
#define FONTSET_FRAME(fontset) XCHAR_TABLE (fontset)->extras[3]
-#define SET_FONTSET_FRAME(fontset, frame) \
- set_char_table_extras ((fontset), 3, (frame))
+static void
+set_fontset_frame (Lisp_Object fontset, Lisp_Object frame)
+{
+ set_char_table_extras (fontset, 3, frame);
+}
#define FONTSET_NOFONT_FACE(fontset) XCHAR_TABLE (fontset)->extras[5]
-#define SET_FONTSET_NOFONT_FACE(fontset, face) \
- set_char_table_extras ((fontset), 5, (face))
+static void
+set_fontset_nofont_face (Lisp_Object fontset, Lisp_Object face)
+{
+ set_char_table_extras (fontset, 5, face);
+}
#define FONTSET_DEFAULT(fontset) XCHAR_TABLE (fontset)->extras[7]
-#define SET_FONTSET_DEFAULT(fontset, def) \
- set_char_table_extras ((fontset), 7, (def))
+static void
+set_fontset_default (Lisp_Object fontset, Lisp_Object def)
+{
+ set_char_table_extras (fontset, 7, def);
+}
/* For both base and realized fontset. */
#define FONTSET_FALLBACK(fontset) XCHAR_TABLE (fontset)->extras[8]
-#define SET_FONTSET_FALLBACK(fontset, fallback) \
- set_char_table_extras ((fontset), 8, (fallback))
+static void
+set_fontset_fallback (Lisp_Object fontset, Lisp_Object fallback)
+{
+ set_char_table_extras (fontset, 8, fallback);
+}
#define BASE_FONTSET_P(fontset) (NILP (FONTSET_BASE (fontset)))
#define FONTSET_ADD(fontset, range, elt, add) \
(NILP (add) \
? (NILP (range) \
- ? (SET_FONTSET_FALLBACK \
+ ? (set_fontset_fallback \
(fontset, Fmake_vector (make_number (1), (elt)))) \
- : Fset_char_table_range ((fontset), (range), \
- Fmake_vector (make_number (1), (elt)))) \
+ : ((void) \
+ Fset_char_table_range (fontset, range, \
+ Fmake_vector (make_number (1), elt)))) \
: fontset_add ((fontset), (range), (elt), (add)))
-static Lisp_Object
+static void
fontset_add (Lisp_Object fontset, Lisp_Object range, Lisp_Object elt, Lisp_Object add)
{
Lisp_Object args[2];
else
{
args[idx] = FONTSET_FALLBACK (fontset);
- SET_FONTSET_FALLBACK
+ set_fontset_fallback
(fontset, NILP (args[idx]) ? args[1 - idx] : Fvconcat (2, args));
}
- return Qnil;
}
static int
Lisp_Object vec, font_object;
int size;
int i;
- int score_changed = 0;
+ bool score_changed = 0;
if (font)
XSETFONT (font_object, font);
if (c >= 0)
char_table_set_range (fontset, from, to, font_group);
else
- SET_FONTSET_FALLBACK (fontset, font_group);
+ set_fontset_fallback (fontset, font_group);
return font_group;
}
ID is a charset-id that must be preferred, or -1 meaning no
preference.
- If FALLBACK is nonzero, search only fallback fonts. */
+ If FALLBACK, search only fallback fonts. */
static Lisp_Object
-fontset_find_font (Lisp_Object fontset, int c, struct face *face, int id, int fallback)
+fontset_find_font (Lisp_Object fontset, int c, struct face *face, int id,
+ bool fallback)
{
Lisp_Object vec, font_group;
int i, charset_matched = 0, found_index;
if (! EQ (base_fontset, Vdefault_fontset))
{
if (NILP (FONTSET_DEFAULT (fontset)))
- SET_FONTSET_DEFAULT
+ set_fontset_default
(fontset,
make_fontset (FONTSET_FRAME (fontset), Qnil, Vdefault_fontset));
FONT_DEFERRED_LOG ("default fontset: font for", make_number (c), Qnil);
fontset = Fmake_char_table (Qfontset, Qnil);
- SET_FONTSET_ID (fontset, make_number (id));
+ set_fontset_id (fontset, make_number (id));
if (NILP (base))
- SET_FONTSET_NAME (fontset, name);
+ set_fontset_name (fontset, name);
else
{
- SET_FONTSET_NAME (fontset, Qnil);
- SET_FONTSET_FRAME (fontset, frame);
- SET_FONTSET_BASE (fontset, base);
+ set_fontset_name (fontset, Qnil);
+ set_fontset_frame (fontset, frame);
+ set_fontset_base (fontset, base);
}
ASET (Vfontset_table, id, fontset);
#if 0
-/* Return 1 if FACE is suitable for displaying character C.
- Otherwise return 0. Called from the macro FACE_SUITABLE_FOR_CHAR_P
+/* Return true if FACE is suitable for displaying character C.
+ Called from the macro FACE_SUITABLE_FOR_CHAR_P
when C is not an ASCII character. */
-int
+bool
face_suitable_for_char_p (struct face *face, int c)
{
Lisp_Object fontset, rfont_def;
else
{
face_id = face_for_font (f, Qnil, face);
- SET_FONTSET_NOFONT_FACE (fontset, make_number (face_id));
+ set_fontset_nofont_face (fontset, make_number (face_id));
}
}
eassert (face_id >= 0);
doesn't remove FACE from a cache. Until we find a solution, we
suppress this code, and simply use Fclear_face_cache even though
that is not efficient. */
- BLOCK_INPUT;
+ block_input ();
for (id = 0; id < ASIZE (Vfontset_table); id++)
{
Lisp_Object this = AREF (Vfontset_table, id);
}
}
}
- UNBLOCK_INPUT;
+ unblock_input ();
#else /* not 0 */
/* But, we don't have to call Fclear_face_cache if no fontset has
been realized from BASE. */
Lisp_Object range_list;
struct charset *charset = NULL;
Lisp_Object fontname;
- int ascii_changed = 0;
+ bool ascii_changed = 0;
fontset = check_fontset_name (name, &frame);
Lisp_Object tail, fr, alist;
int fontset_id = XINT (FONTSET_ID (fontset));
- SET_FONTSET_ASCII (fontset, fontname);
+ set_fontset_ascii (fontset, fontname);
name = FONTSET_NAME (fontset);
FOR_EACH_FRAME (tail, fr)
{
len = font_unparse_xlfd (font_spec, 0, xlfd, 256);
if (len < 0)
error ("Invalid fontset name (perhaps too long): %s", SDATA (name));
- SET_FONTSET_ASCII (fontset, make_unibyte_string (xlfd, len));
+ set_fontset_ascii (fontset, make_unibyte_string (xlfd, len));
}
else
{
Fset_fontset_font (name, Qnil, font_spec, Qnil, Qnil);
}
- SET_FONTSET_ASCII (fontset, font_name);
+ set_fontset_ascii (fontset, font_name);
return XINT (FONTSET_ID (fontset));
}
}
if (! CHAR_VALID_P (c))
return Qnil;
+ if (!FRAME_WINDOW_P (f))
+ return Qnil;
face_id = FACE_FOR_CHAR (f, FACE_FROM_ID (f, face_id), c, pos, Qnil);
face = FACE_FROM_ID (f, face_id);
if (face->font)
Vdefault_fontset = Fmake_char_table (Qfontset, Qnil);
staticpro (&Vdefault_fontset);
- SET_FONTSET_ID (Vdefault_fontset, make_number (0));
- SET_FONTSET_NAME
+ set_fontset_id (Vdefault_fontset, make_number (0));
+ set_fontset_name
(Vdefault_fontset,
build_pure_c_string ("-*-*-*-*-*-*-*-*-*-*-*-*-fontset-default"));
ASET (Vfontset_table, 0, Vdefault_fontset);