diff src/w32term.c @ 96343:5c8f2b7d28ae

* w32font.h (FONT_HANDLE, FONT_TEXTMETRIC): New macros. * w32term.c (x_draw_glyph_string_foreground): (x_draw_composite_glyph_string_foreground): Sync with xterm.c. Use FONT_HANDLE macro. (x_draw_glyph_string): Use FONT_TEXTMETRIC macro. * w32uniscribe.c (uniscribe_otf_capability, uniscribe_shape): (uniscribe_encode_char): Use FONT_HANDLE macro. * w32font.c (Fx_select_font): Use FONT_HANDLE macro. (w32font_text_extents): Use precast w32_font. (w32font_close): Free cached metrics. (w32font_open_internal): Allocate space for name on stack.
author Jason Rumney <jasonr@gnu.org>
date Thu, 26 Jun 2008 22:11:25 +0000
parents 2fc5aff56d81
children c3309dba6542
line wrap: on
line diff
--- a/src/w32term.c	Thu Jun 26 21:37:42 2008 +0000
+++ b/src/w32term.c	Thu Jun 26 22:11:25 2008 +0000
@@ -1237,8 +1237,6 @@
      struct glyph_string *s;
 {
   int i, x;
-  struct w32font_info * w32_font;
-  HFONT old_font;
 
   /* If first glyph of S has a left box line, start drawing the text
      of S to the right of that box line.  */
@@ -1248,21 +1246,10 @@
   else
     x = s->x;
 
-  if (s->for_overlaps || (s->background_filled_p && s->hl != DRAW_CURSOR)
-      || cleartype_active)
-    SetBkMode (s->hdc, TRANSPARENT);
-  else
-    SetBkMode (s->hdc, OPAQUE);
-
   SetTextColor (s->hdc, s->gc->foreground);
   SetBkColor (s->hdc, s->gc->background);
   SetTextAlign (s->hdc, TA_BASELINE | TA_LEFT);
 
-  w32_font = (struct w32font_info *) s->font;
-
-  if (w32_font && w32_font->hfont)
-    old_font = SelectObject (s->hdc, w32_font->hfont);
-
   /* Draw characters of S as rectangles if S's font could not be
      loaded. */
   if (s->font_not_found_p)
@@ -1278,24 +1265,27 @@
     }
   else
     {
-      int boff = s->font->baseline_offset;
+      struct font *font = s->font;
+      int boff = font->baseline_offset;
       int y;
-
-      if (s->font->vertical_centering)
-	boff = VCENTER_BASELINE_OFFSET (s->font, s->f) - boff;
+      HFONT old_font;
+
+      old_font = SelectObject (s->hdc, FONT_HANDLE (font));
+
+      if (font->vertical_centering)
+	boff = VCENTER_BASELINE_OFFSET (font, s->f) - boff;
 
       y = s->ybase - boff;
       if (s->for_overlaps
 	  || (s->background_filled_p && s->hl != DRAW_CURSOR))
-	s->font->driver->draw (s, 0, s->nchars, x, y, 0);
+	font->driver->draw (s, 0, s->nchars, x, y, 0);
       else
-	s->font->driver->draw (s, 0, s->nchars, x, y, 1);
+	font->driver->draw (s, 0, s->nchars, x, y, 1);
       if (s->face->overstrike)
-	s->font->driver->draw (s, 0, s->nchars, x + 1, y, 0);
+	font->driver->draw (s, 0, s->nchars, x + 1, y, 0);
+
+      SelectObject (s->hdc, old_font);
     }
-
-  if (w32_font && w32_font->hfont)
-    SelectObject (s->hdc, old_font);
 }
 
 /* Draw the foreground of composite glyph string S.  */
@@ -1305,8 +1295,6 @@
      struct glyph_string *s;
 {
   int i, j, x;
-  HFONT old_font;
-  struct w32font_info * w32_font;
 
   /* If first glyph of S has a left box line, start drawing the text
      of S to the right of that box line.  */
@@ -1323,14 +1311,8 @@
 
   SetTextColor (s->hdc, s->gc->foreground);
   SetBkColor (s->hdc, s->gc->background);
-  SetBkMode (s->hdc, TRANSPARENT);
   SetTextAlign (s->hdc, TA_BASELINE | TA_LEFT);
 
-  w32_font = (struct w32font_info *) s->font;
-
-  if (w32_font && w32_font->hfont)
-    old_font = SelectObject (s->hdc, w32_font->hfont);
-
   /* Draw a rectangle for the composition if the font for the very
      first character of the composition could not be loaded.  */
   if (s->font_not_found_p)
@@ -1339,11 +1321,14 @@
         w32_draw_rectangle (s->hdc, s->gc, x, s->y, s->width - 1,
                             s->height - 1);
     }
-
+  else
     {
       struct font *font = s->font;
       int y = s->ybase;
       int width = 0;
+      HFONT old_font;
+
+      old_font = SelectObject (s->hdc, FONT_HANDLE (font));
 
       if (s->cmp->method == COMPOSITION_WITH_GLYPH_STRING)
 	{
@@ -1393,10 +1378,8 @@
 		  font->driver->draw (s, j, j + 1, xx + 1, yy, 0);
 	      }
 	}
+      SelectObject (s->hdc, old_font);
     }
-
-  if (w32_font && w32_font->hfont)
-    SelectObject (s->hdc, old_font);
 }
 
 
@@ -2345,7 +2328,7 @@
 
       /* Draw strike-through.  */
       if (s->face->strike_through_p
-          && !((struct w32font_info *) s->font)->metrics.tmStruckOut)
+          && !FONT_TEXTMETRIC(s->font).tmStruckOut)
         {
           unsigned long h = 1;
           unsigned long dy = (s->height - h) / 2;