changeset 27406:fb36ccd8457c

(w32_fill_rect): Do not try to deal with NULL hdc here. Callers changed to always pass real device context. (w32_draw_bitmap): Likewise. (w32_get_glyph_overhangs): Likewise. (w32_draw_box_rect): Make use of s->hdc rather than getting a new one. (w32_set_vertical_scroll_bar): Pass correct HWND parameters to pfnSetScrollInfo and SetScrollRange. (x_get_char_face_and_encoding): Don't turn iso8859-1 characters back into MULE characters after decoding them. (x_get_glyph_face_and_encoding): Likewise. (w32_per_char_metric): Use GetCharExtentPoint32W as fallback when GetCharABCWidthsW fails, since this is defined on Windows 9x. (x_produce_glyphs): Calculate per char metrics for a character that we know exists in default font when font_not_found_p is true.
author Jason Rumney <jasonr@gnu.org>
date Sun, 23 Jan 2000 22:15:12 +0000
parents 5b88f1699107
children 7df920562cbe
files src/w32term.c
diffstat 1 files changed, 83 insertions(+), 63 deletions(-) [+]
line wrap: on
line diff
--- a/src/w32term.c	Sun Jan 23 03:28:57 2000 +0000
+++ b/src/w32term.c	Sun Jan 23 22:15:12 2000 +0000
@@ -496,30 +496,18 @@
 
 /* Draw a filled rectangle at the specified position. */
 void 
-w32_fill_rect (f, _hdc, pix, lprect)
+w32_fill_rect (f, hdc, pix, lprect)
      FRAME_PTR f;
-     HDC _hdc;
+     HDC hdc;
      COLORREF pix;
      RECT * lprect;
 {
-  HDC hdc;
   HBRUSH hb;
   RECT rect;
 
-  if (_hdc)
-    hdc = _hdc;
-  else 
-    {
-      if (!f) return;
-      hdc = get_frame_dc (f);
-    }
-  
   hb = CreateSolidBrush (pix);
   FillRect (hdc, lprect, hb);
   DeleteObject (hb);
-  
-  if (!_hdc)
-    release_frame_dc (f, hdc);
 }
 
 void 
@@ -527,9 +515,11 @@
      FRAME_PTR f;
 {
   RECT rect;
+  HDC hdc = get_frame_dc (f);
 
   GetClientRect (FRAME_W32_WINDOW (f), &rect);
-  w32_clear_rect (f, NULL, &rect);
+  w32_clear_rect (f, hdc, &rect);
+  release_frame_dc (f, hdc);
 }
 
 
@@ -627,13 +617,16 @@
       && !FRAME_HAS_VERTICAL_SCROLL_BARS (f))
     {
       RECT r;
+      HDC hdc;
 
       window_box_edges (w, -1, &r.left, &r.top, &r.right, &r.bottom);
       r.left = r.right + FRAME_X_RIGHT_FLAGS_AREA_WIDTH (f);
       r.right = r.left + 1;
       r.bottom -= 1;
 
-      w32_fill_rect (f, NULL, FRAME_FOREGROUND_PIXEL (f), r);
+      hdc = get_frame_dc (f);
+      w32_fill_rect (f, hdc, FRAME_FOREGROUND_PIXEL (f), r);
+      release_frame_dc (f, hdc);
     }
 }
 
@@ -727,8 +720,10 @@
 	  int x = (window_box_right (w, -1)
                    + FRAME_X_RIGHT_FLAGS_AREA_WIDTH (f));
 	  int y = WINDOW_TO_FRAME_PIXEL_Y (w, max (0, desired_row->y));
-
-          w32_clear_area (f, NULL, x, y, width, height);
+          HDC hdc = get_frame_dc (f);
+
+          w32_clear_area (f, hdc, x, y, width, height);
+          release_frame_dc (f, hdc);
 	}
       
       UNBLOCK_INPUT;
@@ -742,15 +737,14 @@
    drawn.  */
 
 static void
-w32_draw_bitmap (w, _hdc, row, which)
+w32_draw_bitmap (w, hdc, row, which)
      struct window *w;
-     HDC _hdc;
+     HDC hdc;
      struct glyph_row *row;
      enum bitmap_type which;
 {
   struct frame *f = XFRAME (WINDOW_FRAME (w));
   Window window = FRAME_W32_WINDOW (f);
-  HDC hdc = _hdc ? _hdc : get_frame_dc (f);
   HDC compat_hdc;
   int x, y, wd, h, dy;
   unsigned short *bits;
@@ -848,9 +842,6 @@
   DeleteObject (fg_brush);
   DeleteDC (compat_hdc);
   RestoreDC (hdc, -1);
-
-  if (!_hdc)
-    release_frame_dc (f, hdc);
 }
 
 
@@ -1102,7 +1093,7 @@
   /* The result metric information.  */
   XCharStruct *pcm;
   ABC char_widths;
-  int char_total_width;
+  SIZE sz;
   BOOL retval;
 
   xassert (font && char2b);
