blob: 79b518fe53ee3d45938b5965f1c3c7248d1e9a4b [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
Chris Craik54389792013-12-20 13:28:11 -080046// ----------------------------------------------------------------------------
47// DisplayList view properties
48// ----------------------------------------------------------------------------
49
John Reck8de65a82014-04-09 15:23:38 -070050static void android_view_RenderNode_output(JNIEnv* env,
51 jobject clazz, jlong renderNodePtr) {
52 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
53 renderNode->output();
54}
55
John Reckfe5e7b72014-05-23 17:42:28 -070056static jint android_view_RenderNode_getDebugSize(JNIEnv* env,
57 jobject clazz, jlong renderNodePtr) {
58 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
59 return renderNode->getDebugSize();
60}
61
John Reck8de65a82014-04-09 15:23:38 -070062static jlong android_view_RenderNode_create(JNIEnv* env, jobject clazz, jstring name) {
63 RenderNode* renderNode = new RenderNode();
64 renderNode->incStrong(0);
Chris Craik54389792013-12-20 13:28:11 -080065 if (name != NULL) {
66 const char* textArray = env->GetStringUTFChars(name, NULL);
John Reck8de65a82014-04-09 15:23:38 -070067 renderNode->setName(textArray);
Chris Craik54389792013-12-20 13:28:11 -080068 env->ReleaseStringUTFChars(name, textArray);
69 }
John Reck8de65a82014-04-09 15:23:38 -070070 return reinterpret_cast<jlong>(renderNode);
Chris Craik54389792013-12-20 13:28:11 -080071}
72
John Reck8de65a82014-04-09 15:23:38 -070073static void android_view_RenderNode_destroyRenderNode(JNIEnv* env,
74 jobject clazz, jlong renderNodePtr) {
75 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
76 renderNode->decStrong(0);
Chris Craik54389792013-12-20 13:28:11 -080077}
78
Chris Craik003cc3d2015-10-16 10:24:55 -070079static void android_view_RenderNode_setDisplayList(JNIEnv* env,
80 jobject clazz, jlong renderNodePtr, jlong displayListPtr) {
John Reck8de65a82014-04-09 15:23:38 -070081 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik003cc3d2015-10-16 10:24:55 -070082 DisplayList* newData = reinterpret_cast<DisplayList*>(displayListPtr);
John Reck8de65a82014-04-09 15:23:38 -070083 renderNode->setStagingDisplayList(newData);
Chris Craik54389792013-12-20 13:28:11 -080084}
85
86// ----------------------------------------------------------------------------
Chris Craik49e6c732014-03-31 12:34:11 -070087// RenderProperties - setters
Chris Craik54389792013-12-20 13:28:11 -080088// ----------------------------------------------------------------------------
89
John Reck25fbb3f2014-06-12 13:46:45 -070090static jboolean android_view_RenderNode_setLayerType(JNIEnv* env,
91 jobject clazz, jlong renderNodePtr, jint jlayerType) {
92 LayerType layerType = static_cast<LayerType>(jlayerType);
93 return SET_AND_DIRTY(mutateLayerProperties().setType, layerType, RenderNode::GENERIC);
94}
95
96static jboolean android_view_RenderNode_setLayerPaint(JNIEnv* env,
97 jobject clazz, jlong renderNodePtr, jlong paintPtr) {
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -040098 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
John Reck25fbb3f2014-06-12 13:46:45 -070099 return SET_AND_DIRTY(mutateLayerProperties().setFromPaint, paint, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800100}
101
John Reck79c7de72014-05-23 10:33:31 -0700102static jboolean android_view_RenderNode_setStaticMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700103 jobject clazz, jlong renderNodePtr, jlong matrixPtr) {
Chris Craik7a02ea32013-12-27 16:43:22 -0800104 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
John Reck79c7de72014-05-23 10:33:31 -0700105 return SET_AND_DIRTY(setStaticMatrix, matrix, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800106}
107
John Reck79c7de72014-05-23 10:33:31 -0700108static jboolean android_view_RenderNode_setAnimationMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700109 jobject clazz, jlong renderNodePtr, jlong matrixPtr) {
Chris Craik7a02ea32013-12-27 16:43:22 -0800110 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
John Reck79c7de72014-05-23 10:33:31 -0700111 return SET_AND_DIRTY(setAnimationMatrix, matrix, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800112}
113
John Reck79c7de72014-05-23 10:33:31 -0700114static jboolean android_view_RenderNode_setClipToBounds(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700115 jobject clazz, jlong renderNodePtr, jboolean clipToBounds) {
John Reck79c7de72014-05-23 10:33:31 -0700116 return SET_AND_DIRTY(setClipToBounds, clipToBounds, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800117}
118
Chris Craika753f4c2014-07-24 12:39:17 -0700119static jboolean android_view_RenderNode_setClipBounds(JNIEnv* env,
120 jobject clazz, jlong renderNodePtr, jint left, jint top, jint right, jint bottom) {
121 android::uirenderer::Rect clipBounds(left, top, right, bottom);
122 return SET_AND_DIRTY(setClipBounds, clipBounds, RenderNode::GENERIC);
123}
124
125static jboolean android_view_RenderNode_setClipBoundsEmpty(JNIEnv* env,
126 jobject clazz, jlong renderNodePtr) {
127 return SET_AND_DIRTY(setClipBoundsEmpty,, RenderNode::GENERIC);
128}
129
John Reck79c7de72014-05-23 10:33:31 -0700130static jboolean android_view_RenderNode_setProjectBackwards(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700131 jobject clazz, jlong renderNodePtr, jboolean shouldProject) {
John Reck79c7de72014-05-23 10:33:31 -0700132 return SET_AND_DIRTY(setProjectBackwards, shouldProject, RenderNode::GENERIC);
Alan Viverette58f09b32014-01-08 17:18:19 -0800133}
134
John Reck79c7de72014-05-23 10:33:31 -0700135static jboolean android_view_RenderNode_setProjectionReceiver(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700136 jobject clazz, jlong renderNodePtr, jboolean shouldRecieve) {
John Reck79c7de72014-05-23 10:33:31 -0700137 return SET_AND_DIRTY(setProjectionReceiver, shouldRecieve, RenderNode::GENERIC);
Chris Craik1df26442014-02-05 16:50:41 -0800138}
139
John Reck79c7de72014-05-23 10:33:31 -0700140static jboolean android_view_RenderNode_setOutlineRoundRect(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700141 jobject clazz, jlong renderNodePtr, jint left, jint top,
Chris Craik77b5cad2014-07-30 18:23:07 -0700142 jint right, jint bottom, jfloat radius, jfloat alpha) {
John Reck8de65a82014-04-09 15:23:38 -0700143 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik77b5cad2014-07-30 18:23:07 -0700144 renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom,
145 radius, alpha);
John Reckff941dc2014-05-14 16:34:14 -0700146 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700147 return true;
Chris Craikb49f4462014-03-20 12:44:20 -0700148}
Chris Craik8c271ca2014-03-25 10:33:01 -0700149
John Reck79c7de72014-05-23 10:33:31 -0700150static jboolean android_view_RenderNode_setOutlineConvexPath(JNIEnv* env,
Chris Craik77b5cad2014-07-30 18:23:07 -0700151 jobject clazz, jlong renderNodePtr, jlong outlinePathPtr, jfloat alpha) {
John Reck8de65a82014-04-09 15:23:38 -0700152 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craikb49f4462014-03-20 12:44:20 -0700153 SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr);
Chris Craik77b5cad2014-07-30 18:23:07 -0700154 renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath, alpha);
John Reckff941dc2014-05-14 16:34:14 -0700155 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700156 return true;
Chris Craikb49f4462014-03-20 12:44:20 -0700157}
Chris Craik8c271ca2014-03-25 10:33:01 -0700158
John Reck79c7de72014-05-23 10:33:31 -0700159static jboolean android_view_RenderNode_setOutlineEmpty(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700160 jobject clazz, jlong renderNodePtr) {
161 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
162 renderNode->mutateStagingProperties().mutableOutline().setEmpty();
John Reckff941dc2014-05-14 16:34:14 -0700163 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700164 return true;
Chris Craika2fe7af2014-01-28 17:25:06 -0800165}
166
Chris Craik06451282014-07-21 10:25:54 -0700167static jboolean android_view_RenderNode_setOutlineNone(JNIEnv* env,
168 jobject clazz, jlong renderNodePtr) {
169 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
170 renderNode->mutateStagingProperties().mutableOutline().setNone();
171 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
172 return true;
173}
174
Chris Craik5c75c522014-09-05 14:08:08 -0700175static jboolean android_view_RenderNode_hasShadow(JNIEnv* env,
176 jobject clazz, jlong renderNodePtr) {
177 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
178 return renderNode->stagingProperties().hasShadow();
179}
180
John Reck79c7de72014-05-23 10:33:31 -0700181static jboolean android_view_RenderNode_setClipToOutline(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700182 jobject clazz, jlong renderNodePtr, jboolean clipToOutline) {
183 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
184 renderNode->mutateStagingProperties().mutableOutline().setShouldClip(clipToOutline);
John Reckff941dc2014-05-14 16:34:14 -0700185 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700186 return true;
Chris Craik8c271ca2014-03-25 10:33:01 -0700187}
188
John Reck79c7de72014-05-23 10:33:31 -0700189static jboolean android_view_RenderNode_setRevealClip(JNIEnv* env,
Chris Craikaf4d04c2014-07-29 12:50:14 -0700190 jobject clazz, jlong renderNodePtr, jboolean shouldClip,
Chris Craik8c271ca2014-03-25 10:33:01 -0700191 jfloat x, jfloat y, jfloat radius) {
John Reck8de65a82014-04-09 15:23:38 -0700192 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
193 renderNode->mutateStagingProperties().mutableRevealClip().set(
Chris Craikaf4d04c2014-07-29 12:50:14 -0700194 shouldClip, x, y, radius);
John Reckff941dc2014-05-14 16:34:14 -0700195 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700196 return true;
ztenghuifad45932014-02-06 10:33:58 -0800197}
198
John Reck79c7de72014-05-23 10:33:31 -0700199static jboolean android_view_RenderNode_setAlpha(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700200 jobject clazz, jlong renderNodePtr, float alpha) {
John Reck79c7de72014-05-23 10:33:31 -0700201 return SET_AND_DIRTY(setAlpha, alpha, RenderNode::ALPHA);
Chris Craik54389792013-12-20 13:28:11 -0800202}
203
John Reck79c7de72014-05-23 10:33:31 -0700204static jboolean android_view_RenderNode_setHasOverlappingRendering(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700205 jobject clazz, jlong renderNodePtr, bool hasOverlappingRendering) {
John Reck79c7de72014-05-23 10:33:31 -0700206 return SET_AND_DIRTY(setHasOverlappingRendering, hasOverlappingRendering,
207 RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800208}
209
John Reck79c7de72014-05-23 10:33:31 -0700210static jboolean android_view_RenderNode_setElevation(JNIEnv* env,
Chris Craikcc39e162014-04-25 18:34:11 -0700211 jobject clazz, jlong renderNodePtr, float elevation) {
John Reck79c7de72014-05-23 10:33:31 -0700212 return SET_AND_DIRTY(setElevation, elevation, RenderNode::Z);
Chris Craikcc39e162014-04-25 18:34:11 -0700213}
214
John Reck79c7de72014-05-23 10:33:31 -0700215static jboolean android_view_RenderNode_setTranslationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700216 jobject clazz, jlong renderNodePtr, float tx) {
John Reck79c7de72014-05-23 10:33:31 -0700217 return SET_AND_DIRTY(setTranslationX, tx, RenderNode::TRANSLATION_X | RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800218}
219
John Reck79c7de72014-05-23 10:33:31 -0700220static jboolean android_view_RenderNode_setTranslationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700221 jobject clazz, jlong renderNodePtr, float ty) {
John Reck79c7de72014-05-23 10:33:31 -0700222 return SET_AND_DIRTY(setTranslationY, ty, RenderNode::TRANSLATION_Y | RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800223}
224
John Reck79c7de72014-05-23 10:33:31 -0700225static jboolean android_view_RenderNode_setTranslationZ(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700226 jobject clazz, jlong renderNodePtr, float tz) {
John Reck79c7de72014-05-23 10:33:31 -0700227 return SET_AND_DIRTY(setTranslationZ, tz, RenderNode::TRANSLATION_Z | RenderNode::Z);
Chris Craik54389792013-12-20 13:28:11 -0800228}
229
John Reck79c7de72014-05-23 10:33:31 -0700230static jboolean android_view_RenderNode_setRotation(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700231 jobject clazz, jlong renderNodePtr, float rotation) {
John Reck79c7de72014-05-23 10:33:31 -0700232 return SET_AND_DIRTY(setRotation, rotation, RenderNode::ROTATION);
Chris Craik54389792013-12-20 13:28:11 -0800233}
234
John Reck79c7de72014-05-23 10:33:31 -0700235static jboolean android_view_RenderNode_setRotationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700236 jobject clazz, jlong renderNodePtr, float rx) {
John Reck79c7de72014-05-23 10:33:31 -0700237 return SET_AND_DIRTY(setRotationX, rx, RenderNode::ROTATION_X);
Chris Craik54389792013-12-20 13:28:11 -0800238}
239
John Reck79c7de72014-05-23 10:33:31 -0700240static jboolean android_view_RenderNode_setRotationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700241 jobject clazz, jlong renderNodePtr, float ry) {
John Reck79c7de72014-05-23 10:33:31 -0700242 return SET_AND_DIRTY(setRotationY, ry, RenderNode::ROTATION_Y);
Chris Craik54389792013-12-20 13:28:11 -0800243}
244
John Reck79c7de72014-05-23 10:33:31 -0700245static jboolean android_view_RenderNode_setScaleX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700246 jobject clazz, jlong renderNodePtr, float sx) {
John Reck79c7de72014-05-23 10:33:31 -0700247 return SET_AND_DIRTY(setScaleX, sx, RenderNode::SCALE_X);
Chris Craik54389792013-12-20 13:28:11 -0800248}
249
John Reck79c7de72014-05-23 10:33:31 -0700250static jboolean android_view_RenderNode_setScaleY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700251 jobject clazz, jlong renderNodePtr, float sy) {
John Reck79c7de72014-05-23 10:33:31 -0700252 return SET_AND_DIRTY(setScaleY, sy, RenderNode::SCALE_Y);
Chris Craik54389792013-12-20 13:28:11 -0800253}
254
John Reck79c7de72014-05-23 10:33:31 -0700255static jboolean android_view_RenderNode_setPivotX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700256 jobject clazz, jlong renderNodePtr, float px) {
John Reck79c7de72014-05-23 10:33:31 -0700257 return SET_AND_DIRTY(setPivotX, px, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800258}
259
John Reck79c7de72014-05-23 10:33:31 -0700260static jboolean android_view_RenderNode_setPivotY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700261 jobject clazz, jlong renderNodePtr, float py) {
John Reck79c7de72014-05-23 10:33:31 -0700262 return SET_AND_DIRTY(setPivotY, py, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800263}
264
John Reck79c7de72014-05-23 10:33:31 -0700265static jboolean android_view_RenderNode_setCameraDistance(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700266 jobject clazz, jlong renderNodePtr, float distance) {
John Reck79c7de72014-05-23 10:33:31 -0700267 return SET_AND_DIRTY(setCameraDistance, distance, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800268}
269
John Reck79c7de72014-05-23 10:33:31 -0700270static jboolean android_view_RenderNode_setLeft(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700271 jobject clazz, jlong renderNodePtr, int left) {
John Reck79c7de72014-05-23 10:33:31 -0700272 return SET_AND_DIRTY(setLeft, left, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800273}
274
John Reck79c7de72014-05-23 10:33:31 -0700275static jboolean android_view_RenderNode_setTop(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700276 jobject clazz, jlong renderNodePtr, int top) {
John Reck79c7de72014-05-23 10:33:31 -0700277 return SET_AND_DIRTY(setTop, top, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800278}
279
John Reck79c7de72014-05-23 10:33:31 -0700280static jboolean android_view_RenderNode_setRight(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700281 jobject clazz, jlong renderNodePtr, int right) {
John Reck79c7de72014-05-23 10:33:31 -0700282 return SET_AND_DIRTY(setRight, right, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800283}
284
John Reck79c7de72014-05-23 10:33:31 -0700285static jboolean android_view_RenderNode_setBottom(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700286 jobject clazz, jlong renderNodePtr, int bottom) {
John Reck79c7de72014-05-23 10:33:31 -0700287 return SET_AND_DIRTY(setBottom, bottom, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800288}
289
John Reck79c7de72014-05-23 10:33:31 -0700290static jboolean android_view_RenderNode_setLeftTopRightBottom(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700291 jobject clazz, jlong renderNodePtr, int left, int top,
Chris Craik54389792013-12-20 13:28:11 -0800292 int right, int bottom) {
John Reck8de65a82014-04-09 15:23:38 -0700293 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reck79c7de72014-05-23 10:33:31 -0700294 if (renderNode->mutateStagingProperties().setLeftTopRightBottom(left, top, right, bottom)) {
295 renderNode->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
296 return true;
297 }
298 return false;
Chris Craik54389792013-12-20 13:28:11 -0800299}
300
John Reck79c7de72014-05-23 10:33:31 -0700301static jboolean android_view_RenderNode_offsetLeftAndRight(JNIEnv* env,
Chris Craika753f4c2014-07-24 12:39:17 -0700302 jobject clazz, jlong renderNodePtr, jint offset) {
John Reck79c7de72014-05-23 10:33:31 -0700303 return SET_AND_DIRTY(offsetLeftRight, offset, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800304}
305
John Reck79c7de72014-05-23 10:33:31 -0700306static jboolean android_view_RenderNode_offsetTopAndBottom(JNIEnv* env,
Chris Craika753f4c2014-07-24 12:39:17 -0700307 jobject clazz, jlong renderNodePtr, jint offset) {
John Reck79c7de72014-05-23 10:33:31 -0700308 return SET_AND_DIRTY(offsetTopBottom, offset, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800309}
310
Chris Craik49e6c732014-03-31 12:34:11 -0700311// ----------------------------------------------------------------------------
312// RenderProperties - getters
313// ----------------------------------------------------------------------------
314
John Reckf666ad72014-03-14 16:24:57 -0700315static jboolean android_view_RenderNode_hasOverlappingRendering(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700316 jobject clazz, jlong renderNodePtr) {
317 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
318 return renderNode->stagingProperties().hasOverlappingRendering();
Chris Craik54389792013-12-20 13:28:11 -0800319}
320
Chris Craikdeeda3d2014-05-05 19:09:33 -0700321static jboolean android_view_RenderNode_getClipToOutline(JNIEnv* env,
322 jobject clazz, jlong renderNodePtr) {
323 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
324 return renderNode->stagingProperties().getOutline().getShouldClip();
325}
326
John Reckf666ad72014-03-14 16:24:57 -0700327static jfloat android_view_RenderNode_getAlpha(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700328 jobject clazz, jlong renderNodePtr) {
329 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
330 return renderNode->stagingProperties().getAlpha();
Chris Craik54389792013-12-20 13:28:11 -0800331}
332
John Reckf666ad72014-03-14 16:24:57 -0700333static jfloat android_view_RenderNode_getCameraDistance(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700334 jobject clazz, jlong renderNodePtr) {
335 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
336 return renderNode->stagingProperties().getCameraDistance();
Chris Craik54389792013-12-20 13:28:11 -0800337}
338
John Reckf666ad72014-03-14 16:24:57 -0700339static jfloat android_view_RenderNode_getScaleX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700340 jobject clazz, jlong renderNodePtr) {
341 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
342 return renderNode->stagingProperties().getScaleX();
Chris Craik54389792013-12-20 13:28:11 -0800343}
344
John Reckf666ad72014-03-14 16:24:57 -0700345static jfloat android_view_RenderNode_getScaleY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700346 jobject clazz, jlong renderNodePtr) {
347 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
348 return renderNode->stagingProperties().getScaleY();
Chris Craik54389792013-12-20 13:28:11 -0800349}
350
Chris Craikcc39e162014-04-25 18:34:11 -0700351static jfloat android_view_RenderNode_getElevation(JNIEnv* env,
352 jobject clazz, jlong renderNodePtr) {
353 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
354 return renderNode->stagingProperties().getElevation();
355}
356
John Reckf666ad72014-03-14 16:24:57 -0700357static jfloat android_view_RenderNode_getTranslationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700358 jobject clazz, jlong renderNodePtr) {
359 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
360 return renderNode->stagingProperties().getTranslationX();
Chris Craik54389792013-12-20 13:28:11 -0800361}
362
John Reckf666ad72014-03-14 16:24:57 -0700363static jfloat android_view_RenderNode_getTranslationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700364 jobject clazz, jlong renderNodePtr) {
365 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
366 return renderNode->stagingProperties().getTranslationY();
Chris Craik54389792013-12-20 13:28:11 -0800367}
368
Chris Craik49e6c732014-03-31 12:34:11 -0700369static jfloat android_view_RenderNode_getTranslationZ(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700370 jobject clazz, jlong renderNodePtr) {
371 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
372 return renderNode->stagingProperties().getTranslationZ();
Chris Craik49e6c732014-03-31 12:34:11 -0700373}
374
John Reckf666ad72014-03-14 16:24:57 -0700375static jfloat android_view_RenderNode_getRotation(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700376 jobject clazz, jlong renderNodePtr) {
377 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
378 return renderNode->stagingProperties().getRotation();
Chris Craik54389792013-12-20 13:28:11 -0800379}
380
John Reckf666ad72014-03-14 16:24:57 -0700381static jfloat android_view_RenderNode_getRotationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700382 jobject clazz, jlong renderNodePtr) {
383 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
384 return renderNode->stagingProperties().getRotationX();
Chris Craik54389792013-12-20 13:28:11 -0800385}
386
John Reckf666ad72014-03-14 16:24:57 -0700387static jfloat android_view_RenderNode_getRotationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700388 jobject clazz, jlong renderNodePtr) {
389 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
390 return renderNode->stagingProperties().getRotationY();
Chris Craik54389792013-12-20 13:28:11 -0800391}
392
Chris Craik49e6c732014-03-31 12:34:11 -0700393static jboolean android_view_RenderNode_isPivotExplicitlySet(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700394 jobject clazz, jlong renderNodePtr) {
395 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
396 return renderNode->stagingProperties().isPivotExplicitlySet();
Chris Craik49e6c732014-03-31 12:34:11 -0700397}
398
399static jboolean android_view_RenderNode_hasIdentityMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700400 jobject clazz, jlong renderNodePtr) {
401 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reckf7483e32014-04-11 08:54:47 -0700402 renderNode->mutateStagingProperties().updateMatrix();
403 return !renderNode->stagingProperties().hasTransformMatrix();
Chris Craik49e6c732014-03-31 12:34:11 -0700404}
405
406// ----------------------------------------------------------------------------
407// RenderProperties - computed getters
408// ----------------------------------------------------------------------------
409
410static void android_view_RenderNode_getTransformMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700411 jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
412 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik49e6c732014-03-31 12:34:11 -0700413 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
414
John Reck8de65a82014-04-09 15:23:38 -0700415 renderNode->mutateStagingProperties().updateMatrix();
416 const SkMatrix* transformMatrix = renderNode->stagingProperties().getTransformMatrix();
Chris Craik49e6c732014-03-31 12:34:11 -0700417
John Reckf7483e32014-04-11 08:54:47 -0700418 if (transformMatrix) {
Chris Craik49e6c732014-03-31 12:34:11 -0700419 *outMatrix = *transformMatrix;
420 } else {
421 outMatrix->setIdentity();
422 }
423}
424
425static void android_view_RenderNode_getInverseTransformMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700426 jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
Chris Craik49e6c732014-03-31 12:34:11 -0700427 // load transform matrix
John Reck8de65a82014-04-09 15:23:38 -0700428 android_view_RenderNode_getTransformMatrix(env, clazz, renderNodePtr, outMatrixPtr);
Chris Craik49e6c732014-03-31 12:34:11 -0700429 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
430
431 // return it inverted
432 if (!outMatrix->invert(outMatrix)) {
433 // failed to load inverse, pass back identity
434 outMatrix->setIdentity();
435 }
436}
437
John Reckf666ad72014-03-14 16:24:57 -0700438static jfloat android_view_RenderNode_getPivotX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700439 jobject clazz, jlong renderNodePtr) {
440 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
441 renderNode->mutateStagingProperties().updateMatrix();
442 return renderNode->stagingProperties().getPivotX();
Chris Craik54389792013-12-20 13:28:11 -0800443}
444
John Reckf666ad72014-03-14 16:24:57 -0700445static jfloat android_view_RenderNode_getPivotY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700446 jobject clazz, jlong renderNodePtr) {
447 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
448 renderNode->mutateStagingProperties().updateMatrix();
449 return renderNode->stagingProperties().getPivotY();
Chris Craik54389792013-12-20 13:28:11 -0800450}
451
John Recke45b1fd2014-04-15 09:50:16 -0700452// ----------------------------------------------------------------------------
453// RenderProperties - Animations
454// ----------------------------------------------------------------------------
455
456static void android_view_RenderNode_addAnimator(JNIEnv* env, jobject clazz,
457 jlong renderNodePtr, jlong animatorPtr) {
458 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
459 RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr);
460 renderNode->addAnimator(animator);
461}
462
John Reck119907c2014-08-14 09:02:01 -0700463static void android_view_RenderNode_endAllAnimators(JNIEnv* env, jobject clazz,
464 jlong renderNodePtr) {
465 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Recke2478d42014-09-03 16:46:05 -0700466 renderNode->animators().endAllStagingAnimators();
John Reck119907c2014-08-14 09:02:01 -0700467}
468
Chris Craik54389792013-12-20 13:28:11 -0800469// ----------------------------------------------------------------------------
John Reckf6481082016-02-02 15:18:23 -0800470// SurfaceView position callback
471// ----------------------------------------------------------------------------
472
473jmethodID gSurfaceViewPositionUpdateMethod;
474
475static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject,
476 jlong renderNodePtr, jobject surfaceview) {
477 class SurfaceViewPositionUpdater : public RenderNode::PositionListener {
478 public:
479 SurfaceViewPositionUpdater(JNIEnv* env, jobject surfaceview) {
480 env->GetJavaVM(&mVm);
481 mWeakRef = env->NewWeakGlobalRef(surfaceview);
482 }
483
484 virtual ~SurfaceViewPositionUpdater() {
485 jnienv()->DeleteWeakGlobalRef(mWeakRef);
486 mWeakRef = nullptr;
487 }
488
489 virtual void onPositionUpdated(RenderNode& node, const TreeInfo& info) override {
490 if (CC_UNLIKELY(!mWeakRef || !info.updateWindowPositions)) return;
John Reckf6481082016-02-02 15:18:23 -0800491
John Reckf6481082016-02-02 15:18:23 -0800492 Matrix4 transform;
493 info.damageAccumulator->computeCurrentTransform(&transform);
494 const RenderProperties& props = node.properties();
495 uirenderer::Rect bounds(props.getWidth(), props.getHeight());
496 transform.mapRect(bounds);
497 bounds.left -= info.windowInsetLeft;
498 bounds.right -= info.windowInsetLeft;
499 bounds.top -= info.windowInsetTop;
500 bounds.bottom -= info.windowInsetTop;
John Reck38f6c032016-03-17 10:23:49 -0700501
502 auto functor = std::bind(
503 std::mem_fn(&SurfaceViewPositionUpdater::doUpdatePosition), this,
504 (jlong) info.frameNumber, (jint) bounds.left, (jint) bounds.top,
505 (jint) bounds.right, (jint) bounds.bottom);
506
507 info.canvasContext.enqueueFrameWork(std::move(functor));
John Reckf6481082016-02-02 15:18:23 -0800508 }
509
510 private:
511 JNIEnv* jnienv() {
512 JNIEnv* env;
513 if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
514 LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", mVm);
515 }
516 return env;
517 }
518
John Reck38f6c032016-03-17 10:23:49 -0700519 void doUpdatePosition(jlong frameNumber, jint left, jint top,
520 jint right, jint bottom) {
521 ATRACE_NAME("Update SurfaceView position");
522
523 JNIEnv* env = jnienv();
524 jobject localref = env->NewLocalRef(mWeakRef);
525 if (CC_UNLIKELY(!localref)) {
526 jnienv()->DeleteWeakGlobalRef(mWeakRef);
527 mWeakRef = nullptr;
528 return;
529 }
530
531 env->CallVoidMethod(localref, gSurfaceViewPositionUpdateMethod,
532 frameNumber, left, top, right, bottom);
533 env->DeleteLocalRef(localref);
534 }
535
John Reckf6481082016-02-02 15:18:23 -0800536 JavaVM* mVm;
537 jobject mWeakRef;
538 };
539
540 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
541 renderNode->setPositionListener(new SurfaceViewPositionUpdater(env, surfaceview));
542}
543
544// ----------------------------------------------------------------------------
Chris Craik54389792013-12-20 13:28:11 -0800545// JNI Glue
546// ----------------------------------------------------------------------------
547
John Reckf666ad72014-03-14 16:24:57 -0700548const char* const kClassPathName = "android/view/RenderNode";
Chris Craik54389792013-12-20 13:28:11 -0800549
Daniel Micay76f6a862015-09-19 17:31:01 -0400550static const JNINativeMethod gMethods[] = {
Chris Craik003cc3d2015-10-16 10:24:55 -0700551 { "nCreate", "(Ljava/lang/String;)J", (void*) android_view_RenderNode_create },
552 { "nDestroyRenderNode", "(J)V", (void*) android_view_RenderNode_destroyRenderNode },
553 { "nSetDisplayList", "(JJ)V", (void*) android_view_RenderNode_setDisplayList },
554 { "nOutput", "(J)V", (void*) android_view_RenderNode_output },
555 { "nGetDebugSize", "(J)I", (void*) android_view_RenderNode_getDebugSize },
Chris Craik54389792013-12-20 13:28:11 -0800556
Chris Craik4136a0a2014-10-07 15:09:46 -0700557 { "nSetLayerType", "!(JI)Z", (void*) android_view_RenderNode_setLayerType },
558 { "nSetLayerPaint", "!(JJ)Z", (void*) android_view_RenderNode_setLayerPaint },
559 { "nSetStaticMatrix", "!(JJ)Z", (void*) android_view_RenderNode_setStaticMatrix },
560 { "nSetAnimationMatrix", "!(JJ)Z", (void*) android_view_RenderNode_setAnimationMatrix },
561 { "nSetClipToBounds", "!(JZ)Z", (void*) android_view_RenderNode_setClipToBounds },
562 { "nSetClipBounds", "!(JIIII)Z", (void*) android_view_RenderNode_setClipBounds },
563 { "nSetClipBoundsEmpty", "!(J)Z", (void*) android_view_RenderNode_setClipBoundsEmpty },
564 { "nSetProjectBackwards", "!(JZ)Z", (void*) android_view_RenderNode_setProjectBackwards },
565 { "nSetProjectionReceiver","!(JZ)Z", (void*) android_view_RenderNode_setProjectionReceiver },
Chris Craikb49f4462014-03-20 12:44:20 -0700566
Chris Craik40de9f22015-07-29 12:51:41 -0700567 { "nSetOutlineRoundRect", "!(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect },
568 { "nSetOutlineConvexPath", "!(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath },
569 { "nSetOutlineEmpty", "!(J)Z", (void*) android_view_RenderNode_setOutlineEmpty },
570 { "nSetOutlineNone", "!(J)Z", (void*) android_view_RenderNode_setOutlineNone },
Chris Craik4136a0a2014-10-07 15:09:46 -0700571 { "nHasShadow", "!(J)Z", (void*) android_view_RenderNode_hasShadow },
572 { "nSetClipToOutline", "!(JZ)Z", (void*) android_view_RenderNode_setClipToOutline },
Chris Craik40de9f22015-07-29 12:51:41 -0700573 { "nSetRevealClip", "!(JZFFF)Z", (void*) android_view_RenderNode_setRevealClip },
Chris Craikb49f4462014-03-20 12:44:20 -0700574
Chris Craik4136a0a2014-10-07 15:09:46 -0700575 { "nSetAlpha", "!(JF)Z", (void*) android_view_RenderNode_setAlpha },
576 { "nSetHasOverlappingRendering", "!(JZ)Z",
John Reckf666ad72014-03-14 16:24:57 -0700577 (void*) android_view_RenderNode_setHasOverlappingRendering },
Chris Craik4136a0a2014-10-07 15:09:46 -0700578 { "nSetElevation", "!(JF)Z", (void*) android_view_RenderNode_setElevation },
579 { "nSetTranslationX", "!(JF)Z", (void*) android_view_RenderNode_setTranslationX },
580 { "nSetTranslationY", "!(JF)Z", (void*) android_view_RenderNode_setTranslationY },
581 { "nSetTranslationZ", "!(JF)Z", (void*) android_view_RenderNode_setTranslationZ },
582 { "nSetRotation", "!(JF)Z", (void*) android_view_RenderNode_setRotation },
583 { "nSetRotationX", "!(JF)Z", (void*) android_view_RenderNode_setRotationX },
584 { "nSetRotationY", "!(JF)Z", (void*) android_view_RenderNode_setRotationY },
585 { "nSetScaleX", "!(JF)Z", (void*) android_view_RenderNode_setScaleX },
586 { "nSetScaleY", "!(JF)Z", (void*) android_view_RenderNode_setScaleY },
587 { "nSetPivotX", "!(JF)Z", (void*) android_view_RenderNode_setPivotX },
588 { "nSetPivotY", "!(JF)Z", (void*) android_view_RenderNode_setPivotY },
589 { "nSetCameraDistance", "!(JF)Z", (void*) android_view_RenderNode_setCameraDistance },
590 { "nSetLeft", "!(JI)Z", (void*) android_view_RenderNode_setLeft },
591 { "nSetTop", "!(JI)Z", (void*) android_view_RenderNode_setTop },
592 { "nSetRight", "!(JI)Z", (void*) android_view_RenderNode_setRight },
593 { "nSetBottom", "!(JI)Z", (void*) android_view_RenderNode_setBottom },
594 { "nSetLeftTopRightBottom","!(JIIII)Z", (void*) android_view_RenderNode_setLeftTopRightBottom },
595 { "nOffsetLeftAndRight", "!(JI)Z", (void*) android_view_RenderNode_offsetLeftAndRight },
596 { "nOffsetTopAndBottom", "!(JI)Z", (void*) android_view_RenderNode_offsetTopAndBottom },
Chris Craik54389792013-12-20 13:28:11 -0800597
Chris Craik4136a0a2014-10-07 15:09:46 -0700598 { "nHasOverlappingRendering", "!(J)Z", (void*) android_view_RenderNode_hasOverlappingRendering },
599 { "nGetClipToOutline", "!(J)Z", (void*) android_view_RenderNode_getClipToOutline },
600 { "nGetAlpha", "!(J)F", (void*) android_view_RenderNode_getAlpha },
601 { "nGetCameraDistance", "!(J)F", (void*) android_view_RenderNode_getCameraDistance },
602 { "nGetScaleX", "!(J)F", (void*) android_view_RenderNode_getScaleX },
603 { "nGetScaleY", "!(J)F", (void*) android_view_RenderNode_getScaleY },
604 { "nGetElevation", "!(J)F", (void*) android_view_RenderNode_getElevation },
605 { "nGetTranslationX", "!(J)F", (void*) android_view_RenderNode_getTranslationX },
606 { "nGetTranslationY", "!(J)F", (void*) android_view_RenderNode_getTranslationY },
607 { "nGetTranslationZ", "!(J)F", (void*) android_view_RenderNode_getTranslationZ },
608 { "nGetRotation", "!(J)F", (void*) android_view_RenderNode_getRotation },
609 { "nGetRotationX", "!(J)F", (void*) android_view_RenderNode_getRotationX },
610 { "nGetRotationY", "!(J)F", (void*) android_view_RenderNode_getRotationY },
611 { "nIsPivotExplicitlySet", "!(J)Z", (void*) android_view_RenderNode_isPivotExplicitlySet },
612 { "nHasIdentityMatrix", "!(J)Z", (void*) android_view_RenderNode_hasIdentityMatrix },
Chris Craik49e6c732014-03-31 12:34:11 -0700613
Chris Craik4136a0a2014-10-07 15:09:46 -0700614 { "nGetTransformMatrix", "!(JJ)V", (void*) android_view_RenderNode_getTransformMatrix },
615 { "nGetInverseTransformMatrix","!(JJ)V", (void*) android_view_RenderNode_getInverseTransformMatrix },
Chris Craik49e6c732014-03-31 12:34:11 -0700616
Chris Craik4136a0a2014-10-07 15:09:46 -0700617 { "nGetPivotX", "!(J)F", (void*) android_view_RenderNode_getPivotX },
618 { "nGetPivotY", "!(J)F", (void*) android_view_RenderNode_getPivotY },
John Recke45b1fd2014-04-15 09:50:16 -0700619
620 { "nAddAnimator", "(JJ)V", (void*) android_view_RenderNode_addAnimator },
John Reck119907c2014-08-14 09:02:01 -0700621 { "nEndAllAnimators", "(J)V", (void*) android_view_RenderNode_endAllAnimators },
John Reckf6481082016-02-02 15:18:23 -0800622
623 { "nRequestPositionUpdates", "(JLandroid/view/SurfaceView;)V", (void*) android_view_RenderNode_requestPositionUpdates },
Chris Craik54389792013-12-20 13:28:11 -0800624};
625
John Reckf666ad72014-03-14 16:24:57 -0700626int register_android_view_RenderNode(JNIEnv* env) {
John Reckf6481082016-02-02 15:18:23 -0800627 jclass clazz = FindClassOrDie(env, "android/view/SurfaceView");
628 gSurfaceViewPositionUpdateMethod = GetMethodIDOrDie(env, clazz,
629 "updateWindowPositionRT", "(JIIII)V");
Andreas Gampe987f79f2014-11-18 17:29:46 -0800630 return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
Chris Craik54389792013-12-20 13:28:11 -0800631}
632
633};
634