1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-02-05 20:43:08 +00:00

* w32font.c (w32font_encode_char): Encode characters outside BMP as

surrogates before looking up glyph index.
(w32font_text_extents): Encode as surrogates if falling back to
functions that need UTF-16 wide chars.

* w32uniscribe.c (uniscribe_encode_char): Encode characters outside
BMP as surrogates before looking up glyph index.
This commit is contained in:
Jason Rumney 2008-07-25 11:25:43 +00:00
parent 6f79c90b19
commit f31cf550ca
3 changed files with 55 additions and 21 deletions

View File

@ -1,3 +1,13 @@
2008-07-25 Jason Rumney <jasonr@gnu.org>
* w32font.c (w32font_encode_char): Encode characters outside BMP as
surrogates before looking up glyph index.
(w32font_text_extents): Encode as surrogates if falling back to
functions that need UTF-16 wide chars.
* w32uniscribe.c (uniscribe_encode_char): Encode characters outside
BMP as surrogates before looking up glyph index.
2008-07-25 Chong Yidong <cyd@stupidchicken.com>
* image.c (svg_load_image): Check for failure in return value of

View File

@ -327,8 +327,13 @@ w32font_encode_char (font, c)
if (c > 0xFFFF)
{
/* TODO: Encode as surrogate pair and lookup the glyph. */
return FONT_INVALID_CODE;
DWORD surrogate = c - 0x10000;
/* High surrogate: U+D800 - U+DBFF. */
in[0] = 0xD800 + ((surrogate >> 10) & 0x03FF);
/* Low surrogate: U+DC00 - U+DFFF. */
in[1] = 0xDC00 + (surrogate & 0x03FF);
len = 2;
}
else
{
@ -394,7 +399,7 @@ w32font_text_extents (font, code, nglyphs, metrics)
HDC dc = NULL;
struct frame * f;
int total_width = 0;
WORD *wcode = NULL;
WORD *wcode;
SIZE size;
struct w32font_info *w32_font = (struct w32font_info *) font;
@ -484,19 +489,27 @@ w32font_text_extents (font, code, nglyphs, metrics)
/* For non-truetype fonts, GetGlyphOutlineW is not supported, so
fallback on other methods that will at least give some of the metric
information. */
if (!wcode) {
wcode = alloca (nglyphs * sizeof (WORD));
for (i = 0; i < nglyphs; i++)
{
if (code[i] < 0x10000)
wcode[i] = code[i];
else
{
/* TODO: Convert to surrogate, reallocating array if needed */
wcode[i] = 0xffff;
}
}
}
/* Make array big enough to hold surrogates. */
wcode = alloca (nglyphs * sizeof (WORD) * 2);
for (i = 0; i < nglyphs; i++)
{
if (code[i] < 0x10000)
wcode[i] = code[i];
else
{
DWORD surrogate = code[i] - 0x10000;
/* High surrogate: U+D800 - U+DBFF. */
wcode[i++] = 0xD800 + ((surrogate >> 10) & 0x03FF);
/* Low surrogate: U+DC00 - U+DFFF. */
wcode[i] = 0xDC00 + (surrogate & 0x03FF);
/* An extra glyph. wcode is already double the size of code to
cope with this. */
nglyphs++;
}
}
if (dc == NULL)
{
/* TODO: Frames can come and go, and their fonts outlive

View File

@ -411,25 +411,36 @@ uniscribe_encode_char (font, c)
struct font *font;
int c;
{
wchar_t chars[1];
wchar_t chars[2];
int len;
WORD indices[1];
HDC context;
struct frame *f;
HFONT old_font;
DWORD retval;
/* TODO: surrogates. */
if (c > 0xFFFF)
return FONT_INVALID_CODE;
{
DWORD surrogate = c - 0x10000;
chars[0] = (wchar_t) c;
/* High surrogate: U+D800 - U+DBFF. */
chars[0] = 0xD800 + ((surrogate >> 10) & 0x03FF);
/* Low surrogate: U+DC00 - U+DFFF. */
chars[1] = 0xDC00 + (surrogate & 0x03FF);
len = 2;
}
else
{
chars[0] = (wchar_t) c;
len = 1;
}
/* Use selected frame until API is updated to pass the frame. */
f = XFRAME (selected_frame);
context = get_frame_dc (f);
old_font = SelectObject (context, FONT_HANDLE(font));
retval = GetGlyphIndicesW (context, chars, 1, indices,
retval = GetGlyphIndicesW (context, chars, len, indices,
GGI_MARK_NONEXISTING_GLYPHS);
SelectObject (context, old_font);