@@ -1125,15 +1116,17 @@
     }
   else
     {
+      /* Windows 9x does not implement GetCharABCWidthsW, so if that
+         failed, try GetTextExtentPoint32W, which is implemented and
+         at least gives us some of the info we are after (total
+         character width). */
       if (unicode_p)
-        retval = GetCharWidth32W (hdc, *char2b, *char2b, &char_total_width);
-      else
-        retval = GetCharWidth32A (hdc, *char2b, *char2b, &char_total_width);
+          retval = GetTextExtentPoint32W (hdc, char2b, 1, &sz);
 
       if (retval)
         {
-          pcm->width = char_total_width;
-          pcm->rbearing = char_total_width;
+          pcm->width = sz.cx;
+          pcm->rbearing = sz.cx;
           pcm->lbearing = 0;
         }
       else
@@ -1302,9 +1295,11 @@
 	  if (font_info)
 	    {
 	      x_encode_char (c, char2b, font_info);
+#if 0 /* NTEMACS_TODO: Isn't this undoing what we just did?  Investigate. */
 	      if (charset == charset_latin_iso8859_1)
                 *char2b = BUILD_WCHAR_T (BYTE1 (*char2b),
                                          BYTE2 (*char2b) | 0x80);
+#endif
 	    }
 	}
     }
@@ -1364,9 +1359,11 @@
 	  if (font_info)
 	    {
 	      x_encode_char (glyph->u.ch, char2b, font_info);
+#if 0 /* NTEMACS_TODO: Isn't this undoing what we just did?  Investigate. */
 	      if (charset == charset_latin_iso8859_1)
 		*char2b = BUILD_WCHAR_T (BYTE1 (*char2b),
                                          BYTE2 (*char2b) | 0x80);
+#endif
 	    }
 	}
     }
@@ -1763,7 +1760,7 @@
       XFontStruct *font;
       struct face *face;
       XCharStruct *pcm;
-      int font_not_found_p;
+     int font_not_found_p;
       struct font_info *font_info;
       int boff;                 /* baseline offset */
       HDC hdc;
@@ -1911,19 +1908,30 @@
 	}
       else 
 	{
-	  /* A multi-byte character.  Assume that the display width of the
-	     character is the width of the character multiplied by the
-	     width of the font.  */
-
-          /* If we found a font, this font should give us the right
+	  /* A multi-byte character.
+             If we found a font, this font should give us the right
              metrics.  If we didn't find a font, use the frame's
              default font and calculate the width of the character
              from the charset width; this is what old redisplay code
              did.  */
-          pcm = w32_per_char_metric (hdc, font, &char2b, 1);
-          it->pixel_width = pcm->width;
           if (font_not_found_p)
-            it->pixel_width *= CHARSET_WIDTH (it->charset);
+            {
+              wchar_t dummy = BUILD_WCHAR_T (0, 'X');
+
+              /* Get some metrics for the default font.  */
+              pcm = w32_per_char_metric (hdc, font, &dummy, 0);
+
+              /* Ignore the width obtained above, and use the average
+                 width of a character in the default font. */
+              it->pixel_width = FONT_WIDTH (font)
+                * CHARSET_WIDTH (it->charset);
+            }
+          else
+            {
+              pcm = w32_per_char_metric (hdc, font, &char2b, 1);
+              it->pixel_width = pcm->width;
+            }
+
           it->nglyphs = 1;
           it->ascent = FONT_BASE (font) + boff;
           it->descent = FONT_DESCENT (font) - boff;
@@ -1933,7 +1941,7 @@
               && (pcm->lbearing < 0
                   || pcm->rbearing > pcm->width))
             it->glyph_row->contains_overlapping_glyphs_p = 1;
-	
+
 	  if (face->box != FACE_NO_BOX)
 	    {
 	      int thick = face->box_line_width;
@@ -2869,14 +2877,13 @@
    assumed to be zero.  */
 
 static void
-w32_get_glyph_overhangs (_hdc, glyph, f, left, right, unicode_p)
-     HDC _hdc;
+w32_get_glyph_overhangs (hdc, glyph, f, left, right, unicode_p)
+     HDC hdc;
      struct glyph *glyph;
      struct frame *f;
      int *left, *right, unicode_p;
 {
   int c;
-  HDC hdc = _hdc ? _hdc : get_frame_dc (f);
 
   *left = *right = 0;
   
@@ -2901,8 +2908,6 @@
 	    *left = -pcm->lbearing;
 	}
     }
-  if (!_hdc)
-    release_frame_dc (f, hdc);
 }
 
 
