From f42adef67d57ce6765e4c2bf8bcde280c4af3500 Mon Sep 17 00:00:00 2001 From: Jason Rumney Date: Wed, 11 Jun 2008 22:40:06 +0000 Subject: [PATCH] (w32font_encode_char): Detect missing glyphs that are misreported as space. (add_font_entity_to_list): Support unicode-bmp and unicode-sip as aliases for registry iso10646-1. --- src/ChangeLog | 7 +++++++ src/w32font.c | 15 +++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 3caabe5792c..a25296ba529 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2008-06-11 Jason Rumney + + * w32font.c (w32font_encode_char): Detect missing glyphs that are + misreported as space. + (add_font_entity_to_list): Support unicode-bmp and unicode-sip + as aliases for registry iso10646-1. + 2008-06-11 Stefan Monnier * buffer.c (clone_per_buffer_values): Skip `name'. diff --git a/src/w32font.c b/src/w32font.c index 94f330fe76e..8945ced8c95 100644 --- a/src/w32font.c +++ b/src/w32font.c @@ -310,6 +310,9 @@ w32font_encode_char (font, c) dc = get_frame_dc (f); old_font = SelectObject (dc, w32_font->compat_w32_font->hfont); + /* GetCharacterPlacement is used here rather than GetGlyphIndices because + it is supported on Windows NT 4 and 9x/ME. But it cannot reliably report + missing glyphs, see below for workaround. */ retval = GetCharacterPlacementW (dc, in, len, 0, &result, 0); SelectObject (dc, old_font); @@ -317,7 +320,11 @@ w32font_encode_char (font, c) if (retval) { - if (result.nGlyphs != 1 || !result.lpGlyphs[0]) + if (result.nGlyphs != 1 || !result.lpGlyphs[0] + /* GetCharacterPlacementW seems to return 3, which seems to be + the space glyph in most/all truetype fonts, instead of 0 + for unsupported glyphs. */ + || (result.lpGlyphs[0] == 3 && !iswspace (in[0]))) return FONT_INVALID_CODE; return result.lpGlyphs[0]; } @@ -1360,7 +1367,9 @@ add_font_entity_to_list (logical_font, physical_font, font_type, lParam) /* If registry was specified as iso10646-1, only report ANSI and DEFAULT charsets, as most unicode fonts will contain one of those plus others. */ - if (EQ (spec_charset, Qiso10646_1) + if ((EQ (spec_charset, Qiso10646_1) + || EQ (spec_charset, Qunicode_bmp) + || EQ (spec_charset, Qunicode_sip)) && logical_font->elfLogFont.lfCharSet != DEFAULT_CHARSET && logical_font->elfLogFont.lfCharSet != ANSI_CHARSET) return 1; @@ -1370,6 +1379,8 @@ add_font_entity_to_list (logical_font, physical_font, font_type, lParam) least it eliminates known definite mismatches. */ else if (!NILP (spec_charset) && !EQ (spec_charset, Qiso10646_1) + && !EQ (spec_charset, Qunicode_bmp) + && !EQ (spec_charset, Qunicode_sip) && match_data->pattern.lfCharSet == DEFAULT_CHARSET && logical_font->elfLogFont.lfCharSet != DEFAULT_CHARSET) return 1; -- 2.39.2