blob: 27e2ee87f588b84345245a52788e0b54e6afeb54 [file] [log] [blame]
Chris Craik54389792013-12-20 13:28:11 -08001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "OpenGLRenderer"
John Reckf6481082016-02-02 15:18:23 -080018#define ATRACE_TAG ATRACE_TAG_VIEW
Chris Craik54389792013-12-20 13:28:11 -080019
20#include <EGL/egl.h>
21
22#include "jni.h"
23#include "GraphicsJNI.h"
24#include <nativehelper/JNIHelp.h>
25#include <android_runtime/AndroidRuntime.h>
26
John Recke45b1fd2014-04-15 09:50:16 -070027#include <Animator.h>
John Reckf6481082016-02-02 15:18:23 -080028#include <DamageAccumulator.h>
29#include <Matrix.h>
John Reck113e0822014-03-18 09:22:59 -070030#include <RenderNode.h>
John Reck38f6c032016-03-17 10:23:49 -070031#include <renderthread/CanvasContext.h>
John Reckf6481082016-02-02 15:18:23 -080032#include <TreeInfo.h>
sergeyvdccca442016-03-21 15:38:21 -070033#include <hwui/Paint.h>
Chris Craik54389792013-12-20 13:28:11 -080034
Andreas Gampe987f79f2014-11-18 17:29:46 -080035#include "core_jni_helpers.h"
36
Chris Craik54389792013-12-20 13:28:11 -080037namespace android {
38
39using namespace uirenderer;
40
John Reck79c7de72014-05-23 10:33:31 -070041#define SET_AND_DIRTY(prop, val, dirtyFlag) \
42 (reinterpret_cast<RenderNode*>(renderNodePtr)->mutateStagingProperties().prop(val) \
43 ? (reinterpret_cast<RenderNode*>(renderNodePtr)->setPropertyFieldsDirty(dirtyFlag), true) \
44 : false)
45
John Reck44b49f02016-03-25 14:29:48 -070046static JNIEnv* getenv(JavaVM* vm) {
47 JNIEnv* env;
48 if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
49 LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", vm);
50 }
51 return env;
52}
53
54static jmethodID gOnRenderNodeDetached;
55
56class RenderNodeContext : public VirtualLightRefBase {
57public:
58 RenderNodeContext(JNIEnv* env, jobject jobjRef) {
59 env->GetJavaVM(&mVm);
60 // This holds a weak ref because otherwise there's a cyclic global ref
61 // with this holding a strong global ref to the view which holds
62 // a strong ref to RenderNode which holds a strong ref to this.
63 mWeakRef = env->NewWeakGlobalRef(jobjRef);
64 }
65
66 virtual ~RenderNodeContext() {
67 JNIEnv* env = getenv(mVm);
68 env->DeleteWeakGlobalRef(mWeakRef);
69 }
70
71 jobject acquireLocalRef(JNIEnv* env) {
72 return env->NewLocalRef(mWeakRef);
73 }
74
75private:
76 JavaVM* mVm;
77 jweak mWeakRef;
78};
79
80// Called by ThreadedRenderer's JNI layer
81void onRenderNodeRemoved(JNIEnv* env, RenderNode* node) {
82 auto context = reinterpret_cast<RenderNodeContext*>(node->getUserContext());
83 if (!context) return;
84 jobject jnode = context->acquireLocalRef(env);
85 if (!jnode) {
86 // The owning node has been GC'd, release the context
87 node->setUserContext(nullptr);
88 return;
89 }
90 env->CallVoidMethod(jnode, gOnRenderNodeDetached);
91 env->DeleteLocalRef(jnode);
92}
93
Chris Craik54389792013-12-20 13:28:11 -080094// ----------------------------------------------------------------------------
95// DisplayList view properties
96// ----------------------------------------------------------------------------
97
John Reck8de65a82014-04-09 15:23:38 -070098static void android_view_RenderNode_output(JNIEnv* env,
99 jobject clazz, jlong renderNodePtr) {
100 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
101 renderNode->output();
102}
103
John Reckfe5e7b72014-05-23 17:42:28 -0700104static jint android_view_RenderNode_getDebugSize(JNIEnv* env,
105 jobject clazz, jlong renderNodePtr) {
106 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
107 return renderNode->getDebugSize();
108}
109
John Reck44b49f02016-03-25 14:29:48 -0700110static jlong android_view_RenderNode_create(JNIEnv* env, jobject thiz,
111 jstring name) {
John Reck8de65a82014-04-09 15:23:38 -0700112 RenderNode* renderNode = new RenderNode();
113 renderNode->incStrong(0);
Chris Craik54389792013-12-20 13:28:11 -0800114 if (name != NULL) {
115 const char* textArray = env->GetStringUTFChars(name, NULL);
John Reck8de65a82014-04-09 15:23:38 -0700116 renderNode->setName(textArray);
Chris Craik54389792013-12-20 13:28:11 -0800117 env->ReleaseStringUTFChars(name, textArray);
118 }
John Reck44b49f02016-03-25 14:29:48 -0700119 renderNode->setUserContext(new RenderNodeContext(env, thiz));
John Reck8de65a82014-04-09 15:23:38 -0700120 return reinterpret_cast<jlong>(renderNode);
Chris Craik54389792013-12-20 13:28:11 -0800121}
122
John Reck8de65a82014-04-09 15:23:38 -0700123static void android_view_RenderNode_destroyRenderNode(JNIEnv* env,
124 jobject clazz, jlong renderNodePtr) {
125 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
126 renderNode->decStrong(0);
Chris Craik54389792013-12-20 13:28:11 -0800127}
128
Chris Craik003cc3d2015-10-16 10:24:55 -0700129static void android_view_RenderNode_setDisplayList(JNIEnv* env,
130 jobject clazz, jlong renderNodePtr, jlong displayListPtr) {
John Reck8de65a82014-04-09 15:23:38 -0700131 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik003cc3d2015-10-16 10:24:55 -0700132 DisplayList* newData = reinterpret_cast<DisplayList*>(displayListPtr);
John Reck8de65a82014-04-09 15:23:38 -0700133 renderNode->setStagingDisplayList(newData);
Chris Craik54389792013-12-20 13:28:11 -0800134}
135
136// ----------------------------------------------------------------------------
Chris Craik49e6c732014-03-31 12:34:11 -0700137// RenderProperties - setters
Chris Craik54389792013-12-20 13:28:11 -0800138// ----------------------------------------------------------------------------
139
John Reck25fbb3f2014-06-12 13:46:45 -0700140static jboolean android_view_RenderNode_setLayerType(JNIEnv* env,
141 jobject clazz, jlong renderNodePtr, jint jlayerType) {
142 LayerType layerType = static_cast<LayerType>(jlayerType);
143 return SET_AND_DIRTY(mutateLayerProperties().setType, layerType, RenderNode::GENERIC);
144}
145
146static jboolean android_view_RenderNode_setLayerPaint(JNIEnv* env,
147 jobject clazz, jlong renderNodePtr, jlong paintPtr) {
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400148 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
John Reck25fbb3f2014-06-12 13:46:45 -0700149 return SET_AND_DIRTY(mutateLayerProperties().setFromPaint, paint, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800150}
151
John Reck79c7de72014-05-23 10:33:31 -0700152static jboolean android_view_RenderNode_setStaticMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700153 jobject clazz, jlong renderNodePtr, jlong matrixPtr) {
Chris Craik7a02ea32013-12-27 16:43:22 -0800154 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
John Reck79c7de72014-05-23 10:33:31 -0700155 return SET_AND_DIRTY(setStaticMatrix, matrix, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800156}
157
John Reck79c7de72014-05-23 10:33:31 -0700158static jboolean android_view_RenderNode_setAnimationMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700159 jobject clazz, jlong renderNodePtr, jlong matrixPtr) {
Chris Craik7a02ea32013-12-27 16:43:22 -0800160 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
John Reck79c7de72014-05-23 10:33:31 -0700161 return SET_AND_DIRTY(setAnimationMatrix, matrix, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800162}
163
John Reck79c7de72014-05-23 10:33:31 -0700164static jboolean android_view_RenderNode_setClipToBounds(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700165 jobject clazz, jlong renderNodePtr, jboolean clipToBounds) {
John Reck79c7de72014-05-23 10:33:31 -0700166 return SET_AND_DIRTY(setClipToBounds, clipToBounds, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800167}
168
Chris Craika753f4c2014-07-24 12:39:17 -0700169static jboolean android_view_RenderNode_setClipBounds(JNIEnv* env,
170 jobject clazz, jlong renderNodePtr, jint left, jint top, jint right, jint bottom) {
171 android::uirenderer::Rect clipBounds(left, top, right, bottom);
172 return SET_AND_DIRTY(setClipBounds, clipBounds, RenderNode::GENERIC);
173}
174
175static jboolean android_view_RenderNode_setClipBoundsEmpty(JNIEnv* env,
176 jobject clazz, jlong renderNodePtr) {
177 return SET_AND_DIRTY(setClipBoundsEmpty,, RenderNode::GENERIC);
178}
179
John Reck79c7de72014-05-23 10:33:31 -0700180static jboolean android_view_RenderNode_setProjectBackwards(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700181 jobject clazz, jlong renderNodePtr, jboolean shouldProject) {
John Reck79c7de72014-05-23 10:33:31 -0700182 return SET_AND_DIRTY(setProjectBackwards, shouldProject, RenderNode::GENERIC);
Alan Viverette58f09b32014-01-08 17:18:19 -0800183}
184
John Reck79c7de72014-05-23 10:33:31 -0700185static jboolean android_view_RenderNode_setProjectionReceiver(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700186 jobject clazz, jlong renderNodePtr, jboolean shouldRecieve) {
John Reck79c7de72014-05-23 10:33:31 -0700187 return SET_AND_DIRTY(setProjectionReceiver, shouldRecieve, RenderNode::GENERIC);
Chris Craik1df26442014-02-05 16:50:41 -0800188}
189
John Reck79c7de72014-05-23 10:33:31 -0700190static jboolean android_view_RenderNode_setOutlineRoundRect(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700191 jobject clazz, jlong renderNodePtr, jint left, jint top,
Chris Craik77b5cad2014-07-30 18:23:07 -0700192 jint right, jint bottom, jfloat radius, jfloat alpha) {
John Reck8de65a82014-04-09 15:23:38 -0700193 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik77b5cad2014-07-30 18:23:07 -0700194 renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom,
195 radius, alpha);
John Reckff941dc2014-05-14 16:34:14 -0700196 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700197 return true;
Chris Craikb49f4462014-03-20 12:44:20 -0700198}
Chris Craik8c271ca2014-03-25 10:33:01 -0700199
John Reck79c7de72014-05-23 10:33:31 -0700200static jboolean android_view_RenderNode_setOutlineConvexPath(JNIEnv* env,
Chris Craik77b5cad2014-07-30 18:23:07 -0700201 jobject clazz, jlong renderNodePtr, jlong outlinePathPtr, jfloat alpha) {
John Reck8de65a82014-04-09 15:23:38 -0700202 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craikb49f4462014-03-20 12:44:20 -0700203 SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr);
Chris Craik77b5cad2014-07-30 18:23:07 -0700204 renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath, alpha);
John Reckff941dc2014-05-14 16:34:14 -0700205 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700206 return true;
Chris Craikb49f4462014-03-20 12:44:20 -0700207}
Chris Craik8c271ca2014-03-25 10:33:01 -0700208
John Reck79c7de72014-05-23 10:33:31 -0700209static jboolean android_view_RenderNode_setOutlineEmpty(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700210 jobject clazz, jlong renderNodePtr) {
211 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
212 renderNode->mutateStagingProperties().mutableOutline().setEmpty();
John Reckff941dc2014-05-14 16:34:14 -0700213 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700214 return true;
Chris Craika2fe7af2014-01-28 17:25:06 -0800215}
216
Chris Craik06451282014-07-21 10:25:54 -0700217static jboolean android_view_RenderNode_setOutlineNone(JNIEnv* env,
218 jobject clazz, jlong renderNodePtr) {
219 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
220 renderNode->mutateStagingProperties().mutableOutline().setNone();
221 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
222 return true;
223}
224
Chris Craik5c75c522014-09-05 14:08:08 -0700225static jboolean android_view_RenderNode_hasShadow(JNIEnv* env,
226 jobject clazz, jlong renderNodePtr) {
227 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
228 return renderNode->stagingProperties().hasShadow();
229}
230
John Reck79c7de72014-05-23 10:33:31 -0700231static jboolean android_view_RenderNode_setClipToOutline(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700232 jobject clazz, jlong renderNodePtr, jboolean clipToOutline) {
233 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
234 renderNode->mutateStagingProperties().mutableOutline().setShouldClip(clipToOutline);
John Reckff941dc2014-05-14 16:34:14 -0700235 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700236 return true;
Chris Craik8c271ca2014-03-25 10:33:01 -0700237}
238
John Reck79c7de72014-05-23 10:33:31 -0700239static jboolean android_view_RenderNode_setRevealClip(JNIEnv* env,
Chris Craikaf4d04c2014-07-29 12:50:14 -0700240 jobject clazz, jlong renderNodePtr, jboolean shouldClip,
Chris Craik8c271ca2014-03-25 10:33:01 -0700241 jfloat x, jfloat y, jfloat radius) {
John Reck8de65a82014-04-09 15:23:38 -0700242 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
243 renderNode->mutateStagingProperties().mutableRevealClip().set(
Chris Craikaf4d04c2014-07-29 12:50:14 -0700244 shouldClip, x, y, radius);
John Reckff941dc2014-05-14 16:34:14 -0700245 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700246 return true;
ztenghuifad45932014-02-06 10:33:58 -0800247}
248
John Reck79c7de72014-05-23 10:33:31 -0700249static jboolean android_view_RenderNode_setAlpha(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700250 jobject clazz, jlong renderNodePtr, float alpha) {
John Reck79c7de72014-05-23 10:33:31 -0700251 return SET_AND_DIRTY(setAlpha, alpha, RenderNode::ALPHA);
Chris Craik54389792013-12-20 13:28:11 -0800252}
253
John Reck79c7de72014-05-23 10:33:31 -0700254static jboolean android_view_RenderNode_setHasOverlappingRendering(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700255 jobject clazz, jlong renderNodePtr, bool hasOverlappingRendering) {
John Reck79c7de72014-05-23 10:33:31 -0700256 return SET_AND_DIRTY(setHasOverlappingRendering, hasOverlappingRendering,
257 RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800258}
259
John Reck79c7de72014-05-23 10:33:31 -0700260static jboolean android_view_RenderNode_setElevation(JNIEnv* env,
Chris Craikcc39e162014-04-25 18:34:11 -0700261 jobject clazz, jlong renderNodePtr, float elevation) {
John Reck79c7de72014-05-23 10:33:31 -0700262 return SET_AND_DIRTY(setElevation, elevation, RenderNode::Z);
Chris Craikcc39e162014-04-25 18:34:11 -0700263}
264
John Reck79c7de72014-05-23 10:33:31 -0700265static jboolean android_view_RenderNode_setTranslationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700266 jobject clazz, jlong renderNodePtr, float tx) {
John Reck79c7de72014-05-23 10:33:31 -0700267 return SET_AND_DIRTY(setTranslationX, tx, RenderNode::TRANSLATION_X | RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800268}
269
John Reck79c7de72014-05-23 10:33:31 -0700270static jboolean android_view_RenderNode_setTranslationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700271 jobject clazz, jlong renderNodePtr, float ty) {
John Reck79c7de72014-05-23 10:33:31 -0700272 return SET_AND_DIRTY(setTranslationY, ty, RenderNode::TRANSLATION_Y | RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800273}
274
John Reck79c7de72014-05-23 10:33:31 -0700275static jboolean android_view_RenderNode_setTranslationZ(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700276 jobject clazz, jlong renderNodePtr, float tz) {
John Reck79c7de72014-05-23 10:33:31 -0700277 return SET_AND_DIRTY(setTranslationZ, tz, RenderNode::TRANSLATION_Z | RenderNode::Z);
Chris Craik54389792013-12-20 13:28:11 -0800278}
279
John Reck79c7de72014-05-23 10:33:31 -0700280static jboolean android_view_RenderNode_setRotation(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700281 jobject clazz, jlong renderNodePtr, float rotation) {
John Reck79c7de72014-05-23 10:33:31 -0700282 return SET_AND_DIRTY(setRotation, rotation, RenderNode::ROTATION);
Chris Craik54389792013-12-20 13:28:11 -0800283}
284
John Reck79c7de72014-05-23 10:33:31 -0700285static jboolean android_view_RenderNode_setRotationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700286 jobject clazz, jlong renderNodePtr, float rx) {
John Reck79c7de72014-05-23 10:33:31 -0700287 return SET_AND_DIRTY(setRotationX, rx, RenderNode::ROTATION_X);
Chris Craik54389792013-12-20 13:28:11 -0800288}
289
John Reck79c7de72014-05-23 10:33:31 -0700290static jboolean android_view_RenderNode_setRotationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700291 jobject clazz, jlong renderNodePtr, float ry) {
John Reck79c7de72014-05-23 10:33:31 -0700292 return SET_AND_DIRTY(setRotationY, ry, RenderNode::ROTATION_Y);
Chris Craik54389792013-12-20 13:28:11 -0800293}
294
John Reck79c7de72014-05-23 10:33:31 -0700295static jboolean android_view_RenderNode_setScaleX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700296 jobject clazz, jlong renderNodePtr, float sx) {
John Reck79c7de72014-05-23 10:33:31 -0700297 return SET_AND_DIRTY(setScaleX, sx, RenderNode::SCALE_X);
Chris Craik54389792013-12-20 13:28:11 -0800298}
299
John Reck79c7de72014-05-23 10:33:31 -0700300static jboolean android_view_RenderNode_setScaleY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700301 jobject clazz, jlong renderNodePtr, float sy) {
John Reck79c7de72014-05-23 10:33:31 -0700302 return SET_AND_DIRTY(setScaleY, sy, RenderNode::SCALE_Y);
Chris Craik54389792013-12-20 13:28:11 -0800303}
304
John Reck79c7de72014-05-23 10:33:31 -0700305static jboolean android_view_RenderNode_setPivotX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700306 jobject clazz, jlong renderNodePtr, float px) {
John Reck79c7de72014-05-23 10:33:31 -0700307 return SET_AND_DIRTY(setPivotX, px, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800308}
309
John Reck79c7de72014-05-23 10:33:31 -0700310static jboolean android_view_RenderNode_setPivotY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700311 jobject clazz, jlong renderNodePtr, float py) {
John Reck79c7de72014-05-23 10:33:31 -0700312 return SET_AND_DIRTY(setPivotY, py, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800313}
314
John Reck79c7de72014-05-23 10:33:31 -0700315static jboolean android_view_RenderNode_setCameraDistance(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700316 jobject clazz, jlong renderNodePtr, float distance) {
John Reck79c7de72014-05-23 10:33:31 -0700317 return SET_AND_DIRTY(setCameraDistance, distance, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800318}
319
John Reck79c7de72014-05-23 10:33:31 -0700320static jboolean android_view_RenderNode_setLeft(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700321 jobject clazz, jlong renderNodePtr, int left) {
John Reck79c7de72014-05-23 10:33:31 -0700322 return SET_AND_DIRTY(setLeft, left, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800323}
324
John Reck79c7de72014-05-23 10:33:31 -0700325static jboolean android_view_RenderNode_setTop(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700326 jobject clazz, jlong renderNodePtr, int top) {
John Reck79c7de72014-05-23 10:33:31 -0700327 return SET_AND_DIRTY(setTop, top, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800328}
329
John Reck79c7de72014-05-23 10:33:31 -0700330static jboolean android_view_RenderNode_setRight(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700331 jobject clazz, jlong renderNodePtr, int right) {
John Reck79c7de72014-05-23 10:33:31 -0700332 return SET_AND_DIRTY(setRight, right, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800333}
334
John Reck79c7de72014-05-23 10:33:31 -0700335static jboolean android_view_RenderNode_setBottom(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700336 jobject clazz, jlong renderNodePtr, int bottom) {
John Reck79c7de72014-05-23 10:33:31 -0700337 return SET_AND_DIRTY(setBottom, bottom, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800338}
339
John Reck79c7de72014-05-23 10:33:31 -0700340static jboolean android_view_RenderNode_setLeftTopRightBottom(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700341 jobject clazz, jlong renderNodePtr, int left, int top,
Chris Craik54389792013-12-20 13:28:11 -0800342 int right, int bottom) {
John Reck8de65a82014-04-09 15:23:38 -0700343 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reck79c7de72014-05-23 10:33:31 -0700344 if (renderNode->mutateStagingProperties().setLeftTopRightBottom(left, top, right, bottom)) {
345 renderNode->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
346 return true;
347 }
348 return false;
Chris Craik54389792013-12-20 13:28:11 -0800349}
350
John Reck79c7de72014-05-23 10:33:31 -0700351static jboolean android_view_RenderNode_offsetLeftAndRight(JNIEnv* env,
Chris Craika753f4c2014-07-24 12:39:17 -0700352 jobject clazz, jlong renderNodePtr, jint offset) {
John Reck79c7de72014-05-23 10:33:31 -0700353 return SET_AND_DIRTY(offsetLeftRight, offset, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800354}
355
John Reck79c7de72014-05-23 10:33:31 -0700356static jboolean android_view_RenderNode_offsetTopAndBottom(JNIEnv* env,
Chris Craika753f4c2014-07-24 12:39:17 -0700357 jobject clazz, jlong renderNodePtr, jint offset) {
John Reck79c7de72014-05-23 10:33:31 -0700358 return SET_AND_DIRTY(offsetTopBottom, offset, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800359}
360
Chris Craik49e6c732014-03-31 12:34:11 -0700361// ----------------------------------------------------------------------------
362// RenderProperties - getters
363// ----------------------------------------------------------------------------
364
John Reckf666ad72014-03-14 16:24:57 -0700365static jboolean android_view_RenderNode_hasOverlappingRendering(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700366 jobject clazz, jlong renderNodePtr) {
367 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
368 return renderNode->stagingProperties().hasOverlappingRendering();
Chris Craik54389792013-12-20 13:28:11 -0800369}
370
Chris Craikdeeda3d2014-05-05 19:09:33 -0700371static jboolean android_view_RenderNode_getClipToOutline(JNIEnv* env,
372 jobject clazz, jlong renderNodePtr) {
373 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
374 return renderNode->stagingProperties().getOutline().getShouldClip();
375}
376
John Reckf666ad72014-03-14 16:24:57 -0700377static jfloat android_view_RenderNode_getAlpha(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700378 jobject clazz, jlong renderNodePtr) {
379 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
380 return renderNode->stagingProperties().getAlpha();
Chris Craik54389792013-12-20 13:28:11 -0800381}
382
John Reckf666ad72014-03-14 16:24:57 -0700383static jfloat android_view_RenderNode_getCameraDistance(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700384 jobject clazz, jlong renderNodePtr) {
385 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
386 return renderNode->stagingProperties().getCameraDistance();
Chris Craik54389792013-12-20 13:28:11 -0800387}
388
John Reckf666ad72014-03-14 16:24:57 -0700389static jfloat android_view_RenderNode_getScaleX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700390 jobject clazz, jlong renderNodePtr) {
391 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
392 return renderNode->stagingProperties().getScaleX();
Chris Craik54389792013-12-20 13:28:11 -0800393}
394
John Reckf666ad72014-03-14 16:24:57 -0700395static jfloat android_view_RenderNode_getScaleY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700396 jobject clazz, jlong renderNodePtr) {
397 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
398 return renderNode->stagingProperties().getScaleY();
Chris Craik54389792013-12-20 13:28:11 -0800399}
400
Chris Craikcc39e162014-04-25 18:34:11 -0700401static jfloat android_view_RenderNode_getElevation(JNIEnv* env,
402 jobject clazz, jlong renderNodePtr) {
403 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
404 return renderNode->stagingProperties().getElevation();
405}
406
John Reckf666ad72014-03-14 16:24:57 -0700407static jfloat android_view_RenderNode_getTranslationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700408 jobject clazz, jlong renderNodePtr) {
409 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
410 return renderNode->stagingProperties().getTranslationX();
Chris Craik54389792013-12-20 13:28:11 -0800411}
412
John Reckf666ad72014-03-14 16:24:57 -0700413static jfloat android_view_RenderNode_getTranslationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700414 jobject clazz, jlong renderNodePtr) {
415 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
416 return renderNode->stagingProperties().getTranslationY();
Chris Craik54389792013-12-20 13:28:11 -0800417}
418
Chris Craik49e6c732014-03-31 12:34:11 -0700419static jfloat android_view_RenderNode_getTranslationZ(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700420 jobject clazz, jlong renderNodePtr) {
421 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
422 return renderNode->stagingProperties().getTranslationZ();
Chris Craik49e6c732014-03-31 12:34:11 -0700423}
424
John Reckf666ad72014-03-14 16:24:57 -0700425static jfloat android_view_RenderNode_getRotation(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700426 jobject clazz, jlong renderNodePtr) {
427 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
428 return renderNode->stagingProperties().getRotation();
Chris Craik54389792013-12-20 13:28:11 -0800429}
430
John Reckf666ad72014-03-14 16:24:57 -0700431static jfloat android_view_RenderNode_getRotationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700432 jobject clazz, jlong renderNodePtr) {
433 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
434 return renderNode->stagingProperties().getRotationX();
Chris Craik54389792013-12-20 13:28:11 -0800435}
436
John Reckf666ad72014-03-14 16:24:57 -0700437static jfloat android_view_RenderNode_getRotationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700438 jobject clazz, jlong renderNodePtr) {
439 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
440 return renderNode->stagingProperties().getRotationY();
Chris Craik54389792013-12-20 13:28:11 -0800441}
442
Chris Craik49e6c732014-03-31 12:34:11 -0700443static jboolean android_view_RenderNode_isPivotExplicitlySet(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700444 jobject clazz, jlong renderNodePtr) {
445 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
446 return renderNode->stagingProperties().isPivotExplicitlySet();
Chris Craik49e6c732014-03-31 12:34:11 -0700447}
448
449static jboolean android_view_RenderNode_hasIdentityMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700450 jobject clazz, jlong renderNodePtr) {
451 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reckf7483e32014-04-11 08:54:47 -0700452 renderNode->mutateStagingProperties().updateMatrix();
453 return !renderNode->stagingProperties().hasTransformMatrix();
Chris Craik49e6c732014-03-31 12:34:11 -0700454}
455
456// ----------------------------------------------------------------------------
457// RenderProperties - computed getters
458// ----------------------------------------------------------------------------
459
460static void android_view_RenderNode_getTransformMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700461 jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
462 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik49e6c732014-03-31 12:34:11 -0700463 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
464
John Reck8de65a82014-04-09 15:23:38 -0700465 renderNode->mutateStagingProperties().updateMatrix();
466 const SkMatrix* transformMatrix = renderNode->stagingProperties().getTransformMatrix();
Chris Craik49e6c732014-03-31 12:34:11 -0700467
John Reckf7483e32014-04-11 08:54:47 -0700468 if (transformMatrix) {
Chris Craik49e6c732014-03-31 12:34:11 -0700469 *outMatrix = *transformMatrix;
470 } else {
471 outMatrix->setIdentity();
472 }
473}
474
475static void android_view_RenderNode_getInverseTransformMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700476 jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
Chris Craik49e6c732014-03-31 12:34:11 -0700477 // load transform matrix
John Reck8de65a82014-04-09 15:23:38 -0700478 android_view_RenderNode_getTransformMatrix(env, clazz, renderNodePtr, outMatrixPtr);
Chris Craik49e6c732014-03-31 12:34:11 -0700479 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
480
481 // return it inverted
482 if (!outMatrix->invert(outMatrix)) {
483 // failed to load inverse, pass back identity
484 outMatrix->setIdentity();
485 }
486}
487
John Reckf666ad72014-03-14 16:24:57 -0700488static jfloat android_view_RenderNode_getPivotX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700489 jobject clazz, jlong renderNodePtr) {
490 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
491 renderNode->mutateStagingProperties().updateMatrix();
492 return renderNode->stagingProperties().getPivotX();
Chris Craik54389792013-12-20 13:28:11 -0800493}
494
John Reckf666ad72014-03-14 16:24:57 -0700495static jfloat android_view_RenderNode_getPivotY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700496 jobject clazz, jlong renderNodePtr) {
497 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
498 renderNode->mutateStagingProperties().updateMatrix();
499 return renderNode->stagingProperties().getPivotY();
Chris Craik54389792013-12-20 13:28:11 -0800500}
501
John Recke45b1fd2014-04-15 09:50:16 -0700502// ----------------------------------------------------------------------------
503// RenderProperties - Animations
504// ----------------------------------------------------------------------------
505
506static void android_view_RenderNode_addAnimator(JNIEnv* env, jobject clazz,
507 jlong renderNodePtr, jlong animatorPtr) {
508 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
509 RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr);
510 renderNode->addAnimator(animator);
511}
512
John Reck119907c2014-08-14 09:02:01 -0700513static void android_view_RenderNode_endAllAnimators(JNIEnv* env, jobject clazz,
514 jlong renderNodePtr) {
515 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Recke2478d42014-09-03 16:46:05 -0700516 renderNode->animators().endAllStagingAnimators();
John Reck119907c2014-08-14 09:02:01 -0700517}
518
Chris Craik54389792013-12-20 13:28:11 -0800519// ----------------------------------------------------------------------------
John Reckf6481082016-02-02 15:18:23 -0800520// SurfaceView position callback
521// ----------------------------------------------------------------------------
522
523jmethodID gSurfaceViewPositionUpdateMethod;
524
525static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject,
526 jlong renderNodePtr, jobject surfaceview) {
527 class SurfaceViewPositionUpdater : public RenderNode::PositionListener {
528 public:
529 SurfaceViewPositionUpdater(JNIEnv* env, jobject surfaceview) {
530 env->GetJavaVM(&mVm);
531 mWeakRef = env->NewWeakGlobalRef(surfaceview);
532 }
533
534 virtual ~SurfaceViewPositionUpdater() {
535 jnienv()->DeleteWeakGlobalRef(mWeakRef);
536 mWeakRef = nullptr;
537 }
538
539 virtual void onPositionUpdated(RenderNode& node, const TreeInfo& info) override {
540 if (CC_UNLIKELY(!mWeakRef || !info.updateWindowPositions)) return;
John Reckf6481082016-02-02 15:18:23 -0800541
John Reckf6481082016-02-02 15:18:23 -0800542 Matrix4 transform;
543 info.damageAccumulator->computeCurrentTransform(&transform);
544 const RenderProperties& props = node.properties();
545 uirenderer::Rect bounds(props.getWidth(), props.getHeight());
546 transform.mapRect(bounds);
547 bounds.left -= info.windowInsetLeft;
548 bounds.right -= info.windowInsetLeft;
549 bounds.top -= info.windowInsetTop;
550 bounds.bottom -= info.windowInsetTop;
John Reck38f6c032016-03-17 10:23:49 -0700551
552 auto functor = std::bind(
553 std::mem_fn(&SurfaceViewPositionUpdater::doUpdatePosition), this,
554 (jlong) info.frameNumber, (jint) bounds.left, (jint) bounds.top,
555 (jint) bounds.right, (jint) bounds.bottom);
556
557 info.canvasContext.enqueueFrameWork(std::move(functor));
John Reckf6481082016-02-02 15:18:23 -0800558 }
559
560 private:
561 JNIEnv* jnienv() {
562 JNIEnv* env;
563 if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
564 LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", mVm);
565 }
566 return env;
567 }
568
John Reck38f6c032016-03-17 10:23:49 -0700569 void doUpdatePosition(jlong frameNumber, jint left, jint top,
570 jint right, jint bottom) {
571 ATRACE_NAME("Update SurfaceView position");
572
573 JNIEnv* env = jnienv();
574 jobject localref = env->NewLocalRef(mWeakRef);
575 if (CC_UNLIKELY(!localref)) {
576 jnienv()->DeleteWeakGlobalRef(mWeakRef);
577 mWeakRef = nullptr;
578 return;
579 }
580
581 env->CallVoidMethod(localref, gSurfaceViewPositionUpdateMethod,
582 frameNumber, left, top, right, bottom);
583 env->DeleteLocalRef(localref);
584 }
585
John Reckf6481082016-02-02 15:18:23 -0800586 JavaVM* mVm;
587 jobject mWeakRef;
588 };
589
590 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
591 renderNode->setPositionListener(new SurfaceViewPositionUpdater(env, surfaceview));
592}
593
594// ----------------------------------------------------------------------------
Chris Craik54389792013-12-20 13:28:11 -0800595// JNI Glue
596// ----------------------------------------------------------------------------
597
John Reckf666ad72014-03-14 16:24:57 -0700598const char* const kClassPathName = "android/view/RenderNode";
Chris Craik54389792013-12-20 13:28:11 -0800599
Daniel Micay76f6a862015-09-19 17:31:01 -0400600static const JNINativeMethod gMethods[] = {
Chris Craik003cc3d2015-10-16 10:24:55 -0700601 { "nCreate", "(Ljava/lang/String;)J", (void*) android_view_RenderNode_create },
602 { "nDestroyRenderNode", "(J)V", (void*) android_view_RenderNode_destroyRenderNode },
603 { "nSetDisplayList", "(JJ)V", (void*) android_view_RenderNode_setDisplayList },
604 { "nOutput", "(J)V", (void*) android_view_RenderNode_output },
605 { "nGetDebugSize", "(J)I", (void*) android_view_RenderNode_getDebugSize },
Chris Craik54389792013-12-20 13:28:11 -0800606
Chris Craik4136a0a2014-10-07 15:09:46 -0700607 { "nSetLayerType", "!(JI)Z", (void*) android_view_RenderNode_setLayerType },
608 { "nSetLayerPaint", "!(JJ)Z", (void*) android_view_RenderNode_setLayerPaint },
609 { "nSetStaticMatrix", "!(JJ)Z", (void*) android_view_RenderNode_setStaticMatrix },
610 { "nSetAnimationMatrix", "!(JJ)Z", (void*) android_view_RenderNode_setAnimationMatrix },
611 { "nSetClipToBounds", "!(JZ)Z", (void*) android_view_RenderNode_setClipToBounds },
612 { "nSetClipBounds", "!(JIIII)Z", (void*) android_view_RenderNode_setClipBounds },
613 { "nSetClipBoundsEmpty", "!(J)Z", (void*) android_view_RenderNode_setClipBoundsEmpty },
614 { "nSetProjectBackwards", "!(JZ)Z", (void*) android_view_RenderNode_setProjectBackwards },
615 { "nSetProjectionReceiver","!(JZ)Z", (void*) android_view_RenderNode_setProjectionReceiver },
Chris Craikb49f4462014-03-20 12:44:20 -0700616
Chris Craik40de9f22015-07-29 12:51:41 -0700617 { "nSetOutlineRoundRect", "!(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect },
618 { "nSetOutlineConvexPath", "!(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath },
619 { "nSetOutlineEmpty", "!(J)Z", (void*) android_view_RenderNode_setOutlineEmpty },
620 { "nSetOutlineNone", "!(J)Z", (void*) android_view_RenderNode_setOutlineNone },
Chris Craik4136a0a2014-10-07 15:09:46 -0700621 { "nHasShadow", "!(J)Z", (void*) android_view_RenderNode_hasShadow },
622 { "nSetClipToOutline", "!(JZ)Z", (void*) android_view_RenderNode_setClipToOutline },
Chris Craik40de9f22015-07-29 12:51:41 -0700623 { "nSetRevealClip", "!(JZFFF)Z", (void*) android_view_RenderNode_setRevealClip },
Chris Craikb49f4462014-03-20 12:44:20 -0700624
Chris Craik4136a0a2014-10-07 15:09:46 -0700625 { "nSetAlpha", "!(JF)Z", (void*) android_view_RenderNode_setAlpha },
626 { "nSetHasOverlappingRendering", "!(JZ)Z",
John Reckf666ad72014-03-14 16:24:57 -0700627 (void*) android_view_RenderNode_setHasOverlappingRendering },
Chris Craik4136a0a2014-10-07 15:09:46 -0700628 { "nSetElevation", "!(JF)Z", (void*) android_view_RenderNode_setElevation },
629 { "nSetTranslationX", "!(JF)Z", (void*) android_view_RenderNode_setTranslationX },
630 { "nSetTranslationY", "!(JF)Z", (void*) android_view_RenderNode_setTranslationY },
631 { "nSetTranslationZ", "!(JF)Z", (void*) android_view_RenderNode_setTranslationZ },
632 { "nSetRotation", "!(JF)Z", (void*) android_view_RenderNode_setRotation },
633 { "nSetRotationX", "!(JF)Z", (void*) android_view_RenderNode_setRotationX },
634 { "nSetRotationY", "!(JF)Z", (void*) android_view_RenderNode_setRotationY },
635 { "nSetScaleX", "!(JF)Z", (void*) android_view_RenderNode_setScaleX },
636 { "nSetScaleY", "!(JF)Z", (void*) android_view_RenderNode_setScaleY },
637 { "nSetPivotX", "!(JF)Z", (void*) android_view_RenderNode_setPivotX },
638 { "nSetPivotY", "!(JF)Z", (void*) android_view_RenderNode_setPivotY },
639 { "nSetCameraDistance", "!(JF)Z", (void*) android_view_RenderNode_setCameraDistance },
640 { "nSetLeft", "!(JI)Z", (void*) android_view_RenderNode_setLeft },
641 { "nSetTop", "!(JI)Z", (void*) android_view_RenderNode_setTop },
642 { "nSetRight", "!(JI)Z", (void*) android_view_RenderNode_setRight },
643 { "nSetBottom", "!(JI)Z", (void*) android_view_RenderNode_setBottom },
644 { "nSetLeftTopRightBottom","!(JIIII)Z", (void*) android_view_RenderNode_setLeftTopRightBottom },
645 { "nOffsetLeftAndRight", "!(JI)Z", (void*) android_view_RenderNode_offsetLeftAndRight },
646 { "nOffsetTopAndBottom", "!(JI)Z", (void*) android_view_RenderNode_offsetTopAndBottom },
Chris Craik54389792013-12-20 13:28:11 -0800647
Chris Craik4136a0a2014-10-07 15:09:46 -0700648 { "nHasOverlappingRendering", "!(J)Z", (void*) android_view_RenderNode_hasOverlappingRendering },
649 { "nGetClipToOutline", "!(J)Z", (void*) android_view_RenderNode_getClipToOutline },
650 { "nGetAlpha", "!(J)F", (void*) android_view_RenderNode_getAlpha },
651 { "nGetCameraDistance", "!(J)F", (void*) android_view_RenderNode_getCameraDistance },
652 { "nGetScaleX", "!(J)F", (void*) android_view_RenderNode_getScaleX },
653 { "nGetScaleY", "!(J)F", (void*) android_view_RenderNode_getScaleY },
654 { "nGetElevation", "!(J)F", (void*) android_view_RenderNode_getElevation },
655 { "nGetTranslationX", "!(J)F", (void*) android_view_RenderNode_getTranslationX },
656 { "nGetTranslationY", "!(J)F", (void*) android_view_RenderNode_getTranslationY },
657 { "nGetTranslationZ", "!(J)F", (void*) android_view_RenderNode_getTranslationZ },
658 { "nGetRotation", "!(J)F", (void*) android_view_RenderNode_getRotation },
659 { "nGetRotationX", "!(J)F", (void*) android_view_RenderNode_getRotationX },
660 { "nGetRotationY", "!(J)F", (void*) android_view_RenderNode_getRotationY },
661 { "nIsPivotExplicitlySet", "!(J)Z", (void*) android_view_RenderNode_isPivotExplicitlySet },
662 { "nHasIdentityMatrix", "!(J)Z", (void*) android_view_RenderNode_hasIdentityMatrix },
Chris Craik49e6c732014-03-31 12:34:11 -0700663
Chris Craik4136a0a2014-10-07 15:09:46 -0700664 { "nGetTransformMatrix", "!(JJ)V", (void*) android_view_RenderNode_getTransformMatrix },
665 { "nGetInverseTransformMatrix","!(JJ)V", (void*) android_view_RenderNode_getInverseTransformMatrix },
Chris Craik49e6c732014-03-31 12:34:11 -0700666
Chris Craik4136a0a2014-10-07 15:09:46 -0700667 { "nGetPivotX", "!(J)F", (void*) android_view_RenderNode_getPivotX },
668 { "nGetPivotY", "!(J)F", (void*) android_view_RenderNode_getPivotY },
John Recke45b1fd2014-04-15 09:50:16 -0700669
670 { "nAddAnimator", "(JJ)V", (void*) android_view_RenderNode_addAnimator },
John Reck119907c2014-08-14 09:02:01 -0700671 { "nEndAllAnimators", "(J)V", (void*) android_view_RenderNode_endAllAnimators },
John Reckf6481082016-02-02 15:18:23 -0800672
673 { "nRequestPositionUpdates", "(JLandroid/view/SurfaceView;)V", (void*) android_view_RenderNode_requestPositionUpdates },
Chris Craik54389792013-12-20 13:28:11 -0800674};
675
John Reckf666ad72014-03-14 16:24:57 -0700676int register_android_view_RenderNode(JNIEnv* env) {
John Reckf6481082016-02-02 15:18:23 -0800677 jclass clazz = FindClassOrDie(env, "android/view/SurfaceView");
678 gSurfaceViewPositionUpdateMethod = GetMethodIDOrDie(env, clazz,
679 "updateWindowPositionRT", "(JIIII)V");
John Reck44b49f02016-03-25 14:29:48 -0700680 clazz = FindClassOrDie(env, "android/view/RenderNode");
681 gOnRenderNodeDetached = GetMethodIDOrDie(env, clazz,
682 "onRenderNodeDetached", "()V");
Andreas Gampe987f79f2014-11-18 17:29:46 -0800683 return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
Chris Craik54389792013-12-20 13:28:11 -0800684}
685
686};
687