[androidkit] add transformation operations to Matrix
Change-Id: I5a81087eb56f10786c136df7cf68bb0e34742abf Reviewed-on: https://skia-review.googlesource.com/c/skia/+/402676 Commit-Queue: Jorge Betancourt <jmbetancourt@google.com> Reviewed-by: Florin Malita <fmalita@chromium.org>
This commit is contained in:
parent
a60cc3ea41
commit
14efdd3d50
@ -20,18 +20,11 @@ static jlong Matrix_Create(JNIEnv* env, jobject, jfloat m0, jfloat m4, jfloat m8
|
|||||||
m2, m6, m10, m14,
|
m2, m6, m10, m14,
|
||||||
m3, m7, m11, m15));
|
m3, m7, m11, m15));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Matrix_Release(JNIEnv* env, jobject, jlong native_matrix) {
|
static void Matrix_Release(JNIEnv* env, jobject, jlong native_matrix) {
|
||||||
delete reinterpret_cast<SkM44*>(native_matrix);
|
delete reinterpret_cast<SkM44*>(native_matrix);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Matrix_PostConcat(JNIEnv* env, jobject, jlong native_matrixA, jlong native_matrixB) {
|
|
||||||
if (auto* mA = reinterpret_cast<SkM44*>(native_matrixA),
|
|
||||||
* mB = reinterpret_cast<SkM44*>(native_matrixB); mA && mB) {
|
|
||||||
mA->postConcat(*mB);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static void Matrix_PreConcat(JNIEnv* env, jobject, jlong native_matrixA, jlong native_matrixB) {
|
static void Matrix_PreConcat(JNIEnv* env, jobject, jlong native_matrixA, jlong native_matrixB) {
|
||||||
if (auto* mA = reinterpret_cast<SkM44*>(native_matrixA),
|
if (auto* mA = reinterpret_cast<SkM44*>(native_matrixA),
|
||||||
* mB = reinterpret_cast<SkM44*>(native_matrixB); mA && mB) {
|
* mB = reinterpret_cast<SkM44*>(native_matrixB); mA && mB) {
|
||||||
@ -52,7 +45,6 @@ int register_androidkit_Matrix(JNIEnv* env) {
|
|||||||
static const JNINativeMethod methods[] = {
|
static const JNINativeMethod methods[] = {
|
||||||
{"nCreate" , "(FFFFFFFFFFFFFFFF)J" , reinterpret_cast<void*>(Matrix_Create)},
|
{"nCreate" , "(FFFFFFFFFFFFFFFF)J" , reinterpret_cast<void*>(Matrix_Create)},
|
||||||
{"nRelease" , "(J)V" , reinterpret_cast<void*>(Matrix_Release)},
|
{"nRelease" , "(J)V" , reinterpret_cast<void*>(Matrix_Release)},
|
||||||
{"nPostConcat" , "(JJ)V" , reinterpret_cast<void*>(Matrix_PostConcat)},
|
|
||||||
{"nPreConcat" , "(JJ)V" , reinterpret_cast<void*>(Matrix_PreConcat)},
|
{"nPreConcat" , "(JJ)V" , reinterpret_cast<void*>(Matrix_PreConcat)},
|
||||||
{"nConcat" , "(JJ)J" , reinterpret_cast<void*>(Matrix_Concat)},
|
{"nConcat" , "(JJ)J" , reinterpret_cast<void*>(Matrix_Concat)},
|
||||||
};
|
};
|
||||||
|
@ -41,7 +41,9 @@ public class Matrix {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Concat A * B, return new matrix as result
|
* A: this Matrix
|
||||||
|
* B: Matrix passed in
|
||||||
|
* Concat A * B, return new Matrix C as result
|
||||||
*/
|
*/
|
||||||
public static Matrix Concat(Matrix a, Matrix b) {
|
public static Matrix Concat(Matrix a, Matrix b) {
|
||||||
long nativeA = a.mNativeInstance;
|
long nativeA = a.mNativeInstance;
|
||||||
@ -51,15 +53,8 @@ public class Matrix {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Concat A * B, store result in Matrix A
|
* A: this Matrix
|
||||||
*/
|
* B: Matrix passed in
|
||||||
public void postConcat(Matrix b) {
|
|
||||||
long nativeA = this.mNativeInstance;
|
|
||||||
long nativeB = b.mNativeInstance;
|
|
||||||
nPostConcat(nativeA, nativeB);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Concat B * A, store result in Matrix A
|
* Concat B * A, store result in Matrix A
|
||||||
*/
|
*/
|
||||||
public void preConcat(Matrix b) {
|
public void preConcat(Matrix b) {
|
||||||
@ -68,6 +63,78 @@ public class Matrix {
|
|||||||
nPreConcat(nativeA, nativeB);
|
nPreConcat(nativeA, nativeB);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translates this Matrix by x, y, z
|
||||||
|
* Store result in caller Matrix
|
||||||
|
* returns reference to this Matrix for operation chaining
|
||||||
|
*
|
||||||
|
* TODO: optimize calls to JNI
|
||||||
|
*/
|
||||||
|
public Matrix translate(float x, float y, float z) {
|
||||||
|
Matrix t = new Matrix(1, 0, 0, x,
|
||||||
|
0, 1, 0, y,
|
||||||
|
0, 0, 1, z,
|
||||||
|
0, 0, 0, 1);
|
||||||
|
this.preConcat(t);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Scales this Matrix by x, y, z
|
||||||
|
* Store result in caller Matrix
|
||||||
|
* returns reference to this Matrix for operation chaining
|
||||||
|
*/
|
||||||
|
public Matrix scale(float x, float y, float z) {
|
||||||
|
Matrix s = new Matrix(x, 0, 0, 0,
|
||||||
|
0, y, 0, 0,
|
||||||
|
0, 0, z, 0,
|
||||||
|
0, 0, 0, 1);
|
||||||
|
this.preConcat(s);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Rotates this Matrix along the x-axis by rad radians
|
||||||
|
* Store result in caller Matrix
|
||||||
|
* returns reference to this Matrix for operation chaining
|
||||||
|
*/
|
||||||
|
public Matrix rotateX(float rad) {
|
||||||
|
Matrix r = new Matrix(1, 0, 0, 0,
|
||||||
|
0, (float) Math.cos(rad), (float) -Math.sin(rad), 0,
|
||||||
|
0, (float) Math.sin(rad), (float) Math.cos(rad), 0,
|
||||||
|
0, 0, 0, 1);
|
||||||
|
this.preConcat(r);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Rotates this Matrix along the y-axis by rad radians
|
||||||
|
* Store result in caller Matrix
|
||||||
|
* returns reference to this Matrix for operation chaining
|
||||||
|
*/
|
||||||
|
public Matrix rotateY(float rad) {
|
||||||
|
Matrix r = new Matrix((float) Math.cos(rad), 0, (float) Math.sin(rad), 0,
|
||||||
|
0, 1, 0, 0,
|
||||||
|
(float) -Math.sin(rad), 0, (float) Math.cos(rad), 0,
|
||||||
|
0, 0, 0, 1);
|
||||||
|
this.preConcat(r);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Rotates this Matrix along the z-axis by rad radians
|
||||||
|
* Store result in caller Matrix
|
||||||
|
* returns reference to this Matrix for operation chaining
|
||||||
|
*/
|
||||||
|
public Matrix rotateZ(float rad) {
|
||||||
|
Matrix r = new Matrix((float) Math.cos(rad), (float) -Math.sin(rad), 0, 0,
|
||||||
|
(float) Math.sin(rad), (float) Math.cos(rad), 0, 0,
|
||||||
|
0, 0, 1, 0,
|
||||||
|
0, 0, 0, 1);
|
||||||
|
this.preConcat(r);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Releases any resources associated with this Matrix.
|
* Releases any resources associated with this Matrix.
|
||||||
*/
|
*/
|
||||||
@ -87,7 +154,6 @@ public class Matrix {
|
|||||||
float m3, float m7, float m11, float m15);
|
float m3, float m7, float m11, float m15);
|
||||||
private static native void nRelease(long nativeInstance);
|
private static native void nRelease(long nativeInstance);
|
||||||
|
|
||||||
private static native void nPostConcat(long mNativeInstanceA, long mNativeInstanceB);
|
|
||||||
private static native void nPreConcat(long mNativeInstanceA, long mNativeInstanceB);
|
private static native void nPreConcat(long mNativeInstanceA, long mNativeInstanceB);
|
||||||
private static native long nConcat(long mNativeInstanceA, long mNativeInstanceB);
|
private static native long nConcat(long mNativeInstanceA, long mNativeInstanceB);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user