Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(536)

Side by Side Diff: Source/core/css/CSSSegmentedFontFaceCache.cpp

Issue 68933007: Add CSSFontSelector::removeFontFaceRule() (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Avoid double hash lookups Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/css/CSSSegmentedFontFaceCache.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « Source/core/css/CSSSegmentedFontFaceCache.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698