/* font.c -- "Font" primitives.
-Copyright (C) 2006-2014 Free Software Foundation, Inc.
+Copyright (C) 2006-2015 Free Software Foundation, Inc.
Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011
National Institute of Advanced Industrial Science and Technology (AIST)
Registration Number H13PRO009
#include TERM_HEADER
#endif /* HAVE_WINDOW_SYSTEM */
-Lisp_Object Qopentype;
-
-/* Important character set strings. */
-Lisp_Object Qascii_0, Qiso8859_1, Qiso10646_1, Qunicode_bmp, Qunicode_sip;
-
#define DEFAULT_ENCODING Qiso8859_1
-/* Unicode category `Cf'. */
-static Lisp_Object QCf;
-
/* Vector of Vfont_weight_table, Vfont_slant_table, and Vfont_width_table. */
static Lisp_Object font_style_table;
{ 200, { "ultra-expanded", "ultraexpanded", "wide" }}
};
-Lisp_Object QCfoundry;
-static Lisp_Object QCadstyle, QCregistry;
-/* Symbols representing keys of font extra info. */
-Lisp_Object QCspacing, QCdpi, QCscalable, QCotf, QClang, QCscript, QCavgwidth;
-Lisp_Object QCantialias, QCfont_entity;
-static Lisp_Object QCfc_unknown_spec;
-/* Symbols representing values of font spacing property. */
-static Lisp_Object Qc, Qm, Qd;
-Lisp_Object Qp;
-/* Special ADSTYLE properties to avoid fonts used for Latin
- characters; used in xfont.c and ftfont.c. */
-Lisp_Object Qja, Qko;
-
-static Lisp_Object QCuser_spec;
-
/* Alist of font registry symbols and the corresponding charset
information. The information is retrieved from
Vfont_encoding_alist on demand.
struct font_spec *spec
= ((struct font_spec *)
allocate_pseudovector (VECSIZE (struct font_spec),
- FONT_SPEC_MAX, PVEC_FONT));
+ FONT_SPEC_MAX, FONT_SPEC_MAX, PVEC_FONT));
XSETFONT (font_spec, spec);
return font_spec;
}
struct font_entity *entity
= ((struct font_entity *)
allocate_pseudovector (VECSIZE (struct font_entity),
- FONT_ENTITY_MAX, PVEC_FONT));
+ FONT_ENTITY_MAX, FONT_ENTITY_MAX, PVEC_FONT));
XSETFONT (font_entity, entity);
return font_entity;
}
{
Lisp_Object font_object;
struct font *font
- = (struct font *) allocate_pseudovector (size, FONT_OBJECT_MAX, PVEC_FONT);
+ = (struct font *) allocate_pseudovector (size, FONT_OBJECT_MAX,
+ FONT_OBJECT_MAX, PVEC_FONT);
int i;
/* GC can happen before the driver is set up,
return tem;
name = make_specified_string (str, nchars, len,
len != nchars && len == nbytes);
- return intern_driver (name, obarray, XINT (tem));
+ return intern_driver (name, obarray, tem);
}
/* Return a pixel size of font-spec SPEC on frame F. */
elt = Fmake_vector (make_number (2), make_number (100));
ASET (elt, 1, val);
ASET (font_style_table, prop - FONT_WEIGHT_INDEX,
- Fvconcat (2, ((Lisp_Object [])
- { table, Fmake_vector (make_number (1), elt) })));
+ CALLN (Fvconcat, table, Fmake_vector (make_number (1), elt)));
return (100 << 8) | (i << 4);
}
else
values. */
static const struct
{
- /* Pointer to the key symbol. */
- Lisp_Object *key;
+ /* Index of the key symbol. */
+ int key;
/* Function to validate PROP's value VAL, or NULL if any value is
ok. The value is VAL or its regularized value if VAL is valid,
and Qerror if not. */
Lisp_Object (*validator) (Lisp_Object prop, Lisp_Object val);
} font_property_table[] =
- { { &QCtype, font_prop_validate_symbol },
- { &QCfoundry, font_prop_validate_symbol },
- { &QCfamily, font_prop_validate_symbol },
- { &QCadstyle, font_prop_validate_symbol },
- { &QCregistry, font_prop_validate_symbol },
- { &QCweight, font_prop_validate_style },
- { &QCslant, font_prop_validate_style },
- { &QCwidth, font_prop_validate_style },
- { &QCsize, font_prop_validate_non_neg },
- { &QCdpi, font_prop_validate_non_neg },
- { &QCspacing, font_prop_validate_spacing },
- { &QCavgwidth, font_prop_validate_non_neg },
+ { { SYMBOL_INDEX (QCtype), font_prop_validate_symbol },
+ { SYMBOL_INDEX (QCfoundry), font_prop_validate_symbol },
+ { SYMBOL_INDEX (QCfamily), font_prop_validate_symbol },
+ { SYMBOL_INDEX (QCadstyle), font_prop_validate_symbol },
+ { SYMBOL_INDEX (QCregistry), font_prop_validate_symbol },
+ { SYMBOL_INDEX (QCweight), font_prop_validate_style },
+ { SYMBOL_INDEX (QCslant), font_prop_validate_style },
+ { SYMBOL_INDEX (QCwidth), font_prop_validate_style },
+ { SYMBOL_INDEX (QCsize), font_prop_validate_non_neg },
+ { SYMBOL_INDEX (QCdpi), font_prop_validate_non_neg },
+ { SYMBOL_INDEX (QCspacing), font_prop_validate_spacing },
+ { SYMBOL_INDEX (QCavgwidth), font_prop_validate_non_neg },
/* The order of the above entries must match with enum
font_property_index. */
- { &QClang, font_prop_validate_symbol },
- { &QCscript, font_prop_validate_symbol },
- { &QCotf, font_prop_validate_otf }
+ { SYMBOL_INDEX (QClang), font_prop_validate_symbol },
+ { SYMBOL_INDEX (QCscript), font_prop_validate_symbol },
+ { SYMBOL_INDEX (QCotf), font_prop_validate_otf }
};
/* Return an index number of font property KEY or -1 if KEY is not an
int i;
for (i = 0; i < ARRAYELTS (font_property_table); i++)
- if (EQ (key, *font_property_table[i].key))
+ if (EQ (key, builtin_lisp_symbol (font_property_table[i].key)))
return i;
return -1;
}
if (NILP (val))
return val;
if (NILP (prop))
- prop = *font_property_table[idx].key;
+ prop = builtin_lisp_symbol (font_property_table[idx].key);
else
{
idx = get_font_prop_index (prop);
if (i == 0 || ! NILP (tmp[i - 1]))
/* None of TMP[X] corresponds to Jth field. */
return -1;
- for (; j < range[i].from; j++)
- field[j] = Qnil;
+ memclear (field + j, (range[i].from - j) * word_size);
+ j = range[i].from;
}
field[j++] = tmp[i];
}
if (! NILP (tmp[n - 1]) && j < XLFD_REGISTRY_INDEX)
return -1;
- for (; j < XLFD_LAST_INDEX; j++)
- field[j] = Qnil;
+ memclear (field + j, (XLFD_LAST_INDEX - j) * word_size);
if (INTEGERP (field[XLFD_ENCODING_INDEX]))
field[XLFD_ENCODING_INDEX]
= Fintern (Fnumber_to_string (field[XLFD_ENCODING_INDEX]), Qnil);
}
/* Score the size. Maximum difference is 127. */
- i = FONT_SIZE_INDEX;
if (! NILP (spec_prop[FONT_SIZE_INDEX])
&& XINT (AREF (entity, FONT_SIZE_INDEX)) > 0)
{
Lisp_Object
font_open_by_name (struct frame *f, Lisp_Object name)
{
- Lisp_Object args[2];
- Lisp_Object spec, ret;
-
- args[0] = QCname;
- args[1] = name;
- spec = Ffont_spec (2, args);
- ret = font_open_by_spec (f, spec);
+ Lisp_Object spec = CALLN (Ffont_spec, QCname, name);
+ Lisp_Object ret = font_open_by_spec (f, spec);
/* Do not lose name originally put in. */
if (!NILP (ret))
- font_put_extra (ret, QCuser_spec, args[1]);
+ font_put_extra (ret, QCuser_spec, name);
return ret;
}
if (STRINGP (string))
face_id = face_at_string_position (w, string, pos, 0, &endptr,
- DEFAULT_FACE_ID, 0);
+ DEFAULT_FACE_ID, false);
else
face_id = face_at_buffer_position (w, pos, &endptr,
- pos + 100, 0, -1);
+ pos + 100, false, -1);
face = FACE_FROM_ID (f, face_id);
}
if (multibyte)
int face_id;
face_id = face_at_buffer_position (w, pos, &ignore,
- *limit, 0, -1);
+ *limit, false, -1);
face = FACE_FROM_ID (XFRAME (w->frame), face_id);
}
}
else
vec = font_vconcat_entity_vectors (list);
if (n == 0 || n >= ASIZE (vec))
- {
- Lisp_Object args[2];
-
- args[0] = vec;
- args[1] = Qnil;
- list = Fappend (2, args);
- }
+ list = CALLN (Fappend, vec, Qnil);
else
{
for (list = Qnil, n--; n >= 0; n--)
corresponding character. */)
(Lisp_Object font_object, Lisp_Object character, Lisp_Object otf_features)
{
- struct font *font;
+ struct font *font = CHECK_FONT_GET_OBJECT (font_object);
Lisp_Object gstring_in, gstring_out, g;
Lisp_Object alternates;
int i, num;
- CHECK_FONT_GET_OBJECT (font_object, font);
if (! font->driver->otf_drive)
error ("Font backend %s can't drive OpenType GSUB table",
SDATA (SYMBOL_NAME (font->driver->type)));
If the font is not OpenType font, CAPABILITY is nil. */)
(Lisp_Object font_object)
{
- struct font *font;
- Lisp_Object val;
-
- CHECK_FONT_GET_OBJECT (font_object, font);
+ struct font *font = CHECK_FONT_GET_OBJECT (font_object);
+ Lisp_Object val = make_uninit_vector (9);
- val = make_uninit_vector (9);
ASET (val, 0, AREF (font_object, FONT_NAME_INDEX));
ASET (val, 1, AREF (font_object, FONT_FILE_INDEX));
ASET (val, 2, make_number (font->pixel_size));
(Lisp_Object font_object, Lisp_Object from, Lisp_Object to,
Lisp_Object object)
{
- struct font *font;
+ struct font *font = CHECK_FONT_GET_OBJECT (font_object);
ptrdiff_t i, len;
Lisp_Object *chars, vec;
USE_SAFE_ALLOCA;
- CHECK_FONT_GET_OBJECT (font_object, font);
if (NILP (object))
{
ptrdiff_t charpos, bytepos;
DEFSYM (Qopentype, "opentype");
+ /* Important character set symbols. */
DEFSYM (Qascii_0, "ascii-0");
DEFSYM (Qiso8859_1, "iso8859-1");
DEFSYM (Qiso10646_1, "iso10646-1");
DEFSYM (Qunicode_bmp, "unicode-bmp");
DEFSYM (Qunicode_sip, "unicode-sip");
+ /* Unicode category `Cf'. */
DEFSYM (QCf, "Cf");
+ /* Symbols representing keys of font extra info. */
DEFSYM (QCotf, ":otf");
DEFSYM (QClang, ":lang");
DEFSYM (QCscript, ":script");
DEFSYM (QCantialias, ":antialias");
-
DEFSYM (QCfoundry, ":foundry");
DEFSYM (QCadstyle, ":adstyle");
DEFSYM (QCregistry, ":registry");
DEFSYM (QCfont_entity, ":font-entity");
DEFSYM (QCfc_unknown_spec, ":fc-unknown-spec");
+ /* Symbols representing values of font spacing property. */
DEFSYM (Qc, "c");
DEFSYM (Qm, "m");
DEFSYM (Qp, "p");
DEFSYM (Qd, "d");
+ /* Special ADSTYLE properties to avoid fonts used for Latin
+ characters; used in xfont.c and ftfont.c. */
DEFSYM (Qja, "ja");
DEFSYM (Qko, "ko");
#ifdef HAVE_FREETYPE
syms_of_ftfont ();
#ifdef HAVE_X_WINDOWS
+#ifdef USE_CAIRO
+ syms_of_ftcrfont ();
+#else
syms_of_xfont ();
syms_of_ftxfont ();
#ifdef HAVE_XFT
syms_of_xftfont ();
#endif /* HAVE_XFT */
+#endif /* not USE_CAIRO */
#endif /* HAVE_X_WINDOWS */
#else /* not HAVE_FREETYPE */
#ifdef HAVE_X_WINDOWS