\f
-static int font_pixel_size P_ ((FRAME_PTR f, Lisp_Object));
-static Lisp_Object font_open_entity P_ ((FRAME_PTR, Lisp_Object, int));
-static Lisp_Object font_matching_entity P_ ((FRAME_PTR, Lisp_Object *,
- Lisp_Object));
+static int font_pixel_size (FRAME_PTR f, Lisp_Object);
+static Lisp_Object font_open_entity (FRAME_PTR, Lisp_Object, int);
+static Lisp_Object font_matching_entity (FRAME_PTR, Lisp_Object *,
+ Lisp_Object);
/* Number of registered font drivers. */
static int num_font_drivers;
extern Lisp_Object Vface_alternative_font_family_alist;
-extern Lisp_Object find_font_encoding P_ ((Lisp_Object));
+extern Lisp_Object find_font_encoding (Lisp_Object);
/* Return ENCODING or a cons of ENCODING and REPERTORY of the font
/* Font property value validaters. See the comment of
font_property_table for the meaning of the arguments. */
-static Lisp_Object font_prop_validate P_ ((int, Lisp_Object, Lisp_Object));
-static Lisp_Object font_prop_validate_symbol P_ ((Lisp_Object, Lisp_Object));
-static Lisp_Object font_prop_validate_style P_ ((Lisp_Object, Lisp_Object));
-static Lisp_Object font_prop_validate_non_neg P_ ((Lisp_Object, Lisp_Object));
-static Lisp_Object font_prop_validate_spacing P_ ((Lisp_Object, Lisp_Object));
-static int get_font_prop_index P_ ((Lisp_Object));
+static Lisp_Object font_prop_validate (int, Lisp_Object, Lisp_Object);
+static Lisp_Object font_prop_validate_symbol (Lisp_Object, Lisp_Object);
+static Lisp_Object font_prop_validate_style (Lisp_Object, Lisp_Object);
+static Lisp_Object font_prop_validate_non_neg (Lisp_Object, Lisp_Object);
+static Lisp_Object font_prop_validate_spacing (Lisp_Object, Lisp_Object);
+static int get_font_prop_index (Lisp_Object);
static Lisp_Object
font_prop_validate_symbol (prop, val)
/* 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 (*validater) P_ ((Lisp_Object prop, Lisp_Object val));
+ Lisp_Object (*validater) (Lisp_Object prop, Lisp_Object val);
} font_property_table[] =
{ { &QCtype, font_prop_validate_symbol },
{ &QCfoundry, font_prop_validate_symbol },
\f
/* Font name parser and unparser */
-static int parse_matrix P_ ((char *));
-static int font_expand_wildcards P_ ((Lisp_Object *, int));
-static int font_parse_name P_ ((char *, Lisp_Object));
+static int parse_matrix (char *);
+static int font_expand_wildcards (Lisp_Object *, int);
+static int font_parse_name (char *, Lisp_Object);
/* An enumerator for each field of an XLFD font name. */
enum xlfd_field_index
int size_found = 1;
for (q = p + 1; *q && *q != ' '; q++)
- if (! isdigit (*q))
+ if (! isdigit (*q) && *q != '.')
{
size_found = 0;
break;
prop = font_intern_prop ("book", 4, 1);
FONT_SET_STYLE (font, FONT_WEIGHT_INDEX, prop);
}
+ else if (PROP_MATCH ("Medium", 6))
+ {
+ prop_found = 1;
+ prop = font_intern_prop ("medium", 6, 1);
+ FONT_SET_STYLE (font, FONT_WEIGHT_INDEX, prop);
+ }
else if (PROP_MATCH ("Semi-Bold", 9))
{
prop_found = 1;
\f
/* Font sorting */
-static unsigned font_score P_ ((Lisp_Object, Lisp_Object *));
-static int font_compare P_ ((const void *, const void *));
-static Lisp_Object font_sort_entities P_ ((Lisp_Object, Lisp_Object,
- Lisp_Object, int));
+static unsigned font_score (Lisp_Object, Lisp_Object *);
+static int font_compare (const void *, const void *);
+static Lisp_Object font_sort_entities (Lisp_Object, Lisp_Object,
+ Lisp_Object, int);
/* Return a rescaling ratio of FONT_ENTITY. */
extern Lisp_Object Vface_font_rescale_alist;
is a number frames sharing this cache, and FONT-CACHE-DATA is a
cons (FONT-SPEC FONT-ENTITY ...). */
-static void font_prepare_cache P_ ((FRAME_PTR, struct font_driver *));
-static void font_finish_cache P_ ((FRAME_PTR, struct font_driver *));
-static Lisp_Object font_get_cache P_ ((FRAME_PTR, struct font_driver *));
-static void font_clear_cache P_ ((FRAME_PTR, Lisp_Object,
- struct font_driver *));
+static void font_prepare_cache (FRAME_PTR, struct font_driver *);
+static void font_finish_cache (FRAME_PTR, struct font_driver *);
+static Lisp_Object font_get_cache (FRAME_PTR, struct font_driver *);
+static void font_clear_cache (FRAME_PTR, Lisp_Object,
+ struct font_driver *);
static void
font_prepare_cache (f, driver)
static Lisp_Object scratch_font_spec, scratch_font_prefer;
+/* Check each font-entity in VEC, and return a list of font-entities
+ that satisfy this condition:
+ (1) matches with SPEC and SIZE if SPEC is not nil, and
+ (2) doesn't match with any regexps in Vface_ignored_fonts (if non-nil).
+*/
+
+extern Lisp_Object Vface_ignored_fonts;
+
Lisp_Object
font_delete_unmatched (vec, spec, size)
Lisp_Object vec, spec;
for (val = Qnil, i = ASIZE (vec) - 1; i >= 0; i--)
{
entity = AREF (vec, i);
+ if (! NILP (Vface_ignored_fonts))
+ {
+ char name[256];
+ Lisp_Object tail, regexp;
+
+ if (font_unparse_xlfd (entity, 0, name, 256) >= 0)
+ {
+ for (tail = Vface_ignored_fonts; CONSP (tail); tail = XCDR (tail))
+ {
+ regexp = XCAR (tail);
+ if (STRINGP (regexp)
+ && fast_c_string_match_ignore_case (regexp, name) >= 0)
+ break;
+ }
+ if (CONSP (tail))
+ continue;
+ }
+ }
+ if (NILP (spec))
+ {
+ val = Fcons (entity, val);
+ continue;
+ }
for (prop = FONT_WEIGHT_INDEX; prop < FONT_SIZE_INDEX; prop++)
if (INTEGERP (AREF (spec, prop))
&& ((XINT (AREF (spec, prop)) >> 8)
ASET (copy, FONT_TYPE_INDEX, driver_list->driver->type);
XSETCDR (cache, Fcons (Fcons (copy, val), XCDR (cache)));
}
- if (ASIZE (val) > 0 && need_filtering)
- val = font_delete_unmatched (val, spec, size);
+ if (ASIZE (val) > 0
+ && (need_filtering
+ || ! NILP (Vface_ignored_fonts)))
+ val = font_delete_unmatched (val, need_filtering ? spec : Qnil, size);
if (ASIZE (val) > 0)
list = Fcons (val, list);
}
struct face *face;
Lisp_Object string;
{
- EMACS_INT pos_byte, ignore, start, start_byte;
+ EMACS_INT pos_byte, ignore;
int c;
Lisp_Object font_object = Qnil;
pos_byte = string_char_to_byte (string, pos);
}
- start = pos, start_byte = pos_byte;
while (pos < *limit)
{
Lisp_Object category;
FETCH_CHAR_ADVANCE_NO_CHECK (c, pos, pos_byte);
else
FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, string, pos, pos_byte);
+ category = CHAR_TABLE_REF (Vunicode_category_table, c);
+ if (EQ (category, QCf)
+ || CHAR_VARIATION_SELECTOR_P (c))
+ continue;
if (NILP (font_object))
{
font_object = font_for_char (face, c, pos - 1, string);
return Qnil;
continue;
}
-
- category = CHAR_TABLE_REF (Vunicode_category_table, c);
- if (! EQ (category, QCf)
- && ! CHAR_VARIATION_SELECTOR_P (c)
- && font_encode_char (font_object, c) == FONT_INVALID_CODE)
- {
- Lisp_Object f = font_for_char (face, c, pos - 1, string);
- EMACS_INT i, i_byte;
-
-
- if (NILP (f))
- {
- *limit = pos - 1;
- return font_object;
- }
- i = start, i_byte = start_byte;
- while (i < pos - 1)
- {
-
- if (NILP (string))
- FETCH_CHAR_ADVANCE_NO_CHECK (c, i, i_byte);
- else
- FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, string, i, i_byte);
- category = CHAR_TABLE_REF (Vunicode_category_table, c);
- if (! EQ (category, QCf)
- && ! CHAR_VARIATION_SELECTOR_P (c)
- && font_encode_char (f, c) == FONT_INVALID_CODE)
- {
- *limit = pos - 1;
- return font_object;
- }
- }
- font_object = f;
- }
+ if (font_encode_char (font_object, c) == FONT_INVALID_CODE)
+ *limit = pos - 1;
}
return font_object;
}
ASET (Vfont_log_deferred, 2, result);
}
-extern void syms_of_ftfont P_ (());
-extern void syms_of_xfont P_ (());
-extern void syms_of_xftfont P_ (());
-extern void syms_of_ftxfont P_ (());
-extern void syms_of_bdffont P_ (());
-extern void syms_of_w32font P_ (());
-extern void syms_of_atmfont P_ (());
-extern void syms_of_nsfont P_ (());
+extern void syms_of_ftfont ();
+extern void syms_of_xfont ();
+extern void syms_of_xftfont ();
+extern void syms_of_ftxfont ();
+extern void syms_of_bdffont ();
+extern void syms_of_w32font ();
+extern void syms_of_atmfont ();
+extern void syms_of_nsfont ();
void
syms_of_font ()
gets the repertory information by an opened font and ENCODING. */);
Vfont_encoding_alist = Qnil;
+ /* FIXME: These 3 vars are not quite what they appear: setq on them
+ won't have any effect other than disconnect them from the style
+ table used by the font display code. So we make them read-only,
+ to avoid this confusing situation. */
+
DEFVAR_LISP_NOPRO ("font-weight-table", &Vfont_weight_table,
doc: /* Vector of valid font weight values.
Each element has the form:
[NUMERIC-VALUE SYMBOLIC-NAME ALIAS-NAME ...]
NUMERIC-VALUE is an integer, and SYMBOLIC-NAME and ALIAS-NAME are symbols. */);
Vfont_weight_table = BUILD_STYLE_TABLE (weight_table);
+ XSYMBOL (intern_c_string ("font-weight-table"))->constant = 1;
DEFVAR_LISP_NOPRO ("font-slant-table", &Vfont_slant_table,
doc: /* Vector of font slant symbols vs the corresponding numeric values.
See `font-weight-table' for the format of the vector. */);
Vfont_slant_table = BUILD_STYLE_TABLE (slant_table);
+ XSYMBOL (intern_c_string ("font-slant-table"))->constant = 1;
DEFVAR_LISP_NOPRO ("font-width-table", &Vfont_width_table,
doc: /* Alist of font width symbols vs the corresponding numeric values.
See `font-weight-table' for the format of the vector. */);
Vfont_width_table = BUILD_STYLE_TABLE (width_table);
+ XSYMBOL (intern_c_string ("font-width-table"))->constant = 1;
staticpro (&font_style_table);
font_style_table = Fmake_vector (make_number (3), Qnil);