FontPlatformData FontCustomPlatformData::fontPlatformData(float size, bool bold, bool italic, FontOrientation orientation, FontWidthVariant) { ASSERT(m_typeface); #if OS(WIN) // FIXME: Skia currently renders synthetic bold and italics with hinting and without // linear metrics on windows. Using CreateFromName and specifying the bold/italics // style allows for proper rendering of synthetic style. Once Skia has been updated // this workaround will no longer be needed. crbug.com/332958 bool syntheticBold = bold && !m_typeface->isBold(); bool syntheticItalic = italic && !m_typeface->isItalic(); if (syntheticBold || syntheticItalic) { SkString name; m_typeface->getFamilyName(&name); int style = SkTypeface::kNormal; if (syntheticBold) style |= SkTypeface::kBold; if (syntheticItalic) style |= SkTypeface::kItalic; RefPtr<SkTypeface> typeface = adoptRef(FontCache::fontCache()->fontManager()->legacyCreateTypeface(name.c_str(), static_cast<SkTypeface::Style>(style))); syntheticBold = false; syntheticItalic = false; return FontPlatformData(typeface.release(), "", size, syntheticBold, syntheticItalic, orientation); } #endif return FontPlatformData(m_typeface.get(), "", size, bold && !m_typeface->isBold(), italic && !m_typeface->isItalic(), orientation); }
FontPlatformData FontCustomPlatformData::fontPlatformData(float size, bool bold, bool italic, FontOrientation orientation, FontWidthVariant) { ASSERT(m_fontReference); LOGFONT logFont; // m_name comes from createUniqueFontName, which, in turn, gets // it from base64-encoded uuid (128-bit). So, m_name // can never be longer than LF_FACESIZE (32). if (m_name.length() + 1 >= LF_FACESIZE) { ASSERT_NOT_REACHED(); return FontPlatformData(); } unsigned len = m_name.copyTo(logFont.lfFaceName, 0, LF_FACESIZE - 1); logFont.lfFaceName[len] = '\0'; // FIXME: almost identical to FillLogFont in FontCacheWin.cpp. // Need to refactor. logFont.lfHeight = -static_cast<int>(size); logFont.lfWidth = 0; logFont.lfEscapement = 0; logFont.lfOrientation = 0; logFont.lfUnderline = false; logFont.lfStrikeOut = false; logFont.lfCharSet = DEFAULT_CHARSET; logFont.lfOutPrecision = OUT_TT_ONLY_PRECIS; logFont.lfQuality = isRunningLayoutTest() ? NONANTIALIASED_QUALITY : DEFAULT_QUALITY; // Honor user's desktop settings. logFont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; logFont.lfItalic = italic; logFont.lfWeight = bold ? FW_BOLD : FW_DONTCARE; HFONT hfont = CreateFontIndirect(&logFont); return FontPlatformData(hfont, size, orientation); }
FontPlatformData CachedFont::platformDataFromCustomData(float size, bool bold, bool italic, FontRenderingMode renderingMode) { #if ENABLE(SVG_FONTS) if (m_externalSVGDocument) return FontPlatformData(size, bold, italic); #endif #if PLATFORM(CG) || PLATFORM(QT) || PLATFORM(GTK) || PLATFORM(ISEE) ASSERT(m_fontData); return m_fontData->fontPlatformData(static_cast<int>(size), bold, italic, renderingMode); #else return FontPlatformData(); #endif }
FontPlatformData CachedFont::platformDataFromCustomData(float size, bool bold, bool italic, FontRenderingMode renderingMode) { #if ENABLE(SVG_FONTS) if (m_externalSVGDocument) return FontPlatformData(size, bold, italic); #endif #ifdef STORE_FONT_CUSTOM_PLATFORM_DATA ASSERT(m_fontData); return m_fontData->fontPlatformData(static_cast<int>(size), bold, italic, renderingMode); #else return FontPlatformData(); #endif }
FontPlatformData FontCustomPlatformData::fontPlatformData(const FontDescription& fontDescription, bool bold, bool italic) { int size = fontDescription.computedPixelSize(); FontOrientation orientation = fontDescription.orientation(); FontWidthVariant widthVariant = fontDescription.widthVariant(); #if CORETEXT_WEB_FONTS RetainPtr<CTFontRef> font = adoptCF(CTFontCreateWithFontDescriptor(m_fontDescriptor.get(), size, nullptr)); font = preparePlatformFont(font.get(), fontDescription.textRenderingMode(), fontDescription.featureSettings()); return FontPlatformData(font.get(), size, bold, italic, orientation, widthVariant, fontDescription.textRenderingMode()); #else return FontPlatformData(m_cgFont.get(), size, bold, italic, orientation, widthVariant, fontDescription.textRenderingMode()); #endif }
FontPlatformData CachedFont::platformDataFromCustomData(const FontDescription &fontDescription) { #if ENABLE(SVG_FONTS) if (m_externalSVGDocument) return FontPlatformData(size, bold, italic); #endif #if PLATFORM(CG) || PLATFORM(QT) || PLATFORM(GTK) || PLATFORM(BAL) ASSERT(m_fontData); return m_fontData->fontPlatformData(fontDescription); #else return FontPlatformData(); #endif }
const FontData* FontCache::getFontDataForCharacters(const Font& font, const UChar* characters, int length) { FontData* fontData = 0; fontData = new FontData(FontPlatformData(font.fontDescription(), font.family().family())); return fontData; }
FontPlatformData FontCustomPlatformData::fontPlatformData( int size, bool bold, bool italic, FontOrientation, FontWidthVariant, FontRenderingMode) { JNIEnv* env = WebCore_GetJavaEnv(); static jmethodID mid = env->GetMethodID( PG_GetFontCustomPlatformDataClass(env), "createFont", "(IZZ)Lcom/sun/webkit/graphics/WCFont;"); ASSERT(mid); JLObject font(env->CallObjectMethod( m_data, mid, size, bool_to_jbool(bold), bool_to_jbool(italic))); CheckAndClearException(env); return FontPlatformData(RQRef::create(font), size); }
PassOwnPtr<SimpleFontData> SimpleFontData::createScaledFontData(const FontDescription& fontDescription, float scaleFactor) const { return adoptPtr(new SimpleFontData(FontPlatformData(m_platformData.m_font.get(), scaleFactor * fontDescription.computedSize(), m_platformData.syntheticBold(), m_platformData.syntheticOblique()), isCustomFont(), false)); }
PassRefPtr<SimpleFontData> SimpleFontData::platformCreateScaledFontData(const FontDescription& fontDescription, float scaleFactor) const { ASSERT(m_platformData.scaledFont()); return SimpleFontData::create(FontPlatformData(cairo_scaled_font_get_font_face(m_platformData.scaledFont()), scaleFactor * fontDescription.computedSize(), m_platformData.syntheticBold(), m_platformData.syntheticOblique()), isCustomFont(), false); }
FontPlatformData FontResource::platformDataFromCustomData(float size, bool bold, bool italic, FontOrientation orientation, FontWidthVariant widthVariant) { #if ENABLE(SVG_FONTS) if (m_externalSVGDocument) return FontPlatformData(size, bold, italic); #endif ASSERT(m_fontData); return m_fontData->fontPlatformData(size, bold, italic, orientation, widthVariant); }
PassRefPtr<SimpleFontData> SimpleFontData::platformCreateScaledFontData(const FontDescription& fontDescription, float scaleFactor) const { LOGFONT winFont; GetObject(m_platformData.hfont(), sizeof(LOGFONT), &winFont); float scaledSize = scaleFactor * fontDescription.computedSize(); winFont.lfHeight = -lroundf(scaledSize); HFONT hfont = CreateFontIndirect(&winFont); return SimpleFontData::create(FontPlatformData(hfont, scaledSize, m_platformData.orientation()), isCustomFont() ? CustomFontData::create(false) : 0); }
PassOwnPtr<SimpleFontData> SimpleFontData::createScaledFontData(const FontDescription& fontDescription, float scaleFactor) const { LOGFONT winFont; GetObject(m_platformData.hfont(), sizeof(LOGFONT), &winFont); float scaledSize = scaleFactor * fontDescription.computedSize(); winFont.lfHeight = -lroundf(scaledSize); HFONT hfont = CreateFontIndirect(&winFont); return adoptPtr(new SimpleFontData(FontPlatformData(hfont, scaledSize), isCustomFont(), false)); }
FontPlatformData CachedFont::platformDataFromCustomData(float size, bool bold, bool italic, FontOrientation orientation, FontWidthVariant widthVariant, FontRenderingMode renderingMode) { #if ENABLE(SVG_FONTS) if (m_externalSVGDocument) return FontPlatformData(size, bold, italic); #endif ASSERT(m_fontData); return m_fontData->fontPlatformData(static_cast<int>(size), bold, italic, orientation, widthVariant, renderingMode); }
FontPlatformData FontCustomPlatformData::fontPlatformData(int size, bool bold, bool italic, FontOrientation, TextOrientation, FontWidthVariant, FontRenderingMode renderingMode) { FontDescription fontDesc; fontDesc.setComputedSize(size); fontDesc.setSpecifiedSize(size); fontDesc.setItalic(italic); fontDesc.setWeight(bold ? FontWeightBold : FontWeightNormal); return FontPlatformData(fontDesc, m_name, false); }
PassRefPtr<SimpleFontData> SimpleFontData::createScaledFontData( const FontDescription& fontDescription, float scaleFactor) const { const float scaledSize = lroundf(fontDescription.computedSize() * scaleFactor); return SimpleFontData::create( FontPlatformData(m_platformData, scaledSize), isCustomFont() ? CustomFontData::create() : nullptr); }
SimpleFontData* SimpleFontData::smallCapsFontData(const FontDescription& fontDescription) const { if (!m_smallCapsFontData) { const float smallCapsSize = lroundf(fontDescription.computedSize() * smallCapsFraction); m_smallCapsFontData = new SimpleFontData(FontPlatformData(m_font, smallCapsSize)); } return m_smallCapsFontData; }
FontPlatformData FontCustomPlatformData::fontPlatformData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings) { int size = fontDescription.computedPixelSize(); FontOrientation orientation = fontDescription.orientation(); FontWidthVariant widthVariant = fontDescription.widthVariant(); RetainPtr<CTFontRef> font = adoptCF(CTFontCreateWithFontDescriptor(m_fontDescriptor.get(), size, nullptr)); font = preparePlatformFont(font.get(), fontDescription.textRenderingMode(), &fontFaceFeatures, &fontFaceVariantSettings, fontDescription.featureSettings(), fontDescription.variantSettings()); return FontPlatformData(font.get(), size, bold, italic, orientation, widthVariant, fontDescription.textRenderingMode()); }
FontPlatformData FontCustomPlatformData::fontPlatformData(int size, bool bold, bool italic, FontOrientation orientation, TextOrientation textOrientation, FontWidthVariant, FontRenderingMode mode) { #if OS(WINDOWS) ASSERT(m_fontReference); LOGFONT logFont; // m_name comes from createUniqueFontName, which, in turn, gets // it from base64-encoded uuid (128-bit). So, m_name // can never be longer than LF_FACESIZE (32). if (m_name.length() + 1 >= LF_FACESIZE) { ASSERT_NOT_REACHED(); return FontPlatformData(); } memcpy(logFont.lfFaceName, m_name.charactersWithNullTermination(), sizeof(logFont.lfFaceName[0]) * (1 + m_name.length())); // FIXME: almost identical to FillLogFont in FontCacheWin.cpp. // Need to refactor. logFont.lfHeight = -size; logFont.lfWidth = 0; logFont.lfEscapement = 0; logFont.lfOrientation = 0; logFont.lfUnderline = false; logFont.lfStrikeOut = false; logFont.lfCharSet = DEFAULT_CHARSET; logFont.lfOutPrecision = OUT_TT_ONLY_PRECIS; logFont.lfQuality = PlatformSupport::layoutTestMode() ? NONANTIALIASED_QUALITY : DEFAULT_QUALITY; // Honor user's desktop settings. logFont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; logFont.lfItalic = italic; logFont.lfWeight = bold ? FW_BOLD : FW_DONTCARE; HFONT hfont = CreateFontIndirect(&logFont); return FontPlatformData(hfont, size); #elif OS(UNIX) || PLATFORM(BREWMP) ASSERT(m_fontReference); return FontPlatformData(m_fontReference, "", size, bold && !m_fontReference->isBold(), italic && !m_fontReference->isItalic(), orientation, textOrientation); #else notImplemented(); return FontPlatformData(); #endif }
SimpleFontData::SimpleFontData(PassOwnPtr<SVGFontData> svgFontData, int size, bool syntheticBold, bool syntheticItalic) : m_platformData(FontPlatformData(size, syntheticBold, syntheticItalic)) , m_treatAsFixedPitch(false) , m_svgFontData(svgFontData) , m_isCustomFont(true) , m_isLoading(false) , m_isTextOrientationFallback(false) , m_isBrokenIdeographFallback(false) , m_hasVerticalGlyphs(false) { SVGFontFaceElement* svgFontFaceElement = m_svgFontData->svgFontFaceElement(); unsigned unitsPerEm = svgFontFaceElement->unitsPerEm(); float scale = size; if (unitsPerEm) scale /= unitsPerEm; float xHeight = svgFontFaceElement->xHeight() * scale; float ascent = svgFontFaceElement->ascent() * scale; float descent = svgFontFaceElement->descent() * scale; float lineGap = 0.1f * size; SVGFontElement* associatedFontElement = svgFontFaceElement->associatedFontElement(); if (!xHeight) { // Fallback if x_heightAttr is not specified for the font element. Vector<SVGGlyphIdentifier> letterXGlyphs; associatedFontElement->getGlyphIdentifiersForString(String("x", 1), letterXGlyphs); xHeight = letterXGlyphs.isEmpty() ? 2 * ascent / 3 : letterXGlyphs.first().horizontalAdvanceX * scale; } m_fontMetrics.setUnitsPerEm(unitsPerEm); m_fontMetrics.setAscent(ascent); m_fontMetrics.setDescent(descent); m_fontMetrics.setLineGap(lineGap); m_fontMetrics.setLineSpacing(roundf(ascent) + roundf(descent) + roundf(lineGap)); m_fontMetrics.setXHeight(xHeight); Vector<SVGGlyphIdentifier> spaceGlyphs; associatedFontElement->getGlyphIdentifiersForString(String(" ", 1), spaceGlyphs); m_spaceWidth = spaceGlyphs.isEmpty() ? xHeight : spaceGlyphs.first().horizontalAdvanceX * scale; Vector<SVGGlyphIdentifier> numeralZeroGlyphs; associatedFontElement->getGlyphIdentifiersForString(String("0", 1), numeralZeroGlyphs); m_avgCharWidth = numeralZeroGlyphs.isEmpty() ? m_spaceWidth : numeralZeroGlyphs.first().horizontalAdvanceX * scale; Vector<SVGGlyphIdentifier> letterWGlyphs; associatedFontElement->getGlyphIdentifiersForString(String("W", 1), letterWGlyphs); m_maxCharWidth = letterWGlyphs.isEmpty() ? ascent : letterWGlyphs.first().horizontalAdvanceX * scale; // FIXME: is there a way we can get the space glyph from the SVGGlyphIdentifier above? m_spaceGlyph = 0; m_zeroWidthSpaceGlyph = 0; determinePitch(); m_missingGlyphData.fontData = this; m_missingGlyphData.glyph = 0; }
FontPlatformData FontCustomPlatformData::fontPlatformData( float size, bool bold, bool italic, FontOrientation orientation, FontWidthVariant) { ASSERT(m_typeface); return FontPlatformData(m_typeface, "", size, bold && !m_typeface->isBold(), italic && !m_typeface->isItalic(), orientation); }
SimpleFontData::SimpleFontData(PassRefPtr<CustomFontData> customData, float fontSize, bool syntheticBold, bool syntheticItalic) : m_platformData( FontPlatformData(fontSize, syntheticBold, syntheticItalic)), m_isTextOrientationFallback(false), m_verticalData(nullptr), m_hasVerticalGlyphs(false), m_customFontData(customData) {}
FontPlatformData FontCustomPlatformData::fontPlatformData(int size, bool bold, bool italic, FontOrientation, TextOrientation, FontWidthVariant, FontRenderingMode) { QFont font; font.setFamily(QFontDatabase::applicationFontFamilies(m_handle)[0]); font.setPixelSize(size); if (bold) font.setWeight(QFont::Bold); font.setItalic(italic); return FontPlatformData(font); }
SimpleFontData::SimpleFontData(PassOwnPtr<AdditionalFontData> fontData, float fontSize, bool syntheticBold, bool syntheticItalic) : m_platformData(FontPlatformData(fontSize, syntheticBold, syntheticItalic)) , m_fontData(fontData) , m_treatAsFixedPitch(false) , m_isCustomFont(true) , m_isLoading(false) , m_isTextOrientationFallback(false) , m_isBrokenIdeographFallback(false) , m_hasVerticalGlyphs(false) { m_fontData->initializeFontData(this, fontSize); }
PassRefPtr<SimpleFontData> SimpleFontData::platformCreateScaledFontData(const FontDescription& fontDescription, float scaleFactor) const { const float scaledSize = lroundf(fontDescription.computedSize() * scaleFactor); return adoptRef(new SimpleFontData( FontPlatformData(m_platformData.font()->cur_lfnt->name, scaledSize, m_platformData.syntheticBold(), m_platformData.syntheticOblique(), m_platformData.orientation(), m_platformData.widthVariant()), isCustomFont(), false)); }
FontPlatformData FontCustomPlatformData::fontPlatformData(int size, bool bold, bool italic, FontOrientation fontOrientation, TextOrientation textOrientation, FontWidthVariant, FontRenderingMode) { // turn bold/italic into fakeBold/fakeItalic if (m_typeface != NULL) { if (m_typeface->isBold() == bold) bold = false; if (m_typeface->isItalic() == italic) italic = false; } return FontPlatformData(m_typeface, size, bold, italic, fontOrientation, textOrientation); }
SimpleFontData::SimpleFontData(PassRefPtr<CustomFontData> customData, float fontSize, bool syntheticBold, bool syntheticItalic) : m_platformData(FontPlatformData(fontSize, syntheticBold, syntheticItalic)) , m_treatAsFixedPitch(false) , m_isTextOrientationFallback(false) , m_isBrokenIdeographFallback(false) #if ENABLE(OPENTYPE_VERTICAL) , m_verticalData(nullptr) #endif , m_hasVerticalGlyphs(false) , m_customFontData(customData) { if (m_customFontData) m_customFontData->initializeFontData(this, fontSize); }
RefPtr<Font> Font::platformCreateScaledFont(const FontDescription& fontDescription, float scaleFactor) const { float scaledSize = scaleFactor * m_platformData.size(); if (isCustomFont()) { FontPlatformData scaledFont(m_platformData); scaledFont.setSize(scaledSize); return Font::create(scaledFont, true, false); } LOGFONT winfont; GetObject(m_platformData.hfont(), sizeof(LOGFONT), &winfont); winfont.lfHeight = -lroundf(scaledSize * (m_platformData.useGDI() ? 1 : 32)); auto hfont = adoptGDIObject(::CreateFontIndirect(&winfont)); return Font::create(FontPlatformData(WTFMove(hfont), scaledSize, m_platformData.syntheticBold(), m_platformData.syntheticOblique(), m_platformData.useGDI()), isCustomFont(), false); }
SimpleFontData::SimpleFontData(std::unique_ptr<AdditionalFontData> fontData, float fontSize, bool syntheticBold, bool syntheticItalic) : m_platformData(FontPlatformData(fontSize, syntheticBold, syntheticItalic)) , m_fontData(std::move(fontData)) , m_treatAsFixedPitch(false) , m_isCustomFont(true) , m_isLoading(false) , m_isTextOrientationFallback(false) , m_isBrokenIdeographFallback(false) #if ENABLE(OPENTYPE_VERTICAL) , m_verticalData(0) #endif , m_hasVerticalGlyphs(false) { m_fontData->initializeFontData(this, fontSize); }
SimpleFontData* SimpleFontData::smallCapsFontData(const FontDescription& fontDescription) const { if (!m_smallCapsFontData) { LOGFONT winFont; GetObject(m_font.hfont(), sizeof(LOGFONT), &winFont); float smallCapsSize = 0.70f * fontDescription.computedSize(); // Unlike WebKit trunk, we don't multiply the size by 32. That seems // to be some kind of artifact of their CG backend, or something. winFont.lfHeight = -lroundf(smallCapsSize); HFONT hfont = CreateFontIndirect(&winFont); m_smallCapsFontData = new SimpleFontData(FontPlatformData(hfont, smallCapsSize)); } return m_smallCapsFontData; }