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