/* Check validity of NAME as a fontset name and return the
corresponding fontset. If not valid, signal an error.
- If NAME is t, return Vdefault_fontset. */
+
+ If NAME is t, return Vdefault_fontset. If NAME is nil, return the
+ fontset of *FRAME.
+
+ Set *FRAME to the actual frame. */
static Lisp_Object
-check_fontset_name (name)
- Lisp_Object name;
+check_fontset_name (name, frame)
+ Lisp_Object name, *frame;
{
int id;
+ if (NILP (*frame))
+ *frame = selected_frame;
+ CHECK_LIVE_FRAME (*frame);
+
if (EQ (name, Qt))
return Vdefault_fontset;
-
- CHECK_STRING (name);
- /* First try NAME as literal. */
- id = fs_query_fontset (name, 2);
- if (id < 0)
- /* For backward compatibility, try again NAME as pattern. */
- id = fs_query_fontset (name, 0);
- if (id < 0)
- error ("Fontset `%s' does not exist", SDATA (name));
+ if (NILP (name))
+ {
+ id = FRAME_FONTSET (XFRAME (*frame));
+ }
+ else
+ {
+ CHECK_STRING (name);
+ /* First try NAME as literal. */
+ id = fs_query_fontset (name, 2);
+ if (id < 0)
+ /* For backward compatibility, try again NAME as pattern. */
+ id = fs_query_fontset (name, 0);
+ if (id < 0)
+ error ("Fontset `%s' does not exist", SDATA (name));
+ }
return FONTSET_FROM_ID (id);
}
return make_unibyte_string (xlfd, i);
}
-/* Variables referred in set_fontset_font. They are set before
- map_charset_chars is called in Fset_fontset_font. */
-static Lisp_Object font_def_arg, add_arg;
-static int from_arg, to_arg;
+/* Callback function for map_charset_chars in Fset_fontset_font.
+ ARG is a vector [ FONTSET FONT_DEF ADD ASCII SCRIPT_RANGE_LIST ].
-/* Callback function for map_charset_chars in Fset_fontset_font. In
- FONTSET, set font_def_arg in a fashion specified by add_arg for
- characters in RANGE while ignoring the range between from_arg and
- to_arg. */
+ In FONTSET, set FONT_DEF in a fashion specified by ADD for
+ characters in RANGE and ranges in SCRIPT_RANGE_LIST before RANGE.
+ The consumed ranges are poped up from SCRIPT_RANGE_LIST, and the
+ new SCRIPT_RANGE_LIST is stored in ARG.
+
+ If ASCII is nil, don't set FONT_DEF for ASCII characters. It is
+ assured that SCRIPT_RANGE_LIST doesn't contain ASCII in that
+ case. */
static void
-set_fontset_font (fontset, range)
- Lisp_Object fontset, range;
+set_fontset_font (arg, range)
+ Lisp_Object arg, range;
{
- if (from_arg < to_arg)
- {
- int from = XINT (XCAR (range)), to = XINT (XCDR (range));
+ Lisp_Object fontset, font_def, add, ascii, script_range_list;
+ int from = XINT (XCAR (range)), to = XINT (XCDR (range));
- if (from < from_arg)
- {
- if (to > to_arg)
- {
- Lisp_Object range2;
+ fontset = AREF (arg, 0);
+ font_def = AREF (arg, 1);
+ add = AREF (arg, 2);
+ ascii = AREF (arg, 3);
+ script_range_list = AREF (arg, 4);
- range2 = Fcons (make_number (to_arg), XCDR (range));
- FONTSET_ADD (fontset, range, font_def_arg, add_arg);
- to = to_arg;
- }
- if (to > from_arg)
- range = Fcons (XCAR (range), make_number (from_arg));
- }
- else if (to <= to_arg)
+ if (NILP (ascii) && from < 0x80)
+ {
+ if (to < 0x80)
return;
- else
- {
- if (from < to_arg)
- range = Fcons (make_number (to_arg), XCDR (range));
- }
+ from = 0x80;
+ range = Fcons (make_number (0x80), XCDR (range));
+ }
+
+#define SCRIPT_FROM XINT (XCAR (XCAR (script_range_list)))
+#define SCRIPT_TO XINT (XCDR (XCAR (script_range_list)))
+#define POP_SCRIPT_RANGE() script_range_list = XCDR (script_range_list)
+
+ for (; CONSP (script_range_list) && SCRIPT_TO < from; POP_SCRIPT_RANGE ())
+ FONTSET_ADD (fontset, XCAR (script_range_list), font_def, add);
+ if (CONSP (script_range_list))
+ {
+ if (SCRIPT_FROM < from)
+ range = Fcons (make_number (SCRIPT_FROM), XCDR (range));
+ while (CONSP (script_range_list) && SCRIPT_TO <= to)
+ POP_SCRIPT_RANGE ();
+ if (CONSP (script_range_list) && SCRIPT_FROM <= to)
+ XSETCAR (XCAR (script_range_list), make_number (to + 1));
}
- FONTSET_ADD (fontset, range, font_def_arg, add_arg);
+
+ FONTSET_ADD (fontset, range, font_def, add);
+ ASET (arg, 4, script_range_list);
}
extern Lisp_Object QCfamily, QCregistry;
doc: /*
Modify fontset NAME to use FONT-SPEC for TARGET characters.
+NAME is a fontset name string, nil for the fontset of FRAME, or t for
+the default fontset.
+
TARGET may be a cons; (FROM . TO), where FROM and TO are characters.
In that case, use FONT-SPEC for all characters in the range FROM and
TO (inclusive).
* A font name string.
* nil, which explicitly specifies that there's no font for TARGET.
-Optional 4th argument FRAME, if non-nil, is a frame. This argument is
-kept for backward compatibility and has no meaning.
+Optional 4th argument FRAME is a frame or nil for the selected frame
+that is concerned in the case that NAME is nil.
Optional 5th argument ADD, if non-nil, specifies how to add FONT-SPEC
to the font specifications for TARGET previously set. If it is
Lisp_Object fontname;
int ascii_changed = 0;
- fontset = check_fontset_name (name);
-
- /* The arg FRAME is kept for backward compatibility. We only check
- the validity. */
- if (!NILP (frame))
- CHECK_LIVE_FRAME (frame);
+ fontset = check_fontset_name (name, &frame);
fontname = Qnil;
if (CONSP (font_spec))
val = Fcons (target, Qnil);
map_char_table (accumulate_script_ranges, Qnil, Vchar_script_table,
val);
- range_list = XCDR (val);
+ range_list = Fnreverse (XCDR (val));
}
if (CHARSETP (target))
{
else
error ("Invalid target for setting a font");
- if (NILP (font_spec) && ascii_changed)
- error ("Can't set ASCII font to nil");
+ if (ascii_changed)
+ {
+ Lisp_Object val;
+
+ if (NILP (font_spec))
+ error ("Can't set ASCII font to nil");
+ val = CHAR_TABLE_REF (fontset, 0);
+ if (! NILP (val) && EQ (add, Qappend))
+ /* We are going to change just an additional font for ASCII. */
+ ascii_changed = 0;
+ }
if (charset)
{
- font_def_arg = font_def;
- add_arg = add;
- if (NILP (range_list))
- from_arg = to_arg = 0;
- else
- from_arg = XINT (XCAR (XCAR (range_list))),
- to_arg = XINT (XCDR (XCAR (range_list)));
+ Lisp_Object arg;
+
+ arg = Fmake_vector (make_number (5), Qnil);
+ ASET (arg, 0, fontset);
+ ASET (arg, 1, font_def);
+ ASET (arg, 2, add);
+ ASET (arg, 3, ascii_changed ? Qt : Qnil);
+ ASET (arg, 4, range_list);
- map_charset_chars (set_fontset_font, Qnil, fontset, charset,
+ map_charset_chars (set_fontset_font, Qnil, arg, charset,
CHARSET_MIN_CODE (charset),
CHARSET_MAX_CODE (charset));
+ range_list = AREF (arg, 4);
}
for (; CONSP (range_list); range_list = XCDR (range_list))
FONTSET_ADD (fontset, XCAR (range_list), font_def, add);
Vfontset_alias_alist = Fcons (Fcons (name, alias), Vfontset_alias_alist);
auto_fontset_alist = Fcons (Fcons (font_spec, fontset), auto_fontset_alist);
font_spec = Fcopy_font_spec (font_spec);
- ASET (font_spec, FONT_REGISTRY_INDEX, Qiso10646_1);
for (i = FONT_WEIGHT_INDEX; i < FONT_EXTRA_INDEX; i++)
ASET (font_spec, i, Qnil);
Fset_fontset_font (name, Qlatin, font_spec, Qnil, Qnil);
Fset_fontset_font (name, Qnil, font_spec, Qnil, Qnil);
if (registry != Qiso10646_1)
{
- ASET (font_spec, FONT_REGISTRY_INDEX, registry);
- Fset_fontset_font (name, Qascii, font_spec, Qnil, Qnil);
+ font_spec = Fcopy_font_spec (font_spec);
+ ASET (font_spec, FONT_REGISTRY_INDEX, Qiso10646_1);
+ Fset_fontset_font (name, Qlatin, font_spec, Qnil, Qappend);
}
FONTSET_ASCII (fontset) = font_name;
DEFUN ("fontset-info", Ffontset_info, Sfontset_info, 1, 2, 0,
doc: /* Return information about a fontset FONTSET on frame FRAME.
-The value is a char-table whose elements have this form:
- ((FONT-PATTERN OPENED-FONT ...) ...)
+FONTSET is a fontset name string, nil for the fontset of FRAME, or t
+for the default fontset. FRAME nil means the selected frame.
-FONT-PATTERN is a vector:
+The value is a char-table whose elements have this form:
- [ FAMILY WEIGHT SLANT SWIDTH ADSTYLE REGISTRY ]
+ ((FONT OPENED-FONT ...) ...)
-or a string of font name pattern.
+FONT is a name of font specified for a range of characters.
OPENED-FONT is a name of a font actually opened.
-The char-table has one extra slot. The value is a char-table
-containing the information about the derived fonts from the default
-fontset. The format is the same as above. */)
+The char-table has one extra slot. If FONTSET is not the default
+fontset, the value the extra slot is a char-table containing the
+information about the derived fonts from the default fontset. The
+format is the same as above. */)
(fontset, frame)
Lisp_Object fontset, frame;
{
(*check_window_system_func) ();
- fontset = check_fontset_name (fontset);
-
- if (NILP (frame))
- frame = selected_frame;
- CHECK_LIVE_FRAME (frame);
+ fontset = check_fontset_name (fontset, &frame);
f = XFRAME (frame);
/* Recode fontsets realized on FRAME from the base fontset FONTSET
realized[1][j] = Qnil;
tables[0] = Fmake_char_table (Qfontset_info, Qnil);
- tables[1] = Fmake_char_table (Qnil, Qnil);
- XCHAR_TABLE (tables[0])->extras[0] = tables[1];
fontsets[0] = fontset;
- fontsets[1] = Vdefault_fontset;
+ if (fontset != Vdefault_fontset)
+ {
+ tables[1] = Fmake_char_table (Qnil, Qnil);
+ XCHAR_TABLE (tables[0])->extras[0] = tables[1];
+ fontsets[1] = Vdefault_fontset;
+ }
/* Accumulate information of the fontset in TABLE. The format of
each element is ((FONT-SPEC OPENED-FONT ...) ...). */
val = FONTSET_REF (realized[k][i], c);
else
val = FONTSET_FALLBACK (realized[k][i]);
- if (! VECTORP (val))
+ if (! CONSP (val) || ! VECTORP (XCDR (val)))
continue;
- /* VAL: [int ? [FACE-ID FONT-DEF FONT-OBJECT int] ... ] */
- for (j = 2; j < ASIZE (val); j++)
+ /* VAL: (int . [[FACE-ID FONT-DEF FONT-OBJECT int] ... ]) */
+ val = XCDR (val);
+ for (j = 0; j < ASIZE (val); j++)
{
elt = AREF (val, j);
if (FONT_OBJECT_P (RFONT_DEF_OBJECT (elt)))
}
c = to + 1;
}
+ if (fontset == Vdefault_fontset)
+ break;
}
return tables[0];
int c;
Lisp_Object fontset, elt, list, repertory, val;
int i, j;
+ Lisp_Object frame;
- fontset = check_fontset_name (name);
+ frame = Qnil;
+ fontset = check_fontset_name (name, &frame);
CHECK_CHARACTER (ch);
c = XINT (ch);