OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2007, 2008, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2008, 2011 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 m_sources.removeFirst(); | 119 m_sources.removeFirst(); |
120 } | 120 } |
121 | 121 |
122 if (loadStatus() == FontFace::Unloaded) | 122 if (loadStatus() == FontFace::Unloaded) |
123 setLoadStatus(FontFace::Loading); | 123 setLoadStatus(FontFace::Loading); |
124 if (loadStatus() == FontFace::Loading) | 124 if (loadStatus() == FontFace::Loading) |
125 setLoadStatus(FontFace::Error); | 125 setLoadStatus(FontFace::Error); |
126 return nullptr; | 126 return nullptr; |
127 } | 127 } |
128 | 128 |
129 void CSSFontFace::willUseFontData(const FontDescription& fontDescription) | 129 bool CSSFontFace::maybeScheduleFontLoad(const FontDescription& fontDescription,
UChar32 character) |
130 { | 130 { |
131 // Kicks off font load here only if the @font-face has no unicode-range. | 131 if (m_ranges.contains(character)) { |
132 // @font-faces with unicode-range will be loaded when a GlyphPage for the | |
133 // font is created. | |
134 // FIXME: Pass around the text to render from RenderText, and kick download | |
135 // if m_ranges intersects with the text. Make sure this does not cause | |
136 // performance regression. | |
137 if (m_ranges.isEntireRange()) | |
138 load(fontDescription); | 132 load(fontDescription); |
| 133 return true; |
| 134 } |
| 135 return false; |
139 } | 136 } |
140 | 137 |
141 void CSSFontFace::load(const FontDescription& fontDescription, CSSFontSelector*
fontSelector) | 138 void CSSFontFace::load(const FontDescription& fontDescription, CSSFontSelector*
fontSelector) |
142 { | 139 { |
143 if (loadStatus() != FontFace::Unloaded) | 140 if (loadStatus() != FontFace::Unloaded) |
144 return; | 141 return; |
145 setLoadStatus(FontFace::Loading); | 142 setLoadStatus(FontFace::Loading); |
146 | 143 |
147 while (!m_sources.isEmpty()) { | 144 while (!m_sources.isEmpty()) { |
148 OwnPtr<CSSFontFaceSource>& source = m_sources.first(); | 145 OwnPtr<CSSFontFaceSource>& source = m_sources.first(); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 } else { | 207 } else { |
211 m_ranges[targetIndex++] = UnicodeRange(from, to); | 208 m_ranges[targetIndex++] = UnicodeRange(from, to); |
212 from = m_ranges[i].from(); | 209 from = m_ranges[i].from(); |
213 to = m_ranges[i].to(); | 210 to = m_ranges[i].to(); |
214 } | 211 } |
215 } | 212 } |
216 m_ranges[targetIndex++] = UnicodeRange(from, to); | 213 m_ranges[targetIndex++] = UnicodeRange(from, to); |
217 m_ranges.shrink(targetIndex); | 214 m_ranges.shrink(targetIndex); |
218 } | 215 } |
219 | 216 |
| 217 bool CSSFontFace::UnicodeRangeSet::contains(UChar32 c) const |
| 218 { |
| 219 if (isEntireRange()) |
| 220 return true; |
| 221 Vector<UnicodeRange>::const_iterator it = std::lower_bound(m_ranges.begin(),
m_ranges.end(), c); |
| 222 return it != m_ranges.end() && it->contains(c); |
| 223 } |
| 224 |
220 bool CSSFontFace::UnicodeRangeSet::intersectsWith(const String& text) const | 225 bool CSSFontFace::UnicodeRangeSet::intersectsWith(const String& text) const |
221 { | 226 { |
222 if (text.isEmpty()) | 227 if (text.isEmpty()) |
223 return false; | 228 return false; |
224 if (isEntireRange()) | 229 if (isEntireRange()) |
225 return true; | 230 return true; |
226 if (text.is8Bit() && m_ranges[0].from() >= 0x100) | 231 if (text.is8Bit() && m_ranges[0].from() >= 0x100) |
227 return false; | 232 return false; |
228 | 233 |
229 unsigned index = 0; | 234 unsigned index = 0; |
230 while (index < text.length()) { | 235 while (index < text.length()) { |
231 UChar32 c = text.characterStartingAt(index); | 236 UChar32 c = text.characterStartingAt(index); |
232 index += U16_LENGTH(c); | 237 index += U16_LENGTH(c); |
233 Vector<UnicodeRange>::const_iterator it = std::lower_bound(m_ranges.begi
n(), m_ranges.end(), c); | 238 if (contains(c)) |
234 if (it != m_ranges.end() && it->contains(c)) | |
235 return true; | 239 return true; |
236 } | 240 } |
237 return false; | 241 return false; |
238 } | 242 } |
239 | 243 |
240 void CSSFontFace::trace(Visitor* visitor) | 244 void CSSFontFace::trace(Visitor* visitor) |
241 { | 245 { |
242 visitor->trace(m_segmentedFontFace); | 246 visitor->trace(m_segmentedFontFace); |
243 visitor->trace(m_fontFace); | 247 visitor->trace(m_fontFace); |
244 } | 248 } |
245 | 249 |
246 } | 250 } |
OLD | NEW |