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

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

Issue 2039263002: Avoid RefPtr cycle between FontPlatformData and HarfBuzzFace (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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
« no previous file with comments | « no previous file | 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) 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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 public: 60 public:
61 61
62 HarfBuzzFontData() 62 HarfBuzzFontData()
63 : m_paint() 63 : m_paint()
64 , m_simpleFontData(nullptr) 64 , m_simpleFontData(nullptr)
65 , m_rangeSet(nullptr) 65 , m_rangeSet(nullptr)
66 { 66 {
67 } 67 }
68 68
69 SkPaint m_paint; 69 SkPaint m_paint;
70 RefPtr<SimpleFontData> m_simpleFontData; 70 SimpleFontData* m_simpleFontData;
71 RefPtr<UnicodeRangeSet> m_rangeSet; 71 RefPtr<UnicodeRangeSet> m_rangeSet;
72 }; 72 };
73 73
74 // Though we have FontCache class, which provides the cache mechanism for 74 // Though we have FontCache class, which provides the cache mechanism for
75 // WebKit's font objects, we also need additional caching layer for HarfBuzz to 75 // WebKit's font objects, we also need additional caching layer for HarfBuzz to
76 // reduce the number of hb_font_t objects created. Without it, we would create 76 // reduce the number of hb_font_t objects created. Without it, we would create
77 // an hb_font_t object for every FontPlatformData object. But insted, we only 77 // an hb_font_t object for every FontPlatformData object. But insted, we only
78 // need one for each unique SkTypeface. 78 // need one for each unique SkTypeface.
79 // FIXME, crbug.com/609099: We should fix the FontCache to only keep one 79 // FIXME, crbug.com/609099: We should fix the FontCache to only keep one
80 // FontPlatformData object independent of size, then consider using this here. 80 // FontPlatformData object independent of size, then consider using this here.
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 193
194 static hb_bool_t harfBuzzGetGlyphVerticalOrigin(hb_font_t* hbFont, void* fontDat a, hb_codepoint_t glyph, hb_position_t* x, hb_position_t* y, void* userData) 194 static hb_bool_t harfBuzzGetGlyphVerticalOrigin(hb_font_t* hbFont, void* fontDat a, hb_codepoint_t glyph, hb_position_t* x, hb_position_t* y, void* userData)
195 { 195 {
196 HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData) ; 196 HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData) ;
197 const OpenTypeVerticalData* verticalData = hbFontData->m_simpleFontData->ver ticalData(); 197 const OpenTypeVerticalData* verticalData = hbFontData->m_simpleFontData->ver ticalData();
198 if (!verticalData) 198 if (!verticalData)
199 return false; 199 return false;
200 200
201 float result[] = { 0, 0 }; 201 float result[] = { 0, 0 };
202 Glyph theGlyph = glyph; 202 Glyph theGlyph = glyph;
203 verticalData->getVerticalTranslationsForGlyphs(hbFontData->m_simpleFontData. get(), &theGlyph, 1, result); 203 verticalData->getVerticalTranslationsForGlyphs(hbFontData->m_simpleFontData, &theGlyph, 1, result);
204 *x = SkiaScalarToHarfBuzzPosition(-result[0]); 204 *x = SkiaScalarToHarfBuzzPosition(-result[0]);
205 *y = SkiaScalarToHarfBuzzPosition(-result[1]); 205 *y = SkiaScalarToHarfBuzzPosition(-result[1]);
206 return true; 206 return true;
207 } 207 }
208 208
209 static hb_position_t harfBuzzGetGlyphVerticalAdvance(hb_font_t* hbFont, void* fo ntData, hb_codepoint_t glyph, void* userData) 209 static hb_position_t harfBuzzGetGlyphVerticalAdvance(hb_font_t* hbFont, void* fo ntData, hb_codepoint_t glyph, void* userData)
210 { 210 {
211 HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData) ; 211 HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData) ;
212 const OpenTypeVerticalData* verticalData = hbFontData->m_simpleFontData->ver ticalData(); 212 const OpenTypeVerticalData* verticalData = hbFontData->m_simpleFontData->ver ticalData();
213 if (!verticalData) 213 if (!verticalData)
214 return SkiaScalarToHarfBuzzPosition(hbFontData->m_simpleFontData->getFon tMetrics().height()); 214 return SkiaScalarToHarfBuzzPosition(hbFontData->m_simpleFontData->getFon tMetrics().height());
215 215
216 Glyph theGlyph = glyph; 216 Glyph theGlyph = glyph;
217 float advanceHeight = -verticalData->advanceHeight(hbFontData->m_simpleFontD ata.get(), theGlyph); 217 float advanceHeight = -verticalData->advanceHeight(hbFontData->m_simpleFontD ata, theGlyph);
218 return SkiaScalarToHarfBuzzPosition(SkFloatToScalar(advanceHeight)); 218 return SkiaScalarToHarfBuzzPosition(SkFloatToScalar(advanceHeight));
219 } 219 }
220 220
221 static hb_position_t harfBuzzGetGlyphHorizontalKerning(hb_font_t*, void* fontDat a, hb_codepoint_t leftGlyph, hb_codepoint_t rightGlyph, void*) 221 static hb_position_t harfBuzzGetGlyphHorizontalKerning(hb_font_t*, void* fontDat a, hb_codepoint_t leftGlyph, hb_codepoint_t rightGlyph, void*)
222 { 222 {
223 HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData) ; 223 HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData) ;
224 if (hbFontData->m_paint.isVerticalText()) { 224 if (hbFontData->m_paint.isVerticalText()) {
225 // We don't support cross-stream kerning 225 // We don't support cross-stream kerning
226 return 0; 226 return 0;
227 } 227 }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 hb_font_t* unscaledFont = hb_font_create_sub_font(otFont.get()); 309 hb_font_t* unscaledFont = hb_font_create_sub_font(otFont.get());
310 RefPtr<HbFontCacheEntry> cacheEntry = HbFontCacheEntry::create(unscaledFont) ; 310 RefPtr<HbFontCacheEntry> cacheEntry = HbFontCacheEntry::create(unscaledFont) ;
311 hb_font_set_funcs(unscaledFont, harfBuzzSkiaGetFontFuncs(), cacheEntry->hbFo ntData(), nullptr); 311 hb_font_set_funcs(unscaledFont, harfBuzzSkiaGetFontFuncs(), cacheEntry->hbFo ntData(), nullptr);
312 return cacheEntry; 312 return cacheEntry;
313 } 313 }
314 314
315 hb_font_t* HarfBuzzFace::getScaledFont(PassRefPtr<UnicodeRangeSet> rangeSet) con st 315 hb_font_t* HarfBuzzFace::getScaledFont(PassRefPtr<UnicodeRangeSet> rangeSet) con st
316 { 316 {
317 m_platformData->setupPaint(&m_harfBuzzFontData->m_paint); 317 m_platformData->setupPaint(&m_harfBuzzFontData->m_paint);
318 m_harfBuzzFontData->m_rangeSet = rangeSet; 318 m_harfBuzzFontData->m_rangeSet = rangeSet;
319 m_harfBuzzFontData->m_simpleFontData = FontCache::fontCache()->fontDataFromF ontPlatformData(m_platformData); 319 m_harfBuzzFontData->m_simpleFontData = FontCache::fontCache()->fontDataFromF ontPlatformData(m_platformData).get();
320 ASSERT(m_harfBuzzFontData->m_simpleFontData); 320 ASSERT(m_harfBuzzFontData->m_simpleFontData);
321 int scale = SkiaScalarToHarfBuzzPosition(m_platformData->size()); 321 int scale = SkiaScalarToHarfBuzzPosition(m_platformData->size());
322 hb_font_set_scale(m_unscaledFont, scale, scale); 322 hb_font_set_scale(m_unscaledFont, scale, scale);
323 return m_unscaledFont; 323 return m_unscaledFont;
324 } 324 }
325 325
326 } // namespace blink 326 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698