blob: 37ea8106ecd6a95cbdf1fd50f209aa251268c704 [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
Chris Craik26bced42016-12-15 16:33:47 -080050static void android_view_RenderNode_output(JNIEnv* env, jobject clazz, jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -070051 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
52 renderNode->output();
53}
54
Chris Craik26bced42016-12-15 16:33:47 -080055static jint android_view_RenderNode_getDebugSize(JNIEnv* env, jobject clazz, jlong renderNodePtr) {
John Reckfe5e7b72014-05-23 17:42:28 -070056 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
57 return renderNode->getDebugSize();
58}
59
John Reck2de950d2017-01-25 10:58:30 -080060static jlong android_view_RenderNode_create(JNIEnv* env, jobject, jstring name) {
John Reck8de65a82014-04-09 15:23:38 -070061 RenderNode* renderNode = new RenderNode();
62 renderNode->incStrong(0);
Chris Craik54389792013-12-20 13:28:11 -080063 if (name != NULL) {
64 const char* textArray = env->GetStringUTFChars(name, NULL);
John Reck8de65a82014-04-09 15:23:38 -070065 renderNode->setName(textArray);
Chris Craik54389792013-12-20 13:28:11 -080066 env->ReleaseStringUTFChars(name, textArray);
67 }
John Reck8de65a82014-04-09 15:23:38 -070068 return reinterpret_cast<jlong>(renderNode);
Chris Craik54389792013-12-20 13:28:11 -080069}
70
John Reck395e9b82016-08-24 13:22:37 -070071static void releaseRenderNode(RenderNode* renderNode) {
John Reck8de65a82014-04-09 15:23:38 -070072 renderNode->decStrong(0);
Chris Craik54389792013-12-20 13:28:11 -080073}
74
John Reck395e9b82016-08-24 13:22:37 -070075static jlong android_view_RenderNode_getNativeFinalizer(JNIEnv* env,
76 jobject clazz) {
77 return static_cast<jlong>(reinterpret_cast<uintptr_t>(&releaseRenderNode));
78}
79
Chris Craik003cc3d2015-10-16 10:24:55 -070080static void android_view_RenderNode_setDisplayList(JNIEnv* env,
81 jobject clazz, jlong renderNodePtr, jlong displayListPtr) {
John Reck8de65a82014-04-09 15:23:38 -070082 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik003cc3d2015-10-16 10:24:55 -070083 DisplayList* newData = reinterpret_cast<DisplayList*>(displayListPtr);
John Reck2de950d2017-01-25 10:58:30 -080084 renderNode->setStagingDisplayList(newData);
85}
86
87static jboolean android_view_RenderNode_isValid(jlong renderNodePtr) {
88 return reinterpret_cast<RenderNode*>(renderNodePtr)->isValid();
Chris Craik54389792013-12-20 13:28:11 -080089}
90
91// ----------------------------------------------------------------------------
Chris Craik49e6c732014-03-31 12:34:11 -070092// RenderProperties - setters
Chris Craik54389792013-12-20 13:28:11 -080093// ----------------------------------------------------------------------------
94
Chris Craikfc294242016-12-13 18:10:46 -080095static jboolean android_view_RenderNode_setLayerType(jlong renderNodePtr, jint jlayerType) {
John Reck25fbb3f2014-06-12 13:46:45 -070096 LayerType layerType = static_cast<LayerType>(jlayerType);
97 return SET_AND_DIRTY(mutateLayerProperties().setType, layerType, RenderNode::GENERIC);
98}
99
Chris Craikfc294242016-12-13 18:10:46 -0800100static jboolean android_view_RenderNode_setLayerPaint(jlong renderNodePtr, jlong paintPtr) {
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400101 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
John Reck25fbb3f2014-06-12 13:46:45 -0700102 return SET_AND_DIRTY(mutateLayerProperties().setFromPaint, paint, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800103}
104
Chris Craikfc294242016-12-13 18:10:46 -0800105static jboolean android_view_RenderNode_setStaticMatrix(jlong renderNodePtr, jlong matrixPtr) {
Chris Craik7a02ea32013-12-27 16:43:22 -0800106 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
John Reck79c7de72014-05-23 10:33:31 -0700107 return SET_AND_DIRTY(setStaticMatrix, matrix, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800108}
109
Chris Craikfc294242016-12-13 18:10:46 -0800110static jboolean android_view_RenderNode_setAnimationMatrix(jlong renderNodePtr, jlong matrixPtr) {
Chris Craik7a02ea32013-12-27 16:43:22 -0800111 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
John Reck79c7de72014-05-23 10:33:31 -0700112 return SET_AND_DIRTY(setAnimationMatrix, matrix, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800113}
114
Chris Craikfc294242016-12-13 18:10:46 -0800115static jboolean android_view_RenderNode_setClipToBounds(jlong renderNodePtr,
116 jboolean clipToBounds) {
John Reck79c7de72014-05-23 10:33:31 -0700117 return SET_AND_DIRTY(setClipToBounds, clipToBounds, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800118}
119
Chris Craikfc294242016-12-13 18:10:46 -0800120static jboolean android_view_RenderNode_setClipBounds(jlong renderNodePtr,
121 jint left, jint top, jint right, jint bottom) {
Chris Craika753f4c2014-07-24 12:39:17 -0700122 android::uirenderer::Rect clipBounds(left, top, right, bottom);
123 return SET_AND_DIRTY(setClipBounds, clipBounds, RenderNode::GENERIC);
124}
125
Chris Craikfc294242016-12-13 18:10:46 -0800126static jboolean android_view_RenderNode_setClipBoundsEmpty(jlong renderNodePtr) {
Chris Craika753f4c2014-07-24 12:39:17 -0700127 return SET_AND_DIRTY(setClipBoundsEmpty,, RenderNode::GENERIC);
128}
129
Chris Craikfc294242016-12-13 18:10:46 -0800130static jboolean android_view_RenderNode_setProjectBackwards(jlong renderNodePtr,
131 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
Chris Craikfc294242016-12-13 18:10:46 -0800135static jboolean android_view_RenderNode_setProjectionReceiver(jlong renderNodePtr,
136 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
Chris Craikfc294242016-12-13 18:10:46 -0800140static jboolean android_view_RenderNode_setOutlineRoundRect(jlong renderNodePtr,
141 jint left, jint top, jint right, jint bottom, jfloat radius, jfloat alpha) {
John Reck8de65a82014-04-09 15:23:38 -0700142 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik77b5cad2014-07-30 18:23:07 -0700143 renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom,
144 radius, alpha);
John Reckff941dc2014-05-14 16:34:14 -0700145 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700146 return true;
Chris Craikb49f4462014-03-20 12:44:20 -0700147}
Chris Craik8c271ca2014-03-25 10:33:01 -0700148
Chris Craikfc294242016-12-13 18:10:46 -0800149static jboolean android_view_RenderNode_setOutlineConvexPath(jlong renderNodePtr,
150 jlong outlinePathPtr, jfloat alpha) {
John Reck8de65a82014-04-09 15:23:38 -0700151 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craikb49f4462014-03-20 12:44:20 -0700152 SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr);
Chris Craik77b5cad2014-07-30 18:23:07 -0700153 renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath, alpha);
John Reckff941dc2014-05-14 16:34:14 -0700154 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700155 return true;
Chris Craikb49f4462014-03-20 12:44:20 -0700156}
Chris Craik8c271ca2014-03-25 10:33:01 -0700157
Chris Craikfc294242016-12-13 18:10:46 -0800158static jboolean android_view_RenderNode_setOutlineEmpty(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700159 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
160 renderNode->mutateStagingProperties().mutableOutline().setEmpty();
John Reckff941dc2014-05-14 16:34:14 -0700161 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700162 return true;
Chris Craika2fe7af2014-01-28 17:25:06 -0800163}
164
Chris Craikfc294242016-12-13 18:10:46 -0800165static jboolean android_view_RenderNode_setOutlineNone(jlong renderNodePtr) {
Chris Craik06451282014-07-21 10:25:54 -0700166 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
167 renderNode->mutateStagingProperties().mutableOutline().setNone();
168 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
169 return true;
170}
171
Chris Craikfc294242016-12-13 18:10:46 -0800172static jboolean android_view_RenderNode_hasShadow(jlong renderNodePtr) {
Chris Craik5c75c522014-09-05 14:08:08 -0700173 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
174 return renderNode->stagingProperties().hasShadow();
175}
176
John Reckd8be4a02017-11-17 15:06:24 -0800177static jboolean android_view_RenderNode_setSpotShadowColor(jlong renderNodePtr, jint shadowColor) {
178 return SET_AND_DIRTY(setSpotShadowColor,
179 static_cast<SkColor>(shadowColor), RenderNode::GENERIC);
180}
181
182static jint android_view_RenderNode_getSpotShadowColor(jlong renderNodePtr) {
183 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
184 return renderNode->stagingProperties().getSpotShadowColor();
185}
186
187static jboolean android_view_RenderNode_setAmbientShadowColor(jlong renderNodePtr,
188 jint shadowColor) {
189 return SET_AND_DIRTY(setAmbientShadowColor,
190 static_cast<SkColor>(shadowColor), RenderNode::GENERIC);
191}
192
193static jint android_view_RenderNode_getAmbientShadowColor(jlong renderNodePtr) {
194 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
195 return renderNode->stagingProperties().getAmbientShadowColor();
John Reck3c0369b2017-11-13 16:47:35 -0800196}
197
Chris Craikfc294242016-12-13 18:10:46 -0800198static jboolean android_view_RenderNode_setClipToOutline(jlong renderNodePtr,
199 jboolean clipToOutline) {
John Reck8de65a82014-04-09 15:23:38 -0700200 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
201 renderNode->mutateStagingProperties().mutableOutline().setShouldClip(clipToOutline);
John Reckff941dc2014-05-14 16:34:14 -0700202 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700203 return true;
Chris Craik8c271ca2014-03-25 10:33:01 -0700204}
205
Chris Craikfc294242016-12-13 18:10:46 -0800206static jboolean android_view_RenderNode_setRevealClip(jlong renderNodePtr, jboolean shouldClip,
Chris Craik8c271ca2014-03-25 10:33:01 -0700207 jfloat x, jfloat y, jfloat radius) {
John Reck8de65a82014-04-09 15:23:38 -0700208 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
209 renderNode->mutateStagingProperties().mutableRevealClip().set(
Chris Craikaf4d04c2014-07-29 12:50:14 -0700210 shouldClip, x, y, radius);
John Reckff941dc2014-05-14 16:34:14 -0700211 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700212 return true;
ztenghuifad45932014-02-06 10:33:58 -0800213}
214
Chris Craikfc294242016-12-13 18:10:46 -0800215static jboolean android_view_RenderNode_setAlpha(jlong renderNodePtr, float alpha) {
John Reck79c7de72014-05-23 10:33:31 -0700216 return SET_AND_DIRTY(setAlpha, alpha, RenderNode::ALPHA);
Chris Craik54389792013-12-20 13:28:11 -0800217}
218
Chris Craikfc294242016-12-13 18:10:46 -0800219static jboolean android_view_RenderNode_setHasOverlappingRendering(jlong renderNodePtr,
220 bool hasOverlappingRendering) {
John Reck79c7de72014-05-23 10:33:31 -0700221 return SET_AND_DIRTY(setHasOverlappingRendering, hasOverlappingRendering,
222 RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800223}
224
Chris Craikfc294242016-12-13 18:10:46 -0800225static jboolean android_view_RenderNode_setElevation(jlong renderNodePtr, float elevation) {
John Reck79c7de72014-05-23 10:33:31 -0700226 return SET_AND_DIRTY(setElevation, elevation, RenderNode::Z);
Chris Craikcc39e162014-04-25 18:34:11 -0700227}
228
Chris Craikfc294242016-12-13 18:10:46 -0800229static jboolean android_view_RenderNode_setTranslationX(jlong renderNodePtr, float tx) {
John Reck79c7de72014-05-23 10:33:31 -0700230 return SET_AND_DIRTY(setTranslationX, tx, RenderNode::TRANSLATION_X | RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800231}
232
Chris Craikfc294242016-12-13 18:10:46 -0800233static jboolean android_view_RenderNode_setTranslationY(jlong renderNodePtr, float ty) {
John Reck79c7de72014-05-23 10:33:31 -0700234 return SET_AND_DIRTY(setTranslationY, ty, RenderNode::TRANSLATION_Y | RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800235}
236
Chris Craikfc294242016-12-13 18:10:46 -0800237static jboolean android_view_RenderNode_setTranslationZ(jlong renderNodePtr, float tz) {
John Reck79c7de72014-05-23 10:33:31 -0700238 return SET_AND_DIRTY(setTranslationZ, tz, RenderNode::TRANSLATION_Z | RenderNode::Z);
Chris Craik54389792013-12-20 13:28:11 -0800239}
240
Chris Craikfc294242016-12-13 18:10:46 -0800241static jboolean android_view_RenderNode_setRotation(jlong renderNodePtr, float rotation) {
John Reck79c7de72014-05-23 10:33:31 -0700242 return SET_AND_DIRTY(setRotation, rotation, RenderNode::ROTATION);
Chris Craik54389792013-12-20 13:28:11 -0800243}
244
Chris Craikfc294242016-12-13 18:10:46 -0800245static jboolean android_view_RenderNode_setRotationX(jlong renderNodePtr, float rx) {
John Reck79c7de72014-05-23 10:33:31 -0700246 return SET_AND_DIRTY(setRotationX, rx, RenderNode::ROTATION_X);
Chris Craik54389792013-12-20 13:28:11 -0800247}
248
Chris Craikfc294242016-12-13 18:10:46 -0800249static jboolean android_view_RenderNode_setRotationY(jlong renderNodePtr, float ry) {
John Reck79c7de72014-05-23 10:33:31 -0700250 return SET_AND_DIRTY(setRotationY, ry, RenderNode::ROTATION_Y);
Chris Craik54389792013-12-20 13:28:11 -0800251}
252
Chris Craikfc294242016-12-13 18:10:46 -0800253static jboolean android_view_RenderNode_setScaleX(jlong renderNodePtr, float sx) {
John Reck79c7de72014-05-23 10:33:31 -0700254 return SET_AND_DIRTY(setScaleX, sx, RenderNode::SCALE_X);
Chris Craik54389792013-12-20 13:28:11 -0800255}
256
Chris Craikfc294242016-12-13 18:10:46 -0800257static jboolean android_view_RenderNode_setScaleY(jlong renderNodePtr, float sy) {
John Reck79c7de72014-05-23 10:33:31 -0700258 return SET_AND_DIRTY(setScaleY, sy, RenderNode::SCALE_Y);
Chris Craik54389792013-12-20 13:28:11 -0800259}
260
Chris Craikfc294242016-12-13 18:10:46 -0800261static jboolean android_view_RenderNode_setPivotX(jlong renderNodePtr, float px) {
John Reck79c7de72014-05-23 10:33:31 -0700262 return SET_AND_DIRTY(setPivotX, px, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800263}
264
Chris Craikfc294242016-12-13 18:10:46 -0800265static jboolean android_view_RenderNode_setPivotY(jlong renderNodePtr, float py) {
John Reck79c7de72014-05-23 10:33:31 -0700266 return SET_AND_DIRTY(setPivotY, py, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800267}
268
John Reck8686e1f2018-03-21 16:31:21 -0700269static jboolean android_view_RenderNode_resetPivot(jlong renderNodePtr) {
270 return SET_AND_DIRTY(resetPivot, /* void */, RenderNode::GENERIC);
271}
272
Chris Craikfc294242016-12-13 18:10:46 -0800273static jboolean android_view_RenderNode_setCameraDistance(jlong renderNodePtr, float distance) {
John Reck79c7de72014-05-23 10:33:31 -0700274 return SET_AND_DIRTY(setCameraDistance, distance, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800275}
276
Chris Craikfc294242016-12-13 18:10:46 -0800277static jboolean android_view_RenderNode_setLeft(jlong renderNodePtr, int left) {
John Reck79c7de72014-05-23 10:33:31 -0700278 return SET_AND_DIRTY(setLeft, left, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800279}
280
Chris Craikfc294242016-12-13 18:10:46 -0800281static jboolean android_view_RenderNode_setTop(jlong renderNodePtr, int top) {
John Reck79c7de72014-05-23 10:33:31 -0700282 return SET_AND_DIRTY(setTop, top, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800283}
284
Chris Craikfc294242016-12-13 18:10:46 -0800285static jboolean android_view_RenderNode_setRight(jlong renderNodePtr, int right) {
John Reck79c7de72014-05-23 10:33:31 -0700286 return SET_AND_DIRTY(setRight, right, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800287}
288
Chris Craikfc294242016-12-13 18:10:46 -0800289static jboolean android_view_RenderNode_setBottom(jlong renderNodePtr, int bottom) {
John Reck79c7de72014-05-23 10:33:31 -0700290 return SET_AND_DIRTY(setBottom, bottom, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800291}
292
Chris Craikfc294242016-12-13 18:10:46 -0800293static jboolean android_view_RenderNode_setLeftTopRightBottom(jlong renderNodePtr,
294 int left, int top, int right, int bottom) {
John Reck8de65a82014-04-09 15:23:38 -0700295 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reck79c7de72014-05-23 10:33:31 -0700296 if (renderNode->mutateStagingProperties().setLeftTopRightBottom(left, top, right, bottom)) {
297 renderNode->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
298 return true;
299 }
300 return false;
Chris Craik54389792013-12-20 13:28:11 -0800301}
302
Chris Craikfc294242016-12-13 18:10:46 -0800303static jboolean android_view_RenderNode_offsetLeftAndRight(jlong renderNodePtr, jint offset) {
John Reck79c7de72014-05-23 10:33:31 -0700304 return SET_AND_DIRTY(offsetLeftRight, offset, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800305}
306
Chris Craikfc294242016-12-13 18:10:46 -0800307static jboolean android_view_RenderNode_offsetTopAndBottom(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
Chris Craikfc294242016-12-13 18:10:46 -0800315static jboolean android_view_RenderNode_hasOverlappingRendering(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700316 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
317 return renderNode->stagingProperties().hasOverlappingRendering();
Chris Craik54389792013-12-20 13:28:11 -0800318}
319
Chris Craikfc294242016-12-13 18:10:46 -0800320static jboolean android_view_RenderNode_getClipToOutline(jlong renderNodePtr) {
Chris Craikdeeda3d2014-05-05 19:09:33 -0700321 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
322 return renderNode->stagingProperties().getOutline().getShouldClip();
323}
324
Chris Craikfc294242016-12-13 18:10:46 -0800325static jfloat android_view_RenderNode_getAlpha(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700326 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
327 return renderNode->stagingProperties().getAlpha();
Chris Craik54389792013-12-20 13:28:11 -0800328}
329
Chris Craikfc294242016-12-13 18:10:46 -0800330static jfloat android_view_RenderNode_getCameraDistance(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700331 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
332 return renderNode->stagingProperties().getCameraDistance();
Chris Craik54389792013-12-20 13:28:11 -0800333}
334
Chris Craikfc294242016-12-13 18:10:46 -0800335static jfloat android_view_RenderNode_getScaleX(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700336 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
337 return renderNode->stagingProperties().getScaleX();
Chris Craik54389792013-12-20 13:28:11 -0800338}
339
Chris Craikfc294242016-12-13 18:10:46 -0800340static jfloat android_view_RenderNode_getScaleY(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700341 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
342 return renderNode->stagingProperties().getScaleY();
Chris Craik54389792013-12-20 13:28:11 -0800343}
344
Chris Craikfc294242016-12-13 18:10:46 -0800345static jfloat android_view_RenderNode_getElevation(jlong renderNodePtr) {
Chris Craikcc39e162014-04-25 18:34:11 -0700346 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
347 return renderNode->stagingProperties().getElevation();
348}
349
Chris Craikfc294242016-12-13 18:10:46 -0800350static jfloat android_view_RenderNode_getTranslationX(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700351 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
352 return renderNode->stagingProperties().getTranslationX();
Chris Craik54389792013-12-20 13:28:11 -0800353}
354
Chris Craikfc294242016-12-13 18:10:46 -0800355static jfloat android_view_RenderNode_getTranslationY(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700356 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
357 return renderNode->stagingProperties().getTranslationY();
Chris Craik54389792013-12-20 13:28:11 -0800358}
359
Chris Craikfc294242016-12-13 18:10:46 -0800360static jfloat android_view_RenderNode_getTranslationZ(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700361 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
362 return renderNode->stagingProperties().getTranslationZ();
Chris Craik49e6c732014-03-31 12:34:11 -0700363}
364
Chris Craikfc294242016-12-13 18:10:46 -0800365static jfloat android_view_RenderNode_getRotation(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700366 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
367 return renderNode->stagingProperties().getRotation();
Chris Craik54389792013-12-20 13:28:11 -0800368}
369
Chris Craikfc294242016-12-13 18:10:46 -0800370static jfloat android_view_RenderNode_getRotationX(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700371 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
372 return renderNode->stagingProperties().getRotationX();
Chris Craik54389792013-12-20 13:28:11 -0800373}
374
Chris Craikfc294242016-12-13 18:10:46 -0800375static jfloat android_view_RenderNode_getRotationY(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700376 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
377 return renderNode->stagingProperties().getRotationY();
Chris Craik54389792013-12-20 13:28:11 -0800378}
379
Chris Craikfc294242016-12-13 18:10:46 -0800380static jboolean android_view_RenderNode_isPivotExplicitlySet(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700381 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
382 return renderNode->stagingProperties().isPivotExplicitlySet();
Chris Craik49e6c732014-03-31 12:34:11 -0700383}
384
Chris Craikfc294242016-12-13 18:10:46 -0800385static jboolean android_view_RenderNode_hasIdentityMatrix(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700386 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reckf7483e32014-04-11 08:54:47 -0700387 renderNode->mutateStagingProperties().updateMatrix();
388 return !renderNode->stagingProperties().hasTransformMatrix();
Chris Craik49e6c732014-03-31 12:34:11 -0700389}
390
391// ----------------------------------------------------------------------------
392// RenderProperties - computed getters
393// ----------------------------------------------------------------------------
394
Chris Craikfc294242016-12-13 18:10:46 -0800395static void android_view_RenderNode_getTransformMatrix(jlong renderNodePtr, jlong outMatrixPtr) {
John Reck8de65a82014-04-09 15:23:38 -0700396 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik49e6c732014-03-31 12:34:11 -0700397 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
398
John Reck8de65a82014-04-09 15:23:38 -0700399 renderNode->mutateStagingProperties().updateMatrix();
400 const SkMatrix* transformMatrix = renderNode->stagingProperties().getTransformMatrix();
Chris Craik49e6c732014-03-31 12:34:11 -0700401
John Reckf7483e32014-04-11 08:54:47 -0700402 if (transformMatrix) {
Chris Craik49e6c732014-03-31 12:34:11 -0700403 *outMatrix = *transformMatrix;
404 } else {
405 outMatrix->setIdentity();
406 }
407}
408
Chris Craikfc294242016-12-13 18:10:46 -0800409static void android_view_RenderNode_getInverseTransformMatrix(jlong renderNodePtr,
410 jlong outMatrixPtr) {
Chris Craik49e6c732014-03-31 12:34:11 -0700411 // load transform matrix
Chris Craikfc294242016-12-13 18:10:46 -0800412 android_view_RenderNode_getTransformMatrix(renderNodePtr, outMatrixPtr);
Chris Craik49e6c732014-03-31 12:34:11 -0700413 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
414
415 // return it inverted
416 if (!outMatrix->invert(outMatrix)) {
417 // failed to load inverse, pass back identity
418 outMatrix->setIdentity();
419 }
420}
421
Chris Craikfc294242016-12-13 18:10:46 -0800422static jfloat android_view_RenderNode_getPivotX(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700423 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
424 renderNode->mutateStagingProperties().updateMatrix();
425 return renderNode->stagingProperties().getPivotX();
Chris Craik54389792013-12-20 13:28:11 -0800426}
427
Chris Craikfc294242016-12-13 18:10:46 -0800428static jfloat android_view_RenderNode_getPivotY(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700429 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
430 renderNode->mutateStagingProperties().updateMatrix();
431 return renderNode->stagingProperties().getPivotY();
Chris Craik54389792013-12-20 13:28:11 -0800432}
433
John Recke45b1fd2014-04-15 09:50:16 -0700434// ----------------------------------------------------------------------------
435// RenderProperties - Animations
436// ----------------------------------------------------------------------------
437
Chris Craik26bced42016-12-15 16:33:47 -0800438static void android_view_RenderNode_addAnimator(JNIEnv* env, jobject clazz, jlong renderNodePtr,
439 jlong animatorPtr) {
John Recke45b1fd2014-04-15 09:50:16 -0700440 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
441 RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr);
442 renderNode->addAnimator(animator);
443}
444
Chris Craik26bced42016-12-15 16:33:47 -0800445static void android_view_RenderNode_endAllAnimators(JNIEnv* env, jobject clazz,
446 jlong renderNodePtr) {
John Reck119907c2014-08-14 09:02:01 -0700447 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Recke2478d42014-09-03 16:46:05 -0700448 renderNode->animators().endAllStagingAnimators();
John Reck119907c2014-08-14 09:02:01 -0700449}
450
Chris Craik54389792013-12-20 13:28:11 -0800451// ----------------------------------------------------------------------------
John Reckf6481082016-02-02 15:18:23 -0800452// SurfaceView position callback
453// ----------------------------------------------------------------------------
454
455jmethodID gSurfaceViewPositionUpdateMethod;
John Reckaa6e84f2016-06-16 15:36:13 -0700456jmethodID gSurfaceViewPositionLostMethod;
John Reckf6481082016-02-02 15:18:23 -0800457
458static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject,
459 jlong renderNodePtr, jobject surfaceview) {
460 class SurfaceViewPositionUpdater : public RenderNode::PositionListener {
461 public:
462 SurfaceViewPositionUpdater(JNIEnv* env, jobject surfaceview) {
463 env->GetJavaVM(&mVm);
464 mWeakRef = env->NewWeakGlobalRef(surfaceview);
465 }
466
467 virtual ~SurfaceViewPositionUpdater() {
468 jnienv()->DeleteWeakGlobalRef(mWeakRef);
469 mWeakRef = nullptr;
470 }
471
472 virtual void onPositionUpdated(RenderNode& node, const TreeInfo& info) override {
473 if (CC_UNLIKELY(!mWeakRef || !info.updateWindowPositions)) return;
John Reckf6481082016-02-02 15:18:23 -0800474
John Reckf6481082016-02-02 15:18:23 -0800475 Matrix4 transform;
476 info.damageAccumulator->computeCurrentTransform(&transform);
477 const RenderProperties& props = node.properties();
478 uirenderer::Rect bounds(props.getWidth(), props.getHeight());
479 transform.mapRect(bounds);
John Reck38f6c032016-03-17 10:23:49 -0700480
Chris Craik0e974e742016-04-22 15:44:14 -0700481 if (CC_LIKELY(transform.isPureTranslate())) {
482 // snap/round the computed bounds, so they match the rounding behavior
483 // of the clear done in SurfaceView#draw().
484 bounds.snapToPixelBoundaries();
485 } else {
486 // Conservatively round out so the punched hole (in the ZOrderOnTop = true case)
487 // doesn't extend beyond the other window
488 bounds.roundOut();
489 }
490
John Reck7b570de2016-06-27 13:27:23 -0700491 incStrong(0);
John Reck38f6c032016-03-17 10:23:49 -0700492 auto functor = std::bind(
John Reck7b570de2016-06-27 13:27:23 -0700493 std::mem_fn(&SurfaceViewPositionUpdater::doUpdatePositionAsync), this,
John Reck28912a52016-04-18 14:34:18 -0700494 (jlong) info.canvasContext.getFrameNumber(),
495 (jint) bounds.left, (jint) bounds.top,
John Reck38f6c032016-03-17 10:23:49 -0700496 (jint) bounds.right, (jint) bounds.bottom);
497
498 info.canvasContext.enqueueFrameWork(std::move(functor));
John Reckf6481082016-02-02 15:18:23 -0800499 }
500
John Reckaa6e84f2016-06-16 15:36:13 -0700501 virtual void onPositionLost(RenderNode& node, const TreeInfo* info) override {
502 if (CC_UNLIKELY(!mWeakRef || (info && !info->updateWindowPositions))) return;
503
John Reck7b570de2016-06-27 13:27:23 -0700504 ATRACE_NAME("SurfaceView position lost");
505 JNIEnv* env = jnienv();
506 jobject localref = env->NewLocalRef(mWeakRef);
507 if (CC_UNLIKELY(!localref)) {
508 jnienv()->DeleteWeakGlobalRef(mWeakRef);
509 mWeakRef = nullptr;
510 return;
John Reckaa6e84f2016-06-16 15:36:13 -0700511 }
John Reck7b570de2016-06-27 13:27:23 -0700512
513 env->CallVoidMethod(localref, gSurfaceViewPositionLostMethod,
514 info ? info->canvasContext.getFrameNumber() : 0);
515 env->DeleteLocalRef(localref);
John Reckaa6e84f2016-06-16 15:36:13 -0700516 }
517
John Reckf6481082016-02-02 15:18:23 -0800518 private:
519 JNIEnv* jnienv() {
520 JNIEnv* env;
521 if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
522 LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", mVm);
523 }
524 return env;
525 }
526
John Reck7b570de2016-06-27 13:27:23 -0700527 void doUpdatePositionAsync(jlong frameNumber, jint left, jint top,
John Reck38f6c032016-03-17 10:23:49 -0700528 jint right, jint bottom) {
529 ATRACE_NAME("Update SurfaceView position");
530
531 JNIEnv* env = jnienv();
532 jobject localref = env->NewLocalRef(mWeakRef);
533 if (CC_UNLIKELY(!localref)) {
John Reck7b570de2016-06-27 13:27:23 -0700534 env->DeleteWeakGlobalRef(mWeakRef);
John Reck38f6c032016-03-17 10:23:49 -0700535 mWeakRef = nullptr;
John Reck7b570de2016-06-27 13:27:23 -0700536 } else {
537 env->CallVoidMethod(localref, gSurfaceViewPositionUpdateMethod,
538 frameNumber, left, top, right, bottom);
539 env->DeleteLocalRef(localref);
John Reck38f6c032016-03-17 10:23:49 -0700540 }
541
John Reck7b570de2016-06-27 13:27:23 -0700542 // We need to release ourselves here
543 decStrong(0);
John Reckaa6e84f2016-06-16 15:36:13 -0700544 }
545
John Reckf6481082016-02-02 15:18:23 -0800546 JavaVM* mVm;
547 jobject mWeakRef;
548 };
549
550 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
551 renderNode->setPositionListener(new SurfaceViewPositionUpdater(env, surfaceview));
552}
553
554// ----------------------------------------------------------------------------
Chris Craik54389792013-12-20 13:28:11 -0800555// JNI Glue
556// ----------------------------------------------------------------------------
557
John Reckf666ad72014-03-14 16:24:57 -0700558const char* const kClassPathName = "android/view/RenderNode";
Chris Craik54389792013-12-20 13:28:11 -0800559
Daniel Micay76f6a862015-09-19 17:31:01 -0400560static const JNINativeMethod gMethods[] = {
John Reck395e9b82016-08-24 13:22:37 -0700561// ----------------------------------------------------------------------------
562// Regular JNI
563// ----------------------------------------------------------------------------
Chris Craik003cc3d2015-10-16 10:24:55 -0700564 { "nCreate", "(Ljava/lang/String;)J", (void*) android_view_RenderNode_create },
John Reck395e9b82016-08-24 13:22:37 -0700565 { "nGetNativeFinalizer", "()J", (void*) android_view_RenderNode_getNativeFinalizer },
Chris Craik003cc3d2015-10-16 10:24:55 -0700566 { "nOutput", "(J)V", (void*) android_view_RenderNode_output },
567 { "nGetDebugSize", "(J)I", (void*) android_view_RenderNode_getDebugSize },
John Recke45b1fd2014-04-15 09:50:16 -0700568 { "nAddAnimator", "(JJ)V", (void*) android_view_RenderNode_addAnimator },
John Reck119907c2014-08-14 09:02:01 -0700569 { "nEndAllAnimators", "(J)V", (void*) android_view_RenderNode_endAllAnimators },
John Reckf6481082016-02-02 15:18:23 -0800570 { "nRequestPositionUpdates", "(JLandroid/view/SurfaceView;)V", (void*) android_view_RenderNode_requestPositionUpdates },
Chris Craikfc294242016-12-13 18:10:46 -0800571 { "nSetDisplayList", "(JJ)V", (void*) android_view_RenderNode_setDisplayList },
572
John Reck395e9b82016-08-24 13:22:37 -0700573
574// ----------------------------------------------------------------------------
Chris Craikfc294242016-12-13 18:10:46 -0800575// Fast JNI via @CriticalNative annotation in RenderNode.java
576// ----------------------------------------------------------------------------
577 { "nSetDisplayList", "(JJ)V", (void*) android_view_RenderNode_setDisplayList },
578
579
580// ----------------------------------------------------------------------------
581// Critical JNI via @CriticalNative annotation in RenderNode.java
John Reck395e9b82016-08-24 13:22:37 -0700582// ----------------------------------------------------------------------------
John Reck2de950d2017-01-25 10:58:30 -0800583 { "nIsValid", "(J)Z", (void*) android_view_RenderNode_isValid },
John Reck395e9b82016-08-24 13:22:37 -0700584 { "nSetLayerType", "(JI)Z", (void*) android_view_RenderNode_setLayerType },
585 { "nSetLayerPaint", "(JJ)Z", (void*) android_view_RenderNode_setLayerPaint },
586 { "nSetStaticMatrix", "(JJ)Z", (void*) android_view_RenderNode_setStaticMatrix },
587 { "nSetAnimationMatrix", "(JJ)Z", (void*) android_view_RenderNode_setAnimationMatrix },
588 { "nSetClipToBounds", "(JZ)Z", (void*) android_view_RenderNode_setClipToBounds },
589 { "nSetClipBounds", "(JIIII)Z", (void*) android_view_RenderNode_setClipBounds },
590 { "nSetClipBoundsEmpty", "(J)Z", (void*) android_view_RenderNode_setClipBoundsEmpty },
591 { "nSetProjectBackwards", "(JZ)Z", (void*) android_view_RenderNode_setProjectBackwards },
592 { "nSetProjectionReceiver","(JZ)Z", (void*) android_view_RenderNode_setProjectionReceiver },
593
594 { "nSetOutlineRoundRect", "(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect },
595 { "nSetOutlineConvexPath", "(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath },
596 { "nSetOutlineEmpty", "(J)Z", (void*) android_view_RenderNode_setOutlineEmpty },
597 { "nSetOutlineNone", "(J)Z", (void*) android_view_RenderNode_setOutlineNone },
598 { "nHasShadow", "(J)Z", (void*) android_view_RenderNode_hasShadow },
John Reckd8be4a02017-11-17 15:06:24 -0800599 { "nSetSpotShadowColor", "(JI)Z", (void*) android_view_RenderNode_setSpotShadowColor },
600 { "nGetSpotShadowColor", "(J)I", (void*) android_view_RenderNode_getSpotShadowColor },
601 { "nSetAmbientShadowColor","(JI)Z", (void*) android_view_RenderNode_setAmbientShadowColor },
602 { "nGetAmbientShadowColor","(J)I", (void*) android_view_RenderNode_getAmbientShadowColor },
John Reck395e9b82016-08-24 13:22:37 -0700603 { "nSetClipToOutline", "(JZ)Z", (void*) android_view_RenderNode_setClipToOutline },
604 { "nSetRevealClip", "(JZFFF)Z", (void*) android_view_RenderNode_setRevealClip },
605
606 { "nSetAlpha", "(JF)Z", (void*) android_view_RenderNode_setAlpha },
607 { "nSetHasOverlappingRendering", "(JZ)Z",
608 (void*) android_view_RenderNode_setHasOverlappingRendering },
609 { "nSetElevation", "(JF)Z", (void*) android_view_RenderNode_setElevation },
610 { "nSetTranslationX", "(JF)Z", (void*) android_view_RenderNode_setTranslationX },
611 { "nSetTranslationY", "(JF)Z", (void*) android_view_RenderNode_setTranslationY },
612 { "nSetTranslationZ", "(JF)Z", (void*) android_view_RenderNode_setTranslationZ },
613 { "nSetRotation", "(JF)Z", (void*) android_view_RenderNode_setRotation },
614 { "nSetRotationX", "(JF)Z", (void*) android_view_RenderNode_setRotationX },
615 { "nSetRotationY", "(JF)Z", (void*) android_view_RenderNode_setRotationY },
616 { "nSetScaleX", "(JF)Z", (void*) android_view_RenderNode_setScaleX },
617 { "nSetScaleY", "(JF)Z", (void*) android_view_RenderNode_setScaleY },
618 { "nSetPivotX", "(JF)Z", (void*) android_view_RenderNode_setPivotX },
619 { "nSetPivotY", "(JF)Z", (void*) android_view_RenderNode_setPivotY },
John Reck8686e1f2018-03-21 16:31:21 -0700620 { "nResetPivot", "(J)Z", (void*) android_view_RenderNode_resetPivot },
John Reck395e9b82016-08-24 13:22:37 -0700621 { "nSetCameraDistance", "(JF)Z", (void*) android_view_RenderNode_setCameraDistance },
622 { "nSetLeft", "(JI)Z", (void*) android_view_RenderNode_setLeft },
623 { "nSetTop", "(JI)Z", (void*) android_view_RenderNode_setTop },
624 { "nSetRight", "(JI)Z", (void*) android_view_RenderNode_setRight },
625 { "nSetBottom", "(JI)Z", (void*) android_view_RenderNode_setBottom },
626 { "nSetLeftTopRightBottom","(JIIII)Z", (void*) android_view_RenderNode_setLeftTopRightBottom },
627 { "nOffsetLeftAndRight", "(JI)Z", (void*) android_view_RenderNode_offsetLeftAndRight },
628 { "nOffsetTopAndBottom", "(JI)Z", (void*) android_view_RenderNode_offsetTopAndBottom },
629
630 { "nHasOverlappingRendering", "(J)Z", (void*) android_view_RenderNode_hasOverlappingRendering },
631 { "nGetClipToOutline", "(J)Z", (void*) android_view_RenderNode_getClipToOutline },
632 { "nGetAlpha", "(J)F", (void*) android_view_RenderNode_getAlpha },
633 { "nGetCameraDistance", "(J)F", (void*) android_view_RenderNode_getCameraDistance },
634 { "nGetScaleX", "(J)F", (void*) android_view_RenderNode_getScaleX },
635 { "nGetScaleY", "(J)F", (void*) android_view_RenderNode_getScaleY },
636 { "nGetElevation", "(J)F", (void*) android_view_RenderNode_getElevation },
637 { "nGetTranslationX", "(J)F", (void*) android_view_RenderNode_getTranslationX },
638 { "nGetTranslationY", "(J)F", (void*) android_view_RenderNode_getTranslationY },
639 { "nGetTranslationZ", "(J)F", (void*) android_view_RenderNode_getTranslationZ },
640 { "nGetRotation", "(J)F", (void*) android_view_RenderNode_getRotation },
641 { "nGetRotationX", "(J)F", (void*) android_view_RenderNode_getRotationX },
642 { "nGetRotationY", "(J)F", (void*) android_view_RenderNode_getRotationY },
643 { "nIsPivotExplicitlySet", "(J)Z", (void*) android_view_RenderNode_isPivotExplicitlySet },
644 { "nHasIdentityMatrix", "(J)Z", (void*) android_view_RenderNode_hasIdentityMatrix },
645
646 { "nGetTransformMatrix", "(JJ)V", (void*) android_view_RenderNode_getTransformMatrix },
647 { "nGetInverseTransformMatrix","(JJ)V", (void*) android_view_RenderNode_getInverseTransformMatrix },
648
649 { "nGetPivotX", "(J)F", (void*) android_view_RenderNode_getPivotX },
650 { "nGetPivotY", "(J)F", (void*) android_view_RenderNode_getPivotY },
Chris Craik54389792013-12-20 13:28:11 -0800651};
652
John Reckf666ad72014-03-14 16:24:57 -0700653int register_android_view_RenderNode(JNIEnv* env) {
John Reckf6481082016-02-02 15:18:23 -0800654 jclass clazz = FindClassOrDie(env, "android/view/SurfaceView");
655 gSurfaceViewPositionUpdateMethod = GetMethodIDOrDie(env, clazz,
Robert Carrd5c7dd62017-03-08 10:39:30 -0800656 "updateSurfacePosition_renderWorker", "(JIIII)V");
John Reckaa6e84f2016-06-16 15:36:13 -0700657 gSurfaceViewPositionLostMethod = GetMethodIDOrDie(env, clazz,
Robert Carrd5c7dd62017-03-08 10:39:30 -0800658 "surfacePositionLost_uiRtSync", "(J)V");
Andreas Gampe987f79f2014-11-18 17:29:46 -0800659 return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
Chris Craik54389792013-12-20 13:28:11 -0800660}
661
662};
663