From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Kenichi Handa Newsgroups: gmane.emacs.devel Subject: Re: Zero height line causing arithmetic errors Date: Thu, 19 Jun 2008 10:12:51 +0900 Message-ID: References: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 (generated by SEMI 1.14.3 - "Ushinoya") Content-Type: text/plain; charset=US-ASCII X-Trace: ger.gmane.org 1213837994 25963 80.91.229.12 (19 Jun 2008 01:13:14 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 19 Jun 2008 01:13:14 +0000 (UTC) Cc: emacs-devel@gnu.org To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Jun 19 03:13:58 2008 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1K98is-0007CG-8d for ged-emacs-devel@m.gmane.org; Thu, 19 Jun 2008 03:13:58 +0200 Original-Received: from localhost ([127.0.0.1]:38043 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1K98i3-0003Ar-E8 for ged-emacs-devel@m.gmane.org; Wed, 18 Jun 2008 21:13:07 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1K98hy-0003AR-0K for emacs-devel@gnu.org; Wed, 18 Jun 2008 21:13:02 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1K98hv-00039m-GX for emacs-devel@gnu.org; Wed, 18 Jun 2008 21:13:01 -0400 Original-Received: from [199.232.76.173] (port=58223 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1K98hv-00039h-Du for emacs-devel@gnu.org; Wed, 18 Jun 2008 21:12:59 -0400 Original-Received: from mx1.aist.go.jp ([150.29.246.133]:35688) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1K98hu-0006WB-RV for emacs-devel@gnu.org; Wed, 18 Jun 2008 21:12:59 -0400 Original-Received: from rqsmtp2.aist.go.jp (rqsmtp2.aist.go.jp [150.29.254.123]) by mx1.aist.go.jp with ESMTP id m5J1Djgg025938; Thu, 19 Jun 2008 10:13:45 +0900 (JST) env-from (handa@m17n.org) Original-Received: from smtp4.aist.go.jp by rqsmtp2.aist.go.jp with ESMTP id m5J1Ct9j028450; Thu, 19 Jun 2008 10:12:55 +0900 (JST) env-from (handa@m17n.org) Original-Received: by smtp4.aist.go.jp with ESMTP id m5J1CqfO021825; Thu, 19 Jun 2008 10:12:52 +0900 (JST) env-from (handa@m17n.org) Original-Received: from handa by etlken.m17n.org with local (Exim 4.69) (envelope-from ) id 1K98hn-0008QM-UF; Thu, 19 Jun 2008 10:12:51 +0900 In-reply-to: (message from Stefan Monnier on Sat, 14 Jun 2008 13:35:30 -0400) User-Agent: SEMI/1.14.3 (Ushinoya) FLIM/1.14.2 (Yagi-Nishiguchi) APEL/10.2 Emacs/23.0.60 (i686-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) X-detected-kernel: by monty-python.gnu.org: Solaris 9 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:99427 Archived-At: In article , Stefan Monnier writes: > My MPC.el package uses an overlay placed at the end of a line with an > after-string of #("\n" 0 1 (face (:height 0.05 :inverse-video t))) > in order to place a horizontal line in the display. > In Emacs-22, this worked fine (except the line was a bit thicker than > 0.05 times the base line height). In Emacs-CVS until recently this > worked except that the line was full-height (i.e. 13 pixels in my case). > Recently, it has started to cause more problems because now > FRAME_SMALLEST_FONT_HEIGHT returns 0, and that value is used at 2 places > in the divisor position. > I guess the 0 is because 13 pixels (default font height) * 0.05 -> 0.65 > pixels which are truncated to 0. > I currently use the patch below, which makes it all work again (tho > still with the problem that the 0.05 isn't taken into account and line > line is 13 pixel think), but I suspect it's not the right place to fix > it, For the problem of FRAME_SMALLEST_FONT_HEIGHT being set to 0, I installed the similar change. And, for the problem of too tall line-height, I found the culprit is XftTextExtents8. When the pixelsize of a font is less than 5 or so, for some font, it returns strange values in `extents' argument. For instance, with the attached test problem, I get this result: % ./xfttest 'bitstream vera sans mono' pixelsize=9, ascent=8, descent=2 pixelsize=8, ascent=7, descent=2 pixelsize=7, ascent=6, descent=2 pixelsize=6, ascent=5, descent=2 pixelsize=5, ascent=4, descent=2 pixelsize=4, ascent=4, descent=1 pixelsize=3, ascent=3, descent=1 pixelsize=2, ascent=2, descent=1 pixelsize=1, ascent=1, descent=1 pixelsize=0, ascent=1, descent=1 % ./xfttest 'dejavu sans mono' pixelsize=9, ascent=8, descent=2 pixelsize=8, ascent=7, descent=2 pixelsize=7, ascent=6, descent=2 pixelsize=6, ascent=5, descent=1 pixelsize=5, ascent=5, descent=1 pixelsize=4, ascent=5, descent=2 <-- increasing! pixelsize=3, ascent=4, descent=4 pixelsize=2, ascent=5, descent=5 pixelsize=1, ascent=5, descent=5 pixelsize=0, ascent=5, descent=5 I don't know which component of these has a bug: o the font "dejavu sans mono", o freetype o xft Anyway, I installed a quick dirty workaround; not believe the result of XftTextExtents8 if the pixelsize is less than 5. With that change, if your default font is scalable, the following code works as expected. (let ((buf (get-buffer-create "test")) overlay) (set-buffer buf) (erase-buffer) (insert "first line\n") (setq overlay (make-overlay (1- (point)) (point))) (overlay-put overlay 'after-string (propertize "\n" 'face '(:height 0.01 :inverse-video t))) (switch-to-buffer buf)) But, note that the line height is still 2, not 1. That's because the display engine calculate the line height by ascent+descent, and both ascent and descent doesn't become 0 in the structure XftFont even though `height' member is 1. It may be another Xft (or freetype) problem. --- Kenichi Handa handa@ni.aist.go.jp PS. You can compile xfttest.c by this command: % gcc -g -o xfttest `xft-config --cflags` `xft-config --libs` xfttest.c ----- xfttest.c ---- #include #include #include #include #include char *str = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; void show_height (Display *display, XftFont *font) { XGlyphInfo extents; XftTextExtents8 (display, font, str, 94, &extents); printf (" ascent=%d, descent=%d\n", extents.y, extents.height - extents.y); } int main (int argc, char **argv) { int size; char name[256], *p; Display *display; if (argc < 2) { fprintf (stderr, "Usage: xfttest FAMILYNAME\n"); exit (1); } display = XOpenDisplay (NULL); if (! display) { fprintf (stderr, "Can't open the display\n"); exit (1); } strcpy (name, argv[1]); p = name + strlen (name); for (size = 9; size >= 0; size--) { XftFont *font; sprintf (p, ":pixelsize=%d", size); font = XftFontOpenName (display, 0, name); printf ("pixelsize=%d,", size); show_height (display, font); XftFontClose (display, font); } exit (0); }