diff options
| author | Lars Ingebrigtsen | 2021-10-21 04:30:02 +0200 |
|---|---|---|
| committer | Lars Ingebrigtsen | 2021-10-21 04:30:02 +0200 |
| commit | 65fd3ca84f75aee0dfebb87fa793dae57c1caf35 (patch) | |
| tree | 929b299592e19b39fafc0bbbcccdc6175133f8ef /src | |
| parent | 4e9764e6a155aa403d69d38fa06f4a774140f63c (diff) | |
| download | emacs-65fd3ca84f75aee0dfebb87fa793dae57c1caf35.tar.gz emacs-65fd3ca84f75aee0dfebb87fa793dae57c1caf35.zip | |
Support the "medium" font weight
* lisp/faces.el (set-face-attribute): Mention new font weights in
doc string.
* src/font.c (struct table_entry): Allow more synonyms.
(weight_table): Expand to support separating medium and normal
weights. Also add heavy/ultra-heavy and some other variants.
(font_parse_fcname): Support more names.
* src/gtkutil.c (xg_weight_to_symbol): Support all the Pango weights.
(xg_style_to_symbol): Make into functions.
(xg_get_font): Adjust.
* src/w32font.c (w32_to_fc_weight): Use symbols.
* src/xfaces.c (syms_of_xfaces): Add the new symbols.
Diffstat (limited to 'src')
| -rw-r--r-- | src/font.c | 33 | ||||
| -rw-r--r-- | src/gtkutil.c | 44 | ||||
| -rw-r--r-- | src/w32font.c | 4 | ||||
| -rw-r--r-- | src/xfaces.c | 7 |
4 files changed, 59 insertions, 29 deletions
diff --git a/src/font.c b/src/font.c index 6cd4a6b5c11..5e761abc5e6 100644 --- a/src/font.c +++ b/src/font.c | |||
| @@ -57,24 +57,26 @@ struct table_entry | |||
| 57 | int numeric; | 57 | int numeric; |
| 58 | /* The first one is a valid name as a face attribute. | 58 | /* The first one is a valid name as a face attribute. |
| 59 | The second one (if any) is a typical name in XLFD field. */ | 59 | The second one (if any) is a typical name in XLFD field. */ |
| 60 | const char *names[5]; | 60 | const char *names[6]; |
| 61 | }; | 61 | }; |
| 62 | 62 | ||
| 63 | /* Table of weight numeric values and their names. This table must be | 63 | /* Table of weight numeric values and their names. This table must be |
| 64 | sorted by numeric values in ascending order. */ | 64 | sorted by numeric values in ascending order and the numeric values |
| 65 | must approximately match the weights in the font files. */ | ||
| 65 | 66 | ||
| 66 | static const struct table_entry weight_table[] = | 67 | static const struct table_entry weight_table[] = |
| 67 | { | 68 | { |
| 68 | { 0, { "thin" }}, | 69 | { 0, { "thin" }}, |
| 69 | { 20, { "ultra-light", "ultralight" }}, | 70 | { 40, { "ultra-light", "ultralight", "extra-light", "extralight" }}, |
| 70 | { 40, { "extra-light", "extralight" }}, | ||
| 71 | { 50, { "light" }}, | 71 | { 50, { "light" }}, |
| 72 | { 75, { "semi-light", "semilight", "demilight", "book" }}, | 72 | { 55, { "semi-light", "semilight", "demilight" }}, |
| 73 | { 100, { "normal", "medium", "regular", "unspecified" }}, | 73 | { 80, { "regular", "normal", "unspecified", "book" }}, |
| 74 | { 180, { "semi-bold", "semibold", "demibold", "demi" }}, | 74 | { 100, { "medium" }}, |
| 75 | { 180, { "semi-bold", "semibold", "demibold", "demi-bold", "demi" }}, | ||
| 75 | { 200, { "bold" }}, | 76 | { 200, { "bold" }}, |
| 76 | { 205, { "extra-bold", "extrabold" }}, | 77 | { 205, { "extra-bold", "extrabold", "ultra-bold", "ultrabold" }}, |
| 77 | { 210, { "ultra-bold", "ultrabold", "black" }} | 78 | { 210, { "black", "heavy" }}, |
| 79 | { 250, { "ultra-heavy", "ultraheavy" }} | ||
| 78 | }; | 80 | }; |
| 79 | 81 | ||
| 80 | /* Table of slant numeric values and their names. This table must be | 82 | /* Table of slant numeric values and their names. This table must be |
| @@ -1484,11 +1486,20 @@ font_parse_fcname (char *name, ptrdiff_t len, Lisp_Object font) | |||
| 1484 | #define PROP_MATCH(STR) (word_len == strlen (STR) \ | 1486 | #define PROP_MATCH(STR) (word_len == strlen (STR) \ |
| 1485 | && memcmp (p, STR, strlen (STR)) == 0) | 1487 | && memcmp (p, STR, strlen (STR)) == 0) |
| 1486 | 1488 | ||
| 1487 | if (PROP_MATCH ("light") | 1489 | if (PROP_MATCH ("thin") |
| 1490 | || PROP_MATCH ("ultra-light") | ||
| 1491 | || PROP_MATCH ("light") | ||
| 1492 | || PROP_MATCH ("semi-light") | ||
| 1493 | || PROP_MATCH ("book") | ||
| 1488 | || PROP_MATCH ("medium") | 1494 | || PROP_MATCH ("medium") |
| 1495 | || PROP_MATCH ("normal") | ||
| 1496 | || PROP_MATCH ("semibold") | ||
| 1489 | || PROP_MATCH ("demibold") | 1497 | || PROP_MATCH ("demibold") |
| 1490 | || PROP_MATCH ("bold") | 1498 | || PROP_MATCH ("bold") |
| 1491 | || PROP_MATCH ("black")) | 1499 | || PROP_MATCH ("ultra-bold") |
| 1500 | || PROP_MATCH ("black") | ||
| 1501 | || PROP_MATCH ("heavy") | ||
| 1502 | || PROP_MATCH ("ultra-heavy")) | ||
| 1492 | FONT_SET_STYLE (font, FONT_WEIGHT_INDEX, val); | 1503 | FONT_SET_STYLE (font, FONT_WEIGHT_INDEX, val); |
| 1493 | else if (PROP_MATCH ("roman") | 1504 | else if (PROP_MATCH ("roman") |
| 1494 | || PROP_MATCH ("italic") | 1505 | || PROP_MATCH ("italic") |
diff --git a/src/gtkutil.c b/src/gtkutil.c index e87845caf70..9a2850dea8f 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c | |||
| @@ -2237,20 +2237,32 @@ xg_get_file_name (struct frame *f, | |||
| 2237 | 2237 | ||
| 2238 | #ifdef HAVE_GTK3 | 2238 | #ifdef HAVE_GTK3 |
| 2239 | 2239 | ||
| 2240 | #define XG_WEIGHT_TO_SYMBOL(w) \ | 2240 | static |
| 2241 | (w <= PANGO_WEIGHT_THIN ? Qextra_light \ | 2241 | Lisp_Object xg_weight_to_symbol (PangoWeight w) |
| 2242 | : w <= PANGO_WEIGHT_ULTRALIGHT ? Qlight \ | 2242 | { |
| 2243 | : w <= PANGO_WEIGHT_LIGHT ? Qsemi_light \ | 2243 | return |
| 2244 | : w < PANGO_WEIGHT_MEDIUM ? Qnormal \ | 2244 | (w <= PANGO_WEIGHT_THIN ? Qthin /* 100 */ |
| 2245 | : w <= PANGO_WEIGHT_SEMIBOLD ? Qsemi_bold \ | 2245 | : w <= PANGO_WEIGHT_ULTRALIGHT ? Qultra_light /* 200 */ |
| 2246 | : w <= PANGO_WEIGHT_BOLD ? Qbold \ | 2246 | : w <= PANGO_WEIGHT_LIGHT ? Qlight /* 300 */ |
| 2247 | : w <= PANGO_WEIGHT_HEAVY ? Qextra_bold \ | 2247 | : w <= PANGO_WEIGHT_SEMILIGHT ? Qsemi_light /* 350 */ |
| 2248 | : Qultra_bold) | 2248 | : w <= PANGO_WEIGHT_BOOK ? Qbook /* 380 */ |
| 2249 | 2249 | : w <= PANGO_WEIGHT_NORMAL ? Qnormal /* 400 */ | |
| 2250 | #define XG_STYLE_TO_SYMBOL(s) \ | 2250 | : w <= PANGO_WEIGHT_MEDIUM ? Qmedium /* 500 */ |
| 2251 | (s == PANGO_STYLE_OBLIQUE ? Qoblique \ | 2251 | : w <= PANGO_WEIGHT_SEMIBOLD ? Qsemi_bold /* 600 */ |
| 2252 | : s == PANGO_STYLE_ITALIC ? Qitalic \ | 2252 | : w <= PANGO_WEIGHT_BOLD ? Qbold /* 700 */ |
| 2253 | : Qnormal) | 2253 | : w <= PANGO_WEIGHT_ULTRABOLD ? Qultra_bold /* 800 */ |
| 2254 | : w <= PANGO_WEIGHT_HEAVY ? Qblack /* 900 */ | ||
| 2255 | : Qultra_heavy); /* 1000 */ | ||
| 2256 | } | ||
| 2257 | |||
| 2258 | static | ||
| 2259 | Lisp_Object xg_style_to_symbol (PangoStyle s) | ||
| 2260 | { | ||
| 2261 | return | ||
| 2262 | (s == PANGO_STYLE_OBLIQUE ? Qoblique | ||
| 2263 | : s == PANGO_STYLE_ITALIC ? Qitalic | ||
| 2264 | : Qnormal); | ||
| 2265 | } | ||
| 2254 | 2266 | ||
| 2255 | #endif /* HAVE_GTK3 */ | 2267 | #endif /* HAVE_GTK3 */ |
| 2256 | 2268 | ||
| @@ -2341,8 +2353,8 @@ xg_get_font (struct frame *f, const char *default_name) | |||
| 2341 | font = CALLN (Ffont_spec, | 2353 | font = CALLN (Ffont_spec, |
| 2342 | QCfamily, build_string (family), | 2354 | QCfamily, build_string (family), |
| 2343 | QCsize, make_float (pango_units_to_double (size)), | 2355 | QCsize, make_float (pango_units_to_double (size)), |
| 2344 | QCweight, XG_WEIGHT_TO_SYMBOL (weight), | 2356 | QCweight, xg_weight_to_symbol (weight), |
| 2345 | QCslant, XG_STYLE_TO_SYMBOL (style)); | 2357 | QCslant, xg_style_to_symbol (style)); |
| 2346 | 2358 | ||
| 2347 | char *font_desc_str = pango_font_description_to_string (desc); | 2359 | char *font_desc_str = pango_font_description_to_string (desc); |
| 2348 | dupstring (&x_last_font_name, font_desc_str); | 2360 | dupstring (&x_last_font_name, font_desc_str); |
diff --git a/src/w32font.c b/src/w32font.c index 6b9ab0468cd..885daf930b0 100644 --- a/src/w32font.c +++ b/src/w32font.c | |||
| @@ -2000,11 +2000,11 @@ w32_encode_weight (int n) | |||
| 2000 | static Lisp_Object | 2000 | static Lisp_Object |
| 2001 | w32_to_fc_weight (int n) | 2001 | w32_to_fc_weight (int n) |
| 2002 | { | 2002 | { |
| 2003 | if (n >= FW_HEAVY) return intern ("black"); | 2003 | if (n >= FW_HEAVY) return Qbold; |
| 2004 | if (n >= FW_EXTRABOLD) return Qextra_bold; | 2004 | if (n >= FW_EXTRABOLD) return Qextra_bold; |
| 2005 | if (n >= FW_BOLD) return Qbold; | 2005 | if (n >= FW_BOLD) return Qbold; |
| 2006 | if (n >= FW_SEMIBOLD) return intern ("demibold"); | 2006 | if (n >= FW_SEMIBOLD) return intern ("demibold"); |
| 2007 | if (n >= FW_NORMAL) return intern ("medium"); | 2007 | if (n >= FW_NORMAL) return Qmedium; |
| 2008 | if (n >= FW_LIGHT) return Qlight; | 2008 | if (n >= FW_LIGHT) return Qlight; |
| 2009 | if (n >= FW_EXTRALIGHT) return Qextra_light; | 2009 | if (n >= FW_EXTRALIGHT) return Qextra_light; |
| 2010 | return intern ("thin"); | 2010 | return intern ("thin"); |
diff --git a/src/xfaces.c b/src/xfaces.c index 5e63e87d751..22f37222c38 100644 --- a/src/xfaces.c +++ b/src/xfaces.c | |||
| @@ -6933,13 +6933,20 @@ syms_of_xfaces (void) | |||
| 6933 | DEFSYM (Qpressed_button, "pressed-button"); | 6933 | DEFSYM (Qpressed_button, "pressed-button"); |
| 6934 | DEFSYM (Qflat_button, "flat-button"); | 6934 | DEFSYM (Qflat_button, "flat-button"); |
| 6935 | DEFSYM (Qnormal, "normal"); | 6935 | DEFSYM (Qnormal, "normal"); |
| 6936 | DEFSYM (Qthin, "thin"); | ||
| 6936 | DEFSYM (Qextra_light, "extra-light"); | 6937 | DEFSYM (Qextra_light, "extra-light"); |
| 6938 | DEFSYM (Qultra_light, "ultra-light"); | ||
| 6937 | DEFSYM (Qlight, "light"); | 6939 | DEFSYM (Qlight, "light"); |
| 6938 | DEFSYM (Qsemi_light, "semi-light"); | 6940 | DEFSYM (Qsemi_light, "semi-light"); |
| 6941 | DEFSYM (Qmedium, "medium"); | ||
| 6939 | DEFSYM (Qsemi_bold, "semi-bold"); | 6942 | DEFSYM (Qsemi_bold, "semi-bold"); |
| 6943 | DEFSYM (Qbook, "book"); | ||
| 6940 | DEFSYM (Qbold, "bold"); | 6944 | DEFSYM (Qbold, "bold"); |
| 6941 | DEFSYM (Qextra_bold, "extra-bold"); | 6945 | DEFSYM (Qextra_bold, "extra-bold"); |
| 6942 | DEFSYM (Qultra_bold, "ultra-bold"); | 6946 | DEFSYM (Qultra_bold, "ultra-bold"); |
| 6947 | DEFSYM (Qheavy, "heavy"); | ||
| 6948 | DEFSYM (Qultra_heavy, "ultra-heavy"); | ||
| 6949 | DEFSYM (Qblack, "black"); | ||
| 6943 | DEFSYM (Qoblique, "oblique"); | 6950 | DEFSYM (Qoblique, "oblique"); |
| 6944 | DEFSYM (Qitalic, "italic"); | 6951 | DEFSYM (Qitalic, "italic"); |
| 6945 | 6952 | ||