diff options
author | Victoria Lease <violets@google.com> | 2013-04-15 15:29:36 -0700 |
---|---|---|
committer | Victoria Lease <violets@google.com> | 2013-04-16 09:51:45 -0700 |
commit | cc0f9d8469ac0aa39ca2c2c6e6afe309ab6e69a7 (patch) | |
tree | ddf910caeaababe56f047eeeeca9bfa6685aeb82 /core/jni | |
parent | 919e36d5f689f6a73a879ebd72465f68c1625062 (diff) | |
download | frameworks_base-cc0f9d8469ac0aa39ca2c2c6e6afe309ab6e69a7.zip frameworks_base-cc0f9d8469ac0aa39ca2c2c6e6afe309ab6e69a7.tar.gz frameworks_base-cc0f9d8469ac0aa39ca2c2c6e6afe309ab6e69a7.tar.bz2 |
use appropriate fallback chain for style
TextLayoutShaper was defaulting to the Regular-style fallback chain
for all unknown scripts. This became problematic in that the
codepoint->glyphID enumeration stage of shaping was always using the
Regular-style fallback chain for unknown scripts, and there's no
guarantee that glyph indices are compatible between fallback chains.
Defaulting to a style-appropriate fallback chain addresses this
issue, and probably unreported but related issues, as well.
Bug: 8189208
Change-Id: I6ecf531c74d71a8e4a5359d23439ccc950b0cf80
Diffstat (limited to 'core/jni')
-rw-r--r-- | core/jni/android/graphics/TextLayoutCache.cpp | 28 | ||||
-rw-r--r-- | core/jni/android/graphics/TextLayoutCache.h | 9 |
2 files changed, 9 insertions, 28 deletions
diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp index 1ace23e..17f205d 100644 --- a/core/jni/android/graphics/TextLayoutCache.cpp +++ b/core/jni/android/graphics/TextLayoutCache.cpp @@ -339,23 +339,11 @@ uint32_t TextLayoutValue::getElapsedTime() { } TextLayoutShaper::TextLayoutShaper() { - init(); - mBuffer = hb_buffer_create(); } -void TextLayoutShaper::init() { - mDefaultTypeface = SkFontHost::CreateTypeface(NULL, NULL, SkTypeface::kNormal); -} - -void TextLayoutShaper::unrefTypefaces() { - SkSafeUnref(mDefaultTypeface); -} - TextLayoutShaper::~TextLayoutShaper() { hb_buffer_destroy(mBuffer); - - unrefTypefaces(); } void TextLayoutShaper::computeValues(TextLayoutValue* value, const SkPaint* paint, const UChar* chars, @@ -839,23 +827,27 @@ size_t TextLayoutShaper::shapeFontRun(const SkPaint* paint) { } if (baseGlyphCount != 0) { + SkTypeface::Style style = SkTypeface::kNormal; + if (typeface != NULL) { + style = typeface->style(); + } typeface = typefaceForScript(paint, typeface, hb_buffer_get_script(mBuffer)); if (!typeface) { baseGlyphCount = 0; - typeface = mDefaultTypeface; - SkSafeRef(typeface); + typeface = SkFontHost::CreateTypeface(NULL, NULL, style); #if DEBUG_GLYPHS ALOGD("Using Default Typeface"); #endif } } else { if (!typeface) { - typeface = mDefaultTypeface; + typeface = SkFontHost::CreateTypeface(NULL, NULL, SkTypeface::kNormal); #if DEBUG_GLYPHS - ALOGD("Using Default Typeface"); + ALOGD("Using Default Typeface (normal style)"); #endif + } else { + SkSafeRef(typeface); } - SkSafeRef(typeface); } mShapingPaint.setTypeface(typeface); @@ -899,8 +891,6 @@ void TextLayoutShaper::purgeCaches() { hb_face_destroy(mCachedHBFaces.valueAt(i)); } mCachedHBFaces.clear(); - unrefTypefaces(); - init(); } TextLayoutEngine::TextLayoutEngine() { diff --git a/core/jni/android/graphics/TextLayoutCache.h b/core/jni/android/graphics/TextLayoutCache.h index f9b9900..5414a11 100644 --- a/core/jni/android/graphics/TextLayoutCache.h +++ b/core/jni/android/graphics/TextLayoutCache.h @@ -197,18 +197,10 @@ private: SkPaint mShapingPaint; /** - * Skia default typeface to be returned if we cannot resolve script - */ - SkTypeface* mDefaultTypeface; - - /** * Cache of Harfbuzz faces */ KeyedVector<SkFontID, hb_face_t*> mCachedHBFaces; - void init(); - void unrefTypefaces(); - SkTypeface* typefaceForScript(const SkPaint* paint, SkTypeface* typeface, hb_script_t script); @@ -228,7 +220,6 @@ private: hb_face_t* referenceCachedHBFace(SkTypeface* typeface); bool isComplexScript(hb_script_t script); - }; // TextLayoutShaper /** |