blob: 4459f324ff33df154542bb3f76f8300142fa3532 [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 Reck51f2d602016-04-06 07:50:47 -0700131 class RemovedObserver : public TreeObserver {
132 public:
133 virtual void onMaybeRemovedFromTree(RenderNode* node) override {
134 maybeRemovedNodes.insert(sp<RenderNode>(node));
135 }
136 std::set< sp<RenderNode> > maybeRemovedNodes;
137 };
138
John Reck8de65a82014-04-09 15:23:38 -0700139 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik003cc3d2015-10-16 10:24:55 -0700140 DisplayList* newData = reinterpret_cast<DisplayList*>(displayListPtr);
John Reck51f2d602016-04-06 07:50:47 -0700141 RemovedObserver observer;
142 renderNode->setStagingDisplayList(newData, &observer);
143 for (auto& node : observer.maybeRemovedNodes) {
144 if (node->hasParents()) continue;
145 onRenderNodeRemoved(env, node.get());
146 }
Chris Craik54389792013-12-20 13:28:11 -0800147}
148
149// ----------------------------------------------------------------------------
Chris Craik49e6c732014-03-31 12:34:11 -0700150// RenderProperties - setters
Chris Craik54389792013-12-20 13:28:11 -0800151// ----------------------------------------------------------------------------
152
John Reck25fbb3f2014-06-12 13:46:45 -0700153static jboolean android_view_RenderNode_setLayerType(JNIEnv* env,
154 jobject clazz, jlong renderNodePtr, jint jlayerType) {
155 LayerType layerType = static_cast<LayerType>(jlayerType);
156 return SET_AND_DIRTY(mutateLayerProperties().setType, layerType, RenderNode::GENERIC);
157}
158
159static jboolean android_view_RenderNode_setLayerPaint(JNIEnv* env,
160 jobject clazz, jlong renderNodePtr, jlong paintPtr) {
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400161 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
John Reck25fbb3f2014-06-12 13:46:45 -0700162 return SET_AND_DIRTY(mutateLayerProperties().setFromPaint, paint, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800163}
164
John Reck79c7de72014-05-23 10:33:31 -0700165static jboolean android_view_RenderNode_setStaticMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700166 jobject clazz, jlong renderNodePtr, jlong matrixPtr) {
Chris Craik7a02ea32013-12-27 16:43:22 -0800167 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
John Reck79c7de72014-05-23 10:33:31 -0700168 return SET_AND_DIRTY(setStaticMatrix, matrix, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800169}
170
John Reck79c7de72014-05-23 10:33:31 -0700171static jboolean android_view_RenderNode_setAnimationMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700172 jobject clazz, jlong renderNodePtr, jlong matrixPtr) {
Chris Craik7a02ea32013-12-27 16:43:22 -0800173 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
John Reck79c7de72014-05-23 10:33:31 -0700174 return SET_AND_DIRTY(setAnimationMatrix, matrix, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800175}
176
John Reck79c7de72014-05-23 10:33:31 -0700177static jboolean android_view_RenderNode_setClipToBounds(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700178 jobject clazz, jlong renderNodePtr, jboolean clipToBounds) {
John Reck79c7de72014-05-23 10:33:31 -0700179 return SET_AND_DIRTY(setClipToBounds, clipToBounds, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800180}
181
Chris Craika753f4c2014-07-24 12:39:17 -0700182static jboolean android_view_RenderNode_setClipBounds(JNIEnv* env,
183 jobject clazz, jlong renderNodePtr, jint left, jint top, jint right, jint bottom) {
184 android::uirenderer::Rect clipBounds(left, top, right, bottom);
185 return SET_AND_DIRTY(setClipBounds, clipBounds, RenderNode::GENERIC);
186}
187
188static jboolean android_view_RenderNode_setClipBoundsEmpty(JNIEnv* env,
189 jobject clazz, jlong renderNodePtr) {
190 return SET_AND_DIRTY(setClipBoundsEmpty,, RenderNode::GENERIC);
191}
192
John Reck79c7de72014-05-23 10:33:31 -0700193static jboolean android_view_RenderNode_setProjectBackwards(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700194 jobject clazz, jlong renderNodePtr, jboolean shouldProject) {
John Reck79c7de72014-05-23 10:33:31 -0700195 return SET_AND_DIRTY(setProjectBackwards, shouldProject, RenderNode::GENERIC);
Alan Viverette58f09b32014-01-08 17:18:19 -0800196}
197
John Reck79c7de72014-05-23 10:33:31 -0700198static jboolean android_view_RenderNode_setProjectionReceiver(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700199 jobject clazz, jlong renderNodePtr, jboolean shouldRecieve) {
John Reck79c7de72014-05-23 10:33:31 -0700200 return SET_AND_DIRTY(setProjectionReceiver, shouldRecieve, RenderNode::GENERIC);
Chris Craik1df26442014-02-05 16:50:41 -0800201}
202
John Reck79c7de72014-05-23 10:33:31 -0700203static jboolean android_view_RenderNode_setOutlineRoundRect(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700204 jobject clazz, jlong renderNodePtr, jint left, jint top,
Chris Craik77b5cad2014-07-30 18:23:07 -0700205 jint right, jint bottom, jfloat radius, jfloat alpha) {
John Reck8de65a82014-04-09 15:23:38 -0700206 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik77b5cad2014-07-30 18:23:07 -0700207 renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom,
208 radius, alpha);
John Reckff941dc2014-05-14 16:34:14 -0700209 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700210 return true;
Chris Craikb49f4462014-03-20 12:44:20 -0700211}
Chris Craik8c271ca2014-03-25 10:33:01 -0700212
John Reck79c7de72014-05-23 10:33:31 -0700213static jboolean android_view_RenderNode_setOutlineConvexPath(JNIEnv* env,
Chris Craik77b5cad2014-07-30 18:23:07 -0700214 jobject clazz, jlong renderNodePtr, jlong outlinePathPtr, jfloat alpha) {
John Reck8de65a82014-04-09 15:23:38 -0700215 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craikb49f4462014-03-20 12:44:20 -0700216 SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr);
Chris Craik77b5cad2014-07-30 18:23:07 -0700217 renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath, alpha);
John Reckff941dc2014-05-14 16:34:14 -0700218 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700219 return true;
Chris Craikb49f4462014-03-20 12:44:20 -0700220}
Chris Craik8c271ca2014-03-25 10:33:01 -0700221
John Reck79c7de72014-05-23 10:33:31 -0700222static jboolean android_view_RenderNode_setOutlineEmpty(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700223 jobject clazz, jlong renderNodePtr) {
224 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
225 renderNode->mutateStagingProperties().mutableOutline().setEmpty();
John Reckff941dc2014-05-14 16:34:14 -0700226 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700227 return true;
Chris Craika2fe7af2014-01-28 17:25:06 -0800228}
229
Chris Craik06451282014-07-21 10:25:54 -0700230static jboolean android_view_RenderNode_setOutlineNone(JNIEnv* env,
231 jobject clazz, jlong renderNodePtr) {
232 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
233 renderNode->mutateStagingProperties().mutableOutline().setNone();
234 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
235 return true;
236}
237
Chris Craik5c75c522014-09-05 14:08:08 -0700238static jboolean android_view_RenderNode_hasShadow(JNIEnv* env,
239 jobject clazz, jlong renderNodePtr) {
240 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
241 return renderNode->stagingProperties().hasShadow();
242}
243
John Reck79c7de72014-05-23 10:33:31 -0700244static jboolean android_view_RenderNode_setClipToOutline(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700245 jobject clazz, jlong renderNodePtr, jboolean clipToOutline) {
246 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
247 renderNode->mutateStagingProperties().mutableOutline().setShouldClip(clipToOutline);
John Reckff941dc2014-05-14 16:34:14 -0700248 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700249 return true;
Chris Craik8c271ca2014-03-25 10:33:01 -0700250}
251
John Reck79c7de72014-05-23 10:33:31 -0700252static jboolean android_view_RenderNode_setRevealClip(JNIEnv* env,
Chris Craikaf4d04c2014-07-29 12:50:14 -0700253 jobject clazz, jlong renderNodePtr, jboolean shouldClip,
Chris Craik8c271ca2014-03-25 10:33:01 -0700254 jfloat x, jfloat y, jfloat radius) {
John Reck8de65a82014-04-09 15:23:38 -0700255 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
256 renderNode->mutateStagingProperties().mutableRevealClip().set(
Chris Craikaf4d04c2014-07-29 12:50:14 -0700257 shouldClip, x, y, radius);
John Reckff941dc2014-05-14 16:34:14 -0700258 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700259 return true;
ztenghuifad45932014-02-06 10:33:58 -0800260}
261
John Reck79c7de72014-05-23 10:33:31 -0700262static jboolean android_view_RenderNode_setAlpha(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700263 jobject clazz, jlong renderNodePtr, float alpha) {
John Reck79c7de72014-05-23 10:33:31 -0700264 return SET_AND_DIRTY(setAlpha, alpha, RenderNode::ALPHA);
Chris Craik54389792013-12-20 13:28:11 -0800265}
266
John Reck79c7de72014-05-23 10:33:31 -0700267static jboolean android_view_RenderNode_setHasOverlappingRendering(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700268 jobject clazz, jlong renderNodePtr, bool hasOverlappingRendering) {
John Reck79c7de72014-05-23 10:33:31 -0700269 return SET_AND_DIRTY(setHasOverlappingRendering, hasOverlappingRendering,
270 RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800271}
272
John Reck79c7de72014-05-23 10:33:31 -0700273static jboolean android_view_RenderNode_setElevation(JNIEnv* env,
Chris Craikcc39e162014-04-25 18:34:11 -0700274 jobject clazz, jlong renderNodePtr, float elevation) {
John Reck79c7de72014-05-23 10:33:31 -0700275 return SET_AND_DIRTY(setElevation, elevation, RenderNode::Z);
Chris Craikcc39e162014-04-25 18:34:11 -0700276}
277
John Reck79c7de72014-05-23 10:33:31 -0700278static jboolean android_view_RenderNode_setTranslationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700279 jobject clazz, jlong renderNodePtr, float tx) {
John Reck79c7de72014-05-23 10:33:31 -0700280 return SET_AND_DIRTY(setTranslationX, tx, RenderNode::TRANSLATION_X | RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800281}
282
John Reck79c7de72014-05-23 10:33:31 -0700283static jboolean android_view_RenderNode_setTranslationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700284 jobject clazz, jlong renderNodePtr, float ty) {
John Reck79c7de72014-05-23 10:33:31 -0700285 return SET_AND_DIRTY(setTranslationY, ty, RenderNode::TRANSLATION_Y | RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800286}
287
John Reck79c7de72014-05-23 10:33:31 -0700288static jboolean android_view_RenderNode_setTranslationZ(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700289 jobject clazz, jlong renderNodePtr, float tz) {
John Reck79c7de72014-05-23 10:33:31 -0700290 return SET_AND_DIRTY(setTranslationZ, tz, RenderNode::TRANSLATION_Z | RenderNode::Z);
Chris Craik54389792013-12-20 13:28:11 -0800291}
292
John Reck79c7de72014-05-23 10:33:31 -0700293static jboolean android_view_RenderNode_setRotation(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700294 jobject clazz, jlong renderNodePtr, float rotation) {
John Reck79c7de72014-05-23 10:33:31 -0700295 return SET_AND_DIRTY(setRotation, rotation, RenderNode::ROTATION);
Chris Craik54389792013-12-20 13:28:11 -0800296}
297
John Reck79c7de72014-05-23 10:33:31 -0700298static jboolean android_view_RenderNode_setRotationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700299 jobject clazz, jlong renderNodePtr, float rx) {
John Reck79c7de72014-05-23 10:33:31 -0700300 return SET_AND_DIRTY(setRotationX, rx, RenderNode::ROTATION_X);
Chris Craik54389792013-12-20 13:28:11 -0800301}
302
John Reck79c7de72014-05-23 10:33:31 -0700303static jboolean android_view_RenderNode_setRotationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700304 jobject clazz, jlong renderNodePtr, float ry) {
John Reck79c7de72014-05-23 10:33:31 -0700305 return SET_AND_DIRTY(setRotationY, ry, RenderNode::ROTATION_Y);
Chris Craik54389792013-12-20 13:28:11 -0800306}
307
John Reck79c7de72014-05-23 10:33:31 -0700308static jboolean android_view_RenderNode_setScaleX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700309 jobject clazz, jlong renderNodePtr, float sx) {
John Reck79c7de72014-05-23 10:33:31 -0700310 return SET_AND_DIRTY(setScaleX, sx, RenderNode::SCALE_X);
Chris Craik54389792013-12-20 13:28:11 -0800311}
312
John Reck79c7de72014-05-23 10:33:31 -0700313static jboolean android_view_RenderNode_setScaleY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700314 jobject clazz, jlong renderNodePtr, float sy) {
John Reck79c7de72014-05-23 10:33:31 -0700315 return SET_AND_DIRTY(setScaleY, sy, RenderNode::SCALE_Y);
Chris Craik54389792013-12-20 13:28:11 -0800316}
317
John Reck79c7de72014-05-23 10:33:31 -0700318static jboolean android_view_RenderNode_setPivotX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700319 jobject clazz, jlong renderNodePtr, float px) {
John Reck79c7de72014-05-23 10:33:31 -0700320 return SET_AND_DIRTY(setPivotX, px, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800321}
322
John Reck79c7de72014-05-23 10:33:31 -0700323static jboolean android_view_RenderNode_setPivotY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700324 jobject clazz, jlong renderNodePtr, float py) {
John Reck79c7de72014-05-23 10:33:31 -0700325 return SET_AND_DIRTY(setPivotY, py, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800326}
327
John Reck79c7de72014-05-23 10:33:31 -0700328static jboolean android_view_RenderNode_setCameraDistance(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700329 jobject clazz, jlong renderNodePtr, float distance) {
John Reck79c7de72014-05-23 10:33:31 -0700330 return SET_AND_DIRTY(setCameraDistance, distance, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800331}
332
John Reck79c7de72014-05-23 10:33:31 -0700333static jboolean android_view_RenderNode_setLeft(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700334 jobject clazz, jlong renderNodePtr, int left) {
John Reck79c7de72014-05-23 10:33:31 -0700335 return SET_AND_DIRTY(setLeft, left, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800336}
337
John Reck79c7de72014-05-23 10:33:31 -0700338static jboolean android_view_RenderNode_setTop(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700339 jobject clazz, jlong renderNodePtr, int top) {
John Reck79c7de72014-05-23 10:33:31 -0700340 return SET_AND_DIRTY(setTop, top, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800341}
342
John Reck79c7de72014-05-23 10:33:31 -0700343static jboolean android_view_RenderNode_setRight(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700344 jobject clazz, jlong renderNodePtr, int right) {
John Reck79c7de72014-05-23 10:33:31 -0700345 return SET_AND_DIRTY(setRight, right, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800346}
347
John Reck79c7de72014-05-23 10:33:31 -0700348static jboolean android_view_RenderNode_setBottom(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700349 jobject clazz, jlong renderNodePtr, int bottom) {
John Reck79c7de72014-05-23 10:33:31 -0700350 return SET_AND_DIRTY(setBottom, bottom, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800351}
352
John Reck79c7de72014-05-23 10:33:31 -0700353static jboolean android_view_RenderNode_setLeftTopRightBottom(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700354 jobject clazz, jlong renderNodePtr, int left, int top,
Chris Craik54389792013-12-20 13:28:11 -0800355 int right, int bottom) {
John Reck8de65a82014-04-09 15:23:38 -0700356 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reck79c7de72014-05-23 10:33:31 -0700357 if (renderNode->mutateStagingProperties().setLeftTopRightBottom(left, top, right, bottom)) {
358 renderNode->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
359 return true;
360 }
361 return false;
Chris Craik54389792013-12-20 13:28:11 -0800362}
363
John Reck79c7de72014-05-23 10:33:31 -0700364static jboolean android_view_RenderNode_offsetLeftAndRight(JNIEnv* env,
Chris Craika753f4c2014-07-24 12:39:17 -0700365 jobject clazz, jlong renderNodePtr, jint offset) {
John Reck79c7de72014-05-23 10:33:31 -0700366 return SET_AND_DIRTY(offsetLeftRight, offset, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800367}
368
John Reck79c7de72014-05-23 10:33:31 -0700369static jboolean android_view_RenderNode_offsetTopAndBottom(JNIEnv* env,
Chris Craika753f4c2014-07-24 12:39:17 -0700370 jobject clazz, jlong renderNodePtr, jint offset) {
John Reck79c7de72014-05-23 10:33:31 -0700371 return SET_AND_DIRTY(offsetTopBottom, offset, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800372}
373
Chris Craik49e6c732014-03-31 12:34:11 -0700374// ----------------------------------------------------------------------------
375// RenderProperties - getters
376// ----------------------------------------------------------------------------
377
John Reckf666ad72014-03-14 16:24:57 -0700378static jboolean android_view_RenderNode_hasOverlappingRendering(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700379 jobject clazz, jlong renderNodePtr) {
380 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
381 return renderNode->stagingProperties().hasOverlappingRendering();
Chris Craik54389792013-12-20 13:28:11 -0800382}
383
Chris Craikdeeda3d2014-05-05 19:09:33 -0700384static jboolean android_view_RenderNode_getClipToOutline(JNIEnv* env,
385 jobject clazz, jlong renderNodePtr) {
386 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
387 return renderNode->stagingProperties().getOutline().getShouldClip();
388}
389
John Reckf666ad72014-03-14 16:24:57 -0700390static jfloat android_view_RenderNode_getAlpha(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700391 jobject clazz, jlong renderNodePtr) {
392 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
393 return renderNode->stagingProperties().getAlpha();
Chris Craik54389792013-12-20 13:28:11 -0800394}
395
John Reckf666ad72014-03-14 16:24:57 -0700396static jfloat android_view_RenderNode_getCameraDistance(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700397 jobject clazz, jlong renderNodePtr) {
398 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
399 return renderNode->stagingProperties().getCameraDistance();
Chris Craik54389792013-12-20 13:28:11 -0800400}
401
John Reckf666ad72014-03-14 16:24:57 -0700402static jfloat android_view_RenderNode_getScaleX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700403 jobject clazz, jlong renderNodePtr) {
404 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
405 return renderNode->stagingProperties().getScaleX();
Chris Craik54389792013-12-20 13:28:11 -0800406}
407
John Reckf666ad72014-03-14 16:24:57 -0700408static jfloat android_view_RenderNode_getScaleY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700409 jobject clazz, jlong renderNodePtr) {
410 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
411 return renderNode->stagingProperties().getScaleY();
Chris Craik54389792013-12-20 13:28:11 -0800412}
413
Chris Craikcc39e162014-04-25 18:34:11 -0700414static jfloat android_view_RenderNode_getElevation(JNIEnv* env,
415 jobject clazz, jlong renderNodePtr) {
416 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
417 return renderNode->stagingProperties().getElevation();
418}
419
John Reckf666ad72014-03-14 16:24:57 -0700420static jfloat android_view_RenderNode_getTranslationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700421 jobject clazz, jlong renderNodePtr) {
422 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
423 return renderNode->stagingProperties().getTranslationX();
Chris Craik54389792013-12-20 13:28:11 -0800424}
425
John Reckf666ad72014-03-14 16:24:57 -0700426static jfloat android_view_RenderNode_getTranslationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700427 jobject clazz, jlong renderNodePtr) {
428 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
429 return renderNode->stagingProperties().getTranslationY();
Chris Craik54389792013-12-20 13:28:11 -0800430}
431
Chris Craik49e6c732014-03-31 12:34:11 -0700432static jfloat android_view_RenderNode_getTranslationZ(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700433 jobject clazz, jlong renderNodePtr) {
434 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
435 return renderNode->stagingProperties().getTranslationZ();
Chris Craik49e6c732014-03-31 12:34:11 -0700436}
437
John Reckf666ad72014-03-14 16:24:57 -0700438static jfloat android_view_RenderNode_getRotation(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700439 jobject clazz, jlong renderNodePtr) {
440 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
441 return renderNode->stagingProperties().getRotation();
Chris Craik54389792013-12-20 13:28:11 -0800442}
443
John Reckf666ad72014-03-14 16:24:57 -0700444static jfloat android_view_RenderNode_getRotationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700445 jobject clazz, jlong renderNodePtr) {
446 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
447 return renderNode->stagingProperties().getRotationX();
Chris Craik54389792013-12-20 13:28:11 -0800448}
449
John Reckf666ad72014-03-14 16:24:57 -0700450static jfloat android_view_RenderNode_getRotationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700451 jobject clazz, jlong renderNodePtr) {
452 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
453 return renderNode->stagingProperties().getRotationY();
Chris Craik54389792013-12-20 13:28:11 -0800454}
455
Chris Craik49e6c732014-03-31 12:34:11 -0700456static jboolean android_view_RenderNode_isPivotExplicitlySet(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700457 jobject clazz, jlong renderNodePtr) {
458 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
459 return renderNode->stagingProperties().isPivotExplicitlySet();
Chris Craik49e6c732014-03-31 12:34:11 -0700460}
461
462static jboolean android_view_RenderNode_hasIdentityMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700463 jobject clazz, jlong renderNodePtr) {
464 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reckf7483e32014-04-11 08:54:47 -0700465 renderNode->mutateStagingProperties().updateMatrix();
466 return !renderNode->stagingProperties().hasTransformMatrix();
Chris Craik49e6c732014-03-31 12:34:11 -0700467}
468
469// ----------------------------------------------------------------------------
470// RenderProperties - computed getters
471// ----------------------------------------------------------------------------
472
473static void android_view_RenderNode_getTransformMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700474 jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
475 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik49e6c732014-03-31 12:34:11 -0700476 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
477
John Reck8de65a82014-04-09 15:23:38 -0700478 renderNode->mutateStagingProperties().updateMatrix();
479 const SkMatrix* transformMatrix = renderNode->stagingProperties().getTransformMatrix();
Chris Craik49e6c732014-03-31 12:34:11 -0700480
John Reckf7483e32014-04-11 08:54:47 -0700481 if (transformMatrix) {
Chris Craik49e6c732014-03-31 12:34:11 -0700482 *outMatrix = *transformMatrix;
483 } else {
484 outMatrix->setIdentity();
485 }
486}
487
488static void android_view_RenderNode_getInverseTransformMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700489 jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
Chris Craik49e6c732014-03-31 12:34:11 -0700490 // load transform matrix
John Reck8de65a82014-04-09 15:23:38 -0700491 android_view_RenderNode_getTransformMatrix(env, clazz, renderNodePtr, outMatrixPtr);
Chris Craik49e6c732014-03-31 12:34:11 -0700492 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
493
494 // return it inverted
495 if (!outMatrix->invert(outMatrix)) {
496 // failed to load inverse, pass back identity
497 outMatrix->setIdentity();
498 }
499}
500
John Reckf666ad72014-03-14 16:24:57 -0700501static jfloat android_view_RenderNode_getPivotX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700502 jobject clazz, jlong renderNodePtr) {
503 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
504 renderNode->mutateStagingProperties().updateMatrix();
505 return renderNode->stagingProperties().getPivotX();
Chris Craik54389792013-12-20 13:28:11 -0800506}
507
John Reckf666ad72014-03-14 16:24:57 -0700508static jfloat android_view_RenderNode_getPivotY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700509 jobject clazz, jlong renderNodePtr) {
510 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
511 renderNode->mutateStagingProperties().updateMatrix();
512 return renderNode->stagingProperties().getPivotY();
Chris Craik54389792013-12-20 13:28:11 -0800513}
514
John Recke45b1fd2014-04-15 09:50:16 -0700515// ----------------------------------------------------------------------------
516// RenderProperties - Animations
517// ----------------------------------------------------------------------------
518
519static void android_view_RenderNode_addAnimator(JNIEnv* env, jobject clazz,
520 jlong renderNodePtr, jlong animatorPtr) {
521 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
522 RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr);
523 renderNode->addAnimator(animator);
524}
525
John Reck119907c2014-08-14 09:02:01 -0700526static void android_view_RenderNode_endAllAnimators(JNIEnv* env, jobject clazz,
527 jlong renderNodePtr) {
528 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Recke2478d42014-09-03 16:46:05 -0700529 renderNode->animators().endAllStagingAnimators();
John Reck119907c2014-08-14 09:02:01 -0700530}
531
Chris Craik54389792013-12-20 13:28:11 -0800532// ----------------------------------------------------------------------------
John Reckf6481082016-02-02 15:18:23 -0800533// SurfaceView position callback
534// ----------------------------------------------------------------------------
535
536jmethodID gSurfaceViewPositionUpdateMethod;
537
538static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject,
539 jlong renderNodePtr, jobject surfaceview) {
540 class SurfaceViewPositionUpdater : public RenderNode::PositionListener {
541 public:
542 SurfaceViewPositionUpdater(JNIEnv* env, jobject surfaceview) {
543 env->GetJavaVM(&mVm);
544 mWeakRef = env->NewWeakGlobalRef(surfaceview);
545 }
546
547 virtual ~SurfaceViewPositionUpdater() {
548 jnienv()->DeleteWeakGlobalRef(mWeakRef);
549 mWeakRef = nullptr;
550 }
551
552 virtual void onPositionUpdated(RenderNode& node, const TreeInfo& info) override {
553 if (CC_UNLIKELY(!mWeakRef || !info.updateWindowPositions)) return;
John Reckf6481082016-02-02 15:18:23 -0800554
John Reckf6481082016-02-02 15:18:23 -0800555 Matrix4 transform;
556 info.damageAccumulator->computeCurrentTransform(&transform);
557 const RenderProperties& props = node.properties();
558 uirenderer::Rect bounds(props.getWidth(), props.getHeight());
559 transform.mapRect(bounds);
560 bounds.left -= info.windowInsetLeft;
561 bounds.right -= info.windowInsetLeft;
562 bounds.top -= info.windowInsetTop;
563 bounds.bottom -= info.windowInsetTop;
John Reck38f6c032016-03-17 10:23:49 -0700564
565 auto functor = std::bind(
566 std::mem_fn(&SurfaceViewPositionUpdater::doUpdatePosition), this,
567 (jlong) info.frameNumber, (jint) bounds.left, (jint) bounds.top,
568 (jint) bounds.right, (jint) bounds.bottom);
569
570 info.canvasContext.enqueueFrameWork(std::move(functor));
John Reckf6481082016-02-02 15:18:23 -0800571 }
572
573 private:
574 JNIEnv* jnienv() {
575 JNIEnv* env;
576 if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
577 LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", mVm);
578 }
579 return env;
580 }
581
John Reck38f6c032016-03-17 10:23:49 -0700582 void doUpdatePosition(jlong frameNumber, jint left, jint top,
583 jint right, jint bottom) {
584 ATRACE_NAME("Update SurfaceView position");
585
586 JNIEnv* env = jnienv();
587 jobject localref = env->NewLocalRef(mWeakRef);
588 if (CC_UNLIKELY(!localref)) {
589 jnienv()->DeleteWeakGlobalRef(mWeakRef);
590 mWeakRef = nullptr;
591 return;
592 }
593
594 env->CallVoidMethod(localref, gSurfaceViewPositionUpdateMethod,
595 frameNumber, left, top, right, bottom);
596 env->DeleteLocalRef(localref);
597 }
598
John Reckf6481082016-02-02 15:18:23 -0800599 JavaVM* mVm;
600 jobject mWeakRef;
601 };
602
603 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
604 renderNode->setPositionListener(new SurfaceViewPositionUpdater(env, surfaceview));
605}
606
607// ----------------------------------------------------------------------------
Chris Craik54389792013-12-20 13:28:11 -0800608// JNI Glue
609// ----------------------------------------------------------------------------
610
John Reckf666ad72014-03-14 16:24:57 -0700611const char* const kClassPathName = "android/view/RenderNode";
Chris Craik54389792013-12-20 13:28:11 -0800612
Daniel Micay76f6a862015-09-19 17:31:01 -0400613static const JNINativeMethod gMethods[] = {
Chris Craik003cc3d2015-10-16 10:24:55 -0700614 { "nCreate", "(Ljava/lang/String;)J", (void*) android_view_RenderNode_create },
615 { "nDestroyRenderNode", "(J)V", (void*) android_view_RenderNode_destroyRenderNode },
616 { "nSetDisplayList", "(JJ)V", (void*) android_view_RenderNode_setDisplayList },
617 { "nOutput", "(J)V", (void*) android_view_RenderNode_output },
618 { "nGetDebugSize", "(J)I", (void*) android_view_RenderNode_getDebugSize },
Chris Craik54389792013-12-20 13:28:11 -0800619
Chris Craik4136a0a2014-10-07 15:09:46 -0700620 { "nSetLayerType", "!(JI)Z", (void*) android_view_RenderNode_setLayerType },
621 { "nSetLayerPaint", "!(JJ)Z", (void*) android_view_RenderNode_setLayerPaint },
622 { "nSetStaticMatrix", "!(JJ)Z", (void*) android_view_RenderNode_setStaticMatrix },
623 { "nSetAnimationMatrix", "!(JJ)Z", (void*) android_view_RenderNode_setAnimationMatrix },
624 { "nSetClipToBounds", "!(JZ)Z", (void*) android_view_RenderNode_setClipToBounds },
625 { "nSetClipBounds", "!(JIIII)Z", (void*) android_view_RenderNode_setClipBounds },
626 { "nSetClipBoundsEmpty", "!(J)Z", (void*) android_view_RenderNode_setClipBoundsEmpty },
627 { "nSetProjectBackwards", "!(JZ)Z", (void*) android_view_RenderNode_setProjectBackwards },
628 { "nSetProjectionReceiver","!(JZ)Z", (void*) android_view_RenderNode_setProjectionReceiver },
Chris Craikb49f4462014-03-20 12:44:20 -0700629
Chris Craik40de9f22015-07-29 12:51:41 -0700630 { "nSetOutlineRoundRect", "!(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect },
631 { "nSetOutlineConvexPath", "!(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath },
632 { "nSetOutlineEmpty", "!(J)Z", (void*) android_view_RenderNode_setOutlineEmpty },
633 { "nSetOutlineNone", "!(J)Z", (void*) android_view_RenderNode_setOutlineNone },
Chris Craik4136a0a2014-10-07 15:09:46 -0700634 { "nHasShadow", "!(J)Z", (void*) android_view_RenderNode_hasShadow },
635 { "nSetClipToOutline", "!(JZ)Z", (void*) android_view_RenderNode_setClipToOutline },
Chris Craik40de9f22015-07-29 12:51:41 -0700636 { "nSetRevealClip", "!(JZFFF)Z", (void*) android_view_RenderNode_setRevealClip },
Chris Craikb49f4462014-03-20 12:44:20 -0700637
Chris Craik4136a0a2014-10-07 15:09:46 -0700638 { "nSetAlpha", "!(JF)Z", (void*) android_view_RenderNode_setAlpha },
639 { "nSetHasOverlappingRendering", "!(JZ)Z",
John Reckf666ad72014-03-14 16:24:57 -0700640 (void*) android_view_RenderNode_setHasOverlappingRendering },
Chris Craik4136a0a2014-10-07 15:09:46 -0700641 { "nSetElevation", "!(JF)Z", (void*) android_view_RenderNode_setElevation },
642 { "nSetTranslationX", "!(JF)Z", (void*) android_view_RenderNode_setTranslationX },
643 { "nSetTranslationY", "!(JF)Z", (void*) android_view_RenderNode_setTranslationY },
644 { "nSetTranslationZ", "!(JF)Z", (void*) android_view_RenderNode_setTranslationZ },
645 { "nSetRotation", "!(JF)Z", (void*) android_view_RenderNode_setRotation },
646 { "nSetRotationX", "!(JF)Z", (void*) android_view_RenderNode_setRotationX },
647 { "nSetRotationY", "!(JF)Z", (void*) android_view_RenderNode_setRotationY },
648 { "nSetScaleX", "!(JF)Z", (void*) android_view_RenderNode_setScaleX },
649 { "nSetScaleY", "!(JF)Z", (void*) android_view_RenderNode_setScaleY },
650 { "nSetPivotX", "!(JF)Z", (void*) android_view_RenderNode_setPivotX },
651 { "nSetPivotY", "!(JF)Z", (void*) android_view_RenderNode_setPivotY },
652 { "nSetCameraDistance", "!(JF)Z", (void*) android_view_RenderNode_setCameraDistance },
653 { "nSetLeft", "!(JI)Z", (void*) android_view_RenderNode_setLeft },
654 { "nSetTop", "!(JI)Z", (void*) android_view_RenderNode_setTop },
655 { "nSetRight", "!(JI)Z", (void*) android_view_RenderNode_setRight },
656 { "nSetBottom", "!(JI)Z", (void*) android_view_RenderNode_setBottom },
657 { "nSetLeftTopRightBottom","!(JIIII)Z", (void*) android_view_RenderNode_setLeftTopRightBottom },
658 { "nOffsetLeftAndRight", "!(JI)Z", (void*) android_view_RenderNode_offsetLeftAndRight },
659 { "nOffsetTopAndBottom", "!(JI)Z", (void*) android_view_RenderNode_offsetTopAndBottom },
Chris Craik54389792013-12-20 13:28:11 -0800660
Chris Craik4136a0a2014-10-07 15:09:46 -0700661 { "nHasOverlappingRendering", "!(J)Z", (void*) android_view_RenderNode_hasOverlappingRendering },
662 { "nGetClipToOutline", "!(J)Z", (void*) android_view_RenderNode_getClipToOutline },
663 { "nGetAlpha", "!(J)F", (void*) android_view_RenderNode_getAlpha },
664 { "nGetCameraDistance", "!(J)F", (void*) android_view_RenderNode_getCameraDistance },
665 { "nGetScaleX", "!(J)F", (void*) android_view_RenderNode_getScaleX },
666 { "nGetScaleY", "!(J)F", (void*) android_view_RenderNode_getScaleY },
667 { "nGetElevation", "!(J)F", (void*) android_view_RenderNode_getElevation },
668 { "nGetTranslationX", "!(J)F", (void*) android_view_RenderNode_getTranslationX },
669 { "nGetTranslationY", "!(J)F", (void*) android_view_RenderNode_getTranslationY },
670 { "nGetTranslationZ", "!(J)F", (void*) android_view_RenderNode_getTranslationZ },
671 { "nGetRotation", "!(J)F", (void*) android_view_RenderNode_getRotation },
672 { "nGetRotationX", "!(J)F", (void*) android_view_RenderNode_getRotationX },
673 { "nGetRotationY", "!(J)F", (void*) android_view_RenderNode_getRotationY },
674 { "nIsPivotExplicitlySet", "!(J)Z", (void*) android_view_RenderNode_isPivotExplicitlySet },
675 { "nHasIdentityMatrix", "!(J)Z", (void*) android_view_RenderNode_hasIdentityMatrix },
Chris Craik49e6c732014-03-31 12:34:11 -0700676
Chris Craik4136a0a2014-10-07 15:09:46 -0700677 { "nGetTransformMatrix", "!(JJ)V", (void*) android_view_RenderNode_getTransformMatrix },
678 { "nGetInverseTransformMatrix","!(JJ)V", (void*) android_view_RenderNode_getInverseTransformMatrix },
Chris Craik49e6c732014-03-31 12:34:11 -0700679
Chris Craik4136a0a2014-10-07 15:09:46 -0700680 { "nGetPivotX", "!(J)F", (void*) android_view_RenderNode_getPivotX },
681 { "nGetPivotY", "!(J)F", (void*) android_view_RenderNode_getPivotY },
John Recke45b1fd2014-04-15 09:50:16 -0700682
683 { "nAddAnimator", "(JJ)V", (void*) android_view_RenderNode_addAnimator },
John Reck119907c2014-08-14 09:02:01 -0700684 { "nEndAllAnimators", "(J)V", (void*) android_view_RenderNode_endAllAnimators },
John Reckf6481082016-02-02 15:18:23 -0800685
686 { "nRequestPositionUpdates", "(JLandroid/view/SurfaceView;)V", (void*) android_view_RenderNode_requestPositionUpdates },
Chris Craik54389792013-12-20 13:28:11 -0800687};
688
John Reckf666ad72014-03-14 16:24:57 -0700689int register_android_view_RenderNode(JNIEnv* env) {
John Reckf6481082016-02-02 15:18:23 -0800690 jclass clazz = FindClassOrDie(env, "android/view/SurfaceView");
691 gSurfaceViewPositionUpdateMethod = GetMethodIDOrDie(env, clazz,
692 "updateWindowPositionRT", "(JIIII)V");
John Reck44b49f02016-03-25 14:29:48 -0700693 clazz = FindClassOrDie(env, "android/view/RenderNode");
694 gOnRenderNodeDetached = GetMethodIDOrDie(env, clazz,
695 "onRenderNodeDetached", "()V");
Andreas Gampe987f79f2014-11-18 17:29:46 -0800696 return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
Chris Craik54389792013-12-20 13:28:11 -0800697}
698
699};
700