Revert "Revert "Improve last change to xfaces.c" (05ece1eb8b
)"
This reverts commit b8d2ec920f
.
Not only does it make debugging Emacs harder for users, that change is
unsafe for the Haiku port.
This commit is contained in:
parent
b8d2ec920f
commit
f4ce6fa7d3
1 changed files with 57 additions and 50 deletions
107
src/xfaces.c
107
src/xfaces.c
|
@ -6014,6 +6014,21 @@ realize_non_ascii_face (struct frame *f, Lisp_Object font_object,
|
||||||
}
|
}
|
||||||
#endif /* HAVE_WINDOW_SYSTEM */
|
#endif /* HAVE_WINDOW_SYSTEM */
|
||||||
|
|
||||||
|
/* Remove the attribute at INDEX from the font object if SYMBOL
|
||||||
|
appears in `font-fallback-ignored-attributes'. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
font_maybe_unset_attribute (Lisp_Object font_object,
|
||||||
|
enum font_property_index index, Lisp_Object symbol)
|
||||||
|
{
|
||||||
|
Lisp_Object tail = Vface_font_lax_matched_attributes;
|
||||||
|
|
||||||
|
FOR_EACH_TAIL_SAFE (tail)
|
||||||
|
{
|
||||||
|
if (EQ (XCAR (tail), symbol))
|
||||||
|
ASET (font_object, index, Qnil);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Realize the fully-specified face with attributes ATTRS in face
|
/* Realize the fully-specified face with attributes ATTRS in face
|
||||||
cache CACHE for ASCII characters. Do it for GUI frame CACHE->f.
|
cache CACHE for ASCII characters. Do it for GUI frame CACHE->f.
|
||||||
|
@ -6073,38 +6088,33 @@ realize_gui_face (struct face_cache *cache, Lisp_Object attrs[LFACE_VECTOR_SIZE]
|
||||||
if (! FONT_OBJECT_P (attrs[LFACE_FONT_INDEX]))
|
if (! FONT_OBJECT_P (attrs[LFACE_FONT_INDEX]))
|
||||||
{
|
{
|
||||||
Lisp_Object spec = copy_font_spec (attrs[LFACE_FONT_INDEX]);
|
Lisp_Object spec = copy_font_spec (attrs[LFACE_FONT_INDEX]);
|
||||||
#define MAYBE_UNSET_ATTRIBUTE(ATTR) \
|
|
||||||
if (realize_gui_face_ignored_spec_attributes \
|
/* Maybe unset several values in SPEC, usually the width,
|
||||||
& (1 << FONT_##ATTR##_INDEX)) \
|
slant, and weight. The best possible values for these
|
||||||
ASET (spec, FONT_##ATTR##_INDEX, Qnil);
|
attributes are determined in font_find_for_lface, called
|
||||||
/* The default value of
|
by font_load_for_lface, when the list of candidate fonts
|
||||||
realize_gui_face_ignored_spec_attributes unsets the
|
returned by font_list_entities is sorted by font_select_entity
|
||||||
weight, slant and width in spec. The best possible
|
(which calls font_sort_entities, which calls font_score).
|
||||||
values for these attributes is determined in
|
If these attributes are not unset here, the candidate
|
||||||
font_find_for_lface, called by font_load_for_lface, when
|
font list returned by font_list_entities only contains
|
||||||
the candidate list returned by font_list_entities is
|
fonts that are exact matches for these weight, slant, and
|
||||||
sorted by font_select_entity (which calls
|
width attributes, which could lead to suboptimal or wrong
|
||||||
font_sort_entities, which calls font_score). If these
|
font selection. (bug#5934) */
|
||||||
attributes are not unset here, the candidate font list
|
font_maybe_unset_attribute (spec, FONT_WEIGHT_INDEX, QCweight);
|
||||||
returned by font_list_entities only contains fonts that
|
font_maybe_unset_attribute (spec, FONT_SLANT_INDEX, QCslant);
|
||||||
are exact matches for these weight, slant and width
|
font_maybe_unset_attribute (spec, FONT_WIDTH_INDEX, QCwidth);
|
||||||
attributes, which leads to suboptimal or wrong font
|
|
||||||
choices. See bug#59347. */
|
|
||||||
MAYBE_UNSET_ATTRIBUTE (WEIGHT);
|
|
||||||
MAYBE_UNSET_ATTRIBUTE (SLANT);
|
|
||||||
MAYBE_UNSET_ATTRIBUTE (WIDTH);
|
|
||||||
/* Also allow unsetting other attributes for debugging
|
/* Also allow unsetting other attributes for debugging
|
||||||
purposes. */
|
purposes. But not FONT_EXTRA_INDEX; that is not safe to
|
||||||
MAYBE_UNSET_ATTRIBUTE (FAMILY);
|
touch, at least in the Haiku font backend. */
|
||||||
MAYBE_UNSET_ATTRIBUTE (FOUNDRY);
|
font_maybe_unset_attribute (spec, FONT_FAMILY_INDEX, QCfamily);
|
||||||
MAYBE_UNSET_ATTRIBUTE (REGISTRY);
|
font_maybe_unset_attribute (spec, FONT_FOUNDRY_INDEX, QCfoundry);
|
||||||
MAYBE_UNSET_ATTRIBUTE (ADSTYLE);
|
font_maybe_unset_attribute (spec, FONT_REGISTRY_INDEX, QCregistry);
|
||||||
MAYBE_UNSET_ATTRIBUTE (SIZE);
|
font_maybe_unset_attribute (spec, FONT_ADSTYLE_INDEX, QCadstyle);
|
||||||
MAYBE_UNSET_ATTRIBUTE (DPI);
|
font_maybe_unset_attribute (spec, FONT_SIZE_INDEX, QCsize);
|
||||||
MAYBE_UNSET_ATTRIBUTE (SPACING);
|
font_maybe_unset_attribute (spec, FONT_DPI_INDEX, QCdpi);
|
||||||
MAYBE_UNSET_ATTRIBUTE (AVGWIDTH);
|
font_maybe_unset_attribute (spec, FONT_SPACING_INDEX, QCspacing);
|
||||||
MAYBE_UNSET_ATTRIBUTE (EXTRA);
|
font_maybe_unset_attribute (spec, FONT_AVGWIDTH_INDEX, QCavgwidth);
|
||||||
#undef MAYBE_UNSET_ATTRIBUTE
|
|
||||||
attrs[LFACE_FONT_INDEX] = font_load_for_lface (f, attrs, spec);
|
attrs[LFACE_FONT_INDEX] = font_load_for_lface (f, attrs, spec);
|
||||||
}
|
}
|
||||||
if (FONT_OBJECT_P (attrs[LFACE_FONT_INDEX]))
|
if (FONT_OBJECT_P (attrs[LFACE_FONT_INDEX]))
|
||||||
|
@ -7394,27 +7404,24 @@ Lisp programs that change the value of this variable should also
|
||||||
clear the face cache, see `clear-face-cache'. */);
|
clear the face cache, see `clear-face-cache'. */);
|
||||||
face_near_same_color_threshold = 30000;
|
face_near_same_color_threshold = 30000;
|
||||||
|
|
||||||
DEFVAR_INT ("realize-gui-face-ignored-spec-attributes",
|
DEFVAR_LISP ("face-font-lax-matched-attributes",
|
||||||
realize_gui_face_ignored_spec_attributes,
|
Vface_font_lax_matched_attributes,
|
||||||
doc: /* Ignored font-spec attributes in realize_gui_face.
|
doc: /* Font-related face attributes to match in lax manner when realizing faces.
|
||||||
|
|
||||||
The value is an integer number and represents a bit mask.
|
The value should be a list of font-related face attribute symbols;
|
||||||
The attribute corresponding to each bit that is set is cleared in
|
see `set-face-attribute' for the full list of attributes. The
|
||||||
realize_gui_face. The bits are: 1 = :foundry, 2 = :family,
|
corresponding face attributes will be treated as "soft" constraints
|
||||||
3 = :adstyle, 4 = :registry, 5 = :weight, 6 = :slant, 7 = :width,
|
when looking for suitable fonts: if an exact match is not possible,
|
||||||
8 = :size, 9 = :dpi, 10 = :spacing, 11 = :avgwidth, 12 = extra
|
a font can be selected that is a close, but not an exact, match. For
|
||||||
attributes (:name, :script, :lang and :otf).
|
example, looking for a semi-bold font might select a bold or a medium
|
||||||
|
font if no semi-bold font matching other attributes is found. Emacs
|
||||||
|
still tries to find a font that is the closest possible match; in
|
||||||
|
particular, if a font is available that matches the face attributes
|
||||||
|
exactly, it will be selected.
|
||||||
|
|
||||||
Bits 5 to 7 are set in the default value. When these bits are not
|
Note that if the `:extra' attribute is present in the value, it
|
||||||
set, and when the font chosen for the default face has a weight, slant
|
will be ignored. */);
|
||||||
or width that is not supported by other available fonts on the system,
|
Vface_font_lax_matched_attributes = list3 (QCweight, QCslant, QCwidth);
|
||||||
such as 'medium', Emacs may select suboptimal fonts for other faces.
|
|
||||||
|
|
||||||
There is no reason to change that value except for debugging purposes. */);
|
|
||||||
realize_gui_face_ignored_spec_attributes =
|
|
||||||
(1 << FONT_WEIGHT_INDEX) |
|
|
||||||
(1 << FONT_SLANT_INDEX) |
|
|
||||||
(1 << FONT_WIDTH_INDEX);
|
|
||||||
|
|
||||||
#ifdef HAVE_WINDOW_SYSTEM
|
#ifdef HAVE_WINDOW_SYSTEM
|
||||||
defsubr (&Sbitmap_spec_p);
|
defsubr (&Sbitmap_spec_p);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue