diff options
author | Fabrice Di Meglio <fdimeglio@google.com> | 2011-11-08 15:49:20 -0800 |
---|---|---|
committer | Fabrice Di Meglio <fdimeglio@google.com> | 2011-11-08 17:13:49 -0800 |
commit | 208d4592f6e8db90eab30cfca3dc294731258d1c (patch) | |
tree | 4f27f6b97fbb06115495eb8ff6ad1fe1b2295572 | |
parent | 4873dc8fbacb856e892f7ac6f0d6c88e5df21ecc (diff) | |
download | frameworks_base-208d4592f6e8db90eab30cfca3dc294731258d1c.zip frameworks_base-208d4592f6e8db90eab30cfca3dc294731258d1c.tar.gz frameworks_base-208d4592f6e8db90eab30cfca3dc294731258d1c.tar.bz2 |
Fix potential crash when shaping Hebrew with bold
- make code more resilient
- make correct initialization of gHebrewRegularTypeface
Change-Id: I97e98d36b830ad35979184c1459e8c8503eb3d28
-rw-r--r-- | core/jni/android/graphics/HarfbuzzSkia.cpp | 6 | ||||
-rw-r--r-- | core/jni/android/graphics/TextLayoutCache.cpp | 26 | ||||
-rw-r--r-- | core/jni/android/graphics/TextLayoutCache.h | 2 |
3 files changed, 19 insertions, 15 deletions
diff --git a/core/jni/android/graphics/HarfbuzzSkia.cpp b/core/jni/android/graphics/HarfbuzzSkia.cpp index 92c743f..e02070d 100644 --- a/core/jni/android/graphics/HarfbuzzSkia.cpp +++ b/core/jni/android/graphics/HarfbuzzSkia.cpp @@ -24,6 +24,8 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#define LOG_TAG "HarfbuzzSkia" + #include "HarfbuzzSkia.h" #include "SkFontHost.h" @@ -214,6 +216,10 @@ HB_Error harfbuzzSkiaGetTable(void* voidface, const HB_Tag tag, HB_Byte* buffer, FontData* data = reinterpret_cast<FontData*>(voidface); SkTypeface* typeface = data->typeFace; + if (!typeface) { + LOGD("Typeface cannot be null"); + return HB_Err_Invalid_Argument; + } const size_t tableSize = SkFontHost::GetTableSize(typeface->uniqueID(), tag); if (!tableSize) return HB_Err_Invalid_Argument; diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp index 104c83d..bfd2061 100644 --- a/core/jni/android/graphics/TextLayoutCache.cpp +++ b/core/jni/android/graphics/TextLayoutCache.cpp @@ -415,10 +415,7 @@ unsigned TextLayoutCacheValue::shapeFontRun(HB_ShaperItem& shaperItem, SkPaint* FontData* data = reinterpret_cast<FontData*>(shaperItem.font->userData); switch(shaperItem.item.script) { case HB_Script_Arabic: - if (!gArabicTypeface) { - gArabicTypeface = SkTypeface::CreateFromFile(TYPEFACE_ARABIC); - } - data->typeFace = gArabicTypeface; + data->typeFace = getCachedTypeface(gArabicTypeface, TYPEFACE_ARABIC); #if DEBUG_GLYPHS LOGD("Using Arabic Typeface"); #endif @@ -430,29 +427,21 @@ unsigned TextLayoutCacheValue::shapeFontRun(HB_ShaperItem& shaperItem, SkPaint* case SkTypeface::kNormal: case SkTypeface::kItalic: default: - if (!gHebrewRegularTypeface) { - gHebrewRegularTypeface = SkTypeface::CreateFromFile( - TYPE_FACE_HEBREW_REGULAR); - } - data->typeFace = gHebrewRegularTypeface; + data->typeFace = getCachedTypeface(gHebrewRegularTypeface, TYPE_FACE_HEBREW_REGULAR); #if DEBUG_GLYPHS LOGD("Using Hebrew Regular/Italic Typeface"); #endif break; case SkTypeface::kBold: case SkTypeface::kBoldItalic: - if (!gHebrewBoldTypeface) { - gHebrewBoldTypeface = SkTypeface::CreateFromFile( - TYPE_FACE_HEBREW_BOLD); - } - data->typeFace = gHebrewBoldTypeface; + data->typeFace = getCachedTypeface(gHebrewBoldTypeface, TYPE_FACE_HEBREW_BOLD); #if DEBUG_GLYPHS LOGD("Using Hebrew Bold/BoldItalic Typeface"); #endif break; } } else { - data->typeFace = gHebrewRegularTypeface; + data->typeFace = getCachedTypeface(gHebrewRegularTypeface, TYPE_FACE_HEBREW_REGULAR); #if DEBUG_GLYPHS LOGD("Using Hebrew Regular Typeface"); #endif @@ -492,6 +481,13 @@ unsigned TextLayoutCacheValue::shapeFontRun(HB_ShaperItem& shaperItem, SkPaint* return result; } +SkTypeface* TextLayoutCacheValue::getCachedTypeface(SkTypeface* typeface, const char path[]) { + if (!typeface) { + typeface = SkTypeface::CreateFromFile(path); + } + return typeface; +} + void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar* chars, size_t start, size_t count, size_t contextCount, int dirFlags, Vector<jfloat>* const outAdvances, jfloat* outTotalAdvance, diff --git a/core/jni/android/graphics/TextLayoutCache.h b/core/jni/android/graphics/TextLayoutCache.h index a5d8eb7..3b612ff 100644 --- a/core/jni/android/graphics/TextLayoutCache.h +++ b/core/jni/android/graphics/TextLayoutCache.h @@ -174,6 +174,8 @@ private: static unsigned shapeFontRun(HB_ShaperItem& shaperItem, SkPaint* paint, size_t count, bool isRTL); + static SkTypeface* getCachedTypeface(SkTypeface* typeface, const char path[]); + static void deleteGlyphArrays(HB_ShaperItem& shaperItem); static void createGlyphArrays(HB_ShaperItem& shaperItem, int size); |