From: "Juanma Barranquero" <lekktu@gmail.com>
To: "Ng, Andrew" <anng@ptc.com>
Cc: bug-gnu-emacs@gnu.org, Emacs Devel <emacs-devel@gnu.org>
Subject: Re: Emacs 22.1 Windows ClearType Support
Date: Thu, 22 Nov 2007 22:43:49 +0100 [thread overview]
Message-ID: <f7ccd24b0711221343v4b3b00bbr66e5795300f6737@mail.gmail.com> (raw)
In-Reply-To: <A69AA663CE9BBC44AE1DA72483DE15DE09AACFEB@HQ-MAIL3.ptcnet.ptc.com>
On Nov 22, 2007 4:51 PM, Ng, Andrew <anng@ptc.com> 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);
}
}
next prev parent reply other threads:[~2007-11-22 21:43 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <A69AA663CE9BBC44AE1DA72483DE15DE09AACFEB@HQ-MAIL3.ptcnet.ptc.com>
2007-11-22 21:39 ` Emacs 22.1 Windows ClearType Support Jason Rumney
2007-11-22 21:43 ` Juanma Barranquero [this message]
2007-11-22 21:55 ` Drew Adams
2007-11-22 22:06 ` Jason Rumney
2007-11-22 22:24 ` Ng, Andrew
2007-11-22 22:47 ` Drew Adams
2007-11-22 21:58 ` Jason Rumney
2007-11-22 22:07 ` Juanma Barranquero
2007-11-23 4:35 ` Richard Stallman
2007-11-23 9:46 Angelo Graziosi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f7ccd24b0711221343v4b3b00bbr66e5795300f6737@mail.gmail.com \
--to=lekktu@gmail.com \
--cc=anng@ptc.com \
--cc=bug-gnu-emacs@gnu.org \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).