From: Chong Yidong Date: Thu, 16 Aug 2012 06:35:13 +0000 (+0800) Subject: For Xft and X font backends, set omitted max_width font fields. X-Git-Tag: emacs-24.2.90~649 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=032a42c88d421ee434e783e29bf2cde3d6a81e7b;p=emacs.git For Xft and X font backends, set omitted max_width font fields. * src/xfont.c (xfont_open): * src/xftfont.c (xftfont_open): Set the font's max_width field. * src/font.h (struct font): Update comments. --- diff --git a/src/ChangeLog b/src/ChangeLog index 27527dbb934..54215f59f8e 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,6 +1,19 @@ +2012-08-16 Chong Yidong + + * xfont.c (xfont_open): + * xftfont.c (xftfont_open): Set the font's max_width field. + + * nsfont.m (nsfont_open): Similar to the Xft backend, set + min_width to space_width and average_width to the average over + printable ASCII characters. + (ns_char_width): Code cleanup. + (ns_ascii_average_width): New utility function. + + * font.h (struct font): Update comments. + 2012-08-16 Dmitry Antipov - Simple interface to set Lisp_Object fields of chararcter tables. + Simple interface to set Lisp_Object fields of character tables. * lisp.h (CSET): New macro. (char_table_set_extras, char_table_set_contents) (sub_char_table_set_contents): New function. diff --git a/src/font.h b/src/font.h index 3e9af6df235..6e9387f7632 100644 --- a/src/font.h +++ b/src/font.h @@ -284,8 +284,11 @@ struct font /* Beyond here, there should be no more Lisp_Object components. */ - /* Maximum bound width over all existing characters of the font. On - X window, this is same as (font->max_bounds.width). */ + /* Minimum and maximum glyph widths, in pixels. Some font backends, + such as xft, lack the information to easily compute minimum and + maximum widths over all characters; in that case, these values + are approximate. */ + int min_width; int max_width; /* By which pixel size the font is opened. */ @@ -301,13 +304,10 @@ struct font /* Average width of glyphs in the font. If the font itself doesn't have that information but has glyphs of ASCII characters, the - value is the average with of those glyphs. Otherwise, the value + value is the average width of those glyphs. Otherwise, the value is 0. */ int average_width; - /* Minimum glyph width (in pixels). */ - int min_width; - /* Ascent and descent of the font (in pixels). */ int ascent, descent; diff --git a/src/xfont.c b/src/xfont.c index 9e929eed678..072bce7bb0a 100644 --- a/src/xfont.c +++ b/src/xfont.c @@ -823,6 +823,7 @@ xfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) font->descent = xfont->descent; font->height = font->ascent + font->descent; font->min_width = xfont->min_bounds.width; + font->max_width = xfont->max_bounds.width; if (xfont->min_bounds.width == xfont->max_bounds.width) { /* Fixed width font. */ diff --git a/src/xftfont.c b/src/xftfont.c index 2f8125393bc..34c6a8fa0b4 100644 --- a/src/xftfont.c +++ b/src/xftfont.c @@ -414,20 +414,25 @@ xftfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) ascii_printable[ch] = ' ' + ch; } BLOCK_INPUT; + + /* Unfortunately Xft doesn't provide a way to get minimum char + width. So, we set min_width to space_width. */ + if (spacing != FC_PROPORTIONAL #ifdef FC_DUAL && spacing != FC_DUAL #endif /* FC_DUAL */ ) { - font->min_width = font->average_width = font->space_width - = xftfont->max_advance_width; + font->min_width = font->max_width = font->average_width + = font->space_width = xftfont->max_advance_width; XftTextExtents8 (display, xftfont, ascii_printable + 1, 94, &extents); } else { XftTextExtents8 (display, xftfont, ascii_printable, 1, &extents); - font->space_width = extents.xOff; + font->min_width = font->max_width = font->space_width + = extents.xOff; if (font->space_width <= 0) /* dirty workaround */ font->space_width = pixel_size; @@ -470,10 +475,6 @@ xftfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) #endif /* HAVE_LIBOTF */ xftfont_info->ft_size = ft_face->size; - /* Unfortunately Xft doesn't provide a way to get minimum char - width. So, we use space_width instead. */ - font->min_width = font->space_width; - font->baseline_offset = 0; font->relative_compose = 0; font->default_ascent = 0; @@ -764,6 +765,8 @@ syms_of_xftfont (void) DEFSYM (QCembolden, ":embolden"); DEFSYM (QClcdfilter, ":lcdfilter"); + ascii_printable[0] = 0; + xftfont_driver = ftfont_driver; xftfont_driver.type = Qxft; xftfont_driver.get_cache = xfont_driver.get_cache;