aboutsummaryrefslogtreecommitdiffstats
path: root/src/ftfont.c
diff options
context:
space:
mode:
authorYAMAMOTO Mitsuharu2019-05-14 10:17:16 +0900
committerYAMAMOTO Mitsuharu2019-05-14 10:17:16 +0900
commit9b28a5083edecacfac3c7e16308bd8af3f4773a2 (patch)
treec01c23b892c62d944d89e1f281cbeb7b307d3562 /src/ftfont.c
parent2f7e97ef482ddacd0ed21ccd25ca777beb60ab35 (diff)
downloademacs-9b28a5083edecacfac3c7e16308bd8af3f4773a2.tar.gz
emacs-9b28a5083edecacfac3c7e16308bd8af3f4773a2.zip
Avoid artifacts in ftx and ftcr font backend drivers
* src/ftcrfont.c (ftcrfont_open): * src/ftfont.c (ftfont_open2): Make font->height equal to sum of font->ascent and font->descent. Respect :minspace property. (ftfont_open2): Remove redundant assignment. (syms_of_ftfont) <QCminspace>: New DEFSYM.
Diffstat (limited to 'src/ftfont.c')
-rw-r--r--src/ftfont.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/src/ftfont.c b/src/ftfont.c
index d0078a37701..4770c3c40b3 100644
--- a/src/ftfont.c
+++ b/src/ftfont.c
@@ -1108,7 +1108,6 @@ ftfont_open2 (struct frame *f,
1108 return Qnil; 1108 return Qnil;
1109 filename = XCAR (val); 1109 filename = XCAR (val);
1110 idx = XCDR (val); 1110 idx = XCDR (val);
1111 val = XCDR (cache);
1112 cache_data = xmint_pointer (XCDR (cache)); 1111 cache_data = xmint_pointer (XCDR (cache));
1113 ft_face = cache_data->ft_face; 1112 ft_face = cache_data->ft_face;
1114 if (cache_data->face_refcount > 0) 1113 if (cache_data->face_refcount > 0)
@@ -1172,20 +1171,38 @@ ftfont_open2 (struct frame *f,
1172 font->driver = &ftfont_driver; 1171 font->driver = &ftfont_driver;
1173 font->encoding_charset = font->repertory_charset = -1; 1172 font->encoding_charset = font->repertory_charset = -1;
1174 1173
1174 val = assq_no_quit (QCminspace, AREF (entity, FONT_EXTRA_INDEX));
1175 bool no_leading_p = !(CONSP (val) && NILP (XCDR (val)));
1175 upEM = ft_face->units_per_EM; 1176 upEM = ft_face->units_per_EM;
1176 scalable = (FIXNUMP (AREF (entity, FONT_AVGWIDTH_INDEX)) 1177 scalable = (FIXNUMP (AREF (entity, FONT_AVGWIDTH_INDEX))
1177 && XFIXNUM (AREF (entity, FONT_AVGWIDTH_INDEX)) == 0); 1178 && XFIXNUM (AREF (entity, FONT_AVGWIDTH_INDEX)) == 0);
1178 if (scalable) 1179 if (scalable)
1179 { 1180 {
1180 font->ascent = ft_face->ascender * size / upEM + 0.5; 1181 font->ascent = ft_face->ascender * size / upEM + 0.5;
1181 font->descent = - ft_face->descender * size / upEM + 0.5; 1182 if (no_leading_p)
1182 font->height = ft_face->height * size / upEM + 0.5; 1183 {
1184 font->descent = - ft_face->descender * size / upEM + 0.5;
1185 font->height = font->ascent + font->descent;
1186 }
1187 else
1188 {
1189 font->height = ft_face->height * size / upEM + 0.5;
1190 font->descent = font->height - font->ascent;
1191 }
1183 } 1192 }
1184 else 1193 else
1185 { 1194 {
1186 font->ascent = ft_face->size->metrics.ascender >> 6; 1195 font->ascent = ft_face->size->metrics.ascender >> 6;
1187 font->descent = - ft_face->size->metrics.descender >> 6; 1196 if (no_leading_p)
1188 font->height = ft_face->size->metrics.height >> 6; 1197 {
1198 font->descent = - ft_face->size->metrics.descender >> 6;
1199 font->height = font->ascent + font->descent;
1200 }
1201 else
1202 {
1203 font->height = ft_face->size->metrics.height >> 6;
1204 font->descent = font->height - font->ascent;
1205 }
1189 } 1206 }
1190 if (FIXNUMP (AREF (entity, FONT_SPACING_INDEX))) 1207 if (FIXNUMP (AREF (entity, FONT_SPACING_INDEX)))
1191 spacing = XFIXNUM (AREF (entity, FONT_SPACING_INDEX)); 1208 spacing = XFIXNUM (AREF (entity, FONT_SPACING_INDEX));
@@ -2769,6 +2786,9 @@ syms_of_ftfont (void)
2769 DEFSYM (Qsans, "sans"); 2786 DEFSYM (Qsans, "sans");
2770 DEFSYM (Qsans__serif, "sans serif"); 2787 DEFSYM (Qsans__serif, "sans serif");
2771 2788
2789 /* The boolean-valued font property key specifying the use of leading. */
2790 DEFSYM (QCminspace, ":minspace");
2791
2772 staticpro (&freetype_font_cache); 2792 staticpro (&freetype_font_cache);
2773 freetype_font_cache = list1 (Qt); 2793 freetype_font_cache = list1 (Qt);
2774 2794