| 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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 bool FontCache::s_useSubpixelPositioning = false; | 70 bool FontCache::s_useSubpixelPositioning = false; |
| 71 #endif // OS(WIN) | 71 #endif // OS(WIN) |
| 72 | 72 |
| 73 FontCache* FontCache::fontCache() | 73 FontCache* FontCache::fontCache() |
| 74 { | 74 { |
| 75 DEFINE_STATIC_LOCAL(FontCache, globalFontCache, ()); | 75 DEFINE_STATIC_LOCAL(FontCache, globalFontCache, ()); |
| 76 return &globalFontCache; | 76 return &globalFontCache; |
| 77 } | 77 } |
| 78 | 78 |
| 79 FontPlatformData* FontCache::getFontPlatformData(const FontDescription& fontDesc
ription, | 79 FontPlatformData* FontCache::getFontPlatformData(const FontDescription& fontDesc
ription, |
| 80 const AtomicString& passedFamilyName, bool checkingAlternateName) | 80 const FontFaceCreationParams& creationParams, bool checkingAlternateName) |
| 81 { | 81 { |
| 82 #if OS(WIN) && ENABLE(OPENTYPE_VERTICAL) | |
| 83 // Leading "@" in the font name enables Windows vertical flow flag for the f
ont. | |
| 84 // Because we do vertical flow by ourselves, we don't want to use the Window
s feature. | |
| 85 // IE disregards "@" regardless of the orientatoin, so we follow the behavio
r. | |
| 86 const AtomicString& familyName = (passedFamilyName.isEmpty() || passedFamily
Name[0] != '@') ? | |
| 87 passedFamilyName : AtomicString(passedFamilyName.impl()->substring(1)); | |
| 88 #else | |
| 89 const AtomicString& familyName = passedFamilyName; | |
| 90 #endif | |
| 91 | |
| 92 if (!gFontPlatformDataCache) { | 82 if (!gFontPlatformDataCache) { |
| 93 gFontPlatformDataCache = new FontPlatformDataCache; | 83 gFontPlatformDataCache = new FontPlatformDataCache; |
| 94 platformInit(); | 84 platformInit(); |
| 95 } | 85 } |
| 96 | 86 |
| 97 FontCacheKey key = fontDescription.cacheKey(familyName); | 87 FontCacheKey key = fontDescription.cacheKey(creationParams); |
| 98 FontPlatformData* result = 0; | 88 FontPlatformData* result = 0; |
| 99 bool foundResult; | 89 bool foundResult; |
| 100 FontPlatformDataCache::iterator it = gFontPlatformDataCache->find(key); | 90 FontPlatformDataCache::iterator it = gFontPlatformDataCache->find(key); |
| 101 if (it == gFontPlatformDataCache->end()) { | 91 if (it == gFontPlatformDataCache->end()) { |
| 102 result = createFontPlatformData(fontDescription, familyName, fontDescrip
tion.effectiveFontSize()); | 92 result = createFontPlatformData(fontDescription, creationParams, fontDes
cription.effectiveFontSize()); |
| 103 gFontPlatformDataCache->set(key, adoptPtr(result)); | 93 gFontPlatformDataCache->set(key, adoptPtr(result)); |
| 104 foundResult = result; | 94 foundResult = result; |
| 105 } else { | 95 } else { |
| 106 result = it->value.get(); | 96 result = it->value.get(); |
| 107 foundResult = true; | 97 foundResult = true; |
| 108 } | 98 } |
| 109 | 99 |
| 110 if (!foundResult && !checkingAlternateName) { | 100 if (!foundResult && !checkingAlternateName && creationParams.creationType()
== CreateFontByFamily) { |
| 111 // We were unable to find a font. We have a small set of fonts that we a
lias to other names, | 101 // We were unable to find a font. We have a small set of fonts that we a
lias to other names, |
| 112 // e.g., Arial/Helvetica, Courier/Courier New, etc. Try looking up the f
ont under the aliased name. | 102 // e.g., Arial/Helvetica, Courier/Courier New, etc. Try looking up the f
ont under the aliased name. |
| 113 const AtomicString& alternateName = alternateFamilyName(familyName); | 103 const AtomicString& alternateName = alternateFamilyName(creationParams.f
amily()); |
| 114 if (!alternateName.isEmpty()) | 104 if (!alternateName.isEmpty()) { |
| 115 result = getFontPlatformData(fontDescription, alternateName, true); | 105 FontFaceCreationParams createByAlternateFamily(alternateName); |
| 106 result = getFontPlatformData(fontDescription, createByAlternateFamil
y, true); |
| 107 } |
| 116 if (result) | 108 if (result) |
| 117 gFontPlatformDataCache->set(key, adoptPtr(new FontPlatformData(*resu
lt))); // Cache the result under the old name. | 109 gFontPlatformDataCache->set(key, adoptPtr(new FontPlatformData(*resu
lt))); // Cache the result under the old name. |
| 118 } | 110 } |
| 119 | 111 |
| 120 return result; | 112 return result; |
| 121 } | 113 } |
| 122 | 114 |
| 123 #if ENABLE(OPENTYPE_VERTICAL) | 115 #if ENABLE(OPENTYPE_VERTICAL) |
| 124 typedef HashMap<FontCache::FontFileKey, RefPtr<OpenTypeVerticalData>, WTF::IntHa
sh<FontCache::FontFileKey>, WTF::UnsignedWithZeroKeyHashTraits<FontCache::FontFi
leKey> > FontVerticalDataCache; | 116 typedef HashMap<FontCache::FontFileKey, RefPtr<OpenTypeVerticalData>, WTF::IntHa
sh<FontCache::FontFileKey>, WTF::UnsignedWithZeroKeyHashTraits<FontCache::FontFi
leKey> > FontVerticalDataCache; |
| 125 | 117 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 141 verticalData.clear(); | 133 verticalData.clear(); |
| 142 fontVerticalDataCache.set(key, verticalData); | 134 fontVerticalDataCache.set(key, verticalData); |
| 143 return verticalData; | 135 return verticalData; |
| 144 } | 136 } |
| 145 #endif | 137 #endif |
| 146 | 138 |
| 147 static FontDataCache* gFontDataCache = 0; | 139 static FontDataCache* gFontDataCache = 0; |
| 148 | 140 |
| 149 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) |
| 150 { | 142 { |
| 151 if (FontPlatformData* platformData = getFontPlatformData(fontDescription, ad
justFamilyNameToAvoidUnsupportedFonts(family), checkingAlternateName)) | 143 if (FontPlatformData* platformData = getFontPlatformData(fontDescription, Fo
ntFaceCreationParams(adjustFamilyNameToAvoidUnsupportedFonts(family)), checkingA
lternateName)) |
| 152 return fontDataFromFontPlatformData(platformData, shouldRetain); | 144 return fontDataFromFontPlatformData(platformData, shouldRetain); |
| 153 | 145 |
| 154 return nullptr; | 146 return nullptr; |
| 155 } | 147 } |
| 156 | 148 |
| 157 PassRefPtr<SimpleFontData> FontCache::fontDataFromFontPlatformData(const FontPla
tformData* platformData, ShouldRetain shouldRetain) | 149 PassRefPtr<SimpleFontData> FontCache::fontDataFromFontPlatformData(const FontPla
tformData* platformData, ShouldRetain shouldRetain) |
| 158 { | 150 { |
| 159 if (!gFontDataCache) | 151 if (!gFontDataCache) |
| 160 gFontDataCache = new FontDataCache; | 152 gFontDataCache = new FontDataCache; |
| 161 | 153 |
| 162 #if ASSERT_ENABLED | 154 #if ASSERT_ENABLED |
| 163 if (shouldRetain == DoNotRetain) | 155 if (shouldRetain == DoNotRetain) |
| 164 ASSERT(m_purgePreventCount); | 156 ASSERT(m_purgePreventCount); |
| 165 #endif | 157 #endif |
| 166 | 158 |
| 167 return gFontDataCache->get(platformData, shouldRetain); | 159 return gFontDataCache->get(platformData, shouldRetain); |
| 168 } | 160 } |
| 169 | 161 |
| 170 bool FontCache::isPlatformFontAvailable(const FontDescription& fontDescription,
const AtomicString& family) | 162 bool FontCache::isPlatformFontAvailable(const FontDescription& fontDescription,
const AtomicString& family) |
| 171 { | 163 { |
| 172 bool checkingAlternateName = true; | 164 bool checkingAlternateName = true; |
| 173 return getFontPlatformData(fontDescription, adjustFamilyNameToAvoidUnsupport
edFonts(family), checkingAlternateName); | 165 return getFontPlatformData(fontDescription, FontFaceCreationParams(adjustFam
ilyNameToAvoidUnsupportedFonts(family)), checkingAlternateName); |
| 174 } | 166 } |
| 175 | 167 |
| 176 SimpleFontData* FontCache::getNonRetainedLastResortFallbackFont(const FontDescri
ption& fontDescription) | 168 SimpleFontData* FontCache::getNonRetainedLastResortFallbackFont(const FontDescri
ption& fontDescription) |
| 177 { | 169 { |
| 178 return getLastResortFallbackFont(fontDescription, DoNotRetain).leakRef(); | 170 return getLastResortFallbackFont(fontDescription, DoNotRetain).leakRef(); |
| 179 } | 171 } |
| 180 | 172 |
| 181 void FontCache::releaseFontData(const SimpleFontData* fontData) | 173 void FontCache::releaseFontData(const SimpleFontData* fontData) |
| 182 { | 174 { |
| 183 ASSERT(gFontDataCache); | 175 ASSERT(gFontDataCache); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 clients.append(*it); | 287 clients.append(*it); |
| 296 | 288 |
| 297 ASSERT(numClients == clients.size()); | 289 ASSERT(numClients == clients.size()); |
| 298 for (size_t i = 0; i < numClients; ++i) | 290 for (size_t i = 0; i < numClients; ++i) |
| 299 clients[i]->fontCacheInvalidated(); | 291 clients[i]->fontCacheInvalidated(); |
| 300 | 292 |
| 301 purge(ForcePurge); | 293 purge(ForcePurge); |
| 302 } | 294 } |
| 303 | 295 |
| 304 } // namespace WebCore | 296 } // namespace WebCore |
| OLD | NEW |