From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Anders Lindgren Newsgroups: gmane.emacs.bugs Subject: bug#7887: Emacs will render some fonts under Mac OS X one pixel too tall (patch supplied) Date: Sat, 22 Jan 2011 10:43:39 +0100 Message-ID: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 X-Trace: dough.gmane.org 1295723426 31161 80.91.229.12 (22 Jan 2011 19:10:26 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Sat, 22 Jan 2011 19:10:26 +0000 (UTC) To: 7887@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sat Jan 22 20:10:16 2011 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Pgiql-0007wc-5Z for geb-bug-gnu-emacs@m.gmane.org; Sat, 22 Jan 2011 20:10:16 +0100 Original-Received: from localhost ([127.0.0.1]:58843 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Pgiqk-0001px-6q for geb-bug-gnu-emacs@m.gmane.org; Sat, 22 Jan 2011 14:10:14 -0500 Original-Received: from [140.186.70.92] (port=54426 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PgicC-0003qZ-5F for bug-gnu-emacs@gnu.org; Sat, 22 Jan 2011 13:55:36 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Pgibw-0006wO-5V for bug-gnu-emacs@gnu.org; Sat, 22 Jan 2011 13:55:12 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:56183) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Pgibw-0006wK-0w for bug-gnu-emacs@gnu.org; Sat, 22 Jan 2011 13:54:56 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.69) (envelope-from ) id 1PgiMY-0007Cv-HT; Sat, 22 Jan 2011 13:39:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Anders Lindgren Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-To: owner@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 22 Jan 2011 18:39:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 7887 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.129572151227654 (code B ref -1); Sat, 22 Jan 2011 18:39:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 22 Jan 2011 18:38:32 +0000 Original-Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1PgiM3-0007Bz-SA for submit@debbugs.gnu.org; Sat, 22 Jan 2011 13:38:32 -0500 Original-Received: from eggs.gnu.org ([140.186.70.92]) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1PgZsr-0002JS-Sf for submit@debbugs.gnu.org; Sat, 22 Jan 2011 04:35:50 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Pga0W-0003rR-Us for submit@debbugs.gnu.org; Sat, 22 Jan 2011 04:43:46 -0500 Original-Received: from lists.gnu.org ([199.232.76.165]:41348) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Pga0W-0003rM-QU for submit@debbugs.gnu.org; Sat, 22 Jan 2011 04:43:44 -0500 Original-Received: from [140.186.70.92] (port=49511 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Pga0U-0000Kt-UI for bug-gnu-emacs@gnu.org; Sat, 22 Jan 2011 04:43:44 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Pga0T-0003rB-6e for bug-gnu-emacs@gnu.org; Sat, 22 Jan 2011 04:43:42 -0500 Original-Received: from mail-gw0-f41.google.com ([74.125.83.41]:58688) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Pga0T-0003r6-34 for bug-gnu-emacs@gnu.org; Sat, 22 Jan 2011 04:43:41 -0500 Original-Received: by gwj22 with SMTP id 22so877491gwj.0 for ; Sat, 22 Jan 2011 01:43:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:date:message-id:subject:from:to :content-type; bh=YKRygLizgGzjFuw1LZMUGRiaCO/Jtws90ggRUrGy9g0=; b=Wc7pzfFNzydUAYmLMYHN6D1kA9X59pvMRpSu8szel7pZeEmfTexSMw89LQcd9DJZnJ +i+/fMQeexLI2JTOCcYl2Zn4zMl6Kp21WXXEteIKHAPR0jHYtj1ULhkS6Ofi/WuXO7lT Ane3hWmei4b03sTrp/63EF+BQ2tC8dA2zxwzk= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=xA2m/aayRVe76IEPAQIg/3UeO/UEQnlZVSqvf+nAXfLr0FyAnN6/Iet2AvxOEYU6FK MEQWPt/MdGHoAZDQW96QED2qxUH6mq7Z8wIboJddIe6Jxkt1d0SK2R7BXilB4MDK0iRu Wg9TrEqiWYdv9BWXt1LxG5NrOnZ0b6Kf2SQFk= Original-Received: by 10.150.219.10 with SMTP id r10mr1908848ybg.318.1295689419960; Sat, 22 Jan 2011 01:43:39 -0800 (PST) Original-Received: by 10.151.108.17 with HTTP; Sat, 22 Jan 2011 01:43:39 -0800 (PST) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Mailman-Approved-At: Sat, 22 Jan 2011 13:38:30 -0500 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list Resent-Date: Sat, 22 Jan 2011 13:39:02 -0500 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Mailman-Approved-At: Sat, 22 Jan 2011 14:00:19 -0500 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:43532 Archived-At: Hi! I have notices that Emacs will render some fonts under Mac OS X one pixel too tall. The current implementation for handling fonts under NextStep always round the descender to the next full integer, to avoid clipping. (As descenders under NextStep are negative, this is done using the function "floor"). Unfortunately, some fonts do not specify the descender as exactly as desired. Concretely, a 6x8 bitmap font could report a descender of -2.0000040531158447 (represented by 0xc000000220000000), which Emacs rounds to -3. The result is that the font will be drawn one pixel taller than expected. The patch below is one example of how to handle this, it will circumvent the problem by adding a small value to the descender, making sure that values close enough to an integer will be rounded to that integer. -- Anders Lindgren 2011-01-22 Anders Lindgren * nsfont.m (nsfont_open): Ensure that fonts with inexact descenders would not become one pixel too tall. === modified file 'src/nsfont.m' --- src/nsfont.m 2011-01-19 22:11:33 +0000 +++ src/nsfont.m 2011-01-22 09:03:56 +0000 @@ -809,6 +809,15 @@ const char *fontName = [[nsfont fontName] UTF8String]; int len = strlen (fontName); + /* The values specified by fonts are not always exact. For + * example, a 6x8 font could specify that the descender is + * -2.00000405... (represented by 0xc000000220000000). Without + * adjustment, the code below would round the descender to -3, + * resulting in a font that would be one pixel higher than + * intended. */ + + CGFloat adjusted_descender = [sfont descender] + 0.0001; + #ifdef NS_IMPL_GNUSTEP font_info->nsfont = sfont; #else @@ -830,7 +839,7 @@ brect = [sfont boundingRectForFont]; full_height = brect.size.height; - min_height = [sfont ascender] - [sfont descender]; + min_height = [sfont ascender] - adjusted_descender; hd = full_height - min_height; /* standard height, similar to Carbon. Emacs.app: was 0.5 by default. */ @@ -845,10 +854,10 @@ /* max bounds */ font_info->max_bounds.ascent = lrint (hshrink * [sfont ascender] + expand * hd/2); - /* [sfont descender] is usually negative. Use floor to avoid - clipping descenders. */ + /* Descender is usually negative. Use floor to avoid clipping + descenders. */ font_info->max_bounds.descent = - -lrint (floor(hshrink* [sfont descender] - expand*hd/2)); + -lrint (floor(hshrink * adjusted_descender - expand * hd/2)); font_info->height = font_info->max_bounds.ascent + font_info->max_bounds.descent; font_info->max_bounds.width = lrint (font_info->width); @@ -884,7 +893,7 @@ /* set up metrics portion of font struct */ font->ascent = lrint([sfont ascender]); - font->descent = -lrint(floor([sfont descender])); + font->descent = -lrint(floor(adjusted_descender)); font->min_width = ns_char_width(sfont, '|'); font->space_width = lrint (ns_char_width (sfont, ' ')); font->average_width = lrint (font_info->width); In GNU Emacs 24.0.50.1 (x86_64-apple-darwin10.5.0, NS apple-appkit-1038.35) of 2011-01-14 on macpro.local Windowing system distributor `Apple', version 10.3.1038 configured using `configure '--with-ns'' Important settings: value of $LC_ALL: nil value of $LC_COLLATE: nil value of $LC_CTYPE: nil value of $LC_MESSAGES: nil value of $LC_MONETARY: nil value of $LC_NUMERIC: nil value of $LC_TIME: nil value of $LANG: nil value of $XMODIFIERS: nil locale-coding-system: nil default enable-multibyte-characters: t Major mode: ObjC/lw Minor modes in effect: diff-auto-refine-mode: t subword-mode: t global-auto-revert-mode: t global-cwarn-mode: t minibuffer-electric-file-mode: t recentf-mode: t msb-mode: t display-time-mode: t tooltip-mode: t mouse-wheel-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t column-number-mode: t line-number-mode: t transient-mark-mode: t abbrev-mode: t Recent input: C-SPC C-w C-SPC C-w C-e C-a C-x C-s C-M-a C-s e p s C-a C-x C-f s a l a s j . k . c C-x o C-x p C-M-a C-SPC C-w C-x C-s C-x o C-y C-x p C-v C-l C-v C-a C-SPC C-w C-x C-s C-x o C-y C-x C-s C-x p M-d M-d M-d c o u l y d SPC M-f y q q M-f M-f M-f t h e SPC d e s c M-- q C-x C-s C-a C-x C-s SPC SPC C-a C-x C-s SPC SPC C-a C-x C-s C-a SPC SPC C-a C-x C-s M-f C-s C-w C-s C-a a a d j u s t m e n t d q C-a C-SPC x i s p l l e l l - r e g ' q C-g c q C-d i f y C-a C-x C-s Recent messages: Wrote /Users/anders/build/emacs/trunk/src/nsfont.m Mark saved where search started Mark set Starting new Ispell process [default] ... Entering debugger... Back to top level. Quit Auto-saving...done Saving file /Users/anders/build/emacs/trunk/src/nsfont.m... Wrote /Users/anders/build/emacs/trunk/src/nsfont.m Load-path shadows: ~/emacs/lisp/table hides /Applications/Emacs24.app/Contents/Resources/lisp/textmodes/table ~/emacs/lisp/ruby-mode hides /Applications/Emacs24.app/Contents/Resources/lisp/progmodes/ruby-mode ~/emacs/src/asm-mode-new/src/asm-mode hides /Applications/Emacs24.app/Contents/Resources/lisp/progmodes/asm-mode Features: (ispell smerge-mode diff-mode texinfo autoconf autoconf-mode conf-mode shadow sort gnus-util mail-extr message rfc822 mml mml-sec mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mailabbrev mail-utils gmm-utils mailheader emacsbug subword newcomment ctypes grep compile etags jka-compr find-func follow my-end-of-buffer-log c-electric-operator c-indent-operator dired-aux dired vc-bzr sha1 hex-util add-log vc-dispatcher vc-svn pp apropos multi-isearch debug dabbrev help-mode eldoc ps-print ps-def lpr autorevert folding-isearch folding view rdebug cwarn prepaint cc-mode cc-fonts cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs tempo edg-mode split-nways toggle-file-read-only lockdir uniquify ange-ftp comint regexp-opt ring paren mic-paren iso-insert minibuf-elfile easy-mmode recentf tree-widget wid-edit easymenu msb edmacro kmacro warnings disp-table time advice help-fns advice-preload cl tooltip ediff-hook vc-hooks lisp-float-type mwheel ns-win tool-bar dnd fontset image fringe lisp-mode register page menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock font-lock syntax facemenu font-core frame cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese case-table epa-hook jka-cmpr-hook help simple abbrev loaddefs button minibuffer faces cus-face files text-properties overlay md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote make-network-process ns multi-tty emacs)