]> git.eshelyaron.com Git - emacs.git/commitdiff
Unbreak display of characters on MS-Windows
authorEli Zaretskii <eliz@gnu.org>
Thu, 23 May 2019 05:26:32 +0000 (08:26 +0300)
committerEli Zaretskii <eliz@gnu.org>
Thu, 23 May 2019 05:26:32 +0000 (08:26 +0300)
* src/w32font.c (w32font_draw): Convert the glyph_string's
char2b array to 16-bit WCHAR data that ExtTextOutW needs.

src/w32font.c

index bd68e22cc902ea6fd0c447828e56b6943b099bc8..47a33aec35f7907c567eae46868e54743e80aaaf 100644 (file)
@@ -704,11 +704,23 @@ w32font_draw (struct glyph_string *s, int from, int to,
       int i;
 
       for (i = 0; i < len; i++)
-       ExtTextOutW (s->hdc, x + i, y, options, NULL,
-                    s->char2b + from + i, 1, NULL);
+       {
+         WCHAR c = s->char2b[from + i] & 0xFFFF;
+         ExtTextOutW (s->hdc, x + i, y, options, NULL, &c, 1, NULL);
+       }
     }
   else
-    ExtTextOutW (s->hdc, x, y, options, NULL, s->char2b + from, len, NULL);
+    {
+      /* The number of glyphs in a glyph_string cannot be larger than
+        the maximum value of the 'used' member of a glyph_row, so we
+        are OK using alloca here.  */
+      eassert (len <= SHRT_MAX);
+      WCHAR *chars = alloca (len * sizeof (WCHAR));
+      int j;
+      for (j = 0; j < len; j++)
+       chars[j] = s->char2b[from + j] & 0xFFFF;
+      ExtTextOutW (s->hdc, x, y, options, NULL, chars, len, NULL);
+    }
 
   /* Restore clip region.  */
   if (s->num_clips > 0)