diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/view/GLES20Canvas.java | 28 | ||||
-rw-r--r-- | core/jni/android/graphics/TextLayout.cpp | 5 | ||||
-rw-r--r-- | core/jni/android_view_GLES20Canvas.cpp | 36 |
3 files changed, 62 insertions, 7 deletions
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index f5fc708..36582af 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -1208,14 +1208,38 @@ class GLES20Canvas extends HardwareCanvas { @Override public void drawTextOnPath(char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint) { - // TODO: Implement + if (index < 0 || index + count > text.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + int modifiers = setupModifiers(paint); + try { + nDrawTextOnPath(mRenderer, text, index, count, path.mNativePath, hOffset, vOffset, + paint.mBidiFlags, paint.mNativePaint); + } finally { + if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers); + } } + private static native void nDrawTextOnPath(int renderer, char[] text, int index, int count, + int path, float hOffset, float vOffset, int bidiFlags, int nativePaint); + @Override public void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) { - // TODO: Implement + if (text.length() == 0) return; + + int modifiers = setupModifiers(paint); + try { + nDrawTextOnPath(mRenderer, text, 0, text.length(), path.mNativePath, hOffset, vOffset, + paint.mBidiFlags, paint.mNativePaint); + } finally { + if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers); + } } + private static native void nDrawTextOnPath(int renderer, String text, int start, int end, + int path, float hOffset, float vOffset, int bidiFlags, int nativePaint); + @Override public void drawTextRun(char[] text, int index, int count, int contextIndex, int contextCount, float x, float y, int dir, Paint paint) { diff --git a/core/jni/android/graphics/TextLayout.cpp b/core/jni/android/graphics/TextLayout.cpp index 2241f60..2beedad 100644 --- a/core/jni/android/graphics/TextLayout.cpp +++ b/core/jni/android/graphics/TextLayout.cpp @@ -101,11 +101,6 @@ void TextLayout::drawTextOnPath(SkPaint* paint, const jchar* text, int count, SkScalar h_ = SkFloatToScalar(hOffset); SkScalar v_ = SkFloatToScalar(vOffset); - if (!needsLayout(text, count, bidiFlags)) { - canvas->drawTextOnPathHV(text, count << 1, *path, h_, v_, *paint); - return; - } - sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint, text, 0, count, count, bidiFlags); if (value == NULL) { diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp index cdce4f9..f0560c1 100644 --- a/core/jni/android_view_GLES20Canvas.cpp +++ b/core/jni/android_view_GLES20Canvas.cpp @@ -521,6 +521,20 @@ static void renderText(OpenGLRenderer* renderer, const jchar* text, int count, renderer->drawText((const char*) glyphs, bytesCount, glyphsCount, x, y, paint); } +static void renderTextOnPath(OpenGLRenderer* renderer, const jchar* text, int count, + SkPath* path, jfloat hOffset, jfloat vOffset, int flags, SkPaint* paint) { + sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint, + text, 0, count, count, flags); + if (value == NULL) { + return; + } + const jchar* glyphs = value->getGlyphs(); + size_t glyphsCount = value->getGlyphsCount(); + int bytesCount = glyphsCount * sizeof(jchar); + renderer->drawTextOnPath((const char*) glyphs, bytesCount, glyphsCount, path, + hOffset, vOffset, paint); +} + static void renderTextRun(OpenGLRenderer* renderer, const jchar* text, jint start, jint count, jint contextCount, jfloat x, jfloat y, int flags, SkPaint* paint) { @@ -551,6 +565,24 @@ static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz, env->ReleaseStringChars(text, textArray); } +static void android_view_GLES20Canvas_drawTextArrayOnPath(JNIEnv* env, jobject clazz, + OpenGLRenderer* renderer, jcharArray text, jint index, jint count, + SkPath* path, jfloat hOffset, jfloat vOffset, jint flags, SkPaint* paint) { + jchar* textArray = env->GetCharArrayElements(text, NULL); + renderTextOnPath(renderer, textArray + index, count, path, + hOffset, vOffset, flags, paint); + env->ReleaseCharArrayElements(text, textArray, JNI_ABORT); +} + +static void android_view_GLES20Canvas_drawTextOnPath(JNIEnv* env, jobject clazz, + OpenGLRenderer* renderer, jstring text, jint start, jint end, + SkPath* path, jfloat hOffset, jfloat vOffset, jint flags, SkPaint* paint) { + const jchar* textArray = env->GetStringChars(text, NULL); + renderTextOnPath(renderer, textArray + start, end - start, path, + hOffset, vOffset, flags, paint); + env->ReleaseStringChars(text, textArray); +} + static void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jcharArray text, jint index, jint count, jint contextIndex, jint contextCount, jfloat x, jfloat y, jint dirFlags, @@ -885,6 +917,10 @@ static JNINativeMethod gMethods[] = { { "nDrawText", "(ILjava/lang/String;IIFFII)V", (void*) android_view_GLES20Canvas_drawText }, + { "nDrawTextOnPath", "(I[CIIIFFII)V", (void*) android_view_GLES20Canvas_drawTextArrayOnPath }, + { "nDrawTextOnPath", "(ILjava/lang/String;IIIFFII)V", + (void*) android_view_GLES20Canvas_drawTextOnPath }, + { "nDrawTextRun", "(I[CIIIIFFII)V", (void*) android_view_GLES20Canvas_drawTextRunArray }, { "nDrawTextRun", "(ILjava/lang/String;IIIIFFII)V", (void*) android_view_GLES20Canvas_drawTextRun }, |