all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* Emacs 22.1 Windows ClearType Support
@ 2007-11-22 15:51 Ng, Andrew
  2007-11-22 21:39 ` Jason Rumney
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Ng, Andrew @ 2007-11-22 15:51 UTC (permalink / raw)
  To: bug-gnu-emacs

[-- Attachment #1: Type: text/plain, Size: 585 bytes --]

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

[-- Attachment #2: patchfile --]
[-- Type: application/octet-stream, Size: 6194 bytes --]

diff -u emacs-22.1-orig/src/dispnew.c emacs-22.1/src/dispnew.c
--- emacs-22.1-orig/src/dispnew.c	2007-04-16 17:21:18.000000000 +0100
+++ emacs-22.1/src/dispnew.c	2007-11-22 14:26:44.187500000 +0000
@@ -4523,8 +4523,8 @@
 	      if (overlapping_glyphs_p
 		  && i > 0
 		  && i < current_row->used[TEXT_AREA]
-		  && (current_row->used[TEXT_AREA]
-		      != desired_row->used[TEXT_AREA]))
+		  /*&& (current_row->used[TEXT_AREA]
+		      != desired_row->used[TEXT_AREA])*/)
 		{
 		  int left, right;
 
diff -u emacs-22.1-orig/src/w32fns.c emacs-22.1/src/w32fns.c
--- emacs-22.1-orig/src/w32fns.c	2007-03-24 15:49:48.000000000 +0000
+++ emacs-22.1/src/w32fns.c	2007-11-20 10:03:13.171875000 +0000
@@ -4546,6 +4546,8 @@
     int codepage;
     int i;
 
+    const char *env;
+
     if (!fontname || !x_to_w32_font (fontname, &lf))
       return (NULL);
 
@@ -4557,7 +4559,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) != 0) ? CLEARTYPE_QUALITY : ANTIALIASED_QUALITY) : DEFAULT_QUALITY;
 
     font = (XFontStruct *) xmalloc (sizeof (XFontStruct));
     bzero (font, sizeof (*font));
diff -u emacs-22.1-orig/src/w32term.c emacs-22.1/src/w32term.c
--- emacs-22.1-orig/src/w32term.c	2007-02-19 14:45:39.000000000 +0000
+++ emacs-22.1/src/w32term.c	2007-11-21 12:52:00.953125000 +0000
@@ -903,7 +903,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;
@@ -1041,7 +1041,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
@@ -1437,9 +1438,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;
+    }
 }
 
 
@@ -1536,7 +1570,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
@@ -1550,7 +1584,15 @@
   if (s->for_overlaps || (s->background_filled_p && s->hl != DRAW_CURSOR))
     SetBkMode (s->hdc, TRANSPARENT);
   else
-    SetBkMode (s->hdc, OPAQUE);
+  {
+    if (cleartype_active)
+      {
+        ct_clear = 1;
+        SetBkMode (s->hdc, TRANSPARENT);
+      }
+    else
+      SetBkMode (s->hdc, OPAQUE);
+  }
 
   SetTextColor (s->hdc, s->gc->foreground);
   SetBkColor (s->hdc, s->gc->background);
@@ -1586,6 +1628,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)
@@ -6336,7 +6393,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,
@@ -6434,6 +6491,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;
@@ -6459,11 +6518,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);
   }
 }
 

^ permalink raw reply	[flat|nested] 11+ messages in thread
* Re: Emacs 22.1 Windows ClearType Support
@ 2007-11-23  9:46 Angelo Graziosi
  0 siblings, 0 replies; 11+ messages in thread
From: Angelo Graziosi @ 2007-11-23  9:46 UTC (permalink / raw)
  To: emacs-devel



I have the habit to do a Cygwin build of Emacs-CVS but recently I have
tried this:
ftp://alpha.gnu.org/gnu/auctex/emacs+auctex-w32-2007-07-07.zip, that is a
native Windows build.

Comparing the look of characters, the Windows build looks better than the
Cygwin one: the characters appear antialiased (I have an LCD with
ClearType enabled in Windows XP) while in the Cygwin build they do not
look so well defined.

I ask if one can apply some tricks to have better results also in
the Cygwin build (avoiding GTK that under Cygwin does not work, see
PROBLEMS).


TIA,

   Angelo.


---
http://www.webalice.it/angelo.graziosi

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2007-11-23  9:46 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-22 15:51 Emacs 22.1 Windows ClearType Support Ng, Andrew
2007-11-22 21:39 ` Jason Rumney
2007-11-22 21:43 ` Juanma Barranquero
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
  -- strict thread matches above, loose matches on Subject: below --
2007-11-23  9:46 Angelo Graziosi

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.