@@ -3397,34 +3402,31 @@
      int left_x, top_y, right_x, bottom_y, width, left_p, right_p;
      RECT *clip_rect;
 {
-  HDC hdc = get_frame_dc (s->f);
-
-  w32_set_clip_rectangle (hdc, clip_rect);
+  w32_set_clip_rectangle (s->hdc, clip_rect);
   
   /* Top.  */
-  w32_fill_area (s->f, hdc, s->face->box_color,
+  w32_fill_area (s->f, s->hdc, s->face->box_color,
 		  left_x, top_y, right_x - left_x, width);
 
   /* Left.  */
   if (left_p)
     {
-      w32_fill_area (s->f, hdc, s->face->box_color,
+      w32_fill_area (s->f, s->hdc, s->face->box_color,
                      left_x, top_y, width, bottom_y - top_y);
     }
   
   /* Bottom.  */
-  w32_fill_area (s->f, hdc, s->face->box_color,
+  w32_fill_area (s->f, s->hdc, s->face->box_color,
                  left_x, bottom_y - width, right_x - left_x, width);
   
   /* Right.  */
   if (right_p)
     {
-      w32_fill_area (s->f, hdc, s->face->box_color,
+      w32_fill_area (s->f, s->hdc, s->face->box_color,
                      right_x - width, top_y, width, bottom_y - top_y);
     }
 
-  w32_set_clip_rectangle (hdc, NULL);
-  release_frame_dc (s->f, hdc);
+  w32_set_clip_rectangle (s->hdc, NULL);
 }
 
 
@@ -4889,8 +4891,12 @@
   /* Prevent inadvertently clearing to end of the X window.  */
   if (to_x > from_x && to_y > from_y)
     {
+      HDC hdc;
       BLOCK_INPUT;
-      w32_clear_area (f, NULL, from_x, from_y, to_x - from_x, to_y - from_y);
+      hdc = get_frame_dc (f);
+
+      w32_clear_area (f, hdc, from_x, from_y, to_x - from_x, to_y - from_y);
+      release_frame_dc (f, hdc);
       UNBLOCK_INPUT;
     }
 }
@@ -7167,9 +7173,13 @@
   /* Does the scroll bar exist yet?  */
   if (NILP (w->vertical_scroll_bar))
     {
+      HDC hdc;
       BLOCK_INPUT;
-      w32_clear_area (f, NULL, left, top, width, height);
+      hdc = get_frame_dc (f);
+      w32_clear_area (f, hdc, left, top, width, height);
+      release_frame_dc (f, hdc);
       UNBLOCK_INPUT;
+
       bar = x_scroll_bar_create (w, top, sb_left, sb_width, height);
     }
   else
@@ -7192,15 +7202,18 @@
         }
       else
         {
+          HDC hdc;
           BLOCK_INPUT;
 
+          hdc = get_frame_dc (f);
           /* Since Windows scroll bars are smaller than the space reserved
              for them on the frame, we have to clear "under" them.  */
-          w32_clear_area (f, NULL,
+          w32_clear_area (f, hdc,
                           left,
                           top,
                           width,
                           height);
+          release_frame_dc (f, hdc);
 
           /* Make sure scroll bar is "visible" before moving, to ensure the
              area of the parent window now exposed will be refreshed.  */
@@ -7217,10 +7230,10 @@
               si.nMax = VERTICAL_SCROLL_BAR_TOP_RANGE (f, height)
                 + VERTICAL_SCROLL_BAR_MIN_HANDLE;
 
-              pfnSetScrollInfo (w, SB_CTL, &si, FALSE);
+              pfnSetScrollInfo (hwnd, SB_CTL, &si, FALSE);
             }
           else
-            SetScrollRange (w, SB_CTL, 0,
+            SetScrollRange (hwnd, SB_CTL, 0,
                             VERTICAL_SCROLL_BAR_TOP_RANGE (f, height), FALSE);
           my_show_window (f, hwnd, SW_NORMAL);
           //  InvalidateRect (w, NULL, FALSE);
@@ -7681,8 +7694,11 @@
 		  }
 		else
 		  {
+                    HDC hdc = get_frame_dc (f);
+
 		    /* Erase background again for safety.  */
-		    w32_clear_rect (f, NULL, &msg.rect);
+		    w32_clear_rect (f, hdc, &msg.rect);
+                    release_frame_dc (f, hdc);
 		    expose_frame (f,
                                   msg.rect.left,
                                   msg.rect.top,
@@ -8397,7 +8413,7 @@
       struct frame *f = XFRAME (w->frame);
       struct glyph *cursor_glyph;
       int x;
-      HDC hdc = get_frame_dc (f);
+      HDC hdc;
 
       cursor_glyph = get_phys_cursor_glyph (w);
       if (cursor_glyph == NULL)
@@ -8405,6 +8421,7 @@
 
       x = WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x);
 
+      hdc = get_frame_dc (f);
       w32_fill_area (f, hdc, f->output_data.w32->cursor_pixel,
                      x,
                      WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y),
@@ -8524,18 +8541,21 @@
     {
       int x;
       int header_line_height = WINDOW_DISPLAY_HEADER_LINE_HEIGHT (w);
+      HDC hdc;
 
       cursor_glyph = get_phys_cursor_glyph (w);
       if (cursor_glyph == NULL)
 	goto mark_cursor_off;
 
       x = WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x);
-      
-      w32_clear_area (f, NULL, x,
+
+      hdc = get_frame_dc (f);
+      w32_clear_area (f, hdc, x,
                       WINDOW_TO_FRAME_PIXEL_Y (w, max (header_line_height,
                                                        cursor_row->y)),
                       cursor_glyph->pixel_width,
                       cursor_row->visible_height);
+      release_frame_dc (f, hdc);
     }
   
   /* Erase the cursor by redrawing the character underneath it.  */