Index: Source/core/css/resolver/FontBuilder.cpp |
diff --git a/Source/core/css/resolver/FontBuilder.cpp b/Source/core/css/resolver/FontBuilder.cpp |
index 2bc7804c038aaa935a804596e96a02cbd00a60d6..9a4422fd3fa2258c7a806115b26029c4b2e5d2eb 100644 |
--- a/Source/core/css/resolver/FontBuilder.cpp |
+++ b/Source/core/css/resolver/FontBuilder.cpp |
@@ -23,13 +23,13 @@ |
#include "config.h" |
#include "core/css/resolver/FontBuilder.h" |
-#include "core/css/CSSCalculationValue.h" |
-#include "core/css/CSSToLengthConversionData.h" |
+#include "core/CSSValueKeywords.h" |
#include "core/frame/LocalFrame.h" |
#include "core/frame/Settings.h" |
#include "core/rendering/RenderTheme.h" |
#include "core/rendering/RenderView.h" |
#include "core/rendering/TextAutosizer.h" |
+#include "platform/FontFamilyNames.h" |
#include "platform/fonts/FontDescription.h" |
#include "platform/text/LocaleToScriptMapping.h" |
@@ -75,21 +75,6 @@ void FontBuilder::initForStyleResolve(const Document& document, RenderStyle* sty |
m_fontDirty = false; |
} |
-inline static void setFontFamilyToStandard(FontDescription& fontDescription, const Document* document) |
-{ |
- if (!document || !document->settings()) |
- return; |
- |
- fontDescription.setGenericFamily(FontDescription::StandardFamily); |
- const AtomicString& standardFontFamily = document->settings()->genericFontFamilySettings().standard(); |
- if (standardFontFamily.isEmpty()) |
- return; |
- |
- fontDescription.firstFamily().setFamily(standardFontFamily); |
- // FIXME: Why is this needed here? |
- fontDescription.firstFamily().appendFamily(nullptr); |
-} |
- |
void FontBuilder::setInitial(float effectiveZoom) |
{ |
ASSERT(m_document && m_document->settings()); |
@@ -99,7 +84,7 @@ void FontBuilder::setInitial(float effectiveZoom) |
FontDescriptionChangeScope scope(this); |
scope.reset(); |
- setFontFamilyToStandard(scope.fontDescription(), m_document); |
+ setFamilyDescription(scope.fontDescription(), FontBuilder::initialFamilyDescription()); |
setSize(scope.fontDescription(), FontBuilder::initialSize()); |
} |
@@ -137,101 +122,51 @@ void FontBuilder::fromSystemFont(CSSValueID valueId, float effectiveZoom) |
scope.set(fontDescription); |
} |
-void FontBuilder::setFontFamilyInitial() |
+FontFamily FontBuilder::standardFontFamily() const |
{ |
- FontDescriptionChangeScope scope(this); |
- |
- setFontFamilyToStandard(scope.fontDescription(), m_document); |
+ FontFamily family; |
+ family.setFamily(standardFontFamilyName()); |
+ return family; |
} |
-void FontBuilder::setFontFamilyInherit(const FontDescription& parentFontDescription) |
+AtomicString FontBuilder::standardFontFamilyName() const |
{ |
- FontDescriptionChangeScope scope(this); |
- |
- scope.fontDescription().setGenericFamily(parentFontDescription.genericFamily()); |
- scope.fontDescription().setFamily(parentFontDescription.family()); |
+ ASSERT(m_document); |
+ Settings* settings = m_document->settings(); |
+ if (settings) |
+ return settings->genericFontFamilySettings().standard(); |
+ return AtomicString(); |
} |
-// FIXME: I am not convinced FontBuilder needs to know anything about CSSValues. |
-void FontBuilder::setFontFamilyValue(CSSValue* value) |
+AtomicString FontBuilder::genericFontFamilyName(FontDescription::GenericFamilyType genericFamily) const |
{ |
- FontDescriptionChangeScope scope(this); |
- |
- if (!value->isValueList()) |
- return; |
- |
- FontFamily& firstFamily = scope.fontDescription().firstFamily(); |
- FontFamily* currFamily = 0; |
- |
- // Before mapping in a new font-family property, we should reset the generic family. |
- FixedPitchFontType oldFixedPitchFontType = scope.fontDescription().fixedPitchFontType(); |
- scope.fontDescription().setGenericFamily(FontDescription::NoFamily); |
- |
- for (CSSValueListIterator i = value; i.hasMore(); i.advance()) { |
- CSSValue* item = i.value(); |
- if (!item->isPrimitiveValue()) |
- continue; |
- CSSPrimitiveValue* contentValue = toCSSPrimitiveValue(item); |
- AtomicString face; |
- Settings* settings = m_document->settings(); |
- if (contentValue->isString()) { |
- face = AtomicString(contentValue->getStringValue()); |
- } else if (settings) { |
- switch (contentValue->getValueID()) { |
- case CSSValueWebkitBody: |
- face = settings->genericFontFamilySettings().standard(); |
- break; |
- case CSSValueSerif: |
- face = FontFamilyNames::webkit_serif; |
- scope.fontDescription().setGenericFamily(FontDescription::SerifFamily); |
- break; |
- case CSSValueSansSerif: |
- face = FontFamilyNames::webkit_sans_serif; |
- scope.fontDescription().setGenericFamily(FontDescription::SansSerifFamily); |
- break; |
- case CSSValueCursive: |
- face = FontFamilyNames::webkit_cursive; |
- scope.fontDescription().setGenericFamily(FontDescription::CursiveFamily); |
- break; |
- case CSSValueFantasy: |
- face = FontFamilyNames::webkit_fantasy; |
- scope.fontDescription().setGenericFamily(FontDescription::FantasyFamily); |
- break; |
- case CSSValueMonospace: |
- face = FontFamilyNames::webkit_monospace; |
- scope.fontDescription().setGenericFamily(FontDescription::MonospaceFamily); |
- break; |
- case CSSValueWebkitPictograph: |
- face = FontFamilyNames::webkit_pictograph; |
- scope.fontDescription().setGenericFamily(FontDescription::PictographFamily); |
- break; |
- default: |
- break; |
- } |
- } |
- |
- if (!face.isEmpty()) { |
- if (!currFamily) { |
- // Filling in the first family. |
- firstFamily.setFamily(face); |
- firstFamily.appendFamily(nullptr); // Remove any inherited family-fallback list. |
- currFamily = &firstFamily; |
- } else { |
- RefPtr<SharedFontFamily> newFamily = SharedFontFamily::create(); |
- newFamily->setFamily(face); |
- currFamily->appendFamily(newFamily); |
- currFamily = newFamily.get(); |
- } |
- } |
+ switch (genericFamily) { |
+ default: |
+ ASSERT_NOT_REACHED(); |
+ case FontDescription::NoFamily: |
+ return AtomicString(); |
+ case FontDescription::StandardFamily: |
+ return standardFontFamilyName(); |
+ case FontDescription::SerifFamily: |
+ return FontFamilyNames::webkit_serif; |
+ case FontDescription::SansSerifFamily: |
+ return FontFamilyNames::webkit_sans_serif; |
+ case FontDescription::MonospaceFamily: |
+ return FontFamilyNames::webkit_monospace; |
+ case FontDescription::CursiveFamily: |
+ return FontFamilyNames::webkit_cursive; |
+ case FontDescription::FantasyFamily: |
+ return FontFamilyNames::webkit_fantasy; |
+ case FontDescription::PictographFamily: |
+ return FontFamilyNames::webkit_pictograph; |
} |
+} |
- // We can't call useFixedDefaultSize() until all new font families have been added |
- // If currFamily is non-zero then we set at least one family on this description. |
- if (!currFamily) |
- return; |
+void FontBuilder::setFamilyDescription(const FontDescription::FamilyDescription& familyDescription) |
+{ |
+ FontDescriptionChangeScope scope(this); |
- if (scope.fontDescription().keywordSize() && scope.fontDescription().fixedPitchFontType() != oldFixedPitchFontType) |
- setSize(scope.fontDescription(), FontDescription::Size(scope.fontDescription().keywordSize(), 0.0f, false)); |
+ setFamilyDescription(scope.fontDescription(), familyDescription); |
} |
void FontBuilder::setWeight(FontWeight fontWeight) |
@@ -312,6 +247,19 @@ void FontBuilder::setFeatureSettings(PassRefPtr<FontFeatureSettings> settings) |
scope.fontDescription().setFeatureSettings(settings); |
} |
+void FontBuilder::setFamilyDescription(FontDescription& fontDescription, const FontDescription::FamilyDescription& familyDescription) |
+{ |
+ FixedPitchFontType oldFixedPitchFontType = fontDescription.fixedPitchFontType(); |
+ |
+ bool isInitial = familyDescription.genericFamily == FontDescription::StandardFamily && familyDescription.family.familyIsEmpty(); |
+ |
+ fontDescription.setGenericFamily(familyDescription.genericFamily); |
+ fontDescription.setFamily(isInitial ? standardFontFamily() : familyDescription.family); |
+ |
+ if (fontDescription.keywordSize() && fontDescription.fixedPitchFontType() != oldFixedPitchFontType) |
+ setSize(fontDescription, FontDescription::Size(fontDescription.keywordSize(), 0.0f, false)); |
+} |
+ |
void FontBuilder::setSize(FontDescription& fontDescription, const FontDescription::Size& size) |
{ |
float specifiedSize = size.value; |
@@ -465,8 +413,7 @@ void FontBuilder::createFontForDocument(PassRefPtrWillBeRawPtr<FontSelector> fon |
FontDescription fontDescription = FontDescription(); |
fontDescription.setScript(localeToScriptCodeForFontSelection(documentStyle->locale())); |
- setFontFamilyToStandard(fontDescription, m_document); |
- |
+ setFamilyDescription(fontDescription, FontBuilder::initialFamilyDescription()); |
setSize(fontDescription, FontDescription::Size(FontSize::initialKeywordSize(), 0.0f, false)); |
updateComputedSize(fontDescription, documentStyle); |