1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-30 09:00:31 -08:00

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.
This commit is contained in:
Chong Yidong 2012-08-16 14:35:13 +08:00
parent 1c308380b6
commit 032a42c88d
4 changed files with 31 additions and 14 deletions

View file

@ -1,6 +1,19 @@
2012-08-16 Chong Yidong <cyd@gnu.org>
* 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 <dmantipov@yandex.ru>
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.

View file

@ -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;

View file

@ -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. */

View file

@ -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;