From 4c100a015c3ec0d8e15c82bb66730c93f7205eb4 Mon Sep 17 00:00:00 2001 From: Jason Rumney Date: Fri, 20 Jun 2008 15:28:26 +0000 Subject: [PATCH] (font_matches_spec): Use csb bitfield from font signature to determine language support. --- src/ChangeLog | 5 +++++ src/w32font.c | 23 +++++++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 2133a063cef..7517f0e403b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2008-06-20 Jason Rumney + + * w32font.c (font_matches_spec): Use csb bitfield from font signature + to determine language support. + 2008-06-20 Stefan Monnier * sysdep.c (cfsetspeed): New fun extracted from the code. diff --git a/src/w32font.c b/src/w32font.c index 0dc18674aa0..f7b40595054 100644 --- a/src/w32font.c +++ b/src/w32font.c @@ -1103,6 +1103,11 @@ logfonts_match (font, pattern) return 1; } +/* Codepage Bitfields in FONTSIGNATURE struct. */ +#define CSB_JAPANESE (1 << 17) +#define CSB_KOREAN ((1 << 19) | (1 << 21)) +#define CSB_CHINESE ((1 << 18) | (1 << 20)) + static int font_matches_spec (type, font, spec, backend, logfont) DWORD type; @@ -1247,30 +1252,32 @@ font_matches_spec (type, font, spec, backend, logfont) } else if (EQ (key, QClang) && SYMBOLP (val)) { - /* Just handle the CJK languages here, as the language + /* Just handle the CJK languages here, as the lang parameter is used to select a font with appropriate glyphs in the cjk unified ideographs block. Other fonts support for a language can be solely determined by its character coverage. */ if (EQ (val, Qja)) { - if (font->ntmTm.tmCharSet != SHIFTJIS_CHARSET) + if (!(font->ntmFontSig.fsCsb[0] & CSB_JAPANESE)) return 0; } else if (EQ (val, Qko)) { - if (font->ntmTm.tmCharSet != HANGUL_CHARSET - && font->ntmTm.tmCharSet != JOHAB_CHARSET) + if (!(font->ntmFontSig.fsCsb[0] & CSB_KOREAN)) return 0; } else if (EQ (val, Qzh)) { - if (font->ntmTm.tmCharSet != GB2312_CHARSET - && font->ntmTm.tmCharSet != CHINESEBIG5_CHARSET) - return 0; + if (!(font->ntmFontSig.fsCsb[0] & CSB_CHINESE)) + return 0; } else - /* Any other language, we don't recognize it. Fontset + /* Any other language, we don't recognize it. Only the above + currently appear in fontset.el, so it isn't worth + creating a mapping table of codepages/scripts to languages + or opening the font to see if there are any language tags + in it that the W32 API does not expose. Fontset spec should have a fallback, as some backends do not recognize language at all. */ return 0; -- 2.39.2