From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: "Juanma Barranquero" Newsgroups: gmane.emacs.bugs,gmane.emacs.devel Subject: Re: Emacs 22.1 Windows ClearType Support Date: Thu, 22 Nov 2007 22:43:49 +0100 Message-ID: References: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1195767848 10100 80.91.229.12 (22 Nov 2007 21:44:08 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 22 Nov 2007 21:44:08 +0000 (UTC) Cc: bug-gnu-emacs@gnu.org, Emacs Devel To: "Ng, Andrew" Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu Nov 22 22:44:14 2007 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.50) id 1IvJqH-0006PQ-Vq for geb-bug-gnu-emacs@m.gmane.org; Thu, 22 Nov 2007 22:44:14 +0100 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1IvJq3-0006Qe-Rk for geb-bug-gnu-emacs@m.gmane.org; Thu, 22 Nov 2007 16:43:59 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1IvJpx-0006Nj-6j for bug-gnu-emacs@gnu.org; Thu, 22 Nov 2007 16:43:53 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1IvJpw-0006Lb-5Y for bug-gnu-emacs@gnu.org; Thu, 22 Nov 2007 16:43:52 -0500 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1IvJpw-0006LN-22 for bug-gnu-emacs@gnu.org; Thu, 22 Nov 2007 16:43:52 -0500 Original-Received: from nz-out-0506.google.com ([64.233.162.237]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1IvJpv-0002OX-Fh for bug-gnu-emacs@gnu.org; Thu, 22 Nov 2007 16:43:51 -0500 Original-Received: by nz-out-0506.google.com with SMTP id f1so2327428nzc for ; Thu, 22 Nov 2007 13:43:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; bh=kwszrdJu/pAKft11ozcS4GdaJ5tpexUID/f8tq/wEIQ=; b=Dckj6zyqH4ZQ2F7DZNrJdeFwnISiiQi8qh4fsSvuLZuVPV3pByOA7wT3Sssh6+0zA56TTuJ7vAkUc7PSOTz2myVzMsKykPpgpIjj0aSro2yGvAs3BOCVdiUMcqPQm9OgwqgrjON2H76BLVqQMzoYNF0n3iHmKfXlslwy6tJUcEU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; b=rN5qMUggo6iEhLlDoAvVDjpDnXHxH3YqRPLXUenIDwVTXdPX/ONf7b4B89fk3hsPyJXNnea+YjejJm6d4T8Q78yMSsHKzAQqHSZ8uYC/eikRq8M2wJTS/cjk0Q8m9THpoSMhR/vCao4cg8NBp/1CwwTdZAgv1Il2hUc5cy+pQrA= Original-Received: by 10.114.73.1 with SMTP id v1mr1041113waa.1195767830044; Thu, 22 Nov 2007 13:43:50 -0800 (PST) Original-Received: by 10.114.168.11 with HTTP; Thu, 22 Nov 2007 13:43:49 -0800 (PST) In-Reply-To: Content-Disposition: inline X-detected-kernel: by monty-python.gnu.org: Linux 2.6 (newer, 2) X-BeenThere: bug-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list 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:17045 gmane.emacs.devel:83899 Archived-At: On Nov 22, 2007 4:51 PM, Ng, Andrew wrote: > I have been having a go at fixing up the issues related to ClearType in > Emacs 22.1. > > I think I have pretty much sorted out the major issues and everything > appears to work fine now. I've tried as much as possible not to alter > the non-ClearType code path. > > I've also added an environment variable "EMACS_CLEARTYPE". If present > this will disable ClearType if its value is 0 and will enable ClearType > if its value is non-zero. Otherwise, ClearType is enabled according to > the system settings. > > I've attached a patch file for my changes. > > Thank you. > > Regards, > > Andrew Ng Here's the patch, adapted to the current trunk. Juanma Index: src/dispnew.c =================================================================== RCS file: /cvsroot/emacs/emacs/src/dispnew.c,v retrieving revision 1.398 diff -u -r1.398 dispnew.c --- src/dispnew.c 21 Nov 2007 03:46:31 -0000 1.398 +++ src/dispnew.c 22 Nov 2007 21:27:53 -0000 @@ -4525,9 +4525,7 @@ taken care of by draw_glyphs. */ if (overlapping_glyphs_p && i > 0 - && i < current_row->used[TEXT_AREA] - && (current_row->used[TEXT_AREA] - != desired_row->used[TEXT_AREA])) + && i < current_row->used[TEXT_AREA]) { int left, right; Index: src/w32fns.c =================================================================== RCS file: /cvsroot/emacs/emacs/src/w32fns.c,v retrieving revision 1.307 diff -u -r1.307 w32fns.c --- src/w32fns.c 14 Nov 2007 17:33:36 -0000 1.307 +++ src/w32fns.c 22 Nov 2007 21:23:32 -0000 @@ -4571,6 +4571,8 @@ int codepage; int i; + const char *env; + if (!fontname || !x_to_w32_font (fontname, &lf)) return (NULL); @@ -4582,7 +4584,12 @@ ended up with. */ return NULL; - lf.lfQuality = DEFAULT_QUALITY; +#ifndef CLEARTYPE_QUALITY +#define CLEARTYPE_QUALITY 5 +#endif + + env = getenv ("EMACS_CLEARTYPE"); + lf.lfQuality = env ? (atoi (env) ? CLEARTYPE_QUALITY : ANTIALIASED_QUALITY) : DEFAULT_QUALITY; font = (XFontStruct *) xmalloc (sizeof (XFontStruct)); bzero (font, sizeof (*font)); Index: src/w32term.c =================================================================== RCS file: /cvsroot/emacs/emacs/src/w32term.c,v retrieving revision 1.276 diff -u -r1.276 w32term.c --- src/w32term.c 9 Nov 2007 12:19:55 -0000 1.276 +++ src/w32term.c 22 Nov 2007 21:33:15 -0000 @@ -948,7 +948,7 @@ #endif if (cleartype_active) { - /* Cleartype antialiasing causes characters to overhang + /* Cleartype antialiasing can cause characters to overhang by a pixel on each side compared with what GetCharABCWidths reports. */ char_widths.abcA -= 1; @@ -1086,7 +1086,8 @@ if (((font->tm.tmPitchAndFamily & TMPF_FIXED_PITCH) != 0) /* Some fonts (eg DBCS fonts) are marked as fixed width even though they contain characters of different widths. */ - || (font->tm.tmMaxCharWidth != font->tm.tmAveCharWidth)) + || (font->tm.tmMaxCharWidth != font->tm.tmAveCharWidth) + || cleartype_active) { /* Font is not fixed pitch, so cache per_char info for the ASCII characters. It would be much more work, and probably @@ -1483,9 +1484,42 @@ w32_compute_glyph_string_overhangs (s) struct glyph_string *s; { - /* TODO: Windows does not appear to have a method for - getting this info without getting the ABC widths for each - individual character and working it out manually. */ + if (s->cmp == NULL + && s->first_glyph->type == CHAR_GLYPH + && s->nchars > 0) + { + XFontStruct *font = s->font; + const int font_type = s->first_glyph->font_type; + + wchar_t *ws = s->char2b; + const int nc = s->nchars; + int i, pos, mn, mx; + if (nc == 1) + { + XCharStruct *pcm = w32_per_char_metric (font, ws, font_type); + + s->right_overhang = pcm->rbearing > pcm->width ? pcm->rbearing - pcm->width : 0; + s->left_overhang = pcm->lbearing < 0 ? -pcm->lbearing : 0; + return; + } + + pos = mn = mx = 0; + for (i = 0; i < nc; ++i, ++ws) + { + XCharStruct *pcm = w32_per_char_metric (font, ws, font_type); + + const int rp = pos + pcm->rbearing; + const int lp = pos + pcm->lbearing; + + if (rp > mx) mx = rp; + if (lp < mn) mn = lp; + + pos += pcm->width; + } + + s->right_overhang = mx > pos ? mx - pos : 0; + s->left_overhang = mn < 0 ? -mn : 0; + } } @@ -1582,7 +1616,7 @@ x_draw_glyph_string_foreground (s) struct glyph_string *s; { - int i, x; + int i, x, ct_clear = 0; HFONT old_font; /* If first glyph of S has a left box line, start drawing the text @@ -1595,6 +1629,11 @@ if (s->for_overlaps || (s->background_filled_p && s->hl != DRAW_CURSOR)) SetBkMode (s->hdc, TRANSPARENT); + else if (cleartype_active) + { + ct_clear = 1; + SetBkMode (s->hdc, TRANSPARENT); + } else SetBkMode (s->hdc, OPAQUE); @@ -1632,6 +1671,21 @@ char1b[i] = XCHAR2B_BYTE2 (&s->char2b[i]); /* Draw text with TextOut and friends. */ + if (ct_clear) + { + HBRUSH hb; + RECT r; + + r.left = x; + r.top = s->y; + r.right = x + s->background_width; + r.bottom = s->y + s->height; + + hb = CreateSolidBrush (s->gc->background); + FillRect (s->hdc, &r, hb); + DeleteObject (hb); + } + w32_text_out (s, x, s->ybase - boff, s->char2b, s->nchars); if (s->face->overstrike) @@ -6292,7 +6346,7 @@ w32_destroy_fringe_bitmap, w32_per_char_metric, w32_encode_char, - NULL, /* w32_compute_glyph_string_overhangs */ + w32_compute_glyph_string_overhangs, x_draw_glyph_string, w32_define_frame_cursor, w32_clear_frame_area, @@ -6592,6 +6646,8 @@ UINT smoothing_type; BOOL smoothing_enabled; + const char *env; + /* If using proportional scroll bars, ensure handle is at least 5 pixels; otherwise use the fixed height. */ vertical_scroll_bar_min_handle = 5; @@ -6617,11 +6673,13 @@ the char metric calculations which adds extra pixels to compensate for the "sub-pixels" that are not counted by the system APIs. */ + env = getenv ("EMACS_CLEARTYPE"); cleartype_active = - SystemParametersInfo (SPI_GETFONTSMOOTHING, 0, &smoothing_enabled, 0) - && smoothing_enabled - && SystemParametersInfo (SPI_GETFONTSMOOTHINGTYPE, 0, &smoothing_type, 0) - && smoothing_type == FE_FONTSMOOTHINGCLEARTYPE; + env ? (atoi (env) != 0) : + (SystemParametersInfo (SPI_GETFONTSMOOTHING, 0, &smoothing_enabled, 0) + && smoothing_enabled + && SystemParametersInfo (SPI_GETFONTSMOOTHINGTYPE, 0, &smoothing_type, 0) + && smoothing_type == FE_FONTSMOOTHINGCLEARTYPE); } }