X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/0479a1b62ceeb9586168146e2c8f49f2a5ebaf2f..9a834970e822db10bc887db343fd8561a3639a66:/src/xftfont.c diff --git a/src/xftfont.c b/src/xftfont.c index 0e8b876f1d..34c6f7d3e4 100644 --- a/src/xftfont.c +++ b/src/xftfont.c @@ -1,5 +1,5 @@ /* xftfont.c -- XFT font driver. - Copyright (C) 2006-2015 Free Software Foundation, Inc. + Copyright (C) 2006-2016 Free Software Foundation, Inc. Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 National Institute of Advanced Industrial Science and Technology (AIST) Registration Number H13PRO009 @@ -8,8 +8,8 @@ This file is part of GNU Emacs. GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. +the Free Software Foundation, either version 3 of the License, or (at +your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -25,14 +25,11 @@ along with GNU Emacs. If not, see . */ #include #include "lisp.h" -#include "dispextern.h" #include "xterm.h" #include "frame.h" #include "blockinput.h" -#include "character.h" #include "charset.h" #include "composite.h" -#include "fontset.h" #include "font.h" #include "ftfont.h" @@ -111,8 +108,7 @@ xftfont_get_colors (struct frame *f, struct face *face, GC gc, colors[0].pixel = fg->pixel = xgcv.foreground; if (bg) colors[1].pixel = bg->pixel = xgcv.background; - XQueryColors (FRAME_X_DISPLAY (f), FRAME_X_COLORMAP (f), colors, - bg ? 2 : 1); + x_query_colors (f, colors, bg ? 2 : 1); fg->color.alpha = 0xFFFF; fg->color.red = colors[0].red; fg->color.green = colors[0].green; @@ -399,7 +395,15 @@ xftfont_open (struct frame *f, Lisp_Object entity, int pixel_size) font->ascent = xftfont->ascent; font->descent = xftfont->descent; - if (pixel_size >= 5) + /* The following workaround is unnecessary on most systems, and + causes annoying differences in glyph height between regular and + bold fonts (see bug#22383). However, with some fonts, such as + monaco, removing the workaround results in overlapping vertical + space of a line, see bug#23360. As long as the way to reconcile + these opposites is not known, we provide a user option to work + around the problem. */ + if (pixel_size >= 5 + && xft_font_ascent_descent_override) { /* The above condition is a dirty workaround because XftTextExtents8 behaves strangely for some fonts @@ -617,8 +621,26 @@ xftfont_draw (struct glyph_string *s, int from, int to, int x, int y, XftDrawSetClip (xft_draw, NULL); if (with_background) - XftDrawRect (xft_draw, &bg, - x, y - s->font->ascent, s->width, s->font->height); + { + int height = FONT_HEIGHT (s->font), ascent = FONT_BASE (s->font); + + /* Font's global height and ascent values might be + preposterously large for some fonts. We fix here the case + when those fonts are used for display of glyphless + characters, because drawing background with font dimensions + in those cases makes the display illegible. There's only one + more call to the draw method with with_background set to + true, and that's in x_draw_glyph_string_foreground, when + drawing the cursor, where we have no such heuristics + available. FIXME. */ + if (s->first_glyph->type == GLYPHLESS_GLYPH + && (s->first_glyph->u.glyphless.method == GLYPHLESS_DISPLAY_HEX_CODE + || s->first_glyph->u.glyphless.method == GLYPHLESS_DISPLAY_ACRONYM)) + height = ascent = + s->first_glyph->slice.glyphless.lower_yoff + - s->first_glyph->slice.glyphless.upper_yoff; + XftDrawRect (xft_draw, &bg, x, y - ascent, s->width, height); + } code = alloca (sizeof (FT_UInt) * len); for (i = 0; i < len; i++) code[i] = ((XCHAR2B_BYTE1 (s->char2b + from + i) << 8) @@ -729,6 +751,12 @@ syms_of_xftfont (void) DEFSYM (QCembolden, ":embolden"); DEFSYM (QClcdfilter, ":lcdfilter"); + DEFVAR_BOOL ("xft-font-ascent-descent-override", + xft_font_ascent_descent_override, + doc: /* Non-nil means override the ascent and descent values for Xft font driver. +This is needed with some fonts to correct vertical overlap of glyphs. */); + xft_font_ascent_descent_override = 0; + ascii_printable[0] = 0; xftfont_driver = ftfont_driver;