Loading core/java/android/view/GLES20Canvas.java +26 −2 Original line number Original line Diff line number Diff line Loading @@ -1208,13 +1208,37 @@ class GLES20Canvas extends HardwareCanvas { @Override @Override public void drawTextOnPath(char[] text, int index, int count, Path path, float hOffset, public void drawTextOnPath(char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint) { 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 @Override public void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) { 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 @Override public void drawTextRun(char[] text, int index, int count, int contextIndex, int contextCount, public void drawTextRun(char[] text, int index, int count, int contextIndex, int contextCount, Loading core/jni/android/graphics/TextLayout.cpp +0 −5 Original line number Original line Diff line number Diff line Loading @@ -101,11 +101,6 @@ void TextLayout::drawTextOnPath(SkPaint* paint, const jchar* text, int count, SkScalar h_ = SkFloatToScalar(hOffset); SkScalar h_ = SkFloatToScalar(hOffset); SkScalar v_ = SkFloatToScalar(vOffset); 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, sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint, text, 0, count, count, bidiFlags); text, 0, count, count, bidiFlags); if (value == NULL) { if (value == NULL) { Loading core/jni/android_view_GLES20Canvas.cpp +36 −0 Original line number Original line Diff line number Diff line Loading @@ -521,6 +521,20 @@ static void renderText(OpenGLRenderer* renderer, const jchar* text, int count, renderer->drawText((const char*) glyphs, bytesCount, glyphsCount, x, y, paint); 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, static void renderTextRun(OpenGLRenderer* renderer, const jchar* text, jint start, jint count, jint contextCount, jfloat x, jfloat y, jint start, jint count, jint contextCount, jfloat x, jfloat y, int flags, SkPaint* paint) { int flags, SkPaint* paint) { Loading Loading @@ -551,6 +565,24 @@ static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz, env->ReleaseStringChars(text, textArray); 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, static void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jcharArray text, jint index, jint count, OpenGLRenderer* renderer, jcharArray text, jint index, jint count, jint contextIndex, jint contextCount, jfloat x, jfloat y, jint dirFlags, jint contextIndex, jint contextCount, jfloat x, jfloat y, jint dirFlags, Loading Loading @@ -885,6 +917,10 @@ static JNINativeMethod gMethods[] = { { "nDrawText", "(ILjava/lang/String;IIFFII)V", { "nDrawText", "(ILjava/lang/String;IIFFII)V", (void*) android_view_GLES20Canvas_drawText }, (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", "(I[CIIIIFFII)V", (void*) android_view_GLES20Canvas_drawTextRunArray }, { "nDrawTextRun", "(ILjava/lang/String;IIIIFFII)V", { "nDrawTextRun", "(ILjava/lang/String;IIIIFFII)V", (void*) android_view_GLES20Canvas_drawTextRun }, (void*) android_view_GLES20Canvas_drawTextRun }, Loading libs/hwui/DisplayListRenderer.cpp +39 −1 Original line number Original line Diff line number Diff line Loading @@ -61,6 +61,7 @@ const char* DisplayList::OP_NAMES[] = { "DrawLines", "DrawLines", "DrawPoints", "DrawPoints", "DrawText", "DrawText", "DrawTextOnPath", "DrawPosText", "DrawPosText", "ResetShader", "ResetShader", "SetupShader", "SetupShader", Loading Loading @@ -483,7 +484,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { break; break; case DrawText: { case DrawText: { getText(&text); getText(&text); int count = getInt(); int32_t count = getInt(); float x = getFloat(); float x = getFloat(); float y = getFloat(); float y = getFloat(); SkPaint* paint = getPaint(renderer); SkPaint* paint = getPaint(renderer); Loading @@ -492,6 +493,17 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { text.text(), text.length(), count, x, y, paint, length); text.text(), text.length(), count, x, y, paint, length); } } break; break; case DrawTextOnPath: { getText(&text); int32_t count = getInt(); SkPath* path = getPath(); float hOffset = getFloat(); float vOffset = getFloat(); SkPaint* paint = getPaint(renderer); ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], text.text(), text.length(), count, paint); } break; case DrawPosText: { case DrawPosText: { getText(&text); getText(&text); int count = getInt(); int count = getInt(); Loading Loading @@ -890,6 +902,19 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u renderer.drawText(text.text(), text.length(), count, x, y, paint, length); renderer.drawText(text.text(), text.length(), count, x, y, paint, length); } } break; break; case DrawTextOnPath: { getText(&text); int32_t count = getInt(); SkPath* path = getPath(); float hOffset = getFloat(); float vOffset = getFloat(); SkPaint* paint = getPaint(renderer); DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], text.text(), text.length(), count, paint); renderer.drawTextOnPath(text.text(), text.length(), count, path, hOffset, vOffset, paint); } break; case DrawPosText: { case DrawPosText: { getText(&text); getText(&text); int32_t count = getInt(); int32_t count = getInt(); Loading Loading @@ -1331,6 +1356,19 @@ void DisplayListRenderer::drawText(const char* text, int bytesCount, int count, addSkip(location); addSkip(location); } } void DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path, float hOffset, float vOffset, SkPaint* paint) { if (!text || count <= 0) return; addOp(DisplayList::DrawTextOnPath); addText(text, bytesCount); addInt(count); addPath(path); addFloat(hOffset); addFloat(vOffset); paint->setAntiAlias(true); addPaint(paint); } void DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count, void DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count, const float* positions, SkPaint* paint) { const float* positions, SkPaint* paint) { if (!text || count <= 0) return; if (!text || count <= 0) return; Loading libs/hwui/DisplayListRenderer.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -99,6 +99,7 @@ public: DrawLines, DrawLines, DrawPoints, DrawPoints, DrawText, DrawText, DrawTextOnPath, DrawPosText, DrawPosText, ResetShader, ResetShader, SetupShader, SetupShader, Loading Loading @@ -310,6 +311,8 @@ public: virtual void drawPoints(float* points, int count, SkPaint* paint); virtual void drawPoints(float* points, int count, SkPaint* paint); virtual void drawText(const char* text, int bytesCount, int count, float x, float y, virtual void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint, float length = 1.0f); SkPaint* paint, float length = 1.0f); virtual void drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path, float hOffset, float vOffset, SkPaint* paint); virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions, virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions, SkPaint* paint); SkPaint* paint); Loading Loading
core/java/android/view/GLES20Canvas.java +26 −2 Original line number Original line Diff line number Diff line Loading @@ -1208,13 +1208,37 @@ class GLES20Canvas extends HardwareCanvas { @Override @Override public void drawTextOnPath(char[] text, int index, int count, Path path, float hOffset, public void drawTextOnPath(char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint) { 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 @Override public void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) { 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 @Override public void drawTextRun(char[] text, int index, int count, int contextIndex, int contextCount, public void drawTextRun(char[] text, int index, int count, int contextIndex, int contextCount, Loading
core/jni/android/graphics/TextLayout.cpp +0 −5 Original line number Original line Diff line number Diff line Loading @@ -101,11 +101,6 @@ void TextLayout::drawTextOnPath(SkPaint* paint, const jchar* text, int count, SkScalar h_ = SkFloatToScalar(hOffset); SkScalar h_ = SkFloatToScalar(hOffset); SkScalar v_ = SkFloatToScalar(vOffset); 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, sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint, text, 0, count, count, bidiFlags); text, 0, count, count, bidiFlags); if (value == NULL) { if (value == NULL) { Loading
core/jni/android_view_GLES20Canvas.cpp +36 −0 Original line number Original line Diff line number Diff line Loading @@ -521,6 +521,20 @@ static void renderText(OpenGLRenderer* renderer, const jchar* text, int count, renderer->drawText((const char*) glyphs, bytesCount, glyphsCount, x, y, paint); 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, static void renderTextRun(OpenGLRenderer* renderer, const jchar* text, jint start, jint count, jint contextCount, jfloat x, jfloat y, jint start, jint count, jint contextCount, jfloat x, jfloat y, int flags, SkPaint* paint) { int flags, SkPaint* paint) { Loading Loading @@ -551,6 +565,24 @@ static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz, env->ReleaseStringChars(text, textArray); 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, static void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, jcharArray text, jint index, jint count, OpenGLRenderer* renderer, jcharArray text, jint index, jint count, jint contextIndex, jint contextCount, jfloat x, jfloat y, jint dirFlags, jint contextIndex, jint contextCount, jfloat x, jfloat y, jint dirFlags, Loading Loading @@ -885,6 +917,10 @@ static JNINativeMethod gMethods[] = { { "nDrawText", "(ILjava/lang/String;IIFFII)V", { "nDrawText", "(ILjava/lang/String;IIFFII)V", (void*) android_view_GLES20Canvas_drawText }, (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", "(I[CIIIIFFII)V", (void*) android_view_GLES20Canvas_drawTextRunArray }, { "nDrawTextRun", "(ILjava/lang/String;IIIIFFII)V", { "nDrawTextRun", "(ILjava/lang/String;IIIIFFII)V", (void*) android_view_GLES20Canvas_drawTextRun }, (void*) android_view_GLES20Canvas_drawTextRun }, Loading
libs/hwui/DisplayListRenderer.cpp +39 −1 Original line number Original line Diff line number Diff line Loading @@ -61,6 +61,7 @@ const char* DisplayList::OP_NAMES[] = { "DrawLines", "DrawLines", "DrawPoints", "DrawPoints", "DrawText", "DrawText", "DrawTextOnPath", "DrawPosText", "DrawPosText", "ResetShader", "ResetShader", "SetupShader", "SetupShader", Loading Loading @@ -483,7 +484,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { break; break; case DrawText: { case DrawText: { getText(&text); getText(&text); int count = getInt(); int32_t count = getInt(); float x = getFloat(); float x = getFloat(); float y = getFloat(); float y = getFloat(); SkPaint* paint = getPaint(renderer); SkPaint* paint = getPaint(renderer); Loading @@ -492,6 +493,17 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { text.text(), text.length(), count, x, y, paint, length); text.text(), text.length(), count, x, y, paint, length); } } break; break; case DrawTextOnPath: { getText(&text); int32_t count = getInt(); SkPath* path = getPath(); float hOffset = getFloat(); float vOffset = getFloat(); SkPaint* paint = getPaint(renderer); ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], text.text(), text.length(), count, paint); } break; case DrawPosText: { case DrawPosText: { getText(&text); getText(&text); int count = getInt(); int count = getInt(); Loading Loading @@ -890,6 +902,19 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u renderer.drawText(text.text(), text.length(), count, x, y, paint, length); renderer.drawText(text.text(), text.length(), count, x, y, paint, length); } } break; break; case DrawTextOnPath: { getText(&text); int32_t count = getInt(); SkPath* path = getPath(); float hOffset = getFloat(); float vOffset = getFloat(); SkPaint* paint = getPaint(renderer); DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], text.text(), text.length(), count, paint); renderer.drawTextOnPath(text.text(), text.length(), count, path, hOffset, vOffset, paint); } break; case DrawPosText: { case DrawPosText: { getText(&text); getText(&text); int32_t count = getInt(); int32_t count = getInt(); Loading Loading @@ -1331,6 +1356,19 @@ void DisplayListRenderer::drawText(const char* text, int bytesCount, int count, addSkip(location); addSkip(location); } } void DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path, float hOffset, float vOffset, SkPaint* paint) { if (!text || count <= 0) return; addOp(DisplayList::DrawTextOnPath); addText(text, bytesCount); addInt(count); addPath(path); addFloat(hOffset); addFloat(vOffset); paint->setAntiAlias(true); addPaint(paint); } void DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count, void DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count, const float* positions, SkPaint* paint) { const float* positions, SkPaint* paint) { if (!text || count <= 0) return; if (!text || count <= 0) return; Loading
libs/hwui/DisplayListRenderer.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -99,6 +99,7 @@ public: DrawLines, DrawLines, DrawPoints, DrawPoints, DrawText, DrawText, DrawTextOnPath, DrawPosText, DrawPosText, ResetShader, ResetShader, SetupShader, SetupShader, Loading Loading @@ -310,6 +311,8 @@ public: virtual void drawPoints(float* points, int count, SkPaint* paint); virtual void drawPoints(float* points, int count, SkPaint* paint); virtual void drawText(const char* text, int bytesCount, int count, float x, float y, virtual void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint, float length = 1.0f); SkPaint* paint, float length = 1.0f); virtual void drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path, float hOffset, float vOffset, SkPaint* paint); virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions, virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions, SkPaint* paint); SkPaint* paint); Loading