From 768480c2458fda63f5eaab37c03e0671d759c514 Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Sat, 25 Jan 2014 17:54:22 -0800 Subject: [PATCH] Fix dest == src bugs in Matrix.cpp. The main bug was that the AutoJavaFloatArray autoSrc was not passing in read only. This meant that the destructor overwrote the data which the autoDst AutoJavaFloatArray had written in it's destructor. This case only happened if src == dest and the arrays were copies. Also improved performance by passing in read only a few other places. Bug: 12570144 Change-Id: Idc8764087dc165433c584b87a0f9d4ed0ec795e8 --- core/jni/android/graphics/Matrix.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/jni/android/graphics/Matrix.cpp b/core/jni/android/graphics/Matrix.cpp index d0871ac5082fb..4bd59e7296328 100644 --- a/core/jni/android/graphics/Matrix.cpp +++ b/core/jni/android/graphics/Matrix.cpp @@ -239,8 +239,8 @@ public: SkASSERT(dstIndex >= 0); SkASSERT((unsigned)ptCount <= 4); - AutoJavaFloatArray autoSrc(env, jsrc, srcIndex + (ptCount << 1)); - AutoJavaFloatArray autoDst(env, jdst, dstIndex + (ptCount << 1)); + AutoJavaFloatArray autoSrc(env, jsrc, srcIndex + (ptCount << 1), kRO_JNIAccess); + AutoJavaFloatArray autoDst(env, jdst, dstIndex + (ptCount << 1), kRW_JNIAccess); float* src = autoSrc.ptr() + srcIndex; float* dst = autoDst.ptr() + dstIndex; @@ -268,8 +268,8 @@ public: jfloatArray src, int srcIndex, int ptCount, bool isPts) { SkASSERT(ptCount >= 0); - AutoJavaFloatArray autoSrc(env, src, srcIndex + (ptCount << 1)); - AutoJavaFloatArray autoDst(env, dst, dstIndex + (ptCount << 1)); + AutoJavaFloatArray autoSrc(env, src, srcIndex + (ptCount << 1), kRO_JNIAccess); + AutoJavaFloatArray autoDst(env, dst, dstIndex + (ptCount << 1), kRW_JNIAccess); float* srcArray = autoSrc.ptr() + srcIndex; float* dstArray = autoDst.ptr() + dstIndex; @@ -318,7 +318,7 @@ public: } static void getValues(JNIEnv* env, jobject clazz, SkMatrix* matrix, jfloatArray values) { - AutoJavaFloatArray autoValues(env, values, 9); + AutoJavaFloatArray autoValues(env, values, 9, kRW_JNIAccess); float* dst = autoValues.ptr(); #ifdef SK_SCALAR_IS_FIXED @@ -336,7 +336,7 @@ public: } static void setValues(JNIEnv* env, jobject clazz, SkMatrix* matrix, jfloatArray values) { - AutoJavaFloatArray autoValues(env, values, 9); + AutoJavaFloatArray autoValues(env, values, 9, kRO_JNIAccess); const float* src = autoValues.ptr(); #ifdef SK_SCALAR_IS_FIXED