From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: "Jan D." Newsgroups: gmane.emacs.bugs Subject: bug#7887: Emacs will render some fonts under Mac OS X one pixel too tall (patch supplied) Date: Tue, 25 Jan 2011 14:03:02 +0100 Message-ID: <4D3ECA06.5090105@swipnet.se> References: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Trace: dough.gmane.org 1295961922 27211 80.91.229.12 (25 Jan 2011 13:25:22 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Tue, 25 Jan 2011 13:25:22 +0000 (UTC) Cc: 7887@debbugs.gnu.org To: Anders Lindgren Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Tue Jan 25 14:25:17 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 1PhitY-000191-U3 for geb-bug-gnu-emacs@m.gmane.org; Tue, 25 Jan 2011 14:25:17 +0100 Original-Received: from localhost ([127.0.0.1]:49669 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PhitY-0008PS-A7 for geb-bug-gnu-emacs@m.gmane.org; Tue, 25 Jan 2011 08:25:16 -0500 Original-Received: from [140.186.70.92] (port=52172 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PhitO-0008Gk-2v for bug-gnu-emacs@gnu.org; Tue, 25 Jan 2011 08:25:11 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PhitJ-0008CS-2j for bug-gnu-emacs@gnu.org; Tue, 25 Jan 2011 08:25:06 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:38593) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PhitJ-0008CI-0W for bug-gnu-emacs@gnu.org; Tue, 25 Jan 2011 08:25:01 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.69) (envelope-from ) id 1PhiRF-0000kX-Ti; Tue, 25 Jan 2011 07:56:01 -0500 X-Loop: help-debbugs@gnu.org Resent-From: "Jan D." Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-To: owner@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 25 Jan 2011 12:56:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 7887 X-GNU-PR-Package: emacs,ns X-GNU-PR-Keywords: Original-Received: via spool by 7887-submit@debbugs.gnu.org id=B7887.12959601172820 (code B ref 7887); Tue, 25 Jan 2011 12:56:01 +0000 Original-Received: (at 7887) by debbugs.gnu.org; 25 Jan 2011 12:55:17 +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 1PhiQV-0000jR-QM for submit@debbugs.gnu.org; Tue, 25 Jan 2011 07:55:16 -0500 Original-Received: from smtprelay-b12.telenor.se ([62.127.194.21]) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1PhiQU-0000jF-1w for 7887@debbugs.gnu.org; Tue, 25 Jan 2011 07:55:15 -0500 Original-Received: from ipb2.telenor.se (ipb2.telenor.se [195.54.127.165]) by smtprelay-b12.telenor.se (Postfix) with ESMTP id AE328EB630 for <7887@debbugs.gnu.org>; Tue, 25 Jan 2011 14:03:17 +0100 (CET) X-SENDER-IP: [85.225.45.100] X-LISTENER: [smtp.bredband.net] X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqY0AA9ZPk1V4S1kPGdsb2JhbACIXJwSDAEBAQE1L7xchU8Ej24bgns X-IronPort-AV: E=Sophos;i="4.60,374,1291590000"; d="scan'208";a="167275334" Original-Received: from c-642de155.25-1-64736c10.cust.bredbandsbolaget.se (HELO coolsville.localdomain) ([85.225.45.100]) by ipb2.telenor.se with ESMTP; 25 Jan 2011 14:03:04 +0100 Original-Received: from [10.225.40.55] (unknown [193.45.43.33]) by coolsville.localdomain (Postfix) with ESMTPSA id 61CD37FA05A; Tue, 25 Jan 2011 14:03:03 +0100 (CET) User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; sv-SE; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list Resent-Date: Tue, 25 Jan 2011 07:56:01 -0500 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) 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:43631 Archived-At: Anders Lindgren skrev 2011-01-22 10:43: > 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. How about checking if it is negative and then use ceil instead of floor, and keeping floor for the positive case? Jan D. > > -- 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 -bug-report> > > 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) > >