static PassRefPtr<FixedSizeFontData> createFixedSizeFontData(const AtomicString& family, unsigned weight, bool italic) { FixedSizeFontDataKey key(family, weight, italic); FixedSizeFontCache::AddResult result = g_fixedSizeFontCache.add(key, RefPtr<FixedSizeFontData>()); if (result.isNewEntry) result.iterator->value = FixedSizeFontData::create(family, weight, italic); return result.iterator->value; }
PassRefPtr<FixedSizeFontData> FixedSizeFontData::create(const AtomicString& family, unsigned weight, bool italic) { FixedSizeFontData* fontData = new FixedSizeFontData(); fontData->m_weight = weight; fontData->m_italic = italic; LOGFONT& winFont = fontData->m_font; // The size here looks unusual. The negative number is intentional. winFont.lfHeight = -72; winFont.lfWidth = 0; winFont.lfEscapement = 0; winFont.lfOrientation = 0; winFont.lfUnderline = false; winFont.lfStrikeOut = false; winFont.lfCharSet = DEFAULT_CHARSET; winFont.lfOutPrecision = OUT_DEFAULT_PRECIS; winFont.lfQuality = CLEARTYPE_QUALITY; //DEFAULT_QUALITY; winFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; winFont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; winFont.lfItalic = italic; winFont.lfWeight = FontPlatformData::adjustedGDIFontWeight(weight, family); int len = std::min(family.length(), (unsigned int)LF_FACESIZE - 1); wmemcpy(winFont.lfFaceName, family.characters(), len); winFont.lfFaceName[len] = L'\0'; fontData->m_hfont.set(CreateFontIndirect(&winFont)); HGDIOBJ oldFont = SelectObject(g_screenDC, fontData->m_hfont.get()); GetTextMetrics(g_screenDC, &fontData->m_metrics); #if defined(IMLANG_FONT_LINK) && (IMLANG_FONT_LINK == 2) if (IMLangFontLink2* langFontLink = fontCache()->getFontLinkInterface()) { #else if (IMLangFontLink* langFontLink = fontCache()->getFontLinkInterface()) { #endif langFontLink->GetFontCodePages(g_screenDC, fontData->m_hfont.get(), &fontData->m_codePages); fontData->m_codePages |= FontPlatformData::getKnownFontCodePages(winFont.lfFaceName); } SelectObject(g_screenDC, oldFont); return adoptRef(fontData); } static PassRefPtr<FixedSizeFontData> createFixedSizeFontData(const AtomicString& family, unsigned weight, bool italic) { FixedSizeFontDataKey key(family, weight, italic); pair<FixedSizeFontCache::iterator, bool> result = g_fixedSizeFontCache.add(key, RefPtr<FixedSizeFontData>()); if (result.second) result.first->second = FixedSizeFontData::create(family, weight, italic); return result.first->second; }