+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.
/* 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. */
/* 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;
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. */
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;
#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;
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;