aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Ingebrigtsen2021-10-21 04:30:02 +0200
committerLars Ingebrigtsen2021-10-21 04:30:02 +0200
commit65fd3ca84f75aee0dfebb87fa793dae57c1caf35 (patch)
tree929b299592e19b39fafc0bbbcccdc6175133f8ef /src
parent4e9764e6a155aa403d69d38fa06f4a774140f63c (diff)
downloademacs-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.c33
-rw-r--r--src/gtkutil.c44
-rw-r--r--src/w32font.c4
-rw-r--r--src/xfaces.c7
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
66static const struct table_entry weight_table[] = 67static 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) \ 2240static
2241 (w <= PANGO_WEIGHT_THIN ? Qextra_light \ 2241Lisp_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
2258static
2259Lisp_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)
2000static Lisp_Object 2000static Lisp_Object
2001w32_to_fc_weight (int n) 2001w32_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