Use light weight method for text measurement.
Bug: 24505153
Change-Id: I94823e8d546fbe0a29bc05e8841672c4cf9b5ecd
diff --git a/core/jni/android/graphics/MinikinUtils.cpp b/core/jni/android/graphics/MinikinUtils.cpp
index 0597d3f..309d35b 100644
--- a/core/jni/android/graphics/MinikinUtils.cpp
+++ b/core/jni/android/graphics/MinikinUtils.cpp
@@ -62,6 +62,15 @@
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 5bf1eec..9152539 100644
--- a/core/jni/android/graphics/MinikinUtils.h
+++ b/core/jni/android/graphics/MinikinUtils.h
@@ -40,6 +40,9 @@
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 98f8ce3..a3214eb 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -493,16 +493,16 @@
return 0;
}
}
-
- Layout layout;
- MinikinUtils::doLayout(&layout, paint, bidiFlags, typeface, text, start, count,
- contextCount);
- if (advances != NULL) {
- std::unique_ptr<jfloat> advancesArray(new jfloat[count]);
- layout.getAdvances(advancesArray.get());
+ std::unique_ptr<jfloat[]> 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,