@@ -332,15 +332,7 @@ uint32_t TextLayoutValue::getElapsedTime() {
332332}
333333
334334TextLayoutShaper::TextLayoutShaper () : mShaperItemGlyphArraySize(0 ) {
335- mDefaultTypeface = SkFontHost::CreateTypeface (NULL , NULL , NULL , 0 , SkTypeface::kNormal );
336- mArabicTypeface = NULL ;
337- mHebrewRegularTypeface = NULL ;
338- mHebrewBoldTypeface = NULL ;
339- mBengaliTypeface = NULL ;
340- mThaiTypeface = NULL ;
341- mDevanagariRegularTypeface = NULL ;
342- mTamilRegularTypeface = NULL ;
343- mTamilBoldTypeface = NULL ;
335+ init ();
344336
345337 mFontRec .klass = &harfbuzzSkiaClass;
346338 mFontRec .userData = 0 ;
@@ -359,7 +351,19 @@ TextLayoutShaper::TextLayoutShaper() : mShaperItemGlyphArraySize(0) {
359351 mShaperItem .font ->userData = &mShapingPaint ;
360352}
361353
362- TextLayoutShaper::~TextLayoutShaper () {
354+ void TextLayoutShaper::init () {
355+ mDefaultTypeface = SkFontHost::CreateTypeface (NULL , NULL , NULL , 0 , SkTypeface::kNormal );
356+ mArabicTypeface = NULL ;
357+ mHebrewRegularTypeface = NULL ;
358+ mHebrewBoldTypeface = NULL ;
359+ mBengaliTypeface = NULL ;
360+ mThaiTypeface = NULL ;
361+ mDevanagariRegularTypeface = NULL ;
362+ mTamilRegularTypeface = NULL ;
363+ mTamilBoldTypeface = NULL ;
364+ }
365+
366+ void TextLayoutShaper::unrefTypefaces () {
363367 SkSafeUnref (mDefaultTypeface );
364368 SkSafeUnref (mArabicTypeface );
365369 SkSafeUnref (mHebrewRegularTypeface );
@@ -369,6 +373,10 @@ TextLayoutShaper::~TextLayoutShaper() {
369373 SkSafeUnref (mDevanagariRegularTypeface );
370374 SkSafeUnref (mTamilRegularTypeface );
371375 SkSafeUnref (mTamilBoldTypeface );
376+ }
377+
378+ TextLayoutShaper::~TextLayoutShaper () {
379+ unrefTypefaces ();
372380 deleteShaperItemGlyphArrays ();
373381}
374382
@@ -983,6 +991,12 @@ HB_Face TextLayoutShaper::getCachedHBFace(SkTypeface* typeface) {
983991 return face;
984992}
985993
994+ void TextLayoutShaper::purgeCaches () {
995+ mCachedHBFaces .clear ();
996+ unrefTypefaces ();
997+ init ();
998+ }
999+
9861000TextLayoutEngine::TextLayoutEngine () {
9871001 mShaper = new TextLayoutShaper ();
9881002#if USE_TEXT_LAYOUT_CACHE
@@ -1018,6 +1032,10 @@ sp<TextLayoutValue> TextLayoutEngine::getValue(const SkPaint* paint, const jchar
10181032void TextLayoutEngine::purgeCaches () {
10191033#if USE_TEXT_LAYOUT_CACHE
10201034 mTextLayoutCache ->clear ();
1035+ mShaper ->purgeCaches ();
1036+ #if DEBUG_GLYPHS
1037+ ALOGD (" Purged TextLayoutEngine caches" );
1038+ #endif
10211039#endif
10221040}
10231041
0 commit comments