From a3024bd7026deb777556dd75dd34a719ea1c2b39 Mon Sep 17 00:00:00 2001 From: Keisuke Kuroyanagi Date: Wed, 16 Sep 2015 20:02:15 -0700 Subject: [PATCH] Use light weight method for text measurement. Bug: 24505153 Change-Id: I94823e8d546fbe0a29bc05e8841672c4cf9b5ecd --- core/jni/android/graphics/MinikinUtils.cpp | 9 +++++++++ core/jni/android/graphics/MinikinUtils.h | 3 +++ core/jni/android/graphics/Paint.cpp | 16 ++++++++-------- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/core/jni/android/graphics/MinikinUtils.cpp b/core/jni/android/graphics/MinikinUtils.cpp index 0597d3f37a71..309d35b90260 100644 --- a/core/jni/android/graphics/MinikinUtils.cpp +++ b/core/jni/android/graphics/MinikinUtils.cpp @@ -62,6 +62,15 @@ void MinikinUtils::doLayout(Layout* layout, const Paint* paint, int bidiFlags, layout->doLayout(buf, start, count, bufSize, bidiFlags, minikinStyle, minikinPaint); } +float MinikinUtils::measureText(const Paint* paint, int bidiFlags, TypefaceImpl* typeface, + const uint16_t* buf, size_t start, size_t count, size_t bufSize, float *advances) { + FontCollection *font; + MinikinPaint minikinPaint; + FontStyle minikinStyle = prepareMinikinPaint(&minikinPaint, &font, paint, typeface); + return Layout::measureText(buf, start, count, bufSize, bidiFlags, minikinStyle, minikinPaint, + font, advances); +} + bool MinikinUtils::hasVariationSelector(TypefaceImpl* typeface, uint32_t codepoint, uint32_t vs) { const TypefaceImpl* resolvedFace = TypefaceImpl_resolveDefault(typeface); return resolvedFace->fFontCollection->hasVariationSelector(codepoint, vs); diff --git a/core/jni/android/graphics/MinikinUtils.h b/core/jni/android/graphics/MinikinUtils.h index 5bf1eec4507d..91525397b2ba 100644 --- a/core/jni/android/graphics/MinikinUtils.h +++ b/core/jni/android/graphics/MinikinUtils.h @@ -40,6 +40,9 @@ public: TypefaceImpl* typeface, const uint16_t* buf, size_t start, size_t count, size_t bufSize); + static float measureText(const Paint* paint, int bidiFlags, TypefaceImpl* typeface, + const uint16_t* buf, size_t start, size_t count, size_t bufSize, float *advances); + static bool hasVariationSelector(TypefaceImpl* typeface, uint32_t codepoint, uint32_t vs); static float xOffsetForTextAlign(Paint* paint, const Layout& layout); diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp index 98f8ce3e93c9..a3214eb2c9e3 100644 --- a/core/jni/android/graphics/Paint.cpp +++ b/core/jni/android/graphics/Paint.cpp @@ -493,16 +493,16 @@ namespace PaintGlue { return 0; } } - - Layout layout; - MinikinUtils::doLayout(&layout, paint, bidiFlags, typeface, text, start, count, - contextCount); - if (advances != NULL) { - std::unique_ptr advancesArray(new jfloat[count]); - layout.getAdvances(advancesArray.get()); + std::unique_ptr advancesArray; + if (advances) { + advancesArray.reset(new jfloat[count]); + } + const float advance = MinikinUtils::measureText(paint, bidiFlags, typeface, text, + start, count, contextCount, advancesArray.get()); + if (advances) { env->SetFloatArrayRegion(advances, advancesIndex, count, advancesArray.get()); } - return layout.getAdvance(); + return advance; } static jfloat getTextAdvances___CIIIII_FI(JNIEnv* env, jobject clazz, jlong paintHandle, -- 2.11.0