aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2022-12-12 10:41:38 +0800
committerPo Lu2022-12-12 10:41:38 +0800
commitf4ce6fa7d3e90fc41fa9067049edd585f7d28924 (patch)
tree75b26354990bb9cd059b72339748767cd3d14678 /src
parentb8d2ec920f37f5d77d32440eefc97dd5e8c2c7dc (diff)
downloademacs-f4ce6fa7d3e90fc41fa9067049edd585f7d28924.tar.gz
emacs-f4ce6fa7d3e90fc41fa9067049edd585f7d28924.zip
Revert "Revert "Improve last change to xfaces.c" (05ece1eb8b)"
This reverts commit b8d2ec920f37f5d77d32440eefc97dd5e8c2c7dc. Not only does it make debugging Emacs harder for users, that change is unsafe for the Haiku port.
Diffstat (limited to 'src')
-rw-r--r--src/xfaces.c111
1 files changed, 59 insertions, 52 deletions
diff --git a/src/xfaces.c b/src/xfaces.c
index 643f4365896..7dbcacb35ac 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -6014,6 +6014,21 @@ realize_non_ascii_face (struct frame *f, Lisp_Object font_object,
6014} 6014}
6015#endif /* HAVE_WINDOW_SYSTEM */ 6015#endif /* HAVE_WINDOW_SYSTEM */
6016 6016
6017/* Remove the attribute at INDEX from the font object if SYMBOL
6018 appears in `font-fallback-ignored-attributes'. */
6019
6020static void
6021font_maybe_unset_attribute (Lisp_Object font_object,
6022 enum font_property_index index, Lisp_Object symbol)
6023{
6024 Lisp_Object tail = Vface_font_lax_matched_attributes;
6025
6026 FOR_EACH_TAIL_SAFE (tail)
6027 {
6028 if (EQ (XCAR (tail), symbol))
6029 ASET (font_object, index, Qnil);
6030 }
6031}
6017 6032
6018/* Realize the fully-specified face with attributes ATTRS in face 6033/* Realize the fully-specified face with attributes ATTRS in face
6019 cache CACHE for ASCII characters. Do it for GUI frame CACHE->f. 6034 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]
6073 if (! FONT_OBJECT_P (attrs[LFACE_FONT_INDEX])) 6088 if (! FONT_OBJECT_P (attrs[LFACE_FONT_INDEX]))
6074 { 6089 {
6075 Lisp_Object spec = copy_font_spec (attrs[LFACE_FONT_INDEX]); 6090 Lisp_Object spec = copy_font_spec (attrs[LFACE_FONT_INDEX]);
6076#define MAYBE_UNSET_ATTRIBUTE(ATTR) \ 6091
6077 if (realize_gui_face_ignored_spec_attributes \ 6092 /* Maybe unset several values in SPEC, usually the width,
6078 & (1 << FONT_##ATTR##_INDEX)) \ 6093 slant, and weight. The best possible values for these
6079 ASET (spec, FONT_##ATTR##_INDEX, Qnil); 6094 attributes are determined in font_find_for_lface, called
6080 /* The default value of 6095 by font_load_for_lface, when the list of candidate fonts
6081 realize_gui_face_ignored_spec_attributes unsets the 6096 returned by font_list_entities is sorted by font_select_entity
6082 weight, slant and width in spec. The best possible 6097 (which calls font_sort_entities, which calls font_score).
6083 values for these attributes is determined in 6098 If these attributes are not unset here, the candidate
6084 font_find_for_lface, called by font_load_for_lface, when 6099 font list returned by font_list_entities only contains
6085 the candidate list returned by font_list_entities is 6100 fonts that are exact matches for these weight, slant, and
6086 sorted by font_select_entity (which calls 6101 width attributes, which could lead to suboptimal or wrong
6087 font_sort_entities, which calls font_score). If these 6102 font selection. (bug#5934) */
6088 attributes are not unset here, the candidate font list 6103 font_maybe_unset_attribute (spec, FONT_WEIGHT_INDEX, QCweight);
6089 returned by font_list_entities only contains fonts that 6104 font_maybe_unset_attribute (spec, FONT_SLANT_INDEX, QCslant);
6090 are exact matches for these weight, slant and width 6105 font_maybe_unset_attribute (spec, FONT_WIDTH_INDEX, QCwidth);
6091 attributes, which leads to suboptimal or wrong font
6092 choices. See bug#59347. */
6093 MAYBE_UNSET_ATTRIBUTE (WEIGHT);
6094 MAYBE_UNSET_ATTRIBUTE (SLANT);
6095 MAYBE_UNSET_ATTRIBUTE (WIDTH);
6096 /* Also allow unsetting other attributes for debugging 6106 /* Also allow unsetting other attributes for debugging
6097 purposes. */ 6107 purposes. But not FONT_EXTRA_INDEX; that is not safe to
6098 MAYBE_UNSET_ATTRIBUTE (FAMILY); 6108 touch, at least in the Haiku font backend. */
6099 MAYBE_UNSET_ATTRIBUTE (FOUNDRY); 6109 font_maybe_unset_attribute (spec, FONT_FAMILY_INDEX, QCfamily);
6100 MAYBE_UNSET_ATTRIBUTE (REGISTRY); 6110 font_maybe_unset_attribute (spec, FONT_FOUNDRY_INDEX, QCfoundry);
6101 MAYBE_UNSET_ATTRIBUTE (ADSTYLE); 6111 font_maybe_unset_attribute (spec, FONT_REGISTRY_INDEX, QCregistry);
6102 MAYBE_UNSET_ATTRIBUTE (SIZE); 6112 font_maybe_unset_attribute (spec, FONT_ADSTYLE_INDEX, QCadstyle);
6103 MAYBE_UNSET_ATTRIBUTE (DPI); 6113 font_maybe_unset_attribute (spec, FONT_SIZE_INDEX, QCsize);
6104 MAYBE_UNSET_ATTRIBUTE (SPACING); 6114 font_maybe_unset_attribute (spec, FONT_DPI_INDEX, QCdpi);
6105 MAYBE_UNSET_ATTRIBUTE (AVGWIDTH); 6115 font_maybe_unset_attribute (spec, FONT_SPACING_INDEX, QCspacing);
6106 MAYBE_UNSET_ATTRIBUTE (EXTRA); 6116 font_maybe_unset_attribute (spec, FONT_AVGWIDTH_INDEX, QCavgwidth);
6107#undef MAYBE_UNSET_ATTRIBUTE 6117
6108 attrs[LFACE_FONT_INDEX] = font_load_for_lface (f, attrs, spec); 6118 attrs[LFACE_FONT_INDEX] = font_load_for_lface (f, attrs, spec);
6109 } 6119 }
6110 if (FONT_OBJECT_P (attrs[LFACE_FONT_INDEX])) 6120 if (FONT_OBJECT_P (attrs[LFACE_FONT_INDEX]))
@@ -7394,27 +7404,24 @@ Lisp programs that change the value of this variable should also
7394clear the face cache, see `clear-face-cache'. */); 7404clear the face cache, see `clear-face-cache'. */);
7395 face_near_same_color_threshold = 30000; 7405 face_near_same_color_threshold = 30000;
7396 7406
7397 DEFVAR_INT ("realize-gui-face-ignored-spec-attributes", 7407 DEFVAR_LISP ("face-font-lax-matched-attributes",
7398 realize_gui_face_ignored_spec_attributes, 7408 Vface_font_lax_matched_attributes,
7399 doc: /* Ignored font-spec attributes in realize_gui_face. 7409 doc: /* Font-related face attributes to match in lax manner when realizing faces.
7400 7410
7401The value is an integer number and represents a bit mask. 7411The value should be a list of font-related face attribute symbols;
7402The attribute corresponding to each bit that is set is cleared in 7412see `set-face-attribute' for the full list of attributes. The
7403realize_gui_face. The bits are: 1 = :foundry, 2 = :family, 7413corresponding face attributes will be treated as "soft" constraints
74043 = :adstyle, 4 = :registry, 5 = :weight, 6 = :slant, 7 = :width, 7414when looking for suitable fonts: if an exact match is not possible,
74058 = :size, 9 = :dpi, 10 = :spacing, 11 = :avgwidth, 12 = extra 7415a font can be selected that is a close, but not an exact, match. For
7406attributes (:name, :script, :lang and :otf). 7416example, looking for a semi-bold font might select a bold or a medium
7407 7417font if no semi-bold font matching other attributes is found. Emacs
7408Bits 5 to 7 are set in the default value. When these bits are not 7418still tries to find a font that is the closest possible match; in
7409set, and when the font chosen for the default face has a weight, slant 7419particular, if a font is available that matches the face attributes
7410or width that is not supported by other available fonts on the system, 7420exactly, it will be selected.
7411such as 'medium', Emacs may select suboptimal fonts for other faces. 7421
7412 7422Note that if the `:extra' attribute is present in the value, it
7413There is no reason to change that value except for debugging purposes. */); 7423will be ignored. */);
7414 realize_gui_face_ignored_spec_attributes = 7424 Vface_font_lax_matched_attributes = list3 (QCweight, QCslant, QCwidth);
7415 (1 << FONT_WEIGHT_INDEX) |
7416 (1 << FONT_SLANT_INDEX) |
7417 (1 << FONT_WIDTH_INDEX);
7418 7425
7419#ifdef HAVE_WINDOW_SYSTEM 7426#ifdef HAVE_WINDOW_SYSTEM
7420 defsubr (&Sbitmap_spec_p); 7427 defsubr (&Sbitmap_spec_p);