Loading core/java/android/view/GLES20Canvas.java +33 −4 Original line number Diff line number Diff line Loading @@ -32,6 +32,11 @@ import android.graphics.RectF; import android.graphics.Region; import android.graphics.Shader; import android.graphics.SweepGradient; import android.graphics.TemporaryBuffer; import android.text.GraphicsOperations; import android.text.SpannableString; import android.text.SpannedString; import android.text.TextUtils; import javax.microedition.khronos.opengles.GL; Loading Loading @@ -574,22 +579,46 @@ class GLES20Canvas extends Canvas { @Override public void drawText(char[] text, int index, int count, float x, float y, Paint paint) { // TODO: Implement if ((index | count | (index + count) | (text.length - index - count)) < 0) { throw new IndexOutOfBoundsException(); } nDrawText(mRenderer, text, index, count, x, y, paint.mBidiFlags, paint.mNativePaint); } private native void nDrawText(int renderer, char[] text, int index, int count, float x, float y, int bidiFlags, int paint); @Override public void drawText(CharSequence text, int start, int end, float x, float y, Paint paint) { // TODO: Implement if (text instanceof String || text instanceof SpannedString || text instanceof SpannableString) { nDrawText(mRenderer, text.toString(), start, end, x, y, paint.mBidiFlags, paint.mNativePaint); } else if (text instanceof GraphicsOperations) { ((GraphicsOperations) text).drawText(this, start, end, x, y, paint); } else { char[] buf = TemporaryBuffer.obtain(end - start); TextUtils.getChars(text, start, end, buf, 0); nDrawText(mRenderer, buf, 0, end - start, x, y, paint.mBidiFlags, paint.mNativePaint); TemporaryBuffer.recycle(buf); } } @Override public void drawText(String text, int start, int end, float x, float y, Paint paint) { // TODO: Implement if ((start | end | (end - start) | (text.length() - end)) < 0) { throw new IndexOutOfBoundsException(); } nDrawText(mRenderer, text, start, end, x, y, paint.mBidiFlags, paint.mNativePaint); } private native void nDrawText(int renderer, String text, int start, int end, float x, float y, int bidiFlags, int paint); @Override public void drawText(String text, float x, float y, Paint paint) { drawText(text, 0, text.length(), x, y, paint); nDrawText(mRenderer, text, 0, text.length(), x, y, paint.mBidiFlags, paint.mNativePaint); } @Override Loading core/jni/android/graphics/Typeface.cpp +7 −1 Original line number Diff line number Diff line Loading @@ -130,7 +130,13 @@ static SkTypeface* Typeface_createFromAsset(JNIEnv* env, jobject, return NULL; } return SkTypeface::CreateFromStream(new AssetStream(asset, true)); SkStream* stream = new AssetStream(asset, true); SkTypeface* face = SkTypeface::CreateFromStream(stream); // SkTypeFace::CreateFromStream calls ref() on the stream, so we // need to unref it here or it won't be freed later on stream->unref(); return face; } static SkTypeface* Typeface_createFromFile(JNIEnv* env, jobject, jstring jpath) { Loading core/jni/android_view_GLES20Canvas.cpp +27 −1 Original line number Diff line number Diff line Loading @@ -14,6 +14,8 @@ * limitations under the License. */ #define LOG_TAG "OpenGLRenderer" #include "jni.h" #include <nativehelper/JNIHelp.h> #include <android_runtime/AndroidRuntime.h> Loading @@ -24,6 +26,7 @@ #include <SkMatrix.h> #include <SkPaint.h> #include <SkRegion.h> #include <SkScalerContext.h> #include <SkXfermode.h> #include <OpenGLRenderer.h> Loading Loading @@ -207,7 +210,6 @@ static void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject canvas, renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint); // TODO: make sure that 0 is correct for the flags env->ReleaseByteArrayElements(chunks, storage, 0); } Loading Loading @@ -245,6 +247,26 @@ static void android_view_GLES20Canvas_setupLinearShader(JNIEnv* env, jobject can tileMode, matrix, (shader->getFlags() & SkShader::kOpaqueAlpha_Flag) == 0); } // ---------------------------------------------------------------------------- // Text // ---------------------------------------------------------------------------- static void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject canvas, OpenGLRenderer* renderer, jcharArray text, int index, int count, jfloat x, jfloat y, int flags, SkPaint* paint) { jchar* textArray = env->GetCharArrayElements(text, NULL); // TODO: draw from textArray + index env->ReleaseCharArrayElements(text, textArray, JNI_ABORT); } static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject canvas, OpenGLRenderer* renderer, jstring text, int start, int end, jfloat x, jfloat y, int flags, SkPaint* paint) { const jchar* textArray = env->GetStringChars(text, NULL); // TODO: draw from textArray + start env->ReleaseStringChars(text, textArray); } // ---------------------------------------------------------------------------- // JNI Glue // ---------------------------------------------------------------------------- Loading Loading @@ -288,6 +310,10 @@ static JNINativeMethod gMethods[] = { { "nSetupBitmapShader", "(IIIIII)V", (void*) android_view_GLES20Canvas_setupBitmapShader }, { "nSetupLinearShader", "(IIIIIIII)V", (void*) android_view_GLES20Canvas_setupLinearShader }, { "nDrawText", "(I[CIIFFII)V", (void*) android_view_GLES20Canvas_drawTextArray }, { "nDrawText", "(ILjava/lang/String;IIFFII)V", (void*) android_view_GLES20Canvas_drawText }, { "nGetClipBounds", "(ILandroid/graphics/Rect;)Z", (void*) android_view_GLES20Canvas_getClipBounds }, }; Loading core/jni/android_view_HardwareRenderer.cpp +2 −4 Original line number Diff line number Diff line Loading @@ -34,13 +34,11 @@ static void android_view_HardwareRenderer_abandonGlCaches(JNIEnv* env, jobject) const char* const kClassPathName = "android/view/HardwareRenderer"; static JNINativeMethod gMethods[] = { { "nativeAbandonGlCaches", "()V", (void*)android_view_HardwareRenderer_abandonGlCaches }, { "nativeAbandonGlCaches", "()V", (void*)android_view_HardwareRenderer_abandonGlCaches }, }; int register_android_view_HardwareRenderer(JNIEnv* env) { return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); } }; graphics/java/android/graphics/Paint.java +4 −1 Original line number Diff line number Diff line Loading @@ -43,7 +43,10 @@ public class Paint { private boolean mHasCompatScaling; private float mCompatScaling; private float mInvCompatScaling; /* package */ int mBidiFlags = BIDI_DEFAULT_LTR; /** * @hide */ public int mBidiFlags = BIDI_DEFAULT_LTR; private static final Style[] sStyleArray = { Style.FILL, Style.STROKE, Style.FILL_AND_STROKE Loading Loading
core/java/android/view/GLES20Canvas.java +33 −4 Original line number Diff line number Diff line Loading @@ -32,6 +32,11 @@ import android.graphics.RectF; import android.graphics.Region; import android.graphics.Shader; import android.graphics.SweepGradient; import android.graphics.TemporaryBuffer; import android.text.GraphicsOperations; import android.text.SpannableString; import android.text.SpannedString; import android.text.TextUtils; import javax.microedition.khronos.opengles.GL; Loading Loading @@ -574,22 +579,46 @@ class GLES20Canvas extends Canvas { @Override public void drawText(char[] text, int index, int count, float x, float y, Paint paint) { // TODO: Implement if ((index | count | (index + count) | (text.length - index - count)) < 0) { throw new IndexOutOfBoundsException(); } nDrawText(mRenderer, text, index, count, x, y, paint.mBidiFlags, paint.mNativePaint); } private native void nDrawText(int renderer, char[] text, int index, int count, float x, float y, int bidiFlags, int paint); @Override public void drawText(CharSequence text, int start, int end, float x, float y, Paint paint) { // TODO: Implement if (text instanceof String || text instanceof SpannedString || text instanceof SpannableString) { nDrawText(mRenderer, text.toString(), start, end, x, y, paint.mBidiFlags, paint.mNativePaint); } else if (text instanceof GraphicsOperations) { ((GraphicsOperations) text).drawText(this, start, end, x, y, paint); } else { char[] buf = TemporaryBuffer.obtain(end - start); TextUtils.getChars(text, start, end, buf, 0); nDrawText(mRenderer, buf, 0, end - start, x, y, paint.mBidiFlags, paint.mNativePaint); TemporaryBuffer.recycle(buf); } } @Override public void drawText(String text, int start, int end, float x, float y, Paint paint) { // TODO: Implement if ((start | end | (end - start) | (text.length() - end)) < 0) { throw new IndexOutOfBoundsException(); } nDrawText(mRenderer, text, start, end, x, y, paint.mBidiFlags, paint.mNativePaint); } private native void nDrawText(int renderer, String text, int start, int end, float x, float y, int bidiFlags, int paint); @Override public void drawText(String text, float x, float y, Paint paint) { drawText(text, 0, text.length(), x, y, paint); nDrawText(mRenderer, text, 0, text.length(), x, y, paint.mBidiFlags, paint.mNativePaint); } @Override Loading
core/jni/android/graphics/Typeface.cpp +7 −1 Original line number Diff line number Diff line Loading @@ -130,7 +130,13 @@ static SkTypeface* Typeface_createFromAsset(JNIEnv* env, jobject, return NULL; } return SkTypeface::CreateFromStream(new AssetStream(asset, true)); SkStream* stream = new AssetStream(asset, true); SkTypeface* face = SkTypeface::CreateFromStream(stream); // SkTypeFace::CreateFromStream calls ref() on the stream, so we // need to unref it here or it won't be freed later on stream->unref(); return face; } static SkTypeface* Typeface_createFromFile(JNIEnv* env, jobject, jstring jpath) { Loading
core/jni/android_view_GLES20Canvas.cpp +27 −1 Original line number Diff line number Diff line Loading @@ -14,6 +14,8 @@ * limitations under the License. */ #define LOG_TAG "OpenGLRenderer" #include "jni.h" #include <nativehelper/JNIHelp.h> #include <android_runtime/AndroidRuntime.h> Loading @@ -24,6 +26,7 @@ #include <SkMatrix.h> #include <SkPaint.h> #include <SkRegion.h> #include <SkScalerContext.h> #include <SkXfermode.h> #include <OpenGLRenderer.h> Loading Loading @@ -207,7 +210,6 @@ static void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject canvas, renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint); // TODO: make sure that 0 is correct for the flags env->ReleaseByteArrayElements(chunks, storage, 0); } Loading Loading @@ -245,6 +247,26 @@ static void android_view_GLES20Canvas_setupLinearShader(JNIEnv* env, jobject can tileMode, matrix, (shader->getFlags() & SkShader::kOpaqueAlpha_Flag) == 0); } // ---------------------------------------------------------------------------- // Text // ---------------------------------------------------------------------------- static void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject canvas, OpenGLRenderer* renderer, jcharArray text, int index, int count, jfloat x, jfloat y, int flags, SkPaint* paint) { jchar* textArray = env->GetCharArrayElements(text, NULL); // TODO: draw from textArray + index env->ReleaseCharArrayElements(text, textArray, JNI_ABORT); } static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject canvas, OpenGLRenderer* renderer, jstring text, int start, int end, jfloat x, jfloat y, int flags, SkPaint* paint) { const jchar* textArray = env->GetStringChars(text, NULL); // TODO: draw from textArray + start env->ReleaseStringChars(text, textArray); } // ---------------------------------------------------------------------------- // JNI Glue // ---------------------------------------------------------------------------- Loading Loading @@ -288,6 +310,10 @@ static JNINativeMethod gMethods[] = { { "nSetupBitmapShader", "(IIIIII)V", (void*) android_view_GLES20Canvas_setupBitmapShader }, { "nSetupLinearShader", "(IIIIIIII)V", (void*) android_view_GLES20Canvas_setupLinearShader }, { "nDrawText", "(I[CIIFFII)V", (void*) android_view_GLES20Canvas_drawTextArray }, { "nDrawText", "(ILjava/lang/String;IIFFII)V", (void*) android_view_GLES20Canvas_drawText }, { "nGetClipBounds", "(ILandroid/graphics/Rect;)Z", (void*) android_view_GLES20Canvas_getClipBounds }, }; Loading
core/jni/android_view_HardwareRenderer.cpp +2 −4 Original line number Diff line number Diff line Loading @@ -34,13 +34,11 @@ static void android_view_HardwareRenderer_abandonGlCaches(JNIEnv* env, jobject) const char* const kClassPathName = "android/view/HardwareRenderer"; static JNINativeMethod gMethods[] = { { "nativeAbandonGlCaches", "()V", (void*)android_view_HardwareRenderer_abandonGlCaches }, { "nativeAbandonGlCaches", "()V", (void*)android_view_HardwareRenderer_abandonGlCaches }, }; int register_android_view_HardwareRenderer(JNIEnv* env) { return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); } };
graphics/java/android/graphics/Paint.java +4 −1 Original line number Diff line number Diff line Loading @@ -43,7 +43,10 @@ public class Paint { private boolean mHasCompatScaling; private float mCompatScaling; private float mInvCompatScaling; /* package */ int mBidiFlags = BIDI_DEFAULT_LTR; /** * @hide */ public int mBidiFlags = BIDI_DEFAULT_LTR; private static final Style[] sStyleArray = { Style.FILL, Style.STROKE, Style.FILL_AND_STROKE Loading