Commit 032a42c8 authored by Chong Yidong's avatar Chong Yidong

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.
parent 1c308380
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.
......
......@@ -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;
......
......@@ -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. */
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment