- if (! face)
- return Qnil;
- if (! fallback)
- elt = FONTSET_REF_AND_RANGE (base_fontset, c, from, to);
- else
- elt = FONTSET_FALLBACK (base_fontset);
- range = Fcons (make_number (from), make_number (to));
- if (NILP (elt))
- {
- /* Qt means we have no font for characters of this range. */
- vec = Qt;
- }
- else
- {
- /* Build a vector [ -1 -1 nil NEW-ELT0 NEW-ELT1 NEW-ELT2 ... ],
- where the first -1 is to force reordering of NEW-ELTn,
- NEW-ELTn is [nil nil AREF (elt, n) nil]. */
-#ifdef USE_FONT_BACKEND
- if (! fallback
- && enable_font_backend
- && EQ (base_fontset, Vdefault_fontset))
- /* Extra one element is for an automatically added
- font-def specifying only a script. */
- vec = Fmake_vector (make_number (ASIZE (elt) + 4), Qnil);
- else
-#endif /* not USE_FONT_BACKEND */
- vec = Fmake_vector (make_number (ASIZE (elt) + 3), Qnil);
- ASET (vec, 0, make_number (-1));
- ASET (vec, 1, make_number (-1));
- for (i = 0; i < ASIZE (elt); i++)
- {
- Lisp_Object tmp;
-
- tmp = Fmake_vector (make_number (5), Qnil);
- ASET (tmp, 2, AREF (elt, i));
- ASET (vec, 3 + i, tmp);
- }
-#ifdef USE_FONT_BACKEND
- if (! fallback
- && enable_font_backend
- && EQ (base_fontset, Vdefault_fontset))
- {
- Lisp_Object script, font_spec;
-
- script = CHAR_TABLE_REF (Vchar_script_table, c);
- if (NILP (script))
- script = intern ("latin");
- font_spec = Ffont_spec (0, NULL);
- ASET (font_spec, FONT_REGISTRY_INDEX, Qiso10646_1);
- ASET (font_spec, FONT_EXTRA_INDEX,
- Fcons (Fcons (QCscript, script), Qnil));
- font_def = Fmake_vector (make_number (3), Qnil);
- ASET (font_def, 0, font_spec);
- elt = Fmake_vector (make_number (5), Qnil);
- ASET (elt, 2, font_def);
- ASET (vec, 3 + i, elt);
- }
-#endif /* USE_FONT_BACKEND */
-
- /* Then store it in the fontset. */
- if (! fallback)
- FONTSET_SET (fontset, range, vec);
- else
- FONTSET_FALLBACK (fontset) = vec;
- }
- }
- if (EQ (vec, Qt))