| 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 * Copyright (C) 2013 Google Inc. All rights reserved. | 3 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 return; | 59 return; |
| 60 | 60 |
| 61 unsigned traitsMask = fontFace->traitsMask(); | 61 unsigned traitsMask = fontFace->traitsMask(); |
| 62 if (!traitsMask) | 62 if (!traitsMask) |
| 63 return; | 63 return; |
| 64 | 64 |
| 65 RefPtr<CSSFontFace> cssFontFace = fontFace->createCSSFontFace(cssFontSelecto
r->document()); | 65 RefPtr<CSSFontFace> cssFontFace = fontFace->createCSSFontFace(cssFontSelecto
r->document()); |
| 66 if (!cssFontFace || !cssFontFace->isValid()) | 66 if (!cssFontFace || !cssFontFace->isValid()) |
| 67 return; | 67 return; |
| 68 | 68 |
| 69 OwnPtr<HashMap<unsigned, RefPtr<CSSSegmentedFontFace> > >& familyFontFaces =
m_fontFaces.add(fontFace->family(), nullptr).iterator->value; | 69 if (!m_styleRuleToFontFace.add(fontFaceRule, cssFontFace).isNewEntry) |
| 70 return; |
| 71 |
| 72 OwnPtr<TraitsMap>& familyFontFaces = m_fontFaces.add(fontFace->family(), nul
lptr).iterator->value; |
| 70 if (!familyFontFaces) { | 73 if (!familyFontFaces) { |
| 71 familyFontFaces = adoptPtr(new HashMap<unsigned, RefPtr<CSSSegmentedFont
Face> >); | 74 familyFontFaces = adoptPtr(new TraitsMap); |
| 72 | 75 |
| 73 ASSERT(!m_locallyInstalledFontFaces.contains(fontFace->family())); | 76 ASSERT(!m_locallyInstalledFontFaces.contains(fontFace->family())); |
| 74 | 77 |
| 75 Vector<unsigned> locallyInstalledFontsTraitsMasks; | 78 Vector<unsigned> locallyInstalledFontsTraitsMasks; |
| 76 fontCache()->getTraitsInFamily(fontFace->family(), locallyInstalledFonts
TraitsMasks); | 79 fontCache()->getTraitsInFamily(fontFace->family(), locallyInstalledFonts
TraitsMasks); |
| 77 if (unsigned numLocallyInstalledFaces = locallyInstalledFontsTraitsMasks
.size()) { | 80 if (unsigned numLocallyInstalledFaces = locallyInstalledFontsTraitsMasks
.size()) { |
| 78 OwnPtr<Vector<RefPtr<CSSSegmentedFontFace> > > familyLocallyInstalle
dFaces = adoptPtr(new Vector<RefPtr<CSSSegmentedFontFace> >); | 81 OwnPtr<Vector<RefPtr<CSSSegmentedFontFace> > > familyLocallyInstalle
dFaces = adoptPtr(new Vector<RefPtr<CSSSegmentedFontFace> >); |
| 79 | 82 |
| 80 for (unsigned i = 0; i < numLocallyInstalledFaces; ++i) { | 83 for (unsigned i = 0; i < numLocallyInstalledFaces; ++i) { |
| 81 RefPtr<CSSFontFace> locallyInstalledFontFace = CSSFontFace::crea
te(0); | 84 RefPtr<CSSFontFace> locallyInstalledFontFace = CSSFontFace::crea
te(0); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 93 | 96 |
| 94 RefPtr<CSSSegmentedFontFace>& segmentedFontFace = familyFontFaces->add(trait
sMask, 0).iterator->value; | 97 RefPtr<CSSSegmentedFontFace>& segmentedFontFace = familyFontFaces->add(trait
sMask, 0).iterator->value; |
| 95 if (!segmentedFontFace) | 98 if (!segmentedFontFace) |
| 96 segmentedFontFace = CSSSegmentedFontFace::create(cssFontSelector, static
_cast<FontTraitsMask>(traitsMask), false); | 99 segmentedFontFace = CSSSegmentedFontFace::create(cssFontSelector, static
_cast<FontTraitsMask>(traitsMask), false); |
| 97 | 100 |
| 98 segmentedFontFace->appendFontFace(cssFontFace); | 101 segmentedFontFace->appendFontFace(cssFontFace); |
| 99 | 102 |
| 100 ++m_version; | 103 ++m_version; |
| 101 } | 104 } |
| 102 | 105 |
| 106 void CSSSegmentedFontFaceCache::removeFontFaceRule(const StyleRuleFontFace* font
FaceRule) |
| 107 { |
| 108 StyleRuleToFontFace::iterator styleRuleToFontFaceIter = m_styleRuleToFontFac
e.find(fontFaceRule); |
| 109 if (styleRuleToFontFaceIter == m_styleRuleToFontFace.end()) |
| 110 return; |
| 111 RefPtr<CSSFontFace> cssFontFace = styleRuleToFontFaceIter->value; |
| 112 |
| 113 ASSERT(cssFontFace->fontFace()); |
| 114 FamilyToTraitsMap::iterator fontFacesIter = m_fontFaces.find(cssFontFace->fo
ntFace()->family()); |
| 115 if (fontFacesIter == m_fontFaces.end()) |
| 116 return; |
| 117 TraitsMap* familyFontFaces = fontFacesIter->value.get(); |
| 118 |
| 119 TraitsMap::iterator familyFontFacesIter = familyFontFaces->find(cssFontFace-
>fontFace()->traitsMask()); |
| 120 if (familyFontFacesIter == familyFontFaces->end()) |
| 121 return; |
| 122 RefPtr<CSSSegmentedFontFace> segmentedFontFace = familyFontFacesIter->value; |
| 123 |
| 124 segmentedFontFace->removeFontFace(cssFontFace); |
| 125 if (segmentedFontFace->isEmpty()) { |
| 126 familyFontFaces->remove(familyFontFacesIter); |
| 127 if (familyFontFaces->isEmpty()) { |
| 128 m_fontFaces.remove(fontFacesIter); |
| 129 m_locallyInstalledFontFaces.remove(cssFontFace->fontFace()->family()
); |
| 130 } |
| 131 } |
| 132 m_styleRuleToFontFace.remove(styleRuleToFontFaceIter); |
| 133 m_fonts.clear(); |
| 134 } |
| 103 | 135 |
| 104 static PassRefPtr<FontData> fontDataForGenericFamily(Settings* settings, const F
ontDescription& fontDescription, const AtomicString& familyName) | 136 static PassRefPtr<FontData> fontDataForGenericFamily(Settings* settings, const F
ontDescription& fontDescription, const AtomicString& familyName) |
| 105 { | 137 { |
| 106 if (!settings) | 138 if (!settings) |
| 107 return 0; | 139 return 0; |
| 108 | 140 |
| 109 AtomicString genericFamily; | 141 AtomicString genericFamily; |
| 110 UScriptCode script = fontDescription.script(); | 142 UScriptCode script = fontDescription.script(); |
| 111 | 143 |
| 112 #if OS(ANDROID) | 144 #if OS(ANDROID) |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 return fontDataForGenericFamily(settings, fontDescription, "-webkit-
standard"); | 265 return fontDataForGenericFamily(settings, fontDescription, "-webkit-
standard"); |
| 234 return fontDataForGenericFamily(settings, fontDescription, familyName); | 266 return fontDataForGenericFamily(settings, fontDescription, familyName); |
| 235 } | 267 } |
| 236 | 268 |
| 237 // We have a face. Ask it for a font data. If it cannot produce one, it will
fail, and the OS will take over. | 269 // We have a face. Ask it for a font data. If it cannot produce one, it will
fail, and the OS will take over. |
| 238 return face->getFontData(fontDescription); | 270 return face->getFontData(fontDescription); |
| 239 } | 271 } |
| 240 | 272 |
| 241 CSSSegmentedFontFace* CSSSegmentedFontFaceCache::getFontFace(const FontDescripti
on& fontDescription, const AtomicString& family) | 273 CSSSegmentedFontFace* CSSSegmentedFontFaceCache::getFontFace(const FontDescripti
on& fontDescription, const AtomicString& family) |
| 242 { | 274 { |
| 243 HashMap<unsigned, RefPtr<CSSSegmentedFontFace> >* familyFontFaces = m_fontFa
ces.get(family); | 275 TraitsMap* familyFontFaces = m_fontFaces.get(family); |
| 244 if (!familyFontFaces || familyFontFaces->isEmpty()) | 276 if (!familyFontFaces || familyFontFaces->isEmpty()) |
| 245 return 0; | 277 return 0; |
| 246 | 278 |
| 247 OwnPtr<HashMap<unsigned, RefPtr<CSSSegmentedFontFace> > >& segmentedFontFace
Cache = m_fonts.add(family, nullptr).iterator->value; | 279 OwnPtr<TraitsMap>& segmentedFontFaceCache = m_fonts.add(family, nullptr).ite
rator->value; |
| 248 if (!segmentedFontFaceCache) | 280 if (!segmentedFontFaceCache) |
| 249 segmentedFontFaceCache = adoptPtr(new HashMap<unsigned, RefPtr<CSSSegmen
tedFontFace> >); | 281 segmentedFontFaceCache = adoptPtr(new TraitsMap); |
| 250 | 282 |
| 251 FontTraitsMask traitsMask = fontDescription.traitsMask(); | 283 FontTraitsMask traitsMask = fontDescription.traitsMask(); |
| 252 | 284 |
| 253 RefPtr<CSSSegmentedFontFace>& face = segmentedFontFaceCache->add(traitsMask,
0).iterator->value; | 285 RefPtr<CSSSegmentedFontFace>& face = segmentedFontFaceCache->add(traitsMask,
0).iterator->value; |
| 254 if (!face) { | 286 if (!face) { |
| 255 for (HashMap<unsigned, RefPtr<CSSSegmentedFontFace> >::const_iterator i
= familyFontFaces->begin(); i != familyFontFaces->end(); ++i) { | 287 for (TraitsMap::const_iterator i = familyFontFaces->begin(); i != family
FontFaces->end(); ++i) { |
| 256 CSSSegmentedFontFace* candidate = i->value.get(); | 288 CSSSegmentedFontFace* candidate = i->value.get(); |
| 257 unsigned candidateTraitsMask = candidate->traitsMask(); | 289 unsigned candidateTraitsMask = candidate->traitsMask(); |
| 258 if ((traitsMask & FontStyleNormalMask) && !(candidateTraitsMask & Fo
ntStyleNormalMask)) | 290 if ((traitsMask & FontStyleNormalMask) && !(candidateTraitsMask & Fo
ntStyleNormalMask)) |
| 259 continue; | 291 continue; |
| 260 if ((traitsMask & FontVariantNormalMask) && !(candidateTraitsMask &
FontVariantNormalMask)) | 292 if ((traitsMask & FontVariantNormalMask) && !(candidateTraitsMask &
FontVariantNormalMask)) |
| 261 continue; | 293 continue; |
| 262 if (!face || compareFontFaces(candidate, face.get(), traitsMask)) | 294 if (!face || compareFontFaces(candidate, face.get(), traitsMask)) |
| 263 face = candidate; | 295 face = candidate; |
| 264 } | 296 } |
| 265 | 297 |
| 266 if (Vector<RefPtr<CSSSegmentedFontFace> >* familyLocallyInstalledFontFac
es = m_locallyInstalledFontFaces.get(family)) { | 298 if (Vector<RefPtr<CSSSegmentedFontFace> >* familyLocallyInstalledFontFac
es = m_locallyInstalledFontFaces.get(family)) { |
| 267 unsigned numLocallyInstalledFontFaces = familyLocallyInstalledFontFa
ces->size(); | 299 unsigned numLocallyInstalledFontFaces = familyLocallyInstalledFontFa
ces->size(); |
| 268 for (unsigned i = 0; i < numLocallyInstalledFontFaces; ++i) { | 300 for (unsigned i = 0; i < numLocallyInstalledFontFaces; ++i) { |
| 269 CSSSegmentedFontFace* candidate = familyLocallyInstalledFontFace
s->at(i).get(); | 301 CSSSegmentedFontFace* candidate = familyLocallyInstalledFontFace
s->at(i).get(); |
| 270 unsigned candidateTraitsMask = candidate->traitsMask(); | 302 unsigned candidateTraitsMask = candidate->traitsMask(); |
| 271 if ((traitsMask & FontStyleNormalMask) && !(candidateTraitsMask
& FontStyleNormalMask)) | 303 if ((traitsMask & FontStyleNormalMask) && !(candidateTraitsMask
& FontStyleNormalMask)) |
| 272 continue; | 304 continue; |
| 273 if ((traitsMask & FontVariantNormalMask) && !(candidateTraitsMas
k & FontVariantNormalMask)) | 305 if ((traitsMask & FontVariantNormalMask) && !(candidateTraitsMas
k & FontVariantNormalMask)) |
| 274 continue; | 306 continue; |
| 275 if (!face || compareFontFaces(candidate, face.get(), traitsMask)
) | 307 if (!face || compareFontFaces(candidate, face.get(), traitsMask)
) |
| 276 face = candidate; | 308 face = candidate; |
| 277 } | 309 } |
| 278 } | 310 } |
| 279 } | 311 } |
| 280 return face.get(); | 312 return face.get(); |
| 281 } | 313 } |
| 282 | 314 |
| 283 } | 315 } |
| OLD | NEW |