Diff
Modified: trunk/Source/WebCore/CMakeLists.txt (150961 => 150962)
--- trunk/Source/WebCore/CMakeLists.txt 2013-05-30 14:15:28 UTC (rev 150961)
+++ trunk/Source/WebCore/CMakeLists.txt 2013-05-30 14:26:21 UTC (rev 150962)
@@ -1892,6 +1892,7 @@
platform/graphics/FontCache.cpp
platform/graphics/FontData.cpp
platform/graphics/FontDescription.cpp
+ platform/graphics/FontGenericFamilies.cpp
platform/graphics/FontGlyphs.cpp
platform/graphics/FontFastPath.cpp
platform/graphics/FontFeatureSettings.cpp
Modified: trunk/Source/WebCore/ChangeLog (150961 => 150962)
--- trunk/Source/WebCore/ChangeLog 2013-05-30 14:15:28 UTC (rev 150961)
+++ trunk/Source/WebCore/ChangeLog 2013-05-30 14:26:21 UTC (rev 150962)
@@ -1,3 +1,57 @@
+2013-05-30 Antti Koivisto <[email protected]>
+
+ Separate generic font family settings to a class
+ https://bugs.webkit.org/show_bug.cgi?id=117027
+
+ Reviewed by Andreas Kling.
+
+ The new class is under platform/ and can be accessed by the font code directly without platform violations.
+
+ * WebCore.xcodeproj/project.pbxproj:
+ * page/Settings.cpp:
+ (WebCore::invalidateAfterGenericFamilyChange):
+ (WebCore::Settings::Settings):
+ (WebCore::Settings::~Settings):
+ (WebCore::Settings::create):
+ (WebCore::Settings::standardFontFamily):
+ (WebCore::Settings::setStandardFontFamily):
+ (WebCore::Settings::fixedFontFamily):
+ (WebCore::Settings::setFixedFontFamily):
+ (WebCore::Settings::serifFontFamily):
+ (WebCore::Settings::setSerifFontFamily):
+ (WebCore::Settings::sansSerifFontFamily):
+ (WebCore::Settings::setSansSerifFontFamily):
+ (WebCore::Settings::cursiveFontFamily):
+ (WebCore::Settings::setCursiveFontFamily):
+ (WebCore::Settings::fantasyFontFamily):
+ (WebCore::Settings::setFantasyFontFamily):
+ (WebCore::Settings::pictographFontFamily):
+ (WebCore::Settings::setPictographFontFamily):
+ * page/Settings.h:
+ * platform/graphics/FontGenericFamilies.cpp: Added.
+ (WebCore::setGenericFontFamilyForScript):
+ (WebCore::genericFontFamilyForScript):
+ (WebCore::FontGenericFamilies::FontGenericFamilies):
+ (WebCore::FontGenericFamilies::standardFontFamily):
+ (WebCore::FontGenericFamilies::fixedFontFamily):
+ (WebCore::FontGenericFamilies::serifFontFamily):
+ (WebCore::FontGenericFamilies::sansSerifFontFamily):
+ (WebCore::FontGenericFamilies::cursiveFontFamily):
+ (WebCore::FontGenericFamilies::fantasyFontFamily):
+ (WebCore::FontGenericFamilies::pictographFontFamily):
+ (WebCore::FontGenericFamilies::setStandardFontFamily):
+ (WebCore::FontGenericFamilies::setFixedFontFamily):
+ (WebCore::FontGenericFamilies::setSerifFontFamily):
+ (WebCore::FontGenericFamilies::setSansSerifFontFamily):
+ (WebCore::FontGenericFamilies::setCursiveFontFamily):
+ (WebCore::FontGenericFamilies::setFantasyFontFamily):
+ (WebCore::FontGenericFamilies::setPictographFontFamily):
+ * platform/graphics/FontGenericFamilies.h: Added.
+ (WebCore::UScriptCodeHashTraits::emptyValue):
+ (WebCore::UScriptCodeHashTraits::constructDeletedValue):
+ (WebCore::UScriptCodeHashTraits::isDeletedValue):
+ (WebCore::FontGenericFamilies::create):
+
2013-05-30 Andreas Kling <[email protected]>
Avoid using CSSOM style declarations in HTML editing.
Modified: trunk/Source/WebCore/GNUmakefile.list.am (150961 => 150962)
--- trunk/Source/WebCore/GNUmakefile.list.am 2013-05-30 14:15:28 UTC (rev 150961)
+++ trunk/Source/WebCore/GNUmakefile.list.am 2013-05-30 14:26:21 UTC (rev 150962)
@@ -5626,6 +5626,8 @@
Source/WebCore/platform/graphics/FontData.h \
Source/WebCore/platform/graphics/FontDescription.cpp \
Source/WebCore/platform/graphics/FontDescription.h \
+ Source/WebCore/platform/graphics/FontGenericFamilies.cpp \
+ Source/WebCore/platform/graphics/FontGenericFamilies.h \
Source/WebCore/platform/graphics/FontGlyphs.cpp \
Source/WebCore/platform/graphics/FontGlyphs.h \
Source/WebCore/platform/graphics/FontFastPath.cpp \
Modified: trunk/Source/WebCore/Target.pri (150961 => 150962)
--- trunk/Source/WebCore/Target.pri 2013-05-30 14:15:28 UTC (rev 150961)
+++ trunk/Source/WebCore/Target.pri 2013-05-30 14:26:21 UTC (rev 150962)
@@ -986,6 +986,7 @@
platform/FileSystem.cpp \
platform/HistogramSupport.cpp \
platform/graphics/FontDescription.cpp \
+ platform/graphics/FontGenericFamilies.cpp \
platform/graphics/FontGlyphs.cpp \
platform/graphics/FontFeatureSettings.cpp \
platform/graphics/BitmapImage.cpp \
Modified: trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj (150961 => 150962)
--- trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj 2013-05-30 14:15:28 UTC (rev 150961)
+++ trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj 2013-05-30 14:26:21 UTC (rev 150962)
@@ -29881,7 +29881,15 @@
RelativePath="..\platform\graphics\FontDescription.h"
>
</File>
+ <File
+ RelativePath="..\platform\graphics\FontGenericFamilies.cpp"
+ >
+ </File>
<File
+ RelativePath="..\platform\graphics\FontGenericFamilies.h"
+ >
+ </File>
+ <File
RelativePath="..\platform\graphics\FontGlyphs.cpp"
>
</File>
Modified: trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj (150961 => 150962)
--- trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj 2013-05-30 14:15:28 UTC (rev 150961)
+++ trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj 2013-05-30 14:26:21 UTC (rev 150962)
@@ -4239,6 +4239,7 @@
<ClCompile Include="..\platform\graphics\FontCache.cpp" />
<ClCompile Include="..\platform\graphics\FontData.cpp" />
<ClCompile Include="..\platform\graphics\FontDescription.cpp" />
+ <ClCompile Include="..\platform\graphics\FontGenericFamilies.cpp" />
<ClCompile Include="..\platform\graphics\FontGlyphs.cpp" />
<ClCompile Include="..\platform\graphics\FontFastPath.cpp" />
<ClCompile Include="..\platform\graphics\FontFeatureSettings.cpp" />
@@ -11617,6 +11618,7 @@
<ClInclude Include="..\platform\graphics\FontCache.h" />
<ClInclude Include="..\platform\graphics\FontData.h" />
<ClInclude Include="..\platform\graphics\FontDescription.h" />
+ <ClInclude Include="..\platform\graphics\FontGenericFamilies.h" />
<ClInclude Include="..\platform\graphics\FontGlyphs.h" />
<ClInclude Include="..\platform\graphics\FontFeatureSettings.h" />
<ClInclude Include="..\platform\graphics\FontMetrics.h" />
Modified: trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters (150961 => 150962)
--- trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters 2013-05-30 14:15:28 UTC (rev 150961)
+++ trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters 2013-05-30 14:26:21 UTC (rev 150962)
@@ -5193,6 +5193,9 @@
<ClCompile Include="..\platform\graphics\FontDescription.cpp">
<Filter>platform\graphics</Filter>
</ClCompile>
+ <ClCompile Include="..\platform\graphics\FontGenericFamilies.cpp">
+ <Filter>platform\graphics</Filter>
+ </ClCompile>
<ClCompile Include="..\platform\graphics\FontGlyphs.cpp">
<Filter>platform\graphics</Filter>
</ClCompile>
@@ -12667,6 +12670,9 @@
<ClInclude Include="..\platform\graphics\FontDescription.h">
<Filter>platform\graphics</Filter>
</ClInclude>
+ <ClInclude Include="..\platform\graphics\FontGenericFamilies.h">
+ <Filter>platform\graphics</Filter>
+ </ClInclude>
<ClInclude Include="..\platform\graphics\FontGlyphs.h">
<Filter>platform\graphics</Filter>
</ClInclude>
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (150961 => 150962)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2013-05-30 14:15:28 UTC (rev 150961)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2013-05-30 14:26:21 UTC (rev 150962)
@@ -5515,6 +5515,7 @@
E44614520CD68A3500FADA75 /* RenderVideo.h in Headers */ = {isa = PBXBuildFile; fileRef = E4B41E340CBFB60900AF2ECE /* RenderVideo.h */; };
E44B4BB3141650D7002B1D8B /* SelectorChecker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E44B4BB1141650D7002B1D8B /* SelectorChecker.cpp */; };
E44B4BB4141650D7002B1D8B /* SelectorChecker.h in Headers */ = {isa = PBXBuildFile; fileRef = E44B4BB2141650D7002B1D8B /* SelectorChecker.h */; };
+ E44EE3A817577EBD00EEE8CF /* FontGenericFamilies.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E44EE3A617576E5500EEE8CF /* FontGenericFamilies.cpp */; };
E45322AB140CE267005A0F92 /* SelectorQuery.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E45322A9140CE267005A0F92 /* SelectorQuery.cpp */; };
E45322AC140CE267005A0F92 /* SelectorQuery.h in Headers */ = {isa = PBXBuildFile; fileRef = E45322AA140CE267005A0F92 /* SelectorQuery.h */; };
E453901E0EAFCACA003695C8 /* PasteboardIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = E45390190EAFCACA003695C8 /* PasteboardIOS.mm */; };
@@ -12308,6 +12309,8 @@
E44614130CD6826900FADA75 /* JSTimeRanges.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSTimeRanges.h; sourceTree = "<group>"; };
E44B4BB1141650D7002B1D8B /* SelectorChecker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SelectorChecker.cpp; sourceTree = "<group>"; };
E44B4BB2141650D7002B1D8B /* SelectorChecker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectorChecker.h; sourceTree = "<group>"; };
+ E44EE3A617576E5500EEE8CF /* FontGenericFamilies.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FontGenericFamilies.cpp; sourceTree = "<group>"; };
+ E44EE3A717576E5500EEE8CF /* FontGenericFamilies.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FontGenericFamilies.h; sourceTree = "<group>"; };
E45322A9140CE267005A0F92 /* SelectorQuery.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SelectorQuery.cpp; sourceTree = "<group>"; };
E45322AA140CE267005A0F92 /* SelectorQuery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectorQuery.h; sourceTree = "<group>"; };
E45390190EAFCACA003695C8 /* PasteboardIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = PasteboardIOS.mm; path = ios/PasteboardIOS.mm; sourceTree = "<group>"; };
@@ -18337,6 +18340,8 @@
72626E010EF022FE00A07E20 /* FontFastPath.cpp */,
4A6E9FC513C17D570046A7F8 /* FontFeatureSettings.cpp */,
4A6E9FC613C17D570046A7F8 /* FontFeatureSettings.h */,
+ E44EE3A617576E5500EEE8CF /* FontGenericFamilies.cpp */,
+ E44EE3A717576E5500EEE8CF /* FontGenericFamilies.h */,
0845680712B90DA600960A9F /* FontMetrics.h */,
F7A034C3126BF6BE007DC19E /* FontOrientation.h */,
84B62684133138F90095A489 /* FontPlatformData.cpp */,
@@ -26875,6 +26880,7 @@
F36E07A41358A8BE00AACBC9 /* WorkerInspectorController.cpp in Sources */,
2E43464C0F546A8200B0F1BA /* WorkerLocation.cpp in Sources */,
2E43464F0F546A8200B0F1BA /* WorkerMessagingProxy.cpp in Sources */,
+ E44EE3A817577EBD00EEE8CF /* FontGenericFamilies.cpp in Sources */,
E1271A140EEEC80400F61213 /* WorkerNavigator.cpp in Sources */,
2E4346520F546A8200B0F1BA /* WorkerRunLoop.cpp in Sources */,
F3820898147D35F90010BC06 /* WorkerRuntimeAgent.cpp in Sources */,
Modified: trunk/Source/WebCore/page/Settings.cpp (150961 => 150962)
--- trunk/Source/WebCore/page/Settings.cpp 2013-05-30 14:15:28 UTC (rev 150961)
+++ trunk/Source/WebCore/page/Settings.cpp 2013-05-30 14:26:21 UTC (rev 150962)
@@ -33,6 +33,7 @@
#include "Database.h"
#include "Document.h"
#include "Font.h"
+#include "FontGenericFamilies.h"
#include "Frame.h"
#include "FrameTree.h"
#include "FrameView.h"
@@ -57,34 +58,13 @@
}
}
-// Sets the entry in the font map for the given script. If family is the empty string, removes the entry instead.
-static inline void setGenericFontFamilyMap(ScriptFontFamilyMap& fontMap, const AtomicString& family, UScriptCode script, Page* page)
+static void invalidateAfterGenericFamilyChange(Page* page)
{
- ScriptFontFamilyMap::iterator it = fontMap.find(static_cast<int>(script));
- if (family.isEmpty()) {
- if (it == fontMap.end())
- return;
- fontMap.remove(it);
- } else if (it != fontMap.end() && it->value == family)
- return;
- else
- fontMap.set(static_cast<int>(script), family);
-
invalidateFontGlyphsCache();
if (page)
page->setNeedsRecalcStyleInAllFrames();
}
-static inline const AtomicString& getGenericFontFamilyForScript(const ScriptFontFamilyMap& fontMap, UScriptCode script)
-{
- ScriptFontFamilyMap::const_iterator it = fontMap.find(static_cast<int>(script));
- if (it != fontMap.end())
- return it->value;
- if (script != USCRIPT_COMMON)
- return getGenericFontFamilyForScript(fontMap, USCRIPT_COMMON);
- return emptyAtom;
-}
-
double Settings::gDefaultMinDOMTimerInterval = 0.010; // 10 milliseconds
double Settings::gDefaultDOMTimerAlignmentInterval = 0;
double Settings::gHiddenPageDOMTimerAlignmentInterval = 1.0;
@@ -143,6 +123,7 @@
Settings::Settings(Page* page)
: m_page(0)
, m_mediaTypeOverride("screen")
+ , m_fontGenericFamilies(FontGenericFamilies::create())
, m_storageBlockingPolicy(SecurityOrigin::AllowAllStorage)
#if ENABLE(TEXT_AUTOSIZING)
, m_textAutosizingFontScaleFactor(1)
@@ -195,10 +176,14 @@
m_page = page; // Page is not yet fully initialized wen constructing Settings, so keeping m_page null over initializeDefaultFontFamilies() call.
}
+Settings::~Settings()
+{
+}
+
PassOwnPtr<Settings> Settings::create(Page* page)
{
return adoptPtr(new Settings(page));
-}
+}
SETTINGS_SETTER_BODIES
@@ -221,72 +206,86 @@
const AtomicString& Settings::standardFontFamily(UScriptCode script) const
{
- return getGenericFontFamilyForScript(m_standardFontFamilyMap, script);
+ return m_fontGenericFamilies->standardFontFamily(script);
}
void Settings::setStandardFontFamily(const AtomicString& family, UScriptCode script)
{
- setGenericFontFamilyMap(m_standardFontFamilyMap, family, script, m_page);
+ bool changes = m_fontGenericFamilies->setStandardFontFamily(family, script);
+ if (changes)
+ invalidateAfterGenericFamilyChange(m_page);
}
const AtomicString& Settings::fixedFontFamily(UScriptCode script) const
{
- return getGenericFontFamilyForScript(m_fixedFontFamilyMap, script);
+ return m_fontGenericFamilies->fixedFontFamily(script);
}
void Settings::setFixedFontFamily(const AtomicString& family, UScriptCode script)
{
- setGenericFontFamilyMap(m_fixedFontFamilyMap, family, script, m_page);
+ bool changes = m_fontGenericFamilies->setFixedFontFamily(family, script);
+ if (changes)
+ invalidateAfterGenericFamilyChange(m_page);
}
const AtomicString& Settings::serifFontFamily(UScriptCode script) const
{
- return getGenericFontFamilyForScript(m_serifFontFamilyMap, script);
+ return m_fontGenericFamilies->serifFontFamily(script);
}
void Settings::setSerifFontFamily(const AtomicString& family, UScriptCode script)
{
- setGenericFontFamilyMap(m_serifFontFamilyMap, family, script, m_page);
+ bool changes = m_fontGenericFamilies->setSerifFontFamily(family, script);
+ if (changes)
+ invalidateAfterGenericFamilyChange(m_page);
}
const AtomicString& Settings::sansSerifFontFamily(UScriptCode script) const
{
- return getGenericFontFamilyForScript(m_sansSerifFontFamilyMap, script);
+ return m_fontGenericFamilies->sansSerifFontFamily(script);
}
void Settings::setSansSerifFontFamily(const AtomicString& family, UScriptCode script)
{
- setGenericFontFamilyMap(m_sansSerifFontFamilyMap, family, script, m_page);
+ bool changes = m_fontGenericFamilies->setSansSerifFontFamily(family, script);
+ if (changes)
+ invalidateAfterGenericFamilyChange(m_page);
}
const AtomicString& Settings::cursiveFontFamily(UScriptCode script) const
{
- return getGenericFontFamilyForScript(m_cursiveFontFamilyMap, script);
+ return m_fontGenericFamilies->cursiveFontFamily(script);
}
void Settings::setCursiveFontFamily(const AtomicString& family, UScriptCode script)
{
- setGenericFontFamilyMap(m_cursiveFontFamilyMap, family, script, m_page);
+ bool changes = m_fontGenericFamilies->setCursiveFontFamily(family, script);
+ if (changes)
+ invalidateAfterGenericFamilyChange(m_page);
}
const AtomicString& Settings::fantasyFontFamily(UScriptCode script) const
{
- return getGenericFontFamilyForScript(m_fantasyFontFamilyMap, script);
+ return m_fontGenericFamilies->fantasyFontFamily(script);
}
void Settings::setFantasyFontFamily(const AtomicString& family, UScriptCode script)
{
- setGenericFontFamilyMap(m_fantasyFontFamilyMap, family, script, m_page);
+ bool changes = m_fontGenericFamilies->setFantasyFontFamily(family, script);
+ if (changes)
+ invalidateAfterGenericFamilyChange(m_page);
}
const AtomicString& Settings::pictographFontFamily(UScriptCode script) const
{
- return getGenericFontFamilyForScript(m_pictographFontFamilyMap, script);
+ return m_fontGenericFamilies->pictographFontFamily(script);
}
void Settings::setPictographFontFamily(const AtomicString& family, UScriptCode script)
{
- setGenericFontFamilyMap(m_pictographFontFamilyMap, family, script, m_page);
+ bool changes = m_fontGenericFamilies->setPictographFontFamily(family, script);
+ if (changes)
+ invalidateAfterGenericFamilyChange(m_page);
}
#if ENABLE(TEXT_AUTOSIZING)
Modified: trunk/Source/WebCore/page/Settings.h (150961 => 150962)
--- trunk/Source/WebCore/page/Settings.h 2013-05-30 14:15:28 UTC (rev 150961)
+++ trunk/Source/WebCore/page/Settings.h 2013-05-30 14:26:21 UTC (rev 150962)
@@ -41,6 +41,7 @@
namespace WebCore {
+ class FontGenericFamilies;
class Page;
enum EditableLinkBehavior {
@@ -57,22 +58,13 @@
TextDirectionSubmenuAlwaysIncluded
};
- // UScriptCode uses -1 and 0 for UScriptInvalidCode and UScriptCommon.
- // We need to use -2 and -3 for empty value and deleted value.
- struct UScriptCodeHashTraits : WTF::GenericHashTraits<int> {
- static const bool emptyValueIsZero = false;
- static int emptyValue() { return -2; }
- static void constructDeletedValue(int& slot) { slot = -3; }
- static bool isDeletedValue(int value) { return value == -3; }
- };
-
- typedef HashMap<int, AtomicString, DefaultHash<int>::Hash, UScriptCodeHashTraits> ScriptFontFamilyMap;
-
class Settings {
WTF_MAKE_NONCOPYABLE(Settings); WTF_MAKE_FAST_ALLOCATED;
public:
static PassOwnPtr<Settings> create(Page*);
+ ~Settings();
+
void setStandardFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
const AtomicString& standardFontFamily(UScriptCode = USCRIPT_COMMON) const;
@@ -275,13 +267,7 @@
String m_mediaTypeOverride;
KURL m_userStyleSheetLocation;
- ScriptFontFamilyMap m_standardFontFamilyMap;
- ScriptFontFamilyMap m_serifFontFamilyMap;
- ScriptFontFamilyMap m_fixedFontFamilyMap;
- ScriptFontFamilyMap m_sansSerifFontFamilyMap;
- ScriptFontFamilyMap m_cursiveFontFamilyMap;
- ScriptFontFamilyMap m_fantasyFontFamilyMap;
- ScriptFontFamilyMap m_pictographFontFamilyMap;
+ RefPtr<FontGenericFamilies> m_fontGenericFamilies;
SecurityOrigin::StorageBlockingPolicy m_storageBlockingPolicy;
#if ENABLE(TEXT_AUTOSIZING)
float m_textAutosizingFontScaleFactor;
Added: trunk/Source/WebCore/platform/graphics/FontGenericFamilies.cpp (0 => 150962)
--- trunk/Source/WebCore/platform/graphics/FontGenericFamilies.cpp (rev 0)
+++ trunk/Source/WebCore/platform/graphics/FontGenericFamilies.cpp 2013-05-30 14:26:21 UTC (rev 150962)
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "FontGenericFamilies.h"
+
+namespace WebCore {
+
+static bool setGenericFontFamilyForScript(ScriptFontFamilyMap& fontMap, const AtomicString& family, UScriptCode script)
+{
+ if (family.isEmpty()) {
+ ScriptFontFamilyMap::iterator it = fontMap.find(static_cast<int>(script));
+ if (it == fontMap.end())
+ return false;
+ fontMap.remove(it);
+ return true;
+ }
+ ScriptFontFamilyMap::AddResult addResult = fontMap.add(static_cast<int>(script), family);
+ if (addResult.isNewEntry)
+ return true;
+ if (addResult.iterator->value == family)
+ return false;
+ addResult.iterator->value = family;
+ return true;
+}
+
+static const AtomicString& genericFontFamilyForScript(const ScriptFontFamilyMap& fontMap, UScriptCode script)
+{
+ ScriptFontFamilyMap::const_iterator it = fontMap.find(static_cast<int>(script));
+ if (it != fontMap.end())
+ return it->value;
+ if (script != USCRIPT_COMMON)
+ return genericFontFamilyForScript(fontMap, USCRIPT_COMMON);
+ return emptyAtom;
+}
+
+FontGenericFamilies::FontGenericFamilies()
+{
+}
+
+const AtomicString& FontGenericFamilies::standardFontFamily(UScriptCode script) const
+{
+ return genericFontFamilyForScript(m_standardFontFamilyMap, script);
+}
+
+const AtomicString& FontGenericFamilies::fixedFontFamily(UScriptCode script) const
+{
+ return genericFontFamilyForScript(m_fixedFontFamilyMap, script);
+}
+
+const AtomicString& FontGenericFamilies::serifFontFamily(UScriptCode script) const
+{
+ return genericFontFamilyForScript(m_serifFontFamilyMap, script);
+}
+
+const AtomicString& FontGenericFamilies::sansSerifFontFamily(UScriptCode script) const
+{
+ return genericFontFamilyForScript(m_sansSerifFontFamilyMap, script);
+}
+
+const AtomicString& FontGenericFamilies::cursiveFontFamily(UScriptCode script) const
+{
+ return genericFontFamilyForScript(m_cursiveFontFamilyMap, script);
+}
+
+const AtomicString& FontGenericFamilies::fantasyFontFamily(UScriptCode script) const
+{
+ return genericFontFamilyForScript(m_fantasyFontFamilyMap, script);
+}
+
+const AtomicString& FontGenericFamilies::pictographFontFamily(UScriptCode script) const
+{
+ return genericFontFamilyForScript(m_pictographFontFamilyMap, script);
+}
+
+bool FontGenericFamilies::setStandardFontFamily(const AtomicString& family, UScriptCode script)
+{
+ return setGenericFontFamilyForScript(m_standardFontFamilyMap, family, script);
+}
+
+bool FontGenericFamilies::setFixedFontFamily(const AtomicString& family, UScriptCode script)
+{
+ return setGenericFontFamilyForScript(m_fixedFontFamilyMap, family, script);
+}
+
+bool FontGenericFamilies::setSerifFontFamily(const AtomicString& family, UScriptCode script)
+{
+ return setGenericFontFamilyForScript(m_serifFontFamilyMap, family, script);
+}
+
+bool FontGenericFamilies::setSansSerifFontFamily(const AtomicString& family, UScriptCode script)
+{
+ return setGenericFontFamilyForScript(m_sansSerifFontFamilyMap, family, script);
+}
+
+bool FontGenericFamilies::setCursiveFontFamily(const AtomicString& family, UScriptCode script)
+{
+ return setGenericFontFamilyForScript(m_cursiveFontFamilyMap, family, script);
+}
+
+bool FontGenericFamilies::setFantasyFontFamily(const AtomicString& family, UScriptCode script)
+{
+ return setGenericFontFamilyForScript(m_fantasyFontFamilyMap, family, script);
+}
+
+bool FontGenericFamilies::setPictographFontFamily(const AtomicString& family, UScriptCode script)
+{
+ return setGenericFontFamilyForScript(m_pictographFontFamilyMap, family, script);
+}
+
+}
Added: trunk/Source/WebCore/platform/graphics/FontGenericFamilies.h (0 => 150962)
--- trunk/Source/WebCore/platform/graphics/FontGenericFamilies.h (rev 0)
+++ trunk/Source/WebCore/platform/graphics/FontGenericFamilies.h 2013-05-30 14:26:21 UTC (rev 150962)
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FontGenericFamilies_h
+#define FontGenericFamilies_h
+
+#include <wtf/HashMap.h>
+#include <wtf/RefCounted.h>
+#include <wtf/text/AtomicString.h>
+
+namespace WebCore {
+
+// UScriptCode uses -1 and 0 for UScriptInvalidCode and UScriptCommon.
+// We need to use -2 and -3 for empty value and deleted value.
+struct UScriptCodeHashTraits : WTF::GenericHashTraits<int> {
+ static const bool emptyValueIsZero = false;
+ static int emptyValue() { return -2; }
+ static void constructDeletedValue(int& slot) { slot = -3; }
+ static bool isDeletedValue(int value) { return value == -3; }
+};
+
+typedef HashMap<int, AtomicString, DefaultHash<int>::Hash, UScriptCodeHashTraits> ScriptFontFamilyMap;
+
+class FontGenericFamilies : public RefCounted<FontGenericFamilies> {
+public:
+ static PassRefPtr<FontGenericFamilies> create() { return adoptRef(new FontGenericFamilies); }
+
+ const AtomicString& standardFontFamily(UScriptCode = USCRIPT_COMMON) const;
+ const AtomicString& fixedFontFamily(UScriptCode = USCRIPT_COMMON) const;
+ const AtomicString& serifFontFamily(UScriptCode = USCRIPT_COMMON) const;
+ const AtomicString& sansSerifFontFamily(UScriptCode = USCRIPT_COMMON) const;
+ const AtomicString& cursiveFontFamily(UScriptCode = USCRIPT_COMMON) const;
+ const AtomicString& fantasyFontFamily(UScriptCode = USCRIPT_COMMON) const;
+ const AtomicString& pictographFontFamily(UScriptCode = USCRIPT_COMMON) const;
+
+ bool setStandardFontFamily(const AtomicString&, UScriptCode);
+ bool setFixedFontFamily(const AtomicString&, UScriptCode);
+ bool setSerifFontFamily(const AtomicString&, UScriptCode);
+ bool setSansSerifFontFamily(const AtomicString&, UScriptCode);
+ bool setCursiveFontFamily(const AtomicString&, UScriptCode);
+ bool setFantasyFontFamily(const AtomicString&, UScriptCode);
+ bool setPictographFontFamily(const AtomicString&, UScriptCode);
+
+private:
+ FontGenericFamilies();
+
+ ScriptFontFamilyMap m_standardFontFamilyMap;
+ ScriptFontFamilyMap m_serifFontFamilyMap;
+ ScriptFontFamilyMap m_fixedFontFamilyMap;
+ ScriptFontFamilyMap m_sansSerifFontFamilyMap;
+ ScriptFontFamilyMap m_cursiveFontFamilyMap;
+ ScriptFontFamilyMap m_fantasyFontFamilyMap;
+ ScriptFontFamilyMap m_pictographFontFamilyMap;
+};
+
+}
+
+#endif