aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenichi Handa2008-06-19 00:41:48 +0000
committerKenichi Handa2008-06-19 00:41:48 +0000
commit81094fabdcab39f801dd7425c2ed881f64ad853e (patch)
treecf19e8d2f9e0d62971720c59f6b4256903e0b380 /src
parent338191ce01e13281fad699dcf98a725428a2efc8 (diff)
downloademacs-81094fabdcab39f801dd7425c2ed881f64ad853e.tar.gz
emacs-81094fabdcab39f801dd7425c2ed881f64ad853e.zip
(QChinting , QCautohint, QChintstyle, QCrgba)
(QCembolden): New variables. (syms_of_xftfont): DEFSYM them. (xftfont_open): Call XftFontMatch. Don't trust the result of XftTextExtents8 if the pixel_size is less than 5.
Diffstat (limited to 'src')
-rw-r--r--src/xftfont.c61
1 files changed, 53 insertions, 8 deletions
diff --git a/src/xftfont.c b/src/xftfont.c
index 27fbd7241a4..7d5bf245cb6 100644
--- a/src/xftfont.c
+++ b/src/xftfont.c
@@ -38,6 +38,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
38/* Xft font driver. */ 38/* Xft font driver. */
39 39
40static Lisp_Object Qxft; 40static Lisp_Object Qxft;
41static Lisp_Object QChinting , QCautohint, QChintstyle, QCrgba, QCembolden;
41 42
42/* The actual structure for Xft font that can be casted to struct 43/* The actual structure for Xft font that can be casted to struct
43 font. */ 44 font. */
@@ -175,6 +176,7 @@ xftfont_match (frame, spec)
175} 176}
176 177
177extern Lisp_Object ftfont_font_format P_ ((FcPattern *)); 178extern Lisp_Object ftfont_font_format P_ ((FcPattern *));
179extern Lisp_Object QCantialias;
178 180
179static FcChar8 ascii_printable[95]; 181static FcChar8 ascii_printable[95];
180 182
@@ -184,9 +186,10 @@ xftfont_open (f, entity, pixel_size)
184 Lisp_Object entity; 186 Lisp_Object entity;
185 int pixel_size; 187 int pixel_size;
186{ 188{
189 FcResult result;
187 Display *display = FRAME_X_DISPLAY (f); 190 Display *display = FRAME_X_DISPLAY (f);
188 Lisp_Object val, filename, font_object; 191 Lisp_Object val, filename, tail, font_object;
189 FcPattern *pat = NULL; 192 FcPattern *pat = NULL, *match;
190 struct xftfont_info *xftfont_info = NULL; 193 struct xftfont_info *xftfont_info = NULL;
191 struct font *font; 194 struct font *font;
192 double size = 0; 195 double size = 0;
@@ -207,17 +210,48 @@ xftfont_open (f, entity, pixel_size)
207 size = pixel_size; 210 size = pixel_size;
208 pat = FcPatternCreate (); 211 pat = FcPatternCreate ();
209 FcPatternAddString (pat, FC_FILE, (FcChar8 *) SDATA (filename)); 212 FcPatternAddString (pat, FC_FILE, (FcChar8 *) SDATA (filename));
213 FcPatternAddInteger (pat, FC_WEIGHT, FONT_WEIGHT_NUMERIC (entity));
214 i = FONT_SLANT_NUMERIC (entity) - 100;
215 if (i < 0) i = 0;
216 FcPatternAddInteger (pat, FC_SLANT, i);
217 FcPatternAddInteger (pat, FC_WIDTH, FONT_WIDTH_NUMERIC (entity));
210 FcPatternAddDouble (pat, FC_PIXEL_SIZE, pixel_size); 218 FcPatternAddDouble (pat, FC_PIXEL_SIZE, pixel_size);
211 /*FcPatternAddBool (pat, FC_ANTIALIAS, FcTrue);*/
212 val = AREF (entity, FONT_FAMILY_INDEX); 219 val = AREF (entity, FONT_FAMILY_INDEX);
213 if (! NILP (val)) 220 if (! NILP (val))
214 FcPatternAddString (pat, FC_FAMILY, (FcChar8 *) SDATA (SYMBOL_NAME (val))); 221 FcPatternAddString (pat, FC_FAMILY, (FcChar8 *) SDATA (SYMBOL_NAME (val)));
222 for (tail = AREF (entity, FONT_EXTRA_INDEX); CONSP (tail); tail = XCDR (tail))
223 {
224 Lisp_Object key, val;
225
226 key = XCAR (XCAR (tail)), val = XCDR (XCAR (tail));
227 if (EQ (key, QCantialias))
228 FcPatternAddBool (pat, FC_ANTIALIAS, NILP (val) ? FcFalse : FcTrue);
229 else if (EQ (key, QChinting))
230 FcPatternAddBool (pat, FC_HINTING, NILP (val) ? FcFalse : FcTrue);
231 else if (EQ (key, QCautohint))
232 FcPatternAddBool (pat, FC_AUTOHINT, NILP (val) ? FcFalse : FcTrue);
233 else if (EQ (key, QChintstyle))
234 {
235 if (INTEGERP (val))
236 FcPatternAddInteger (pat, FC_RGBA, XINT (val));
237 }
238 else if (EQ (key, QCrgba))
239 {
240 if (INTEGERP (val))
241 FcPatternAddInteger (pat, FC_RGBA, XINT (val));
242 }
243 else if (EQ (key, QCembolden))
244 FcPatternAddBool (pat, FC_EMBOLDEN, NILP (val) ? FcFalse : FcTrue);
245 }
215 FcConfigSubstitute (NULL, pat, FcMatchPattern); 246 FcConfigSubstitute (NULL, pat, FcMatchPattern);
216 247
217 BLOCK_INPUT; 248 BLOCK_INPUT;
218 XftDefaultSubstitute (display, FRAME_X_SCREEN_NUMBER (f), pat); 249 XftDefaultSubstitute (display, FRAME_X_SCREEN_NUMBER (f), pat);
219 xftfont = XftFontOpenPattern (display, pat); 250 match = XftFontMatch (display, FRAME_X_SCREEN_NUMBER (f), pat, &result);
251 FcPatternDestroy (pat);
252 xftfont = XftFontOpenPattern (display, match);
220 UNBLOCK_INPUT; 253 UNBLOCK_INPUT;
254
221 if (! xftfont) 255 if (! xftfont)
222 return Qnil; 256 return Qnil;
223 /* We should not destroy PAT here because it is kept in XFTFONT and 257 /* We should not destroy PAT here because it is kept in XFTFONT and
@@ -280,11 +314,17 @@ xftfont_open (f, entity, pixel_size)
280 UNBLOCK_INPUT; 314 UNBLOCK_INPUT;
281 315
282 font->ascent = xftfont->ascent; 316 font->ascent = xftfont->ascent;
283 if (font->ascent < extents.y)
284 font->ascent = extents.y;
285 font->descent = xftfont->descent; 317 font->descent = xftfont->descent;
286 if (font->descent < extents.height - extents.y) 318 if (pixel_size >= 5)
287 font->descent = extents.height - extents.y; 319 {
320 /* The above condition is a dirty workaround because
321 XftTextExtents8 behaves strangely for some fonts
322 (e.g. "Dejavu Sans Mono") when pixel_size is less than 5. */
323 if (font->ascent < extents.y)
324 font->ascent = extents.y;
325 if (font->descent < extents.height - extents.y)
326 font->descent = extents.height - extents.y;
327 }
288 font->height = font->ascent + font->descent; 328 font->height = font->ascent + font->descent;
289 329
290 ft_face = XftLockFace (xftfont); 330 ft_face = XftLockFace (xftfont);
@@ -570,6 +610,11 @@ void
570syms_of_xftfont () 610syms_of_xftfont ()
571{ 611{
572 DEFSYM (Qxft, "xft"); 612 DEFSYM (Qxft, "xft");
613 DEFSYM (QChinting, ":hinting");
614 DEFSYM (QCautohint, ":autohing");
615 DEFSYM (QChintstyle, ":hintstyle");
616 DEFSYM (QCrgba, ":rgba");
617 DEFSYM (QCembolden, ":embolden");
573 618
574 xftfont_driver = ftfont_driver; 619 xftfont_driver = ftfont_driver;
575 xftfont_driver.type = Qxft; 620 xftfont_driver.type = Qxft;