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

Side by Side Diff: third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp

Issue 2807913002: Replace ASSERT, ASSERT_NOT_REACHED, and RELEASE_ASSERT in platform/fonts (Closed)
Patch Set: Replace ASSERT, ASSERT_NOT_REACHED, and RELEASE_ASSERT in platform/fonts Created 3 years, 8 months 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
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 Google Inc. All rights reserved. 2 * Copyright (c) 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * 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 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 // Though we have FontCache class, which provides the cache mechanism for 107 // Though we have FontCache class, which provides the cache mechanism for
108 // WebKit's font objects, we also need additional caching layer for HarfBuzz to 108 // WebKit's font objects, we also need additional caching layer for HarfBuzz to
109 // reduce the number of hb_font_t objects created. Without it, we would create 109 // reduce the number of hb_font_t objects created. Without it, we would create
110 // an hb_font_t object for every FontPlatformData object. But insted, we only 110 // an hb_font_t object for every FontPlatformData object. But insted, we only
111 // need one for each unique SkTypeface. 111 // need one for each unique SkTypeface.
112 // FIXME, crbug.com/609099: We should fix the FontCache to only keep one 112 // FIXME, crbug.com/609099: We should fix the FontCache to only keep one
113 // FontPlatformData object independent of size, then consider using this here. 113 // FontPlatformData object independent of size, then consider using this here.
114 class HbFontCacheEntry : public RefCounted<HbFontCacheEntry> { 114 class HbFontCacheEntry : public RefCounted<HbFontCacheEntry> {
115 public: 115 public:
116 static PassRefPtr<HbFontCacheEntry> create(hb_font_t* hbFont) { 116 static PassRefPtr<HbFontCacheEntry> create(hb_font_t* hbFont) {
117 ASSERT(hbFont); 117 DCHECK(hbFont);
118 return adoptRef(new HbFontCacheEntry(hbFont)); 118 return adoptRef(new HbFontCacheEntry(hbFont));
119 } 119 }
120 120
121 hb_font_t* hbFont() { return m_hbFont.get(); } 121 hb_font_t* hbFont() { return m_hbFont.get(); }
122 HarfBuzzFontData* hbFontData() { return m_hbFontData.get(); } 122 HarfBuzzFontData* hbFontData() { return m_hbFontData.get(); }
123 123
124 private: 124 private:
125 explicit HbFontCacheEntry(hb_font_t* font) 125 explicit HbFontCacheEntry(hb_font_t* font)
126 : m_hbFont(HbFontUniquePtr(font)), 126 : m_hbFont(HbFontUniquePtr(font)),
127 m_hbFontData(WTF::makeUnique<HarfBuzzFontData>()){}; 127 m_hbFontData(WTF::makeUnique<HarfBuzzFontData>()){};
(...skipping 24 matching lines...) Expand all
152 result.storedValue->value = createHbFontCacheEntry(face.get()); 152 result.storedValue->value = createHbFontCacheEntry(face.get());
153 } 153 }
154 result.storedValue->value->ref(); 154 result.storedValue->value->ref();
155 m_unscaledFont = result.storedValue->value->hbFont(); 155 m_unscaledFont = result.storedValue->value->hbFont();
156 m_harfBuzzFontData = result.storedValue->value->hbFontData(); 156 m_harfBuzzFontData = result.storedValue->value->hbFontData();
157 } 157 }
158 158
159 HarfBuzzFace::~HarfBuzzFace() { 159 HarfBuzzFace::~HarfBuzzFace() {
160 HarfBuzzFontCache::iterator result = harfBuzzFontCache()->find(m_uniqueID); 160 HarfBuzzFontCache::iterator result = harfBuzzFontCache()->find(m_uniqueID);
161 SECURITY_DCHECK(result != harfBuzzFontCache()->end()); 161 SECURITY_DCHECK(result != harfBuzzFontCache()->end());
162 ASSERT(result.get()->value->refCount() > 1); 162 DCHECK_GT(result.get()->value->refCount(), 1);
163 result.get()->value->deref(); 163 result.get()->value->deref();
164 if (result.get()->value->refCount() == 1) 164 if (result.get()->value->refCount() == 1)
165 harfBuzzFontCache()->erase(m_uniqueID); 165 harfBuzzFontCache()->erase(m_uniqueID);
166 } 166 }
167 167
168 static hb_position_t SkiaScalarToHarfBuzzPosition(SkScalar value) { 168 static hb_position_t SkiaScalarToHarfBuzzPosition(SkScalar value) {
169 // We treat HarfBuzz hb_position_t as 16.16 fixed-point. 169 // We treat HarfBuzz hb_position_t as 16.16 fixed-point.
170 static const int kHbPosition1 = 1 << 16; 170 static const int kHbPosition1 = 1 << 16;
171 return clampTo<int>(value * kHbPosition1); 171 return clampTo<int>(value * kHbPosition1);
172 } 172 }
173 173
174 static hb_bool_t harfBuzzGetGlyph(hb_font_t* hbFont, 174 static hb_bool_t harfBuzzGetGlyph(hb_font_t* hbFont,
175 void* fontData, 175 void* fontData,
176 hb_codepoint_t unicode, 176 hb_codepoint_t unicode,
177 hb_codepoint_t variationSelector, 177 hb_codepoint_t variationSelector,
178 hb_codepoint_t* glyph, 178 hb_codepoint_t* glyph,
179 void* userData) { 179 void* userData) {
180 HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData); 180 HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData);
181 181
182 RELEASE_ASSERT(hbFontData); 182 CHECK(hbFontData);
183 if (hbFontData->m_rangeSet && !hbFontData->m_rangeSet->contains(unicode)) 183 if (hbFontData->m_rangeSet && !hbFontData->m_rangeSet->contains(unicode))
184 return false; 184 return false;
185 185
186 return hb_font_get_glyph(hb_font_get_parent(hbFont), unicode, 186 return hb_font_get_glyph(hb_font_get_parent(hbFont), unicode,
187 variationSelector, glyph); 187 variationSelector, glyph);
188 } 188 }
189 189
190 static hb_position_t harfBuzzGetGlyphHorizontalAdvance(hb_font_t* hbFont, 190 static hb_position_t harfBuzzGetGlyphHorizontalAdvance(hb_font_t* hbFont,
191 void* fontData, 191 void* fontData,
192 hb_codepoint_t glyph, 192 hb_codepoint_t glyph,
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 357
358 // Fallback to table copies if there is no in-memory access. 358 // Fallback to table copies if there is no in-memory access.
359 if (!face) { 359 if (!face) {
360 face = hb_face_create_for_tables(harfBuzzSkiaGetTable, 360 face = hb_face_create_for_tables(harfBuzzSkiaGetTable,
361 m_platformData->typeface(), 0); 361 m_platformData->typeface(), 0);
362 zeroCopySuccessHistogram.count(false); 362 zeroCopySuccessHistogram.count(false);
363 } else { 363 } else {
364 zeroCopySuccessHistogram.count(true); 364 zeroCopySuccessHistogram.count(true);
365 } 365 }
366 #endif 366 #endif
367 ASSERT(face); 367 DCHECK(face);
368 return face; 368 return face;
369 } 369 }
370 370
371 PassRefPtr<HbFontCacheEntry> createHbFontCacheEntry(hb_face_t* face) { 371 PassRefPtr<HbFontCacheEntry> createHbFontCacheEntry(hb_face_t* face) {
372 HbFontUniquePtr otFont(hb_font_create(face)); 372 HbFontUniquePtr otFont(hb_font_create(face));
373 hb_ot_font_set_funcs(otFont.get()); 373 hb_ot_font_set_funcs(otFont.get());
374 // Creating a sub font means that non-available functions 374 // Creating a sub font means that non-available functions
375 // are found from the parent. 375 // are found from the parent.
376 hb_font_t* unscaledFont = hb_font_create_sub_font(otFont.get()); 376 hb_font_t* unscaledFont = hb_font_create_sub_font(otFont.get());
377 RefPtr<HbFontCacheEntry> cacheEntry = HbFontCacheEntry::create(unscaledFont); 377 RefPtr<HbFontCacheEntry> cacheEntry = HbFontCacheEntry::create(unscaledFont);
(...skipping 13 matching lines...) Expand all
391 "Skia and HarfBuzz Variation parameter types must match in structure and " 391 "Skia and HarfBuzz Variation parameter types must match in structure and "
392 "size."); 392 "size.");
393 393
394 hb_font_t* HarfBuzzFace::getScaledFont( 394 hb_font_t* HarfBuzzFace::getScaledFont(
395 PassRefPtr<UnicodeRangeSet> rangeSet) const { 395 PassRefPtr<UnicodeRangeSet> rangeSet) const {
396 m_platformData->setupPaint(&m_harfBuzzFontData->m_paint); 396 m_platformData->setupPaint(&m_harfBuzzFontData->m_paint);
397 m_harfBuzzFontData->m_paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 397 m_harfBuzzFontData->m_paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
398 m_harfBuzzFontData->m_rangeSet = std::move(rangeSet); 398 m_harfBuzzFontData->m_rangeSet = std::move(rangeSet);
399 m_harfBuzzFontData->updateSimpleFontData(m_platformData); 399 m_harfBuzzFontData->updateSimpleFontData(m_platformData);
400 400
401 ASSERT(m_harfBuzzFontData->m_simpleFontData); 401 DCHECK(m_harfBuzzFontData->m_simpleFontData);
402 int scale = SkiaScalarToHarfBuzzPosition(m_platformData->size()); 402 int scale = SkiaScalarToHarfBuzzPosition(m_platformData->size());
403 hb_font_set_scale(m_unscaledFont, scale, scale); 403 hb_font_set_scale(m_unscaledFont, scale, scale);
404 404
405 SkTypeface* typeface = m_harfBuzzFontData->m_paint.getTypeface(); 405 SkTypeface* typeface = m_harfBuzzFontData->m_paint.getTypeface();
406 int axisCount = typeface->getVariationDesignPosition(nullptr, 0); 406 int axisCount = typeface->getVariationDesignPosition(nullptr, 0);
407 if (axisCount > 0) { 407 if (axisCount > 0) {
408 Vector<SkFontArguments::VariationPosition::Coordinate> axisValues; 408 Vector<SkFontArguments::VariationPosition::Coordinate> axisValues;
409 axisValues.resize(axisCount); 409 axisValues.resize(axisCount);
410 if (typeface->getVariationDesignPosition(axisValues.data(), 410 if (typeface->getVariationDesignPosition(axisValues.data(),
411 axisValues.size()) > 0) { 411 axisValues.size()) > 0) {
412 hb_font_set_variations( 412 hb_font_set_variations(
413 m_unscaledFont, reinterpret_cast<hb_variation_t*>(axisValues.data()), 413 m_unscaledFont, reinterpret_cast<hb_variation_t*>(axisValues.data()),
414 axisValues.size()); 414 axisValues.size());
415 } 415 }
416 } 416 }
417 417
418 return m_unscaledFont; 418 return m_unscaledFont;
419 } 419 }
420 420
421 } // namespace blink 421 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698