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

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: rebase 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* hb_font) { 116 static PassRefPtr<HbFontCacheEntry> Create(hb_font_t* hb_font) {
117 ASSERT(hb_font); 117 DCHECK(hb_font);
118 return AdoptRef(new HbFontCacheEntry(hb_font)); 118 return AdoptRef(new HbFontCacheEntry(hb_font));
119 } 119 }
120 120
121 hb_font_t* HbFont() { return hb_font_.get(); } 121 hb_font_t* HbFont() { return hb_font_.get(); }
122 HarfBuzzFontData* HbFontData() { return hb_font_data_.get(); } 122 HarfBuzzFontData* HbFontData() { return hb_font_data_.get(); }
123 123
124 private: 124 private:
125 explicit HbFontCacheEntry(hb_font_t* font) 125 explicit HbFontCacheEntry(hb_font_t* font)
126 : hb_font_(HbFontUniquePtr(font)), 126 : hb_font_(HbFontUniquePtr(font)),
127 hb_font_data_(WTF::MakeUnique<HarfBuzzFontData>()){}; 127 hb_font_data_(WTF::MakeUnique<HarfBuzzFontData>()){};
(...skipping 24 matching lines...) Expand all
152 result.stored_value->value = CreateHbFontCacheEntry(face.get()); 152 result.stored_value->value = CreateHbFontCacheEntry(face.get());
153 } 153 }
154 result.stored_value->value->Ref(); 154 result.stored_value->value->Ref();
155 unscaled_font_ = result.stored_value->value->HbFont(); 155 unscaled_font_ = result.stored_value->value->HbFont();
156 harf_buzz_font_data_ = result.stored_value->value->HbFontData(); 156 harf_buzz_font_data_ = result.stored_value->value->HbFontData();
157 } 157 }
158 158
159 HarfBuzzFace::~HarfBuzzFace() { 159 HarfBuzzFace::~HarfBuzzFace() {
160 HarfBuzzFontCache::iterator result = GetHarfBuzzFontCache()->Find(unique_id_); 160 HarfBuzzFontCache::iterator result = GetHarfBuzzFontCache()->Find(unique_id_);
161 SECURITY_DCHECK(result != GetHarfBuzzFontCache()->end()); 161 SECURITY_DCHECK(result != GetHarfBuzzFontCache()->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 GetHarfBuzzFontCache()->erase(unique_id_); 165 GetHarfBuzzFontCache()->erase(unique_id_);
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* hb_font, 174 static hb_bool_t HarfBuzzGetGlyph(hb_font_t* hb_font,
175 void* font_data, 175 void* font_data,
176 hb_codepoint_t unicode, 176 hb_codepoint_t unicode,
177 hb_codepoint_t variation_selector, 177 hb_codepoint_t variation_selector,
178 hb_codepoint_t* glyph, 178 hb_codepoint_t* glyph,
179 void* user_data) { 179 void* user_data) {
180 HarfBuzzFontData* hb_font_data = 180 HarfBuzzFontData* hb_font_data =
181 reinterpret_cast<HarfBuzzFontData*>(font_data); 181 reinterpret_cast<HarfBuzzFontData*>(font_data);
182 182
183 RELEASE_ASSERT(hb_font_data); 183 CHECK(hb_font_data);
184 if (hb_font_data->range_set_ && !hb_font_data->range_set_->Contains(unicode)) 184 if (hb_font_data->range_set_ && !hb_font_data->range_set_->Contains(unicode))
185 return false; 185 return false;
186 186
187 return hb_font_get_glyph(hb_font_get_parent(hb_font), unicode, 187 return hb_font_get_glyph(hb_font_get_parent(hb_font), unicode,
188 variation_selector, glyph); 188 variation_selector, glyph);
189 } 189 }
190 190
191 static hb_position_t HarfBuzzGetGlyphHorizontalAdvance(hb_font_t* hb_font, 191 static hb_position_t HarfBuzzGetGlyphHorizontalAdvance(hb_font_t* hb_font,
192 void* font_data, 192 void* font_data,
193 hb_codepoint_t glyph, 193 hb_codepoint_t glyph,
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 365
366 // Fallback to table copies if there is no in-memory access. 366 // Fallback to table copies if there is no in-memory access.
367 if (!face) { 367 if (!face) {
368 face = hb_face_create_for_tables(HarfBuzzSkiaGetTable, 368 face = hb_face_create_for_tables(HarfBuzzSkiaGetTable,
369 platform_data_->Typeface(), 0); 369 platform_data_->Typeface(), 0);
370 zero_copy_success_histogram.Count(false); 370 zero_copy_success_histogram.Count(false);
371 } else { 371 } else {
372 zero_copy_success_histogram.Count(true); 372 zero_copy_success_histogram.Count(true);
373 } 373 }
374 #endif 374 #endif
375 ASSERT(face); 375 DCHECK(face);
376 return face; 376 return face;
377 } 377 }
378 378
379 PassRefPtr<HbFontCacheEntry> CreateHbFontCacheEntry(hb_face_t* face) { 379 PassRefPtr<HbFontCacheEntry> CreateHbFontCacheEntry(hb_face_t* face) {
380 HbFontUniquePtr ot_font(hb_font_create(face)); 380 HbFontUniquePtr ot_font(hb_font_create(face));
381 hb_ot_font_set_funcs(ot_font.get()); 381 hb_ot_font_set_funcs(ot_font.get());
382 // Creating a sub font means that non-available functions 382 // Creating a sub font means that non-available functions
383 // are found from the parent. 383 // are found from the parent.
384 hb_font_t* unscaled_font = hb_font_create_sub_font(ot_font.get()); 384 hb_font_t* unscaled_font = hb_font_create_sub_font(ot_font.get());
385 RefPtr<HbFontCacheEntry> cache_entry = 385 RefPtr<HbFontCacheEntry> cache_entry =
(...skipping 14 matching lines...) Expand all
400 "Skia and HarfBuzz Variation parameter types must match in structure and " 400 "Skia and HarfBuzz Variation parameter types must match in structure and "
401 "size."); 401 "size.");
402 402
403 hb_font_t* HarfBuzzFace::GetScaledFont( 403 hb_font_t* HarfBuzzFace::GetScaledFont(
404 PassRefPtr<UnicodeRangeSet> range_set) const { 404 PassRefPtr<UnicodeRangeSet> range_set) const {
405 platform_data_->SetupPaint(&harf_buzz_font_data_->paint_); 405 platform_data_->SetupPaint(&harf_buzz_font_data_->paint_);
406 harf_buzz_font_data_->paint_.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 406 harf_buzz_font_data_->paint_.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
407 harf_buzz_font_data_->range_set_ = std::move(range_set); 407 harf_buzz_font_data_->range_set_ = std::move(range_set);
408 harf_buzz_font_data_->UpdateSimpleFontData(platform_data_); 408 harf_buzz_font_data_->UpdateSimpleFontData(platform_data_);
409 409
410 ASSERT(harf_buzz_font_data_->simple_font_data_); 410 DCHECK(harf_buzz_font_data_->simple_font_data_);
411 int scale = SkiaScalarToHarfBuzzPosition(platform_data_->size()); 411 int scale = SkiaScalarToHarfBuzzPosition(platform_data_->size());
412 hb_font_set_scale(unscaled_font_, scale, scale); 412 hb_font_set_scale(unscaled_font_, scale, scale);
413 413
414 SkTypeface* typeface = harf_buzz_font_data_->paint_.getTypeface(); 414 SkTypeface* typeface = harf_buzz_font_data_->paint_.getTypeface();
415 int axis_count = typeface->getVariationDesignPosition(nullptr, 0); 415 int axis_count = typeface->getVariationDesignPosition(nullptr, 0);
416 if (axis_count > 0) { 416 if (axis_count > 0) {
417 Vector<SkFontArguments::VariationPosition::Coordinate> axis_values; 417 Vector<SkFontArguments::VariationPosition::Coordinate> axis_values;
418 axis_values.Resize(axis_count); 418 axis_values.Resize(axis_count);
419 if (typeface->getVariationDesignPosition(axis_values.Data(), 419 if (typeface->getVariationDesignPosition(axis_values.Data(),
420 axis_values.size()) > 0) { 420 axis_values.size()) > 0) {
421 hb_font_set_variations( 421 hb_font_set_variations(
422 unscaled_font_, reinterpret_cast<hb_variation_t*>(axis_values.Data()), 422 unscaled_font_, reinterpret_cast<hb_variation_t*>(axis_values.Data()),
423 axis_values.size()); 423 axis_values.size());
424 } 424 }
425 } 425 }
426 426
427 return unscaled_font_; 427 return unscaled_font_;
428 } 428 }
429 429
430 } // namespace blink 430 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698