OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. |
3 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> | 3 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> |
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 * | 8 * |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 FontFaceCreationParams createByAlternateFamily(alternateName); | 107 FontFaceCreationParams createByAlternateFamily(alternateName); |
108 result = getFontPlatformData(fontDescription, createByAlternateFamil
y, true); | 108 result = getFontPlatformData(fontDescription, createByAlternateFamil
y, true); |
109 } | 109 } |
110 if (result) | 110 if (result) |
111 gFontPlatformDataCache->set(key, adoptPtr(new FontPlatformData(*resu
lt))); // Cache the result under the old name. | 111 gFontPlatformDataCache->set(key, adoptPtr(new FontPlatformData(*resu
lt))); // Cache the result under the old name. |
112 } | 112 } |
113 | 113 |
114 return result; | 114 return result; |
115 } | 115 } |
116 | 116 |
117 #if ENABLE(OPENTYPE_VERTICAL) | |
118 typedef HashMap<FontCache::FontFileKey, RefPtr<OpenTypeVerticalData>, IntHash<Fo
ntCache::FontFileKey>, UnsignedWithZeroKeyHashTraits<FontCache::FontFileKey> > F
ontVerticalDataCache; | 117 typedef HashMap<FontCache::FontFileKey, RefPtr<OpenTypeVerticalData>, IntHash<Fo
ntCache::FontFileKey>, UnsignedWithZeroKeyHashTraits<FontCache::FontFileKey> > F
ontVerticalDataCache; |
119 | 118 |
120 FontVerticalDataCache& fontVerticalDataCacheInstance() | 119 FontVerticalDataCache& fontVerticalDataCacheInstance() |
121 { | 120 { |
122 DEFINE_STATIC_LOCAL(FontVerticalDataCache, fontVerticalDataCache, ()); | 121 DEFINE_STATIC_LOCAL(FontVerticalDataCache, fontVerticalDataCache, ()); |
123 return fontVerticalDataCache; | 122 return fontVerticalDataCache; |
124 } | 123 } |
125 | 124 |
126 PassRefPtr<OpenTypeVerticalData> FontCache::getVerticalData(const FontFileKey& k
ey, const FontPlatformData& platformData) | 125 PassRefPtr<OpenTypeVerticalData> FontCache::getVerticalData(const FontFileKey& k
ey, const FontPlatformData& platformData) |
127 { | 126 { |
128 FontVerticalDataCache& fontVerticalDataCache = fontVerticalDataCacheInstance
(); | 127 FontVerticalDataCache& fontVerticalDataCache = fontVerticalDataCacheInstance
(); |
129 FontVerticalDataCache::iterator result = fontVerticalDataCache.find(key); | 128 FontVerticalDataCache::iterator result = fontVerticalDataCache.find(key); |
130 if (result != fontVerticalDataCache.end()) | 129 if (result != fontVerticalDataCache.end()) |
131 return result.get()->value; | 130 return result.get()->value; |
132 | 131 |
133 RefPtr<OpenTypeVerticalData> verticalData = OpenTypeVerticalData::create(pla
tformData); | 132 RefPtr<OpenTypeVerticalData> verticalData = OpenTypeVerticalData::create(pla
tformData); |
134 if (!verticalData->isOpenType()) | 133 if (!verticalData->isOpenType()) |
135 verticalData.clear(); | 134 verticalData.clear(); |
136 fontVerticalDataCache.set(key, verticalData); | 135 fontVerticalDataCache.set(key, verticalData); |
137 return verticalData; | 136 return verticalData; |
138 } | 137 } |
139 #endif | |
140 | 138 |
141 static FontDataCache* gFontDataCache = 0; | 139 static FontDataCache* gFontDataCache = 0; |
142 | 140 |
143 PassRefPtr<SimpleFontData> FontCache::getFontData(const FontDescription& fontDes
cription, const AtomicString& family, bool checkingAlternateName, ShouldRetain s
houldRetain) | 141 PassRefPtr<SimpleFontData> FontCache::getFontData(const FontDescription& fontDes
cription, const AtomicString& family, bool checkingAlternateName, ShouldRetain s
houldRetain) |
144 { | 142 { |
145 if (FontPlatformData* platformData = getFontPlatformData(fontDescription, Fo
ntFaceCreationParams(adjustFamilyNameToAvoidUnsupportedFonts(family)), checkingA
lternateName)) | 143 if (FontPlatformData* platformData = getFontPlatformData(fontDescription, Fo
ntFaceCreationParams(adjustFamilyNameToAvoidUnsupportedFonts(family)), checkingA
lternateName)) |
146 return fontDataFromFontPlatformData(platformData, shouldRetain); | 144 return fontDataFromFontPlatformData(platformData, shouldRetain); |
147 | 145 |
148 return nullptr; | 146 return nullptr; |
149 } | 147 } |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 FontPlatformDataCache::iterator platformDataEnd = gFontPlatformDataCache->en
d(); | 187 FontPlatformDataCache::iterator platformDataEnd = gFontPlatformDataCache->en
d(); |
190 for (FontPlatformDataCache::iterator platformData = gFontPlatformDataCache->
begin(); platformData != platformDataEnd; ++platformData) { | 188 for (FontPlatformDataCache::iterator platformData = gFontPlatformDataCache->
begin(); platformData != platformDataEnd; ++platformData) { |
191 if (platformData->value && !gFontDataCache->contains(platformData->value
.get())) | 189 if (platformData->value && !gFontDataCache->contains(platformData->value
.get())) |
192 keysToRemove.append(platformData->key); | 190 keysToRemove.append(platformData->key); |
193 } | 191 } |
194 gFontPlatformDataCache->removeAll(keysToRemove); | 192 gFontPlatformDataCache->removeAll(keysToRemove); |
195 } | 193 } |
196 | 194 |
197 static inline void purgeFontVerticalDataCache() | 195 static inline void purgeFontVerticalDataCache() |
198 { | 196 { |
199 #if ENABLE(OPENTYPE_VERTICAL) | |
200 FontVerticalDataCache& fontVerticalDataCache = fontVerticalDataCacheInstance
(); | 197 FontVerticalDataCache& fontVerticalDataCache = fontVerticalDataCacheInstance
(); |
201 if (!fontVerticalDataCache.isEmpty()) { | 198 if (!fontVerticalDataCache.isEmpty()) { |
202 // Mark & sweep unused verticalData | 199 // Mark & sweep unused verticalData |
203 FontVerticalDataCache::iterator verticalDataEnd = fontVerticalDataCache.
end(); | 200 FontVerticalDataCache::iterator verticalDataEnd = fontVerticalDataCache.
end(); |
204 for (FontVerticalDataCache::iterator verticalData = fontVerticalDataCach
e.begin(); verticalData != verticalDataEnd; ++verticalData) { | 201 for (FontVerticalDataCache::iterator verticalData = fontVerticalDataCach
e.begin(); verticalData != verticalDataEnd; ++verticalData) { |
205 if (verticalData->value) | 202 if (verticalData->value) |
206 verticalData->value->setInFontCache(false); | 203 verticalData->value->setInFontCache(false); |
207 } | 204 } |
208 | 205 |
209 gFontDataCache->markAllVerticalData(); | 206 gFontDataCache->markAllVerticalData(); |
210 | 207 |
211 Vector<FontCache::FontFileKey> keysToRemove; | 208 Vector<FontCache::FontFileKey> keysToRemove; |
212 keysToRemove.reserveInitialCapacity(fontVerticalDataCache.size()); | 209 keysToRemove.reserveInitialCapacity(fontVerticalDataCache.size()); |
213 for (FontVerticalDataCache::iterator verticalData = fontVerticalDataCach
e.begin(); verticalData != verticalDataEnd; ++verticalData) { | 210 for (FontVerticalDataCache::iterator verticalData = fontVerticalDataCach
e.begin(); verticalData != verticalDataEnd; ++verticalData) { |
214 if (!verticalData->value || !verticalData->value->inFontCache()) | 211 if (!verticalData->value || !verticalData->value->inFontCache()) |
215 keysToRemove.append(verticalData->key); | 212 keysToRemove.append(verticalData->key); |
216 } | 213 } |
217 fontVerticalDataCache.removeAll(keysToRemove); | 214 fontVerticalDataCache.removeAll(keysToRemove); |
218 } | 215 } |
219 #endif | |
220 } | 216 } |
221 | 217 |
222 void FontCache::purge(PurgeSeverity PurgeSeverity) | 218 void FontCache::purge(PurgeSeverity PurgeSeverity) |
223 { | 219 { |
224 // We should never be forcing the purge while the FontCachePurgePreventer is
in scope. | 220 // We should never be forcing the purge while the FontCachePurgePreventer is
in scope. |
225 ASSERT(!m_purgePreventCount || PurgeSeverity == PurgeIfNeeded); | 221 ASSERT(!m_purgePreventCount || PurgeSeverity == PurgeIfNeeded); |
226 if (m_purgePreventCount) | 222 if (m_purgePreventCount) |
227 return; | 223 return; |
228 | 224 |
229 if (!gFontDataCache || !gFontDataCache->purge(PurgeSeverity)) | 225 if (!gFontDataCache || !gFontDataCache->purge(PurgeSeverity)) |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 clients.append(*it); | 281 clients.append(*it); |
286 | 282 |
287 ASSERT(numClients == clients.size()); | 283 ASSERT(numClients == clients.size()); |
288 for (size_t i = 0; i < numClients; ++i) | 284 for (size_t i = 0; i < numClients; ++i) |
289 clients[i]->fontCacheInvalidated(); | 285 clients[i]->fontCacheInvalidated(); |
290 | 286 |
291 purge(ForcePurge); | 287 purge(ForcePurge); |
292 } | 288 } |
293 | 289 |
294 } // namespace blink | 290 } // namespace blink |
OLD | NEW |