/* Fontset handler.
-Copyright (C) 2001-2013 Free Software Foundation, Inc.
+Copyright (C) 2001-2015 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)
range of characters in this fontset, but may be available in the
default fontset.
+ A fontset has 8 extra slots.
- A fontset has 9 extra slots.
-
- The 1st slot: the ID number of the fontset
+ The 1st slot:
+ base: the ID number of the fontset
+ realized: Likewise
The 2nd slot:
base: the name of the fontset
realized: nil
The 3rd slot:
- base: nil
- realized: the base fontset
+ base: the font name for ASCII characters
+ realized: nil
The 4th slot:
base: nil
- realized: the frame that the fontset belongs to
+ realized: the base fontset
The 5th slot:
- base: the font name for ASCII characters
- realized: nil
+ base: nil
+ realized: the frame that the fontset belongs to
The 6th slot:
base: nil
has no font in a realized fontset.
The 7th slot:
- base: nil
- realized: Alist of font index vs the corresponding repertory
- char-table.
-
- The 8th slot:
base: nil
realized: If the base is not the default fontset, a fontset
- realized from the default fontset, else nil.
+ realized from the default fontset, else nil.
- The 9th slot:
+ The 8th slot:
base: Same as element value (but for fallback fonts).
realized: Likewise.
/********** VARIABLES and FUNCTION PROTOTYPES **********/
-static Lisp_Object Qfontset;
-static Lisp_Object Qfontset_info;
-static Lisp_Object Qprepend, Qappend;
-Lisp_Object Qlatin;
-
/* Vector containing all fontsets. */
static Lisp_Object Vfontset_table;
set_char_table_extras (fontset, 1, name);
}
-#define FONTSET_ASCII(fontset) XCHAR_TABLE (fontset)->extras[4]
+#define FONTSET_ASCII(fontset) XCHAR_TABLE (fontset)->extras[2]
static void
set_fontset_ascii (Lisp_Object fontset, Lisp_Object ascii)
{
- set_char_table_extras (fontset, 4, ascii);
+ set_char_table_extras (fontset, 2, ascii);
}
/* Access special values of (realized) FONTSET. */
-#define FONTSET_BASE(fontset) XCHAR_TABLE (fontset)->extras[2]
+#define FONTSET_BASE(fontset) XCHAR_TABLE (fontset)->extras[3]
static void
set_fontset_base (Lisp_Object fontset, Lisp_Object base)
{
- set_char_table_extras (fontset, 2, base);
+ set_char_table_extras (fontset, 3, base);
}
-#define FONTSET_FRAME(fontset) XCHAR_TABLE (fontset)->extras[3]
+#define FONTSET_FRAME(fontset) XCHAR_TABLE (fontset)->extras[4]
static void
set_fontset_frame (Lisp_Object fontset, Lisp_Object frame)
{
- set_char_table_extras (fontset, 3, frame);
+ set_char_table_extras (fontset, 4, frame);
}
#define FONTSET_NOFONT_FACE(fontset) XCHAR_TABLE (fontset)->extras[5]
set_char_table_extras (fontset, 5, face);
}
-#define FONTSET_DEFAULT(fontset) XCHAR_TABLE (fontset)->extras[7]
+#define FONTSET_DEFAULT(fontset) XCHAR_TABLE (fontset)->extras[6]
static void
set_fontset_default (Lisp_Object fontset, Lisp_Object def)
{
- set_char_table_extras (fontset, 7, def);
+ set_char_table_extras (fontset, 6, def);
}
/* For both base and realized fontset. */
-#define FONTSET_FALLBACK(fontset) XCHAR_TABLE (fontset)->extras[8]
+#define FONTSET_FALLBACK(fontset) XCHAR_TABLE (fontset)->extras[7]
static void
set_fontset_fallback (Lisp_Object fontset, Lisp_Object fallback)
{
- set_char_table_extras (fontset, 8, fallback);
+ set_char_table_extras (fontset, 7, fallback);
}
#define BASE_FONTSET_P(fontset) (NILP (FONTSET_BASE (fontset)))
Lisp_Object vec, font_object;
int size;
int i;
- bool score_changed = 0;
+ bool score_changed = false;
if (font)
XSETFONT (font_object, font);
if (RFONT_DEF_SCORE (rfont_def) != score)
{
RFONT_DEF_SET_SCORE (rfont_def, score);
- score_changed = 1;
+ score_changed = true;
}
}
if (score_changed)
- qsort (XVECTOR (vec)->u.contents, size, word_size,
+ qsort (XVECTOR (vec)->contents, size, word_size,
fontset_compare_rfontdef);
- XSETCAR (font_group, make_number (charset_ordered_list_tick));
+ EMACS_INT low_tick_bits = charset_ordered_list_tick & MOST_POSITIVE_FIXNUM;
+ XSETCAR (font_group, make_number (low_tick_bits));
}
/* Return a font-group (actually a cons (-1 . FONT-GROUP-VECTOR)) for
return elt;
}
-static void
-free_realized_fontset (struct frame *f, Lisp_Object fontset)
-{
-#if 0
- Lisp_Object tail;
-
- if (0)
- for (tail = FONTSET_OBJLIST (fontset); CONSP (tail); tail = XCDR (tail))
- {
- eassert (FONT_OBJECT_P (XCAR (tail)));
- font_close_object (f, XCAR (tail));
- }
-#endif
-}
-
/* Free fontset of FACE defined on frame F. Called from
free_realized_face. */
return;
eassert (! BASE_FONTSET_P (fontset));
eassert (f == XFRAME (FONTSET_FRAME (fontset)));
- free_realized_fontset (f, fontset);
ASET (Vfontset_table, face->fontset, Qnil);
if (face->fontset < next_fontset_id)
next_fontset_id = face->fontset;
fontset = AREF (Vfontset_table, id);
eassert (!NILP (fontset) && ! BASE_FONTSET_P (fontset));
eassert (f == XFRAME (FONTSET_FRAME (fontset)));
- free_realized_fontset (f, fontset);
ASET (Vfontset_table, id, Qnil);
if (id < next_fontset_id)
next_fontset_id = face->fontset;
face->fontset = -1;
}
-
-#if 0
-/* 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. */
-
-bool
-face_suitable_for_char_p (struct face *face, int c)
-{
- Lisp_Object fontset, rfont_def;
-
- fontset = FONTSET_FROM_ID (face->fontset);
- rfont_def = fontset_font (fontset, c, NULL, -1);
- return (VECTORP (rfont_def)
- && INTEGERP (RFONT_DEF_FACE (rfont_def))
- && face->id == XINT (RFONT_DEF_FACE (rfont_def)));
-}
-#endif
-
-
-/* Return ID of face suitable for displaying character C on frame F.
- FACE must be realized for ASCII characters in advance. Called from
- the macro FACE_FOR_CHAR. */
+/* Return ID of face suitable for displaying character C at buffer position
+ POS on frame F. FACE must be realized for ASCII characters in advance.
+ Called from the macro FACE_FOR_CHAR. */
int
-face_for_char (struct frame *f, struct face *face, int c, int pos, Lisp_Object object)
+face_for_char (struct frame *f, struct face *face, int c,
+ ptrdiff_t pos, Lisp_Object object)
{
Lisp_Object fontset, rfont_def, charset;
int face_id;
int id;
- /* If face->fontset is negative (that happens when no font is found
- for face), just return face->ascii_face because we can't do
- anything. Perhaps, we should fix the callers to assure
- that face->fontset is always valid. */
- if (ASCII_CHAR_P (c) || face->fontset < 0)
+ eassert (fontset_id_valid_p (face->fontset));
+
+ if (ASCII_CHAR_P (c) || CHAR_BYTE8_P (c))
return face->ascii_face->id;
#ifdef HAVE_NS
}
#endif
- eassert (fontset_id_valid_p (face->fontset));
fontset = FONTSET_FROM_ID (face->fontset);
eassert (!BASE_FONTSET_P (fontset));
Lisp_Object
-font_for_char (struct face *face, int c, int pos, Lisp_Object object)
+font_for_char (struct face *face, int c, ptrdiff_t pos, Lisp_Object object)
{
Lisp_Object fontset, rfont_def, charset;
int id;
/* If PATTERN is not full XLFD we convert "*" to ".*". Otherwise
we convert "*" to "[^-]*" which is much faster in regular
expression matching. */
- if (ndashes < 14)
- p1 = regex = alloca (SBYTES (pattern) + 2 * nstars + 2 * nescs + 1);
- else
- p1 = regex = alloca (SBYTES (pattern) + 5 * nstars + 2 * nescs + 1);
+ ptrdiff_t regexsize = (SBYTES (pattern)
+ + (ndashes < 14 ? 2 : 5) * nstars
+ + 2 * nescs + 1);
+ USE_SAFE_ALLOCA;
+ p1 = regex = SAFE_ALLOCA (regexsize);
*p1++ = '^';
for (p0 = SDATA (pattern); *p0; p0++)
Vcached_fontset_data = Fcons (build_string (SSDATA (pattern)),
build_string ((char *) regex));
+ SAFE_FREE ();
}
return CACHED_FONTSET_REGEX;
registry = AREF (font_spec, FONT_REGISTRY_INDEX);
if (! NILP (registry))
registry = Fdowncase (SYMBOL_NAME (registry));
- encoding = find_font_encoding (concat3 (family, build_string ("-"),
- registry));
+ AUTO_STRING (dash, "-");
+ encoding = find_font_encoding (concat3 (family, dash, registry));
if (NILP (encoding))
encoding = Qascii;
if (ascii_changed)
{
- Lisp_Object tail, fr, alist;
+ Lisp_Object tail, fr;
int fontset_id = XINT (FONTSET_ID (fontset));
set_fontset_ascii (fontset, fontname);
if (! NILP (font_object))
{
update_auto_fontset_alist (font_object, fontset);
- alist = list1 (Fcons (Qfont, Fcons (name, font_object)));
- Fmodify_frame_parameters (fr, alist);
+ AUTO_FRAME_ARG (arg, Qfont, Fcons (name, font_object));
+ Fmodify_frame_parameters (fr, arg);
}
}
}
return Qnil;
if (!FRAME_WINDOW_P (f))
return Qnil;
+ /* We need the basic faces to be valid below, so recompute them if
+ some code just happened to clear the face cache. */
+ if (FRAME_FACE_CACHE (f)->used == 0)
+ recompute_basic_faces (f);
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)
/* Recode fontsets realized on FRAME from the base fontset FONTSET
in the table `realized'. */
- realized[0] = alloca (word_size * ASIZE (Vfontset_table));
+ USE_SAFE_ALLOCA;
+ SAFE_ALLOCA_LISP (realized[0], 2 * ASIZE (Vfontset_table));
+ realized[1] = realized[0] + ASIZE (Vfontset_table);
for (i = j = 0; i < ASIZE (Vfontset_table); i++)
{
elt = FONTSET_FROM_ID (i);
}
realized[0][j] = Qnil;
- realized[1] = alloca (word_size * ASIZE (Vfontset_table));
for (i = j = 0; ! NILP (realized[0][i]); i++)
{
elt = FONTSET_DEFAULT (realized[0][i]);
break;
}
+ SAFE_FREE ();
return tables[0];
}
syms_of_fontset (void)
{
DEFSYM (Qfontset, "fontset");
- Fput (Qfontset, Qchar_table_extra_slots, make_number (9));
+ Fput (Qfontset, Qchar_table_extra_slots, make_number (8));
DEFSYM (Qfontset_info, "fontset-info");
Fput (Qfontset_info, Qchar_table_extra_slots, make_number (1));