xref: /aosp_15_r20/frameworks/base/libs/hwui/jni/Camera.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker #include "SkCamera.h"
2*d57664e9SAndroid Build Coastguard Worker 
3*d57664e9SAndroid Build Coastguard Worker #include "GraphicsJNI.h"
4*d57664e9SAndroid Build Coastguard Worker #include <hwui/Canvas.h>
5*d57664e9SAndroid Build Coastguard Worker 
6*d57664e9SAndroid Build Coastguard Worker static jfieldID gNativeInstanceFieldID;
7*d57664e9SAndroid Build Coastguard Worker 
Camera_constructor(JNIEnv * env,jobject obj)8*d57664e9SAndroid Build Coastguard Worker static void Camera_constructor(JNIEnv* env, jobject obj) {
9*d57664e9SAndroid Build Coastguard Worker     Sk3DView* view = new Sk3DView;
10*d57664e9SAndroid Build Coastguard Worker     env->SetLongField(obj, gNativeInstanceFieldID, reinterpret_cast<jlong>(view));
11*d57664e9SAndroid Build Coastguard Worker }
12*d57664e9SAndroid Build Coastguard Worker 
Camera_destructor(JNIEnv * env,jobject obj)13*d57664e9SAndroid Build Coastguard Worker static void Camera_destructor(JNIEnv* env, jobject obj) {
14*d57664e9SAndroid Build Coastguard Worker     jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
15*d57664e9SAndroid Build Coastguard Worker     Sk3DView* view = reinterpret_cast<Sk3DView*>(viewHandle);
16*d57664e9SAndroid Build Coastguard Worker     delete view;
17*d57664e9SAndroid Build Coastguard Worker }
18*d57664e9SAndroid Build Coastguard Worker 
Camera_save(JNIEnv * env,jobject obj)19*d57664e9SAndroid Build Coastguard Worker static void Camera_save(JNIEnv* env, jobject obj) {
20*d57664e9SAndroid Build Coastguard Worker     jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
21*d57664e9SAndroid Build Coastguard Worker     Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
22*d57664e9SAndroid Build Coastguard Worker     v->save();
23*d57664e9SAndroid Build Coastguard Worker }
24*d57664e9SAndroid Build Coastguard Worker 
Camera_restore(JNIEnv * env,jobject obj)25*d57664e9SAndroid Build Coastguard Worker static void Camera_restore(JNIEnv* env, jobject obj) {
26*d57664e9SAndroid Build Coastguard Worker     jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
27*d57664e9SAndroid Build Coastguard Worker     Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
28*d57664e9SAndroid Build Coastguard Worker     v->restore();
29*d57664e9SAndroid Build Coastguard Worker }
30*d57664e9SAndroid Build Coastguard Worker 
Camera_translate(JNIEnv * env,jobject obj,jfloat dx,jfloat dy,jfloat dz)31*d57664e9SAndroid Build Coastguard Worker static void Camera_translate(JNIEnv* env, jobject obj,
32*d57664e9SAndroid Build Coastguard Worker                              jfloat dx, jfloat dy, jfloat dz) {
33*d57664e9SAndroid Build Coastguard Worker     jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
34*d57664e9SAndroid Build Coastguard Worker     Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
35*d57664e9SAndroid Build Coastguard Worker     v->translate(dx, dy, dz);
36*d57664e9SAndroid Build Coastguard Worker }
37*d57664e9SAndroid Build Coastguard Worker 
Camera_rotateX(JNIEnv * env,jobject obj,jfloat degrees)38*d57664e9SAndroid Build Coastguard Worker static void Camera_rotateX(JNIEnv* env, jobject obj, jfloat degrees) {
39*d57664e9SAndroid Build Coastguard Worker     jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
40*d57664e9SAndroid Build Coastguard Worker     Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
41*d57664e9SAndroid Build Coastguard Worker     v->rotateX(degrees);
42*d57664e9SAndroid Build Coastguard Worker }
43*d57664e9SAndroid Build Coastguard Worker 
Camera_rotateY(JNIEnv * env,jobject obj,jfloat degrees)44*d57664e9SAndroid Build Coastguard Worker static void Camera_rotateY(JNIEnv* env, jobject obj, jfloat degrees) {
45*d57664e9SAndroid Build Coastguard Worker     jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
46*d57664e9SAndroid Build Coastguard Worker     Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
47*d57664e9SAndroid Build Coastguard Worker     v->rotateY(degrees);
48*d57664e9SAndroid Build Coastguard Worker }
49*d57664e9SAndroid Build Coastguard Worker 
Camera_rotateZ(JNIEnv * env,jobject obj,jfloat degrees)50*d57664e9SAndroid Build Coastguard Worker static void Camera_rotateZ(JNIEnv* env, jobject obj, jfloat degrees) {
51*d57664e9SAndroid Build Coastguard Worker     jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
52*d57664e9SAndroid Build Coastguard Worker     Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
53*d57664e9SAndroid Build Coastguard Worker     v->rotateZ(degrees);
54*d57664e9SAndroid Build Coastguard Worker }
55*d57664e9SAndroid Build Coastguard Worker 
Camera_rotate(JNIEnv * env,jobject obj,jfloat x,jfloat y,jfloat z)56*d57664e9SAndroid Build Coastguard Worker static void Camera_rotate(JNIEnv* env, jobject obj, jfloat x, jfloat y, jfloat z) {
57*d57664e9SAndroid Build Coastguard Worker     jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
58*d57664e9SAndroid Build Coastguard Worker     Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
59*d57664e9SAndroid Build Coastguard Worker     v->rotateX(x);
60*d57664e9SAndroid Build Coastguard Worker     v->rotateY(y);
61*d57664e9SAndroid Build Coastguard Worker     v->rotateZ(z);
62*d57664e9SAndroid Build Coastguard Worker }
63*d57664e9SAndroid Build Coastguard Worker 
Camera_setLocation(JNIEnv * env,jobject obj,jfloat x,jfloat y,jfloat z)64*d57664e9SAndroid Build Coastguard Worker static void Camera_setLocation(JNIEnv* env, jobject obj, jfloat x, jfloat y, jfloat z) {
65*d57664e9SAndroid Build Coastguard Worker     jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
66*d57664e9SAndroid Build Coastguard Worker     Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
67*d57664e9SAndroid Build Coastguard Worker     v->setCameraLocation(x, y, z);
68*d57664e9SAndroid Build Coastguard Worker }
69*d57664e9SAndroid Build Coastguard Worker 
Camera_getLocationX(JNIEnv * env,jobject obj)70*d57664e9SAndroid Build Coastguard Worker static jfloat Camera_getLocationX(JNIEnv* env, jobject obj) {
71*d57664e9SAndroid Build Coastguard Worker     jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
72*d57664e9SAndroid Build Coastguard Worker     Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
73*d57664e9SAndroid Build Coastguard Worker     return SkScalarToFloat(v->getCameraLocationX());
74*d57664e9SAndroid Build Coastguard Worker }
75*d57664e9SAndroid Build Coastguard Worker 
Camera_getLocationY(JNIEnv * env,jobject obj)76*d57664e9SAndroid Build Coastguard Worker static jfloat Camera_getLocationY(JNIEnv* env, jobject obj) {
77*d57664e9SAndroid Build Coastguard Worker     jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
78*d57664e9SAndroid Build Coastguard Worker     Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
79*d57664e9SAndroid Build Coastguard Worker     return SkScalarToFloat(v->getCameraLocationY());
80*d57664e9SAndroid Build Coastguard Worker }
81*d57664e9SAndroid Build Coastguard Worker 
Camera_getLocationZ(JNIEnv * env,jobject obj)82*d57664e9SAndroid Build Coastguard Worker static jfloat Camera_getLocationZ(JNIEnv* env, jobject obj) {
83*d57664e9SAndroid Build Coastguard Worker     jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
84*d57664e9SAndroid Build Coastguard Worker     Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
85*d57664e9SAndroid Build Coastguard Worker     return SkScalarToFloat(v->getCameraLocationZ());
86*d57664e9SAndroid Build Coastguard Worker }
87*d57664e9SAndroid Build Coastguard Worker 
Camera_getMatrix(JNIEnv * env,jobject obj,jlong matrixHandle)88*d57664e9SAndroid Build Coastguard Worker static void Camera_getMatrix(JNIEnv* env, jobject obj, jlong matrixHandle) {
89*d57664e9SAndroid Build Coastguard Worker     SkMatrix* native_matrix =  reinterpret_cast<SkMatrix*>(matrixHandle);
90*d57664e9SAndroid Build Coastguard Worker     jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
91*d57664e9SAndroid Build Coastguard Worker     Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
92*d57664e9SAndroid Build Coastguard Worker     v->getMatrix(native_matrix);
93*d57664e9SAndroid Build Coastguard Worker }
94*d57664e9SAndroid Build Coastguard Worker 
Camera_applyToCanvas(JNIEnv * env,jobject obj,jlong canvasHandle)95*d57664e9SAndroid Build Coastguard Worker static void Camera_applyToCanvas(JNIEnv* env, jobject obj, jlong canvasHandle) {
96*d57664e9SAndroid Build Coastguard Worker     android::Canvas* canvas = reinterpret_cast<android::Canvas*>(canvasHandle);
97*d57664e9SAndroid Build Coastguard Worker     jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
98*d57664e9SAndroid Build Coastguard Worker     Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
99*d57664e9SAndroid Build Coastguard Worker     SkMatrix matrix;
100*d57664e9SAndroid Build Coastguard Worker     v->getMatrix(&matrix);
101*d57664e9SAndroid Build Coastguard Worker     canvas->concat(matrix);
102*d57664e9SAndroid Build Coastguard Worker }
103*d57664e9SAndroid Build Coastguard Worker 
Camera_dotWithNormal(JNIEnv * env,jobject obj,jfloat x,jfloat y,jfloat z)104*d57664e9SAndroid Build Coastguard Worker static jfloat Camera_dotWithNormal(JNIEnv* env, jobject obj,
105*d57664e9SAndroid Build Coastguard Worker                                   jfloat x, jfloat y, jfloat z) {
106*d57664e9SAndroid Build Coastguard Worker     jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
107*d57664e9SAndroid Build Coastguard Worker     Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
108*d57664e9SAndroid Build Coastguard Worker     SkScalar dot = v->dotWithNormal(x, y, z);
109*d57664e9SAndroid Build Coastguard Worker     return SkScalarToFloat(dot);
110*d57664e9SAndroid Build Coastguard Worker }
111*d57664e9SAndroid Build Coastguard Worker 
112*d57664e9SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
113*d57664e9SAndroid Build Coastguard Worker 
114*d57664e9SAndroid Build Coastguard Worker /*
115*d57664e9SAndroid Build Coastguard Worker  * JNI registration.
116*d57664e9SAndroid Build Coastguard Worker  */
117*d57664e9SAndroid Build Coastguard Worker static const JNINativeMethod gCameraMethods[] = {
118*d57664e9SAndroid Build Coastguard Worker     /* name, signature, funcPtr */
119*d57664e9SAndroid Build Coastguard Worker 
120*d57664e9SAndroid Build Coastguard Worker     { "nativeConstructor",   "()V",    (void*)Camera_constructor   },
121*d57664e9SAndroid Build Coastguard Worker     { "nativeDestructor",    "()V",    (void*)Camera_destructor    },
122*d57664e9SAndroid Build Coastguard Worker     { "save",                "()V",    (void*)Camera_save          },
123*d57664e9SAndroid Build Coastguard Worker     { "restore",             "()V",    (void*)Camera_restore       },
124*d57664e9SAndroid Build Coastguard Worker     { "translate",           "(FFF)V", (void*)Camera_translate     },
125*d57664e9SAndroid Build Coastguard Worker     { "rotateX",             "(F)V",   (void*)Camera_rotateX       },
126*d57664e9SAndroid Build Coastguard Worker     { "rotateY",             "(F)V",   (void*)Camera_rotateY       },
127*d57664e9SAndroid Build Coastguard Worker     { "rotateZ",             "(F)V",   (void*)Camera_rotateZ       },
128*d57664e9SAndroid Build Coastguard Worker     { "rotate",              "(FFF)V", (void*)Camera_rotate        },
129*d57664e9SAndroid Build Coastguard Worker     { "setLocation",         "(FFF)V", (void*)Camera_setLocation   },
130*d57664e9SAndroid Build Coastguard Worker     { "getLocationX",        "()F",    (void*)Camera_getLocationX  },
131*d57664e9SAndroid Build Coastguard Worker     { "getLocationY",        "()F",    (void*)Camera_getLocationY  },
132*d57664e9SAndroid Build Coastguard Worker     { "getLocationZ",        "()F",    (void*)Camera_getLocationZ  },
133*d57664e9SAndroid Build Coastguard Worker     { "nativeGetMatrix",     "(J)V",   (void*)Camera_getMatrix     },
134*d57664e9SAndroid Build Coastguard Worker     { "nativeApplyToCanvas", "(J)V",   (void*)Camera_applyToCanvas },
135*d57664e9SAndroid Build Coastguard Worker     { "dotWithNormal",       "(FFF)F", (void*)Camera_dotWithNormal }
136*d57664e9SAndroid Build Coastguard Worker };
137*d57664e9SAndroid Build Coastguard Worker 
register_android_graphics_Camera(JNIEnv * env)138*d57664e9SAndroid Build Coastguard Worker int register_android_graphics_Camera(JNIEnv* env) {
139*d57664e9SAndroid Build Coastguard Worker     jclass clazz = android::FindClassOrDie(env, "android/graphics/Camera");
140*d57664e9SAndroid Build Coastguard Worker     gNativeInstanceFieldID = android::GetFieldIDOrDie(env, clazz, "native_instance", "J");
141*d57664e9SAndroid Build Coastguard Worker     return android::RegisterMethodsOrDie(env, "android/graphics/Camera", gCameraMethods,
142*d57664e9SAndroid Build Coastguard Worker                                          NELEM(gCameraMethods));
143*d57664e9SAndroid Build Coastguard Worker }
144