OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. |
3 * Copyright (C) 2009 Torch Mobile, Inc. | 3 * Copyright (C) 2009 Torch Mobile, Inc. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 18 matching lines...) Expand all Loading... |
29 | 29 |
30 #include "core/dom/TagCollection.h" | 30 #include "core/dom/TagCollection.h" |
31 #include "core/fetch/ResourceClientWalker.h" | 31 #include "core/fetch/ResourceClientWalker.h" |
32 #include "core/html/parser/TextResourceDecoder.h" | 32 #include "core/html/parser/TextResourceDecoder.h" |
33 #include "platform/SharedBuffer.h" | 33 #include "platform/SharedBuffer.h" |
34 #include "platform/fonts/FontCustomPlatformData.h" | 34 #include "platform/fonts/FontCustomPlatformData.h" |
35 #include "platform/fonts/FontPlatformData.h" | 35 #include "platform/fonts/FontPlatformData.h" |
36 #include "public/platform/Platform.h" | 36 #include "public/platform/Platform.h" |
37 #include "wtf/CurrentTime.h" | 37 #include "wtf/CurrentTime.h" |
38 | 38 |
39 #if ENABLE(SVG_FONTS) | |
40 #include "core/SVGNames.h" | |
41 #include "core/dom/XMLDocument.h" | |
42 #include "core/html/HTMLCollection.h" | |
43 #include "core/svg/SVGFontElement.h" | |
44 #endif | |
45 | |
46 namespace blink { | 39 namespace blink { |
47 | 40 |
48 static const double fontLoadWaitLimitSec = 3.0; | 41 static const double fontLoadWaitLimitSec = 3.0; |
49 | 42 |
50 enum FontPackageFormat { | 43 enum FontPackageFormat { |
51 PackageFormatUnknown, | 44 PackageFormatUnknown, |
52 PackageFormatSFNT, | 45 PackageFormatSFNT, |
53 PackageFormatWOFF, | 46 PackageFormatWOFF, |
54 PackageFormatWOFF2, | 47 PackageFormatWOFF2, |
55 PackageFormatSVG, | 48 PackageFormatSVG, |
(...skipping 24 matching lines...) Expand all Loading... |
80 , m_exceedsFontLoadWaitLimit(false) | 73 , m_exceedsFontLoadWaitLimit(false) |
81 , m_corsFailed(false) | 74 , m_corsFailed(false) |
82 , m_fontLoadWaitLimitTimer(this, &FontResource::fontLoadWaitLimitCallback) | 75 , m_fontLoadWaitLimitTimer(this, &FontResource::fontLoadWaitLimitCallback) |
83 { | 76 { |
84 } | 77 } |
85 | 78 |
86 FontResource::~FontResource() | 79 FontResource::~FontResource() |
87 { | 80 { |
88 } | 81 } |
89 | 82 |
90 void FontResource::trace(Visitor* visitor) | |
91 { | |
92 #if ENABLE(SVG_FONTS) | |
93 visitor->trace(m_externalSVGDocument); | |
94 #endif | |
95 Resource::trace(visitor); | |
96 } | |
97 | |
98 void FontResource::didScheduleLoad() | 83 void FontResource::didScheduleLoad() |
99 { | 84 { |
100 if (m_state == Unloaded) | 85 if (m_state == Unloaded) |
101 m_state = LoadScheduled; | 86 m_state = LoadScheduled; |
102 } | 87 } |
103 | 88 |
104 void FontResource::didUnscheduleLoad() | 89 void FontResource::didUnscheduleLoad() |
105 { | 90 { |
106 if (m_state == LoadScheduled) | 91 if (m_state == LoadScheduled) |
107 m_state = Unloaded; | 92 m_state = Unloaded; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 } else { | 131 } else { |
147 setStatus(DecodeError); | 132 setStatus(DecodeError); |
148 recordPackageFormatHistogram(PackageFormatUnknown); | 133 recordPackageFormatHistogram(PackageFormatUnknown); |
149 } | 134 } |
150 } | 135 } |
151 return m_fontData; | 136 return m_fontData; |
152 } | 137 } |
153 | 138 |
154 FontPlatformData FontResource::platformDataFromCustomData(float size, bool bold,
bool italic, FontOrientation orientation, FontWidthVariant widthVariant) | 139 FontPlatformData FontResource::platformDataFromCustomData(float size, bool bold,
bool italic, FontOrientation orientation, FontWidthVariant widthVariant) |
155 { | 140 { |
156 #if ENABLE(SVG_FONTS) | |
157 if (m_externalSVGDocument) | |
158 return FontPlatformData(size, bold, italic); | |
159 #endif | |
160 ASSERT(m_fontData); | 141 ASSERT(m_fontData); |
161 return m_fontData->fontPlatformData(size, bold, italic, orientation, widthVa
riant); | 142 return m_fontData->fontPlatformData(size, bold, italic, orientation, widthVa
riant); |
162 } | 143 } |
163 | 144 |
164 #if ENABLE(SVG_FONTS) | |
165 bool FontResource::ensureSVGFontData() | |
166 { | |
167 if (!m_externalSVGDocument && !errorOccurred() && !isLoading()) { | |
168 if (m_data) { | |
169 m_externalSVGDocument = XMLDocument::createSVG(); | |
170 | |
171 OwnPtr<TextResourceDecoder> decoder = TextResourceDecoder::create("a
pplication/xml"); | |
172 String svgSource = decoder->decode(m_data->data(), m_data->size()); | |
173 svgSource = svgSource + decoder->flush(); | |
174 | |
175 m_externalSVGDocument->setContent(svgSource); | |
176 | |
177 if (decoder->sawError()) | |
178 m_externalSVGDocument = nullptr; | |
179 } | |
180 if (m_externalSVGDocument) { | |
181 recordPackageFormatHistogram(PackageFormatSVG); | |
182 } else { | |
183 setStatus(DecodeError); | |
184 recordPackageFormatHistogram(PackageFormatUnknown); | |
185 } | |
186 } | |
187 | |
188 return m_externalSVGDocument; | |
189 } | |
190 | |
191 SVGFontElement* FontResource::getSVGFontById(const String& fontName) const | |
192 { | |
193 RefPtrWillBeRawPtr<TagCollection> collection = m_externalSVGDocument->getEle
mentsByTagNameNS(SVGNames::fontTag.namespaceURI(), SVGNames::fontTag.localName()
); | |
194 if (!collection) | |
195 return 0; | |
196 | |
197 unsigned collectionLength = collection->length(); | |
198 if (!collectionLength) | |
199 return 0; | |
200 | |
201 #if ENABLE(ASSERT) | |
202 for (unsigned i = 0; i < collectionLength; ++i) { | |
203 ASSERT(collection->item(i)); | |
204 ASSERT(isSVGFontElement(collection->item(i))); | |
205 } | |
206 #endif | |
207 | |
208 if (fontName.isEmpty()) | |
209 return toSVGFontElement(collection->item(0)); | |
210 | |
211 for (unsigned i = 0; i < collectionLength; ++i) { | |
212 SVGFontElement* element = toSVGFontElement(collection->item(i)); | |
213 if (element->getIdAttribute() == fontName) | |
214 return element; | |
215 } | |
216 | |
217 return 0; | |
218 } | |
219 #endif | |
220 | |
221 bool FontResource::isSafeToUnlock() const | 145 bool FontResource::isSafeToUnlock() const |
222 { | 146 { |
223 return m_data->hasOneRef(); | 147 return m_data->hasOneRef(); |
224 } | 148 } |
225 | 149 |
226 void FontResource::fontLoadWaitLimitCallback(Timer<FontResource>*) | 150 void FontResource::fontLoadWaitLimitCallback(Timer<FontResource>*) |
227 { | 151 { |
228 if (!isLoading()) | 152 if (!isLoading()) |
229 return; | 153 return; |
230 m_exceedsFontLoadWaitLimit = true; | 154 m_exceedsFontLoadWaitLimit = true; |
(...skipping 10 matching lines...) Expand all Loading... |
241 | 165 |
242 void FontResource::checkNotify() | 166 void FontResource::checkNotify() |
243 { | 167 { |
244 m_fontLoadWaitLimitTimer.stop(); | 168 m_fontLoadWaitLimitTimer.stop(); |
245 ResourceClientWalker<FontResourceClient> w(m_clients); | 169 ResourceClientWalker<FontResourceClient> w(m_clients); |
246 while (FontResourceClient* c = w.next()) | 170 while (FontResourceClient* c = w.next()) |
247 c->fontLoaded(this); | 171 c->fontLoaded(this); |
248 } | 172 } |
249 | 173 |
250 } | 174 } |
OLD | NEW |