1/*
2 * Copyright (C) 2013 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "FontGenericFamilies.h"
28
29namespace WebCore {
30
31static bool setGenericFontFamilyForScript(ScriptFontFamilyMap& fontMap, const AtomicString& family, UScriptCode script)
32{
33    if (family.isEmpty()) {
34        ScriptFontFamilyMap::iterator it = fontMap.find(static_cast<int>(script));
35        if (it == fontMap.end())
36            return false;
37        fontMap.remove(it);
38        return true;
39    }
40    ScriptFontFamilyMap::AddResult addResult = fontMap.add(static_cast<int>(script), family);
41    if (addResult.isNewEntry)
42        return true;
43    if (addResult.iterator->value == family)
44        return false;
45    addResult.iterator->value = family;
46    return true;
47}
48
49static const AtomicString& genericFontFamilyForScript(const ScriptFontFamilyMap& fontMap, UScriptCode script)
50{
51    ScriptFontFamilyMap::const_iterator it = fontMap.find(static_cast<int>(script));
52    if (it != fontMap.end())
53        return it->value;
54    if (script != USCRIPT_COMMON)
55        return genericFontFamilyForScript(fontMap, USCRIPT_COMMON);
56    return emptyAtom;
57}
58
59FontGenericFamilies::FontGenericFamilies()
60{
61}
62
63const AtomicString& FontGenericFamilies::standardFontFamily(UScriptCode script) const
64{
65    return genericFontFamilyForScript(m_standardFontFamilyMap, script);
66}
67
68const AtomicString& FontGenericFamilies::fixedFontFamily(UScriptCode script) const
69{
70    return genericFontFamilyForScript(m_fixedFontFamilyMap, script);
71}
72
73const AtomicString& FontGenericFamilies::serifFontFamily(UScriptCode script) const
74{
75    return genericFontFamilyForScript(m_serifFontFamilyMap, script);
76}
77
78const AtomicString& FontGenericFamilies::sansSerifFontFamily(UScriptCode script) const
79{
80    return genericFontFamilyForScript(m_sansSerifFontFamilyMap, script);
81}
82
83const AtomicString& FontGenericFamilies::cursiveFontFamily(UScriptCode script) const
84{
85    return genericFontFamilyForScript(m_cursiveFontFamilyMap, script);
86}
87
88const AtomicString& FontGenericFamilies::fantasyFontFamily(UScriptCode script) const
89{
90    return genericFontFamilyForScript(m_fantasyFontFamilyMap, script);
91}
92
93const AtomicString& FontGenericFamilies::pictographFontFamily(UScriptCode script) const
94{
95    return genericFontFamilyForScript(m_pictographFontFamilyMap, script);
96}
97
98bool FontGenericFamilies::setStandardFontFamily(const AtomicString& family, UScriptCode script)
99{
100    return setGenericFontFamilyForScript(m_standardFontFamilyMap, family, script);
101}
102
103bool FontGenericFamilies::setFixedFontFamily(const AtomicString& family, UScriptCode script)
104{
105    return setGenericFontFamilyForScript(m_fixedFontFamilyMap, family, script);
106}
107
108bool FontGenericFamilies::setSerifFontFamily(const AtomicString& family, UScriptCode script)
109{
110    return setGenericFontFamilyForScript(m_serifFontFamilyMap, family, script);
111}
112
113bool FontGenericFamilies::setSansSerifFontFamily(const AtomicString& family, UScriptCode script)
114{
115    return setGenericFontFamilyForScript(m_sansSerifFontFamilyMap, family, script);
116}
117
118bool FontGenericFamilies::setCursiveFontFamily(const AtomicString& family, UScriptCode script)
119{
120    return setGenericFontFamilyForScript(m_cursiveFontFamilyMap, family, script);
121}
122
123bool FontGenericFamilies::setFantasyFontFamily(const AtomicString& family, UScriptCode script)
124{
125    return setGenericFontFamilyForScript(m_fantasyFontFamilyMap, family, script);
126}
127
128bool FontGenericFamilies::setPictographFontFamily(const AtomicString& family, UScriptCode script)
129{
130    return setGenericFontFamilyForScript(m_pictographFontFamilyMap, family, script);
131}
132
133}
134