bool SimpleFontData::containsCharacters(const UChar* characters, int length) const { if (m_platformData.isDisabled()) return true; // FIXME: Microsoft documentation seems to imply that characters can be output using a given font and DC // merely by testing code page intersection. This seems suspect though. Can't a font only partially // cover a given code page? // FIXME: in the case that we failed to get the interface, still use the font. IMLangFontLinkType* langFontLink = fontCache()->getFontLinkInterface(); if (!langFontLink) return true; DWORD fontCodePages = m_platformData.codePages(); if (!fontCodePages) return false; DWORD acpCodePages = 0; langFontLink->CodePageToCodePages(CP_ACP, &acpCodePages); DWORD actualCodePages; long numCharactersProcessed; while (length) { langFontLink->GetStrCodePages(characters, length, acpCodePages, &actualCodePages, &numCharactersProcessed); if (actualCodePages && !(actualCodePages & fontCodePages)) return false; length -= numCharactersProcessed; characters += numCharactersProcessed; } return true; }
static const Vector<DWORD, 4>& getCJKCodePageMasks() { // The default order in which we look for a font for a CJK character. If the user's default code page is // one of these, we will use it first. static const UINT CJKCodePages[] = { 932, /* Japanese */ 936, /* Simplified Chinese */ 950, /* Traditional Chinese */ 949 /* Korean */ }; static Vector<DWORD, 4> codePageMasks; static bool initialized; if (!initialized) { initialized = true; IMLangFontLinkType* langFontLink = fontCache().getFontLinkInterface(); if (!langFontLink) return codePageMasks; UINT defaultCodePage; DWORD defaultCodePageMask = 0; if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_RETURN_NUMBER | LOCALE_IDEFAULTANSICODEPAGE, reinterpret_cast<LPWSTR>(&defaultCodePage), sizeof(defaultCodePage))) langFontLink->CodePageToCodePages(defaultCodePage, &defaultCodePageMask); if (defaultCodePage == CJKCodePages[0] || defaultCodePage == CJKCodePages[1] || defaultCodePage == CJKCodePages[2] || defaultCodePage == CJKCodePages[3]) codePageMasks.append(defaultCodePageMask); for (unsigned i = 0; i < 4; ++i) { if (defaultCodePage != CJKCodePages[i]) { DWORD codePageMask; langFontLink->CodePageToCodePages(CJKCodePages[i], &codePageMask); codePageMasks.append(codePageMask); } } } return codePageMasks; }