diff options
author | Raph Levien <raph@google.com> | 2012-06-25 16:05:57 -0700 |
---|---|---|
committer | Raph Levien <raph@google.com> | 2012-06-26 08:59:17 -0700 |
commit | f62034d89611fbd3e1d41413847241757acd0c10 (patch) | |
tree | 731d7a1f4f4de46d6680622bff4dea3be1a66ef0 /core/jni/android/graphics | |
parent | 6212a4f2ed2a5921de08b527cd1b25e1d155e56b (diff) | |
download | frameworks_base-f62034d89611fbd3e1d41413847241757acd0c10.zip frameworks_base-f62034d89611fbd3e1d41413847241757acd0c10.tar.gz frameworks_base-f62034d89611fbd3e1d41413847241757acd0c10.tar.bz2 |
Initialize shaper offset array. Needed for bug 5443796.
Harfbuzz apparently requires the offset array to be initialized to zero,
otherwise it can report corrupt glyph positions. This change also
contains a small amount of refactoring to avoid code duplication.
Change-Id: I2553974f40bc8e0549876c7d31243960ca92a8a2
Diffstat (limited to 'core/jni/android/graphics')
-rw-r--r-- | core/jni/android/graphics/TextLayoutCache.cpp | 13 | ||||
-rw-r--r-- | core/jni/android/graphics/TextLayoutCache.h | 2 |
2 files changed, 8 insertions, 7 deletions
diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp index 6e12b95..5466be4 100644 --- a/core/jni/android/graphics/TextLayoutCache.cpp +++ b/core/jni/android/graphics/TextLayoutCache.cpp @@ -915,22 +915,23 @@ size_t TextLayoutShaper::shapeFontRun(const SkPaint* paint, bool isRTL) { // Shape assert(mShaperItem.item.length > 0); // Harfbuzz will overwrite other memory if length is 0. - ensureShaperItemGlyphArrays(mShaperItem.item.length * 3 / 2); - mShaperItem.num_glyphs = mShaperItemGlyphArraySize; - while (!HB_ShapeItem(&mShaperItem)) { + size_t size = mShaperItem.item.length * 3 / 2; + while (!doShaping(size)) { // We overflowed our glyph arrays. Resize and retry. // HB_ShapeItem fills in shaperItem.num_glyphs with the needed size. - ensureShaperItemGlyphArrays(mShaperItem.num_glyphs * 2); - mShaperItem.num_glyphs = mShaperItemGlyphArraySize; + size = mShaperItem.num_glyphs * 2; } return baseGlyphCount; } -void TextLayoutShaper::ensureShaperItemGlyphArrays(size_t size) { +bool TextLayoutShaper::doShaping(size_t size) { if (size > mShaperItemGlyphArraySize) { deleteShaperItemGlyphArrays(); createShaperItemGlyphArrays(size); } + mShaperItem.num_glyphs = mShaperItemGlyphArraySize; + memset(mShaperItem.offsets, 0, mShaperItem.num_glyphs * sizeof(HB_FixedPoint)); + return HB_ShapeItem(&mShaperItem); } void TextLayoutShaper::createShaperItemGlyphArrays(size_t size) { diff --git a/core/jni/android/graphics/TextLayoutCache.h b/core/jni/android/graphics/TextLayoutCache.h index 3cac074..62d1796 100644 --- a/core/jni/android/graphics/TextLayoutCache.h +++ b/core/jni/android/graphics/TextLayoutCache.h @@ -242,7 +242,7 @@ private: SkTypeface* getCachedTypeface(SkTypeface** typeface, HB_Script script, SkTypeface::Style style); HB_Face getCachedHBFace(SkTypeface* typeface); - void ensureShaperItemGlyphArrays(size_t size); + bool doShaping(size_t size); void createShaperItemGlyphArrays(size_t size); void deleteShaperItemGlyphArrays(); |