summaryrefslogtreecommitdiff
path: root/src/fontset.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2015-06-09 17:56:39 +0300
committerEli Zaretskii <eliz@gnu.org>2015-06-09 17:56:39 +0300
commite0707282d214ff17b20a9f07ca2f4055610d30ea (patch)
treed0960fdc88c52d8d558d9995d5f7cc92b4d51f44 /src/fontset.c
parent68273707ecbca6ff6d34071c04c2b395384c41e5 (diff)
downloademacs-e0707282d214ff17b20a9f07ca2f4055610d30ea.tar.gz
Improve font selection for punctuation and other symbols
* src/fontset.c (face_for_char): If the character's script is 'symbol', and the font used for ASCII face has a glyph for it, use the font for the ASCII face instead of searching the fontsets. This comes instead of NS-specific code that used the current face's font instead, which is now disabled due to undesirable consequences. (Bug#20727)
Diffstat (limited to 'src/fontset.c')
-rw-r--r--src/fontset.c46
1 files changed, 37 insertions, 9 deletions
diff --git a/src/fontset.c b/src/fontset.c
index e957c38eb60..97bdbcef5bf 100644
--- a/src/fontset.c
+++ b/src/fontset.c
@@ -892,18 +892,46 @@ face_for_char (struct frame *f, struct face *face, int c,
if (ASCII_CHAR_P (c) || CHAR_BYTE8_P (c))
return face->ascii_face->id;
-#ifdef HAVE_NS
- if (face->font)
+ if (c > 0 && EQ (CHAR_TABLE_REF (Vchar_script_table, c), Qsymbol))
{
- /* Fonts often have characters in other scripts, like symbol, even if they
- don't match script: symbol. So check if the character is present
- in the current face first. Only enable for NS for now, but should
- perhaps be general? */
+ /* Fonts often have characters for punctuation and other
+ symbols, even if they don't match the 'symbol' script. So
+ check if the character is present in the current ASCII face
+ first, and if so, use the same font as used by that face.
+ This avoids unnecessarily switching to another font when the
+ frame's default font will do. We only do this for symbols so
+ that users could still setup fontsets to force Emacs to use
+ specific fonts for characters from other scripts, because
+ choice of fonts is frequently affected by cultural
+ preferences and font features, not by font coverage.
+ However, these considerations are unlikely to be relevant to
+ punctuation and other symbols, since the latter generally
+ aren't specific to any culture, and don't require
+ sophisticated OTF features. */
Lisp_Object font_object;
- XSETFONT (font_object, face->font);
- if (font_has_char (f, font_object, c)) return face->id;
- }
+
+ if (face->ascii_face->font)
+ {
+ XSETFONT (font_object, face->ascii_face->font);
+ if (font_has_char (f, font_object, c))
+ return face->ascii_face->id;
+ }
+
+#if 0
+ /* Try the current face. Disabled because it can cause
+ counter-intuitive results, whereby the font used for some
+ character depends on the characters that precede it on
+ display. See the discussion of bug #15138. Note that the
+ original bug reported in #15138 was in a situation where face
+ == face->ascii_face, so the above code solves that situation
+ without risking the undesirable consequences. */
+ if (face->font)
+ {
+ XSETFONT (font_object, face->font);
+ if (font_has_char (f, font_object, c)) return face->id;
+ }
#endif
+ }
fontset = FONTSET_FROM_ID (face->fontset);
eassert (!BASE_FONTSET_P (fontset));