blob: a5e1adf26861dcd2dfd396965eebca4adf42ddcf [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001#include "SkCamera.h"
2
Florin Malita5c3d9272014-05-08 10:35:36 -04003#include "GraphicsJNI.h"
sergeyvdccca442016-03-21 15:38:21 -07004#include <hwui/Canvas.h>
Florin Malita5c3d9272014-05-08 10:35:36 -04005
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006static jfieldID gNativeInstanceFieldID;
7
8static void Camera_constructor(JNIEnv* env, jobject obj) {
9 Sk3DView* view = new Sk3DView;
Ashok Bhat36bef0b2014-01-20 20:08:01 +000010 env->SetLongField(obj, gNativeInstanceFieldID, reinterpret_cast<jlong>(view));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080011}
12
13static void Camera_destructor(JNIEnv* env, jobject obj) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000014 jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
15 Sk3DView* view = reinterpret_cast<Sk3DView*>(viewHandle);
16 delete view;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080017}
18
19static void Camera_save(JNIEnv* env, jobject obj) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000020 jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
21 Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080022 v->save();
23}
24
25static void Camera_restore(JNIEnv* env, jobject obj) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000026 jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
27 Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080028 v->restore();
29}
30
31static void Camera_translate(JNIEnv* env, jobject obj,
Ashok Bhat36bef0b2014-01-20 20:08:01 +000032 jfloat dx, jfloat dy, jfloat dz) {
33 jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
34 Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
Leon Scroggins III2e0103e2014-04-04 17:05:24 -040035 v->translate(dx, dy, dz);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080036}
37
Ashok Bhat36bef0b2014-01-20 20:08:01 +000038static void Camera_rotateX(JNIEnv* env, jobject obj, jfloat degrees) {
39 jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
40 Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
Leon Scroggins III2e0103e2014-04-04 17:05:24 -040041 v->rotateX(degrees);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080042}
43
Ashok Bhat36bef0b2014-01-20 20:08:01 +000044static void Camera_rotateY(JNIEnv* env, jobject obj, jfloat degrees) {
45 jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
46 Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
Leon Scroggins III2e0103e2014-04-04 17:05:24 -040047 v->rotateY(degrees);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080048}
49
Ashok Bhat36bef0b2014-01-20 20:08:01 +000050static void Camera_rotateZ(JNIEnv* env, jobject obj, jfloat degrees) {
51 jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
52 Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
Leon Scroggins III2e0103e2014-04-04 17:05:24 -040053 v->rotateZ(degrees);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080054}
55
Romain Guy47b8ade2011-02-23 19:46:33 -080056static void Camera_rotate(JNIEnv* env, jobject obj, jfloat x, jfloat y, jfloat z) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000057 jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
58 Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
Leon Scroggins III2e0103e2014-04-04 17:05:24 -040059 v->rotateX(x);
60 v->rotateY(y);
61 v->rotateZ(z);
Romain Guy47b8ade2011-02-23 19:46:33 -080062}
63
64static void Camera_setLocation(JNIEnv* env, jobject obj, jfloat x, jfloat y, jfloat z) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000065 jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
66 Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
Leon Scroggins III2e0103e2014-04-04 17:05:24 -040067 v->setCameraLocation(x, y, z);
Romain Guy47b8ade2011-02-23 19:46:33 -080068}
69
Chet Haasea1cff502012-02-21 13:43:44 -080070static jfloat Camera_getLocationX(JNIEnv* env, jobject obj) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000071 jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
72 Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
Chet Haasea1cff502012-02-21 13:43:44 -080073 return SkScalarToFloat(v->getCameraLocationX());
74}
75
76static jfloat Camera_getLocationY(JNIEnv* env, jobject obj) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000077 jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
78 Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
Chet Haasea1cff502012-02-21 13:43:44 -080079 return SkScalarToFloat(v->getCameraLocationY());
80}
81
82static jfloat Camera_getLocationZ(JNIEnv* env, jobject obj) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000083 jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
84 Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
Chet Haasea1cff502012-02-21 13:43:44 -080085 return SkScalarToFloat(v->getCameraLocationZ());
86}
87
Ashok Bhat36bef0b2014-01-20 20:08:01 +000088static void Camera_getMatrix(JNIEnv* env, jobject obj, jlong matrixHandle) {
89 SkMatrix* native_matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
90 jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
91 Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
92 v->getMatrix(native_matrix);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080093}
94
Ashok Bhat36bef0b2014-01-20 20:08:01 +000095static void Camera_applyToCanvas(JNIEnv* env, jobject obj, jlong canvasHandle) {
John Reck85308532018-08-01 16:39:22 -070096 android::Canvas* canvas = reinterpret_cast<android::Canvas*>(canvasHandle);
Ashok Bhat36bef0b2014-01-20 20:08:01 +000097 jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
98 Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
John Reck85308532018-08-01 16:39:22 -070099 SkMatrix matrix;
100 v->getMatrix(&matrix);
101 canvas->concat(matrix);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800102}
103
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000104static jfloat Camera_dotWithNormal(JNIEnv* env, jobject obj,
105 jfloat x, jfloat y, jfloat z) {
106 jlong viewHandle = env->GetLongField(obj, gNativeInstanceFieldID);
107 Sk3DView* v = reinterpret_cast<Sk3DView*>(viewHandle);
Leon Scroggins III2e0103e2014-04-04 17:05:24 -0400108 SkScalar dot = v->dotWithNormal(x, y, z);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800109 return SkScalarToFloat(dot);
110}
111
112// ----------------------------------------------------------------------------
113
114/*
115 * JNI registration.
116 */
Daniel Micay76f6a862015-09-19 17:31:01 -0400117static const JNINativeMethod gCameraMethods[] = {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800118 /* name, signature, funcPtr */
119
120 { "nativeConstructor", "()V", (void*)Camera_constructor },
121 { "nativeDestructor", "()V", (void*)Camera_destructor },
122 { "save", "()V", (void*)Camera_save },
123 { "restore", "()V", (void*)Camera_restore },
124 { "translate", "(FFF)V", (void*)Camera_translate },
125 { "rotateX", "(F)V", (void*)Camera_rotateX },
126 { "rotateY", "(F)V", (void*)Camera_rotateY },
127 { "rotateZ", "(F)V", (void*)Camera_rotateZ },
Romain Guy47b8ade2011-02-23 19:46:33 -0800128 { "rotate", "(FFF)V", (void*)Camera_rotate },
129 { "setLocation", "(FFF)V", (void*)Camera_setLocation },
Chet Haasea1cff502012-02-21 13:43:44 -0800130 { "getLocationX", "()F", (void*)Camera_getLocationX },
131 { "getLocationY", "()F", (void*)Camera_getLocationY },
132 { "getLocationZ", "()F", (void*)Camera_getLocationZ },
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000133 { "nativeGetMatrix", "(J)V", (void*)Camera_getMatrix },
134 { "nativeApplyToCanvas", "(J)V", (void*)Camera_applyToCanvas },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800135 { "dotWithNormal", "(FFF)F", (void*)Camera_dotWithNormal }
136};
137
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800138int register_android_graphics_Camera(JNIEnv* env) {
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800139 jclass clazz = android::FindClassOrDie(env, "android/graphics/Camera");
140 gNativeInstanceFieldID = android::GetFieldIDOrDie(env, clazz, "native_instance", "J");
141 return android::RegisterMethodsOrDie(env, "android/graphics/Camera", gCameraMethods,
142 NELEM(gCameraMethods));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800143}