1 /*
2 * Copyright (c) 2006, 2007, 2008, 2009 Google 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 are
6 * met:
7 *
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #include "config.h"
32 #include "FontCache.h"
33
34 #include "Font.h"
35 #include "FontDescription.h"
36 #include "FontPlatformData.h"
37 #include "Logging.h"
38 #include "NotImplemented.h"
39 #include "PlatformBridge.h"
40 #include "SimpleFontData.h"
41
42 #include "SkPaint.h"
43 #include "SkTypeface.h"
44 #include "SkUtils.h"
45
46 #include <unicode/locid.h>
47 #include <wtf/Assertions.h>
48 #include <wtf/text/AtomicString.h>
49 #include <wtf/text/CString.h>
50
51 namespace WebCore {
52
platformInit()53 void FontCache::platformInit()
54 {
55 }
56
getFontDataForCharacters(const Font & font,const UChar * characters,int length)57 const SimpleFontData* FontCache::getFontDataForCharacters(const Font& font,
58 const UChar* characters,
59 int length)
60 {
61 icu::Locale locale = icu::Locale::getDefault();
62 String family = PlatformBridge::getFontFamilyForCharacters(characters, length, locale.getLanguage());
63 if (family.isEmpty())
64 return 0;
65
66 AtomicString atomicFamily(family);
67 return getCachedFontData(getCachedFontPlatformData(font.fontDescription(), atomicFamily, false));
68 }
69
getSimilarFontPlatformData(const Font & font)70 SimpleFontData* FontCache::getSimilarFontPlatformData(const Font& font)
71 {
72 return 0;
73 }
74
getLastResortFallbackFont(const FontDescription & description)75 SimpleFontData* FontCache::getLastResortFallbackFont(const FontDescription& description)
76 {
77 static const AtomicString sansStr("Sans");
78 static const AtomicString serifStr("Serif");
79 static const AtomicString monospaceStr("Monospace");
80
81 FontPlatformData* fontPlatformData = 0;
82 switch (description.genericFamily()) {
83 case FontDescription::SerifFamily:
84 fontPlatformData = getCachedFontPlatformData(description, serifStr);
85 break;
86 case FontDescription::MonospaceFamily:
87 fontPlatformData = getCachedFontPlatformData(description, monospaceStr);
88 break;
89 case FontDescription::SansSerifFamily:
90 default:
91 fontPlatformData = getCachedFontPlatformData(description, sansStr);
92 break;
93 }
94
95 ASSERT(fontPlatformData);
96 return getCachedFontData(fontPlatformData);
97 }
98
getTraitsInFamily(const AtomicString & familyName,Vector<unsigned> & traitsMasks)99 void FontCache::getTraitsInFamily(const AtomicString& familyName,
100 Vector<unsigned>& traitsMasks)
101 {
102 notImplemented();
103 }
104
createFontPlatformData(const FontDescription & fontDescription,const AtomicString & family)105 FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription,
106 const AtomicString& family)
107 {
108 const char* name = 0;
109 CString s;
110
111 // If we're creating a fallback font (e.g. "-webkit-monospace"), convert the name into
112 // the fallback name (like "monospace") that fontconfig understands.
113 if (!family.length() || family.startsWith("-webkit-")) {
114 static const struct {
115 FontDescription::GenericFamilyType mType;
116 const char* mName;
117 } fontDescriptions[] = {
118 { FontDescription::SerifFamily, "serif" },
119 { FontDescription::SansSerifFamily, "sans-serif" },
120 { FontDescription::MonospaceFamily, "monospace" },
121 { FontDescription::CursiveFamily, "cursive" },
122 { FontDescription::FantasyFamily, "fantasy" }
123 };
124
125 FontDescription::GenericFamilyType type = fontDescription.genericFamily();
126 for (unsigned i = 0; i < SK_ARRAY_COUNT(fontDescriptions); i++) {
127 if (type == fontDescriptions[i].mType) {
128 name = fontDescriptions[i].mName;
129 break;
130 }
131 }
132 if (!name)
133 name = "";
134 } else {
135 // convert the name to utf8
136 s = family.string().utf8();
137 name = s.data();
138 }
139
140 int style = SkTypeface::kNormal;
141 if (fontDescription.weight() >= FontWeightBold)
142 style |= SkTypeface::kBold;
143 if (fontDescription.italic())
144 style |= SkTypeface::kItalic;
145
146 SkTypeface* tf = SkTypeface::CreateFromName(name, static_cast<SkTypeface::Style>(style));
147 if (!tf)
148 return 0;
149
150 FontPlatformData* result =
151 new FontPlatformData(tf,
152 name,
153 fontDescription.computedSize(),
154 (style & SkTypeface::kBold) && !tf->isBold(),
155 (style & SkTypeface::kItalic) && !tf->isItalic(),
156 fontDescription.orientation(),
157 fontDescription.textOrientation());
158 tf->unref();
159 return result;
160 }
161
162 } // namespace WebCore
163