am 10d32a33: Merge change I16dc1411 into eclair-mr2
Merge commit '10d32a338d5400786e784a0d6f51b53acea76b44' into eclair-mr2-plus-aosp * commit '10d32a338d5400786e784a0d6f51b53acea76b44': add boundary patch
This commit is contained in:
@@ -27,6 +27,9 @@
|
||||
#include "SkShader.h"
|
||||
#include "SkTemplates.h"
|
||||
|
||||
#include "SkBoundaryPatch.h"
|
||||
#include "SkMeshUtils.h"
|
||||
|
||||
#define TIME_DRAWx
|
||||
|
||||
static uint32_t get_thread_msec() {
|
||||
@@ -861,8 +864,6 @@ public:
|
||||
*matrix = canvas->getTotalMatrix();
|
||||
}
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static JNINativeMethod gCanvasMethods[] = {
|
||||
{"finalizer", "(I)V", (void*) SkCanvasGlue::finalizer},
|
||||
@@ -965,6 +966,42 @@ static JNINativeMethod gCanvasMethods[] = {
|
||||
{"freeCaches", "()V", (void*) SkCanvasGlue::freeCaches}
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static void BoundaryPatch_computeCubic(JNIEnv* env, jobject, jfloatArray jpts,
|
||||
int texW, int texH, int rows, int cols,
|
||||
jfloatArray jverts, jshortArray jidx) {
|
||||
AutoJavaFloatArray ptsArray(env, jpts, 24, kRO_JNIAccess);
|
||||
|
||||
int vertCount = rows * cols;
|
||||
AutoJavaFloatArray vertsArray(env, jverts, vertCount * 4, kRW_JNIAccess);
|
||||
SkPoint* verts = (SkPoint*)vertsArray.ptr();
|
||||
SkPoint* texs = verts + vertCount;
|
||||
|
||||
int idxCount = (rows - 1) * (cols - 1) * 6;
|
||||
AutoJavaShortArray idxArray(env, jidx, idxCount, kRW_JNIAccess);
|
||||
uint16_t* idx = (uint16_t*)idxArray.ptr(); // cast from int16_t*
|
||||
|
||||
SkCubicBoundary cubic;
|
||||
memcpy(cubic.fPts, ptsArray.ptr(), 12 * sizeof(SkPoint));
|
||||
|
||||
SkBoundaryPatch patch;
|
||||
patch.setBoundary(&cubic);
|
||||
// generate our verts
|
||||
patch.evalPatch(verts, rows, cols);
|
||||
|
||||
SkMeshIndices mesh;
|
||||
// generate our texs and idx
|
||||
mesh.init(texs, idx, texW, texH, rows, cols);
|
||||
}
|
||||
|
||||
static JNINativeMethod gBoundaryPatchMethods[] = {
|
||||
{"nativeComputeCubicPatch", "([FIIII[F[S)V",
|
||||
(void*)BoundaryPatch_computeCubic },
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <android_runtime/AndroidRuntime.h>
|
||||
|
||||
#define REG(env, name, array) \
|
||||
@@ -976,6 +1013,7 @@ int register_android_graphics_Canvas(JNIEnv* env) {
|
||||
int result;
|
||||
|
||||
REG(env, "android/graphics/Canvas", gCanvasMethods);
|
||||
REG(env, "android/graphics/utils/BoundaryPatch", gBoundaryPatchMethods);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ bool GraphicsJNI::hasException(JNIEnv *env) {
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
AutoJavaFloatArray::AutoJavaFloatArray(JNIEnv* env, jfloatArray array,
|
||||
int minLength)
|
||||
int minLength, JNIAccess access)
|
||||
: fEnv(env), fArray(array), fPtr(NULL), fLen(0) {
|
||||
SkASSERT(env);
|
||||
if (array) {
|
||||
@@ -66,11 +66,12 @@ AutoJavaFloatArray::AutoJavaFloatArray(JNIEnv* env, jfloatArray array,
|
||||
}
|
||||
fPtr = env->GetFloatArrayElements(array, NULL);
|
||||
}
|
||||
fReleaseMode = (access == kRO_JNIAccess) ? JNI_ABORT : 0;
|
||||
}
|
||||
|
||||
AutoJavaFloatArray::~AutoJavaFloatArray() {
|
||||
if (fPtr) {
|
||||
fEnv->ReleaseFloatArrayElements(fArray, fPtr, 0);
|
||||
fEnv->ReleaseFloatArrayElements(fArray, fPtr, fReleaseMode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,7 +95,7 @@ AutoJavaIntArray::~AutoJavaIntArray() {
|
||||
}
|
||||
|
||||
AutoJavaShortArray::AutoJavaShortArray(JNIEnv* env, jshortArray array,
|
||||
int minLength)
|
||||
int minLength, JNIAccess access)
|
||||
: fEnv(env), fArray(array), fPtr(NULL), fLen(0) {
|
||||
SkASSERT(env);
|
||||
if (array) {
|
||||
@@ -104,11 +105,12 @@ AutoJavaShortArray::AutoJavaShortArray(JNIEnv* env, jshortArray array,
|
||||
}
|
||||
fPtr = env->GetShortArrayElements(array, NULL);
|
||||
}
|
||||
fReleaseMode = (access == kRO_JNIAccess) ? JNI_ABORT : 0;
|
||||
}
|
||||
|
||||
AutoJavaShortArray::~AutoJavaShortArray() {
|
||||
if (fPtr) {
|
||||
fEnv->ReleaseShortArrayElements(fArray, fPtr, 0);
|
||||
fEnv->ReleaseShortArrayElements(fArray, fPtr, fReleaseMode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -80,9 +80,15 @@ private:
|
||||
bool fReportSizeToVM;
|
||||
};
|
||||
|
||||
enum JNIAccess {
|
||||
kRO_JNIAccess,
|
||||
kRW_JNIAccess
|
||||
};
|
||||
|
||||
class AutoJavaFloatArray {
|
||||
public:
|
||||
AutoJavaFloatArray(JNIEnv* env, jfloatArray array, int minLength = 0);
|
||||
AutoJavaFloatArray(JNIEnv* env, jfloatArray array,
|
||||
int minLength = 0, JNIAccess = kRW_JNIAccess);
|
||||
~AutoJavaFloatArray();
|
||||
|
||||
float* ptr() const { return fPtr; }
|
||||
@@ -93,6 +99,7 @@ private:
|
||||
jfloatArray fArray;
|
||||
float* fPtr;
|
||||
int fLen;
|
||||
int fReleaseMode;
|
||||
};
|
||||
|
||||
class AutoJavaIntArray {
|
||||
@@ -112,7 +119,8 @@ private:
|
||||
|
||||
class AutoJavaShortArray {
|
||||
public:
|
||||
AutoJavaShortArray(JNIEnv* env, jshortArray array, int minLength = 0);
|
||||
AutoJavaShortArray(JNIEnv* env, jshortArray array,
|
||||
int minLength = 0, JNIAccess = kRW_JNIAccess);
|
||||
~AutoJavaShortArray();
|
||||
|
||||
jshort* ptr() const { return fPtr; }
|
||||
@@ -123,6 +131,7 @@ private:
|
||||
jshortArray fArray;
|
||||
jshort* fPtr;
|
||||
int fLen;
|
||||
int fReleaseMode;
|
||||
};
|
||||
|
||||
class AutoJavaByteArray {
|
||||
|
||||
Reference in New Issue
Block a user