| 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 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 if (!gFontPlatformDataCache) | 190 if (!gFontPlatformDataCache) |
| 191 return; | 191 return; |
| 192 | 192 |
| 193 Vector<FontCacheKey> keysToRemove; | 193 Vector<FontCacheKey> keysToRemove; |
| 194 keysToRemove.reserveInitialCapacity(gFontPlatformDataCache->size()); | 194 keysToRemove.reserveInitialCapacity(gFontPlatformDataCache->size()); |
| 195 FontPlatformDataCache::iterator platformDataEnd = gFontPlatformDataCache->en
d(); | 195 FontPlatformDataCache::iterator platformDataEnd = gFontPlatformDataCache->en
d(); |
| 196 for (FontPlatformDataCache::iterator platformData = gFontPlatformDataCache->
begin(); platformData != platformDataEnd; ++platformData) { | 196 for (FontPlatformDataCache::iterator platformData = gFontPlatformDataCache->
begin(); platformData != platformDataEnd; ++platformData) { |
| 197 if (platformData->value && !gFontDataCache->contains(platformData->value
.get())) | 197 if (platformData->value && !gFontDataCache->contains(platformData->value
.get())) |
| 198 keysToRemove.append(platformData->key); | 198 keysToRemove.append(platformData->key); |
| 199 } | 199 } |
| 200 | 200 gFontPlatformDataCache->removeAll(keysToRemove); |
| 201 size_t keysToRemoveCount = keysToRemove.size(); | |
| 202 for (size_t i = 0; i < keysToRemoveCount; ++i) | |
| 203 gFontPlatformDataCache->remove(keysToRemove[i]); | |
| 204 } | 201 } |
| 205 | 202 |
| 206 static inline void purgeFontVerticalDataCache() | 203 static inline void purgeFontVerticalDataCache() |
| 207 { | 204 { |
| 208 #if ENABLE(OPENTYPE_VERTICAL) | 205 #if ENABLE(OPENTYPE_VERTICAL) |
| 209 FontVerticalDataCache& fontVerticalDataCache = fontVerticalDataCacheInstance
(); | 206 FontVerticalDataCache& fontVerticalDataCache = fontVerticalDataCacheInstance
(); |
| 210 if (!fontVerticalDataCache.isEmpty()) { | 207 if (!fontVerticalDataCache.isEmpty()) { |
| 211 // Mark & sweep unused verticalData | 208 // Mark & sweep unused verticalData |
| 212 FontVerticalDataCache::iterator verticalDataEnd = fontVerticalDataCache.
end(); | 209 FontVerticalDataCache::iterator verticalDataEnd = fontVerticalDataCache.
end(); |
| 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) | 211 if (verticalData->value) |
| 215 verticalData->value->setInFontCache(false); | 212 verticalData->value->setInFontCache(false); |
| 216 } | 213 } |
| 217 | 214 |
| 218 gFontDataCache->markAllVerticalData(); | 215 gFontDataCache->markAllVerticalData(); |
| 219 | 216 |
| 220 Vector<FontCache::FontFileKey> keysToRemove; | 217 Vector<FontCache::FontFileKey> keysToRemove; |
| 221 keysToRemove.reserveInitialCapacity(fontVerticalDataCache.size()); | 218 keysToRemove.reserveInitialCapacity(fontVerticalDataCache.size()); |
| 222 for (FontVerticalDataCache::iterator verticalData = fontVerticalDataCach
e.begin(); verticalData != verticalDataEnd; ++verticalData) { | 219 for (FontVerticalDataCache::iterator verticalData = fontVerticalDataCach
e.begin(); verticalData != verticalDataEnd; ++verticalData) { |
| 223 if (!verticalData->value || !verticalData->value->inFontCache()) | 220 if (!verticalData->value || !verticalData->value->inFontCache()) |
| 224 keysToRemove.append(verticalData->key); | 221 keysToRemove.append(verticalData->key); |
| 225 } | 222 } |
| 226 for (size_t i = 0, count = keysToRemove.size(); i < count; ++i) | 223 fontVerticalDataCache.removeAll(keysToRemove); |
| 227 fontVerticalDataCache.take(keysToRemove[i]); | |
| 228 } | 224 } |
| 229 #endif | 225 #endif |
| 230 } | 226 } |
| 231 | 227 |
| 232 void FontCache::purge(PurgeSeverity PurgeSeverity) | 228 void FontCache::purge(PurgeSeverity PurgeSeverity) |
| 233 { | 229 { |
| 234 // We should never be forcing the purge while the FontCachePurgePreventer is
in scope. | 230 // We should never be forcing the purge while the FontCachePurgePreventer is
in scope. |
| 235 ASSERT(!m_purgePreventCount || PurgeSeverity == PurgeIfNeeded); | 231 ASSERT(!m_purgePreventCount || PurgeSeverity == PurgeIfNeeded); |
| 236 if (m_purgePreventCount) | 232 if (m_purgePreventCount) |
| 237 return; | 233 return; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 clients.append(*it); | 295 clients.append(*it); |
| 300 | 296 |
| 301 ASSERT(numClients == clients.size()); | 297 ASSERT(numClients == clients.size()); |
| 302 for (size_t i = 0; i < numClients; ++i) | 298 for (size_t i = 0; i < numClients; ++i) |
| 303 clients[i]->fontCacheInvalidated(); | 299 clients[i]->fontCacheInvalidated(); |
| 304 | 300 |
| 305 purge(ForcePurge); | 301 purge(ForcePurge); |
| 306 } | 302 } |
| 307 | 303 |
| 308 } // namespace WebCore | 304 } // namespace WebCore |
| OLD | NEW |