FontPlatformData::FontPlatformData(const FontDescription& description, const AtomicString& familyName, int wordSpacing, int letterSpacing) : m_data(adoptRef(new FontPlatformDataPrivate())) { QFont font; int requestedSize = description.computedPixelSize(); font.setFamily(familyName); if (requestedSize) font.setPixelSize(requestedSize); font.setItalic(description.italic()); font.setWeight(toQFontWeight(description.weight())); font.setWordSpacing(wordSpacing); font.setLetterSpacing(QFont::AbsoluteSpacing, letterSpacing); if (description.fontSmoothing() == NoSmoothing) font.setStyleStrategy(QFont::NoAntialias); #if QT_VERSION >= QT_VERSION_CHECK(5, 1, 0) if (description.fontSmoothing() == AutoSmoothing && !Font::shouldUseSmoothing()) font.setStyleStrategy(QFont::NoAntialias); #endif m_data->bold = font.bold(); // WebKit allows font size zero but QFont does not. We will return // m_data->size if a font size of zero is requested and pixelSize() // otherwise. m_data->size = (!requestedSize) ? requestedSize : font.pixelSize(); m_data->rawFont = QRawFont::fromFont(font, QFontDatabase::Any); }
WebFontDescription::WebFontDescription(const FontDescription& desc) { family = desc.family().family(); genericFamily = static_cast<GenericFamily>(desc.genericFamily()); size = desc.specifiedSize(); italic = desc.style() == FontStyleItalic; smallCaps = desc.variant() == FontVariantSmallCaps; weight = static_cast<Weight>(desc.weight()); smoothing = static_cast<Smoothing>(desc.fontSmoothing()); letterSpacing = desc.letterSpacing(); wordSpacing = desc.wordSpacing(); }
FontPlatformData::FontPlatformData(const FontDescription& description, const AtomicString& familyName, const UChar* characters, int length, int wordSpacing, int letterSpacing) : m_data(new FontPlatformDataPrivate()) { using namespace EA::WebKit; EA::WebKit::TextStyle textStyle; // We rather use the textStyle so we can pass in the spacing and the fx info directly. InitTextStyle(textStyle); // Note by Arpit Baldeva: // The way WebCore expects us to handle creation of FontPlatformData is to take the familyName // in FontCacheEA.cpp and return a valid pointer only if that particular font can be created. // In CSS, one can specify multiple font families in order of preference. If you return NULL, // WebCore sends the next highest priority font. Note that it also converts generic font family // name (such as serif) to the one you specify as your default in the Settings (For example, // Times New Roman for us). So the system is supposed to be pretty simple. // The problem we have is that EAText wants to builds a priority array in one shot. Also, if you // request a font and it is not found, it may return one of the fallback fonts even though you may // have something down the priority order available in EAText. // So what we do here is build up that array. //-- Build FamilyName array --- ITextSystem* pTextSystem = GetTextSystem(); const uint32_t familyNameArrayCapacity = pTextSystem->GetFamilyNameArrayCapacity(); uint32_t i = 0; EAW_ASSERT_MSG(!familyName.isEmpty(), "Family name can never be empty"); CopyFontFamilyName(textStyle.mFamilyNameArray[i],familyName); const FontFamily* pfontFamily = &(description.family()); pfontFamily = pfontFamily->next(); ++i; const EA::WebKit::Parameters& params = EA::WebKit::GetParameters(); // Here, we iterate through the list and copy the fonts to the destination array in the order of priority. // If we come across a generic font, we read it from the Params based on the generic family set in the description. bool genericFontAdded = false; while(pfontFamily && i < familyNameArrayCapacity) { if(pfontFamily->family().startsWith("-webkit",true)) // A generic font family { genericFontAdded = true; const char16_t* type = 0; switch(description.genericFamily()) { case FontDescription::SerifFamily: type = params.mFontFamilySerif; break; case FontDescription::SansSerifFamily: type = params.mFontFamilySansSerif; break; case FontDescription::MonospaceFamily: type = params.mFontFamilyMonospace; break; case FontDescription::CursiveFamily: type = params.mFontFamilyCursive; break; case FontDescription::FantasyFamily: type = params.mFontFamilyFantasy; break; default: case FontDescription::NoFamily: case FontDescription::StandardFamily: type = params.mFontFamilyStandard; break; } if(type) { EA::Internal::Strcpy(textStyle.mFamilyNameArray[i],type); ++i; } break; } CopyFontFamilyName(textStyle.mFamilyNameArray[i], pfontFamily->family()); ++i; pfontFamily = pfontFamily->next(); } // If we went through all the fonts specified but a generic font was not added, we add the standard font as a fallback. // It is probably not a good practice to not specify a generic font family for any font but we deal with that situation here. if( i < familyNameArrayCapacity && !genericFontAdded) { EA::Internal::Strcpy(textStyle.mFamilyNameArray[i],params.mFontFamilyStandard); ++i; } if(i < familyNameArrayCapacity) *textStyle.mFamilyNameArray[i] = 0; // verify that spacing can be used raw without size adjustments. textStyle.mfLetterSpacing = static_cast<float> (letterSpacing); textStyle.mfWordSpacing = static_cast<float> (wordSpacing); // Size const float fFontSize = description.computedSize(); const float fAdjustedFontSize = GetFontAdjustedSize(fFontSize); textStyle.mfSize = fAdjustedFontSize; // Italic const bool bItalic = description.italic(); if(bItalic) textStyle.mStyle = EA::WebKit::kStyleItalic; // Weight const WebCore::FontWeight fontWeight = description.weight(); textStyle.mfWeight = GetFontAdjustedWeight(fontWeight); // Variant if(description.smallCaps()) textStyle.mVariant = EA::WebKit::kVariantSmallCaps; // Smooth // We act like FireFox under Windows does with respect to sizes and weights. bool smooth = IsFontSmooth(fFontSize, description.fontSmoothing()); if(smooth) textStyle.mSmooth = EA::WebKit::kSmoothEnabled; // Effects. const EA::WebKit::TextEffectData& effectData = description.getTextEffectData(); textStyle.mTextEffectData = effectData; // Now get the requested font if(pTextSystem) { IFont* pFont = pTextSystem->GetFont(textStyle, length ? characters[0] : ' '); EAW_ASSERT(pFont); m_data->mpFont = pFont; } }