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
This commit is contained in:
Mathieu Chartier
2014-01-25 17:54:22 -08:00
parent 3c30eff63f
commit 768480c245

View File

@@ -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