blob: c4c16ee0ef9b1563c2912922602f0e72a126e0a0 [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>
John Reck322b8ab2019-03-14 13:15:28 -070034#include <utils/TraceUtils.h>
Chris Craik54389792013-12-20 13:28:11 -080035
Andreas Gampe987f79f2014-11-18 17:29:46 -080036#include "core_jni_helpers.h"
37
Chris Craik54389792013-12-20 13:28:11 -080038namespace android {
39
40using namespace uirenderer;
41
John Reck79c7de72014-05-23 10:33:31 -070042#define SET_AND_DIRTY(prop, val, dirtyFlag) \
43 (reinterpret_cast<RenderNode*>(renderNodePtr)->mutateStagingProperties().prop(val) \
44 ? (reinterpret_cast<RenderNode*>(renderNodePtr)->setPropertyFieldsDirty(dirtyFlag), true) \
45 : false)
46
Chris Craik54389792013-12-20 13:28:11 -080047// ----------------------------------------------------------------------------
48// DisplayList view properties
49// ----------------------------------------------------------------------------
50
Chris Craik26bced42016-12-15 16:33:47 -080051static void android_view_RenderNode_output(JNIEnv* env, jobject clazz, jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -070052 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
53 renderNode->output();
54}
55
Chris Craik26bced42016-12-15 16:33:47 -080056static jint android_view_RenderNode_getDebugSize(JNIEnv* env, jobject clazz, jlong renderNodePtr) {
John Reckfe5e7b72014-05-23 17:42:28 -070057 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
58 return renderNode->getDebugSize();
59}
60
John Reck2de950d2017-01-25 10:58:30 -080061static jlong android_view_RenderNode_create(JNIEnv* env, jobject, jstring name) {
John Reck8de65a82014-04-09 15:23:38 -070062 RenderNode* renderNode = new RenderNode();
63 renderNode->incStrong(0);
Chris Craik54389792013-12-20 13:28:11 -080064 if (name != NULL) {
65 const char* textArray = env->GetStringUTFChars(name, NULL);
John Reck8de65a82014-04-09 15:23:38 -070066 renderNode->setName(textArray);
Chris Craik54389792013-12-20 13:28:11 -080067 env->ReleaseStringUTFChars(name, textArray);
68 }
John Reck8de65a82014-04-09 15:23:38 -070069 return reinterpret_cast<jlong>(renderNode);
Chris Craik54389792013-12-20 13:28:11 -080070}
71
John Reck395e9b82016-08-24 13:22:37 -070072static void releaseRenderNode(RenderNode* renderNode) {
John Reck8de65a82014-04-09 15:23:38 -070073 renderNode->decStrong(0);
Chris Craik54389792013-12-20 13:28:11 -080074}
75
John Reck395e9b82016-08-24 13:22:37 -070076static jlong android_view_RenderNode_getNativeFinalizer(JNIEnv* env,
77 jobject clazz) {
78 return static_cast<jlong>(reinterpret_cast<uintptr_t>(&releaseRenderNode));
79}
80
Chris Craik003cc3d2015-10-16 10:24:55 -070081static void android_view_RenderNode_setDisplayList(JNIEnv* env,
82 jobject clazz, jlong renderNodePtr, jlong displayListPtr) {
John Reck8de65a82014-04-09 15:23:38 -070083 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik003cc3d2015-10-16 10:24:55 -070084 DisplayList* newData = reinterpret_cast<DisplayList*>(displayListPtr);
John Reck2de950d2017-01-25 10:58:30 -080085 renderNode->setStagingDisplayList(newData);
86}
87
88static jboolean android_view_RenderNode_isValid(jlong renderNodePtr) {
89 return reinterpret_cast<RenderNode*>(renderNodePtr)->isValid();
Chris Craik54389792013-12-20 13:28:11 -080090}
91
92// ----------------------------------------------------------------------------
Chris Craik49e6c732014-03-31 12:34:11 -070093// RenderProperties - setters
Chris Craik54389792013-12-20 13:28:11 -080094// ----------------------------------------------------------------------------
95
Chris Craikfc294242016-12-13 18:10:46 -080096static jboolean android_view_RenderNode_setLayerType(jlong renderNodePtr, jint jlayerType) {
John Reck25fbb3f2014-06-12 13:46:45 -070097 LayerType layerType = static_cast<LayerType>(jlayerType);
98 return SET_AND_DIRTY(mutateLayerProperties().setType, layerType, RenderNode::GENERIC);
99}
100
Chris Craikfc294242016-12-13 18:10:46 -0800101static jboolean android_view_RenderNode_setLayerPaint(jlong renderNodePtr, jlong paintPtr) {
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -0400102 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
John Reck25fbb3f2014-06-12 13:46:45 -0700103 return SET_AND_DIRTY(mutateLayerProperties().setFromPaint, paint, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800104}
105
Chris Craikfc294242016-12-13 18:10:46 -0800106static jboolean android_view_RenderNode_setStaticMatrix(jlong renderNodePtr, jlong matrixPtr) {
Chris Craik7a02ea32013-12-27 16:43:22 -0800107 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
John Reck79c7de72014-05-23 10:33:31 -0700108 return SET_AND_DIRTY(setStaticMatrix, matrix, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800109}
110
Chris Craikfc294242016-12-13 18:10:46 -0800111static jboolean android_view_RenderNode_setAnimationMatrix(jlong renderNodePtr, jlong matrixPtr) {
Chris Craik7a02ea32013-12-27 16:43:22 -0800112 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
John Reck79c7de72014-05-23 10:33:31 -0700113 return SET_AND_DIRTY(setAnimationMatrix, matrix, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800114}
115
Chris Craikfc294242016-12-13 18:10:46 -0800116static jboolean android_view_RenderNode_setClipToBounds(jlong renderNodePtr,
117 jboolean clipToBounds) {
John Reck79c7de72014-05-23 10:33:31 -0700118 return SET_AND_DIRTY(setClipToBounds, clipToBounds, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800119}
120
Chris Craikfc294242016-12-13 18:10:46 -0800121static jboolean android_view_RenderNode_setClipBounds(jlong renderNodePtr,
122 jint left, jint top, jint right, jint bottom) {
Chris Craika753f4c2014-07-24 12:39:17 -0700123 android::uirenderer::Rect clipBounds(left, top, right, bottom);
124 return SET_AND_DIRTY(setClipBounds, clipBounds, RenderNode::GENERIC);
125}
126
Chris Craikfc294242016-12-13 18:10:46 -0800127static jboolean android_view_RenderNode_setClipBoundsEmpty(jlong renderNodePtr) {
Chris Craika753f4c2014-07-24 12:39:17 -0700128 return SET_AND_DIRTY(setClipBoundsEmpty,, RenderNode::GENERIC);
129}
130
Chris Craikfc294242016-12-13 18:10:46 -0800131static jboolean android_view_RenderNode_setProjectBackwards(jlong renderNodePtr,
132 jboolean shouldProject) {
John Reck79c7de72014-05-23 10:33:31 -0700133 return SET_AND_DIRTY(setProjectBackwards, shouldProject, RenderNode::GENERIC);
Alan Viverette58f09b32014-01-08 17:18:19 -0800134}
135
Chris Craikfc294242016-12-13 18:10:46 -0800136static jboolean android_view_RenderNode_setProjectionReceiver(jlong renderNodePtr,
137 jboolean shouldRecieve) {
John Reck79c7de72014-05-23 10:33:31 -0700138 return SET_AND_DIRTY(setProjectionReceiver, shouldRecieve, RenderNode::GENERIC);
Chris Craik1df26442014-02-05 16:50:41 -0800139}
140
Chris Craikfc294242016-12-13 18:10:46 -0800141static jboolean android_view_RenderNode_setOutlineRoundRect(jlong renderNodePtr,
142 jint left, jint top, 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
Chris Craikfc294242016-12-13 18:10:46 -0800150static jboolean android_view_RenderNode_setOutlineConvexPath(jlong renderNodePtr,
151 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
Chris Craikfc294242016-12-13 18:10:46 -0800159static jboolean android_view_RenderNode_setOutlineEmpty(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700160 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
161 renderNode->mutateStagingProperties().mutableOutline().setEmpty();
John Reckff941dc2014-05-14 16:34:14 -0700162 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700163 return true;
Chris Craika2fe7af2014-01-28 17:25:06 -0800164}
165
Chris Craikfc294242016-12-13 18:10:46 -0800166static jboolean android_view_RenderNode_setOutlineNone(jlong renderNodePtr) {
Chris Craik06451282014-07-21 10:25:54 -0700167 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
168 renderNode->mutateStagingProperties().mutableOutline().setNone();
169 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
170 return true;
171}
172
Chris Craikfc294242016-12-13 18:10:46 -0800173static jboolean android_view_RenderNode_hasShadow(jlong renderNodePtr) {
Chris Craik5c75c522014-09-05 14:08:08 -0700174 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
175 return renderNode->stagingProperties().hasShadow();
176}
177
John Reckd8be4a02017-11-17 15:06:24 -0800178static jboolean android_view_RenderNode_setSpotShadowColor(jlong renderNodePtr, jint shadowColor) {
179 return SET_AND_DIRTY(setSpotShadowColor,
180 static_cast<SkColor>(shadowColor), RenderNode::GENERIC);
181}
182
183static jint android_view_RenderNode_getSpotShadowColor(jlong renderNodePtr) {
184 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
185 return renderNode->stagingProperties().getSpotShadowColor();
186}
187
188static jboolean android_view_RenderNode_setAmbientShadowColor(jlong renderNodePtr,
189 jint shadowColor) {
190 return SET_AND_DIRTY(setAmbientShadowColor,
191 static_cast<SkColor>(shadowColor), RenderNode::GENERIC);
192}
193
194static jint android_view_RenderNode_getAmbientShadowColor(jlong renderNodePtr) {
195 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
196 return renderNode->stagingProperties().getAmbientShadowColor();
John Reck3c0369b2017-11-13 16:47:35 -0800197}
198
Chris Craikfc294242016-12-13 18:10:46 -0800199static jboolean android_view_RenderNode_setClipToOutline(jlong renderNodePtr,
200 jboolean clipToOutline) {
John Reck8de65a82014-04-09 15:23:38 -0700201 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
202 renderNode->mutateStagingProperties().mutableOutline().setShouldClip(clipToOutline);
John Reckff941dc2014-05-14 16:34:14 -0700203 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700204 return true;
Chris Craik8c271ca2014-03-25 10:33:01 -0700205}
206
Chris Craikfc294242016-12-13 18:10:46 -0800207static jboolean android_view_RenderNode_setRevealClip(jlong renderNodePtr, jboolean shouldClip,
Chris Craik8c271ca2014-03-25 10:33:01 -0700208 jfloat x, jfloat y, jfloat radius) {
John Reck8de65a82014-04-09 15:23:38 -0700209 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
210 renderNode->mutateStagingProperties().mutableRevealClip().set(
Chris Craikaf4d04c2014-07-29 12:50:14 -0700211 shouldClip, x, y, radius);
John Reckff941dc2014-05-14 16:34:14 -0700212 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700213 return true;
ztenghuifad45932014-02-06 10:33:58 -0800214}
215
Chris Craikfc294242016-12-13 18:10:46 -0800216static jboolean android_view_RenderNode_setAlpha(jlong renderNodePtr, float alpha) {
John Reck79c7de72014-05-23 10:33:31 -0700217 return SET_AND_DIRTY(setAlpha, alpha, RenderNode::ALPHA);
Chris Craik54389792013-12-20 13:28:11 -0800218}
219
Chris Craikfc294242016-12-13 18:10:46 -0800220static jboolean android_view_RenderNode_setHasOverlappingRendering(jlong renderNodePtr,
221 bool hasOverlappingRendering) {
John Reck79c7de72014-05-23 10:33:31 -0700222 return SET_AND_DIRTY(setHasOverlappingRendering, hasOverlappingRendering,
223 RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800224}
225
John Reck9ce2bf72018-07-02 18:33:32 -0700226static void android_view_RenderNode_setUsageHint(jlong renderNodePtr, jint usageHint) {
227 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
228 renderNode->setUsageHint(static_cast<UsageHint>(usageHint));
229}
230
Chris Craikfc294242016-12-13 18:10:46 -0800231static jboolean android_view_RenderNode_setElevation(jlong renderNodePtr, float elevation) {
John Reck79c7de72014-05-23 10:33:31 -0700232 return SET_AND_DIRTY(setElevation, elevation, RenderNode::Z);
Chris Craikcc39e162014-04-25 18:34:11 -0700233}
234
Chris Craikfc294242016-12-13 18:10:46 -0800235static jboolean android_view_RenderNode_setTranslationX(jlong renderNodePtr, float tx) {
John Reck79c7de72014-05-23 10:33:31 -0700236 return SET_AND_DIRTY(setTranslationX, tx, RenderNode::TRANSLATION_X | RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800237}
238
Chris Craikfc294242016-12-13 18:10:46 -0800239static jboolean android_view_RenderNode_setTranslationY(jlong renderNodePtr, float ty) {
John Reck79c7de72014-05-23 10:33:31 -0700240 return SET_AND_DIRTY(setTranslationY, ty, RenderNode::TRANSLATION_Y | RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800241}
242
Chris Craikfc294242016-12-13 18:10:46 -0800243static jboolean android_view_RenderNode_setTranslationZ(jlong renderNodePtr, float tz) {
John Reck79c7de72014-05-23 10:33:31 -0700244 return SET_AND_DIRTY(setTranslationZ, tz, RenderNode::TRANSLATION_Z | RenderNode::Z);
Chris Craik54389792013-12-20 13:28:11 -0800245}
246
Chris Craikfc294242016-12-13 18:10:46 -0800247static jboolean android_view_RenderNode_setRotation(jlong renderNodePtr, float rotation) {
John Reck79c7de72014-05-23 10:33:31 -0700248 return SET_AND_DIRTY(setRotation, rotation, RenderNode::ROTATION);
Chris Craik54389792013-12-20 13:28:11 -0800249}
250
Chris Craikfc294242016-12-13 18:10:46 -0800251static jboolean android_view_RenderNode_setRotationX(jlong renderNodePtr, float rx) {
John Reck79c7de72014-05-23 10:33:31 -0700252 return SET_AND_DIRTY(setRotationX, rx, RenderNode::ROTATION_X);
Chris Craik54389792013-12-20 13:28:11 -0800253}
254
Chris Craikfc294242016-12-13 18:10:46 -0800255static jboolean android_view_RenderNode_setRotationY(jlong renderNodePtr, float ry) {
John Reck79c7de72014-05-23 10:33:31 -0700256 return SET_AND_DIRTY(setRotationY, ry, RenderNode::ROTATION_Y);
Chris Craik54389792013-12-20 13:28:11 -0800257}
258
Chris Craikfc294242016-12-13 18:10:46 -0800259static jboolean android_view_RenderNode_setScaleX(jlong renderNodePtr, float sx) {
John Reck79c7de72014-05-23 10:33:31 -0700260 return SET_AND_DIRTY(setScaleX, sx, RenderNode::SCALE_X);
Chris Craik54389792013-12-20 13:28:11 -0800261}
262
Chris Craikfc294242016-12-13 18:10:46 -0800263static jboolean android_view_RenderNode_setScaleY(jlong renderNodePtr, float sy) {
John Reck79c7de72014-05-23 10:33:31 -0700264 return SET_AND_DIRTY(setScaleY, sy, RenderNode::SCALE_Y);
Chris Craik54389792013-12-20 13:28:11 -0800265}
266
Chris Craikfc294242016-12-13 18:10:46 -0800267static jboolean android_view_RenderNode_setPivotX(jlong renderNodePtr, float px) {
John Reck79c7de72014-05-23 10:33:31 -0700268 return SET_AND_DIRTY(setPivotX, px, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800269}
270
Chris Craikfc294242016-12-13 18:10:46 -0800271static jboolean android_view_RenderNode_setPivotY(jlong renderNodePtr, float py) {
John Reck79c7de72014-05-23 10:33:31 -0700272 return SET_AND_DIRTY(setPivotY, py, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800273}
274
John Reck8686e1f2018-03-21 16:31:21 -0700275static jboolean android_view_RenderNode_resetPivot(jlong renderNodePtr) {
276 return SET_AND_DIRTY(resetPivot, /* void */, RenderNode::GENERIC);
277}
278
Chris Craikfc294242016-12-13 18:10:46 -0800279static jboolean android_view_RenderNode_setCameraDistance(jlong renderNodePtr, float distance) {
John Reck79c7de72014-05-23 10:33:31 -0700280 return SET_AND_DIRTY(setCameraDistance, distance, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800281}
282
Chris Craikfc294242016-12-13 18:10:46 -0800283static jboolean android_view_RenderNode_setLeft(jlong renderNodePtr, int left) {
John Reck79c7de72014-05-23 10:33:31 -0700284 return SET_AND_DIRTY(setLeft, left, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800285}
286
Chris Craikfc294242016-12-13 18:10:46 -0800287static jboolean android_view_RenderNode_setTop(jlong renderNodePtr, int top) {
John Reck79c7de72014-05-23 10:33:31 -0700288 return SET_AND_DIRTY(setTop, top, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800289}
290
Chris Craikfc294242016-12-13 18:10:46 -0800291static jboolean android_view_RenderNode_setRight(jlong renderNodePtr, int right) {
John Reck79c7de72014-05-23 10:33:31 -0700292 return SET_AND_DIRTY(setRight, right, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800293}
294
Chris Craikfc294242016-12-13 18:10:46 -0800295static jboolean android_view_RenderNode_setBottom(jlong renderNodePtr, int bottom) {
John Reck79c7de72014-05-23 10:33:31 -0700296 return SET_AND_DIRTY(setBottom, bottom, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800297}
298
John Reckddeaa482018-10-30 10:47:43 -0700299static jint android_view_RenderNode_getLeft(jlong renderNodePtr) {
300 return reinterpret_cast<RenderNode*>(renderNodePtr)->stagingProperties().getLeft();
301}
302
303static jint android_view_RenderNode_getTop(jlong renderNodePtr) {
304 return reinterpret_cast<RenderNode*>(renderNodePtr)->stagingProperties().getTop();
305}
306
307static jint android_view_RenderNode_getRight(jlong renderNodePtr) {
308 return reinterpret_cast<RenderNode*>(renderNodePtr)->stagingProperties().getRight();
309}
310
311static jint android_view_RenderNode_getBottom(jlong renderNodePtr) {
312 return reinterpret_cast<RenderNode*>(renderNodePtr)->stagingProperties().getBottom();
313}
314
Chris Craikfc294242016-12-13 18:10:46 -0800315static jboolean android_view_RenderNode_setLeftTopRightBottom(jlong renderNodePtr,
316 int left, int top, int right, int bottom) {
John Reck8de65a82014-04-09 15:23:38 -0700317 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reck79c7de72014-05-23 10:33:31 -0700318 if (renderNode->mutateStagingProperties().setLeftTopRightBottom(left, top, right, bottom)) {
319 renderNode->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
320 return true;
321 }
322 return false;
Chris Craik54389792013-12-20 13:28:11 -0800323}
324
Chris Craikfc294242016-12-13 18:10:46 -0800325static jboolean android_view_RenderNode_offsetLeftAndRight(jlong renderNodePtr, jint offset) {
John Reck79c7de72014-05-23 10:33:31 -0700326 return SET_AND_DIRTY(offsetLeftRight, offset, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800327}
328
Chris Craikfc294242016-12-13 18:10:46 -0800329static jboolean android_view_RenderNode_offsetTopAndBottom(jlong renderNodePtr, jint offset) {
John Reck79c7de72014-05-23 10:33:31 -0700330 return SET_AND_DIRTY(offsetTopBottom, offset, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800331}
332
Chris Craik49e6c732014-03-31 12:34:11 -0700333// ----------------------------------------------------------------------------
334// RenderProperties - getters
335// ----------------------------------------------------------------------------
336
Chris Craikfc294242016-12-13 18:10:46 -0800337static jboolean android_view_RenderNode_hasOverlappingRendering(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700338 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
339 return renderNode->stagingProperties().hasOverlappingRendering();
Chris Craik54389792013-12-20 13:28:11 -0800340}
341
Andrey Kulikovc15c9ca2019-03-12 14:53:06 +0000342static jboolean android_view_RenderNode_getAnimationMatrix(jlong renderNodePtr, jlong outMatrixPtr) {
343 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
344 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
345
346 const SkMatrix* animationMatrix = renderNode->stagingProperties().getAnimationMatrix();
347
348 if (animationMatrix) {
349 *outMatrix = *animationMatrix;
350 return JNI_TRUE;
351 }
352 return JNI_FALSE;
353}
354
John Reck470a9192018-12-17 10:55:54 -0800355static jboolean android_view_RenderNode_getClipToBounds(jlong renderNodePtr) {
356 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
357 return renderNode->stagingProperties().getClipToBounds();
358}
359
Chris Craikfc294242016-12-13 18:10:46 -0800360static jboolean android_view_RenderNode_getClipToOutline(jlong renderNodePtr) {
Chris Craikdeeda3d2014-05-05 19:09:33 -0700361 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
362 return renderNode->stagingProperties().getOutline().getShouldClip();
363}
364
Chris Craikfc294242016-12-13 18:10:46 -0800365static jfloat android_view_RenderNode_getAlpha(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700366 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
367 return renderNode->stagingProperties().getAlpha();
Chris Craik54389792013-12-20 13:28:11 -0800368}
369
Chris Craikfc294242016-12-13 18:10:46 -0800370static jfloat android_view_RenderNode_getCameraDistance(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700371 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
372 return renderNode->stagingProperties().getCameraDistance();
Chris Craik54389792013-12-20 13:28:11 -0800373}
374
Chris Craikfc294242016-12-13 18:10:46 -0800375static jfloat android_view_RenderNode_getScaleX(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700376 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
377 return renderNode->stagingProperties().getScaleX();
Chris Craik54389792013-12-20 13:28:11 -0800378}
379
Chris Craikfc294242016-12-13 18:10:46 -0800380static jfloat android_view_RenderNode_getScaleY(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700381 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
382 return renderNode->stagingProperties().getScaleY();
Chris Craik54389792013-12-20 13:28:11 -0800383}
384
Chris Craikfc294242016-12-13 18:10:46 -0800385static jfloat android_view_RenderNode_getElevation(jlong renderNodePtr) {
Chris Craikcc39e162014-04-25 18:34:11 -0700386 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
387 return renderNode->stagingProperties().getElevation();
388}
389
Chris Craikfc294242016-12-13 18:10:46 -0800390static jfloat android_view_RenderNode_getTranslationX(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700391 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
392 return renderNode->stagingProperties().getTranslationX();
Chris Craik54389792013-12-20 13:28:11 -0800393}
394
Chris Craikfc294242016-12-13 18:10:46 -0800395static jfloat android_view_RenderNode_getTranslationY(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700396 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
397 return renderNode->stagingProperties().getTranslationY();
Chris Craik54389792013-12-20 13:28:11 -0800398}
399
Chris Craikfc294242016-12-13 18:10:46 -0800400static jfloat android_view_RenderNode_getTranslationZ(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700401 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
402 return renderNode->stagingProperties().getTranslationZ();
Chris Craik49e6c732014-03-31 12:34:11 -0700403}
404
Chris Craikfc294242016-12-13 18:10:46 -0800405static jfloat android_view_RenderNode_getRotation(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700406 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
407 return renderNode->stagingProperties().getRotation();
Chris Craik54389792013-12-20 13:28:11 -0800408}
409
Chris Craikfc294242016-12-13 18:10:46 -0800410static jfloat android_view_RenderNode_getRotationX(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700411 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
412 return renderNode->stagingProperties().getRotationX();
Chris Craik54389792013-12-20 13:28:11 -0800413}
414
Chris Craikfc294242016-12-13 18:10:46 -0800415static jfloat android_view_RenderNode_getRotationY(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700416 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
417 return renderNode->stagingProperties().getRotationY();
Chris Craik54389792013-12-20 13:28:11 -0800418}
419
Chris Craikfc294242016-12-13 18:10:46 -0800420static jboolean android_view_RenderNode_isPivotExplicitlySet(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700421 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
422 return renderNode->stagingProperties().isPivotExplicitlySet();
Chris Craik49e6c732014-03-31 12:34:11 -0700423}
424
Chris Craikfc294242016-12-13 18:10:46 -0800425static jboolean android_view_RenderNode_hasIdentityMatrix(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700426 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reckf7483e32014-04-11 08:54:47 -0700427 renderNode->mutateStagingProperties().updateMatrix();
428 return !renderNode->stagingProperties().hasTransformMatrix();
Chris Craik49e6c732014-03-31 12:34:11 -0700429}
430
John Reck470a9192018-12-17 10:55:54 -0800431static jint android_view_RenderNode_getLayerType(jlong renderNodePtr) {
432 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
433 return static_cast<int>(renderNode->stagingProperties().layerProperties().type());
434}
435
Chris Craik49e6c732014-03-31 12:34:11 -0700436// ----------------------------------------------------------------------------
437// RenderProperties - computed getters
438// ----------------------------------------------------------------------------
439
Chris Craikfc294242016-12-13 18:10:46 -0800440static void android_view_RenderNode_getTransformMatrix(jlong renderNodePtr, jlong outMatrixPtr) {
John Reck8de65a82014-04-09 15:23:38 -0700441 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik49e6c732014-03-31 12:34:11 -0700442 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
443
John Reck8de65a82014-04-09 15:23:38 -0700444 renderNode->mutateStagingProperties().updateMatrix();
445 const SkMatrix* transformMatrix = renderNode->stagingProperties().getTransformMatrix();
Chris Craik49e6c732014-03-31 12:34:11 -0700446
John Reckf7483e32014-04-11 08:54:47 -0700447 if (transformMatrix) {
Chris Craik49e6c732014-03-31 12:34:11 -0700448 *outMatrix = *transformMatrix;
449 } else {
450 outMatrix->setIdentity();
451 }
452}
453
Chris Craikfc294242016-12-13 18:10:46 -0800454static void android_view_RenderNode_getInverseTransformMatrix(jlong renderNodePtr,
455 jlong outMatrixPtr) {
Chris Craik49e6c732014-03-31 12:34:11 -0700456 // load transform matrix
Chris Craikfc294242016-12-13 18:10:46 -0800457 android_view_RenderNode_getTransformMatrix(renderNodePtr, outMatrixPtr);
Chris Craik49e6c732014-03-31 12:34:11 -0700458 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
459
460 // return it inverted
461 if (!outMatrix->invert(outMatrix)) {
462 // failed to load inverse, pass back identity
463 outMatrix->setIdentity();
464 }
465}
466
Chris Craikfc294242016-12-13 18:10:46 -0800467static jfloat android_view_RenderNode_getPivotX(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700468 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
469 renderNode->mutateStagingProperties().updateMatrix();
470 return renderNode->stagingProperties().getPivotX();
Chris Craik54389792013-12-20 13:28:11 -0800471}
472
Chris Craikfc294242016-12-13 18:10:46 -0800473static jfloat android_view_RenderNode_getPivotY(jlong renderNodePtr) {
John Reck8de65a82014-04-09 15:23:38 -0700474 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
475 renderNode->mutateStagingProperties().updateMatrix();
476 return renderNode->stagingProperties().getPivotY();
Chris Craik54389792013-12-20 13:28:11 -0800477}
478
John Reck568b2a62018-06-04 17:02:02 -0700479static jint android_view_RenderNode_getWidth(jlong renderNodePtr) {
480 return reinterpret_cast<RenderNode*>(renderNodePtr)->stagingProperties().getWidth();
481}
482
483static jint android_view_RenderNode_getHeight(jlong renderNodePtr) {
484 return reinterpret_cast<RenderNode*>(renderNodePtr)->stagingProperties().getHeight();
485}
486
John Reck1423e132018-09-21 14:30:19 -0700487static jboolean android_view_RenderNode_setAllowForceDark(jlong renderNodePtr, jboolean allow) {
488 return SET_AND_DIRTY(setAllowForceDark, allow, RenderNode::GENERIC);
489}
490
491static jboolean android_view_RenderNode_getAllowForceDark(jlong renderNodePtr) {
492 return reinterpret_cast<RenderNode*>(renderNodePtr)->stagingProperties().getAllowForceDark();
493}
494
John Reckf96b2842018-11-29 09:44:10 -0800495static jlong android_view_RenderNode_getUniqueId(jlong renderNodePtr) {
496 return reinterpret_cast<RenderNode*>(renderNodePtr)->uniqueId();
497}
498
John Recke45b1fd2014-04-15 09:50:16 -0700499// ----------------------------------------------------------------------------
500// RenderProperties - Animations
501// ----------------------------------------------------------------------------
502
Chris Craik26bced42016-12-15 16:33:47 -0800503static void android_view_RenderNode_addAnimator(JNIEnv* env, jobject clazz, jlong renderNodePtr,
504 jlong animatorPtr) {
John Recke45b1fd2014-04-15 09:50:16 -0700505 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
506 RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr);
507 renderNode->addAnimator(animator);
508}
509
Chris Craik26bced42016-12-15 16:33:47 -0800510static void android_view_RenderNode_endAllAnimators(JNIEnv* env, jobject clazz,
511 jlong renderNodePtr) {
John Reck119907c2014-08-14 09:02:01 -0700512 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Recke2478d42014-09-03 16:46:05 -0700513 renderNode->animators().endAllStagingAnimators();
John Reck119907c2014-08-14 09:02:01 -0700514}
515
Chris Craik54389792013-12-20 13:28:11 -0800516// ----------------------------------------------------------------------------
John Reckf6481082016-02-02 15:18:23 -0800517// SurfaceView position callback
518// ----------------------------------------------------------------------------
519
John Reck6b164402018-09-24 15:25:42 -0700520jmethodID gPositionListener_PositionChangedMethod;
521jmethodID gPositionListener_PositionLostMethod;
John Reckf6481082016-02-02 15:18:23 -0800522
523static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject,
John Reck51aa1892019-01-30 15:28:44 -0800524 jlong renderNodePtr, jobject listener) {
525 class PositionListenerTrampoline : public RenderNode::PositionListener {
John Reckf6481082016-02-02 15:18:23 -0800526 public:
John Reck51aa1892019-01-30 15:28:44 -0800527 PositionListenerTrampoline(JNIEnv* env, jobject listener) {
John Reckf6481082016-02-02 15:18:23 -0800528 env->GetJavaVM(&mVm);
John Reck51aa1892019-01-30 15:28:44 -0800529 mWeakRef = env->NewWeakGlobalRef(listener);
John Reckf6481082016-02-02 15:18:23 -0800530 }
531
John Reck51aa1892019-01-30 15:28:44 -0800532 virtual ~PositionListenerTrampoline() {
John Reckf6481082016-02-02 15:18:23 -0800533 jnienv()->DeleteWeakGlobalRef(mWeakRef);
534 mWeakRef = nullptr;
535 }
536
537 virtual void onPositionUpdated(RenderNode& node, const TreeInfo& info) override {
538 if (CC_UNLIKELY(!mWeakRef || !info.updateWindowPositions)) return;
John Reckf6481082016-02-02 15:18:23 -0800539
John Reckf6481082016-02-02 15:18:23 -0800540 Matrix4 transform;
541 info.damageAccumulator->computeCurrentTransform(&transform);
542 const RenderProperties& props = node.properties();
543 uirenderer::Rect bounds(props.getWidth(), props.getHeight());
544 transform.mapRect(bounds);
John Reck38f6c032016-03-17 10:23:49 -0700545
Chris Craik0e974e742016-04-22 15:44:14 -0700546 if (CC_LIKELY(transform.isPureTranslate())) {
547 // snap/round the computed bounds, so they match the rounding behavior
548 // of the clear done in SurfaceView#draw().
549 bounds.snapToPixelBoundaries();
550 } else {
551 // Conservatively round out so the punched hole (in the ZOrderOnTop = true case)
552 // doesn't extend beyond the other window
553 bounds.roundOut();
554 }
555
John Reck51aa1892019-01-30 15:28:44 -0800556 if (mPreviousPosition == bounds) {
557 return;
558 }
559 mPreviousPosition = bounds;
560
John Reck7b570de2016-06-27 13:27:23 -0700561 incStrong(0);
John Reck38f6c032016-03-17 10:23:49 -0700562 auto functor = std::bind(
John Reck51aa1892019-01-30 15:28:44 -0800563 std::mem_fn(&PositionListenerTrampoline::doUpdatePositionAsync), this,
John Reck28912a52016-04-18 14:34:18 -0700564 (jlong) info.canvasContext.getFrameNumber(),
565 (jint) bounds.left, (jint) bounds.top,
John Reck38f6c032016-03-17 10:23:49 -0700566 (jint) bounds.right, (jint) bounds.bottom);
567
568 info.canvasContext.enqueueFrameWork(std::move(functor));
John Reckf6481082016-02-02 15:18:23 -0800569 }
570
John Reckaa6e84f2016-06-16 15:36:13 -0700571 virtual void onPositionLost(RenderNode& node, const TreeInfo* info) override {
572 if (CC_UNLIKELY(!mWeakRef || (info && !info->updateWindowPositions))) return;
573
John Reck51aa1892019-01-30 15:28:44 -0800574 if (mPreviousPosition.isEmpty()) {
575 return;
576 }
577 mPreviousPosition.setEmpty();
578
John Reck7b570de2016-06-27 13:27:23 -0700579 ATRACE_NAME("SurfaceView position lost");
580 JNIEnv* env = jnienv();
581 jobject localref = env->NewLocalRef(mWeakRef);
582 if (CC_UNLIKELY(!localref)) {
583 jnienv()->DeleteWeakGlobalRef(mWeakRef);
584 mWeakRef = nullptr;
585 return;
John Reckaa6e84f2016-06-16 15:36:13 -0700586 }
John Reck7b570de2016-06-27 13:27:23 -0700587
John Reck51aa1892019-01-30 15:28:44 -0800588 // TODO: Remember why this is synchronous and then make a comment
John Reck6b164402018-09-24 15:25:42 -0700589 env->CallVoidMethod(localref, gPositionListener_PositionLostMethod,
John Reck7b570de2016-06-27 13:27:23 -0700590 info ? info->canvasContext.getFrameNumber() : 0);
591 env->DeleteLocalRef(localref);
John Reckaa6e84f2016-06-16 15:36:13 -0700592 }
593
John Reckf6481082016-02-02 15:18:23 -0800594 private:
595 JNIEnv* jnienv() {
596 JNIEnv* env;
597 if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
598 LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", mVm);
599 }
600 return env;
601 }
602
John Reck7b570de2016-06-27 13:27:23 -0700603 void doUpdatePositionAsync(jlong frameNumber, jint left, jint top,
John Reck38f6c032016-03-17 10:23:49 -0700604 jint right, jint bottom) {
605 ATRACE_NAME("Update SurfaceView position");
606
607 JNIEnv* env = jnienv();
608 jobject localref = env->NewLocalRef(mWeakRef);
609 if (CC_UNLIKELY(!localref)) {
John Reck7b570de2016-06-27 13:27:23 -0700610 env->DeleteWeakGlobalRef(mWeakRef);
John Reck38f6c032016-03-17 10:23:49 -0700611 mWeakRef = nullptr;
John Reck7b570de2016-06-27 13:27:23 -0700612 } else {
John Reck6b164402018-09-24 15:25:42 -0700613 env->CallVoidMethod(localref, gPositionListener_PositionChangedMethod,
John Reck7b570de2016-06-27 13:27:23 -0700614 frameNumber, left, top, right, bottom);
615 env->DeleteLocalRef(localref);
John Reck38f6c032016-03-17 10:23:49 -0700616 }
617
John Reck7b570de2016-06-27 13:27:23 -0700618 // We need to release ourselves here
619 decStrong(0);
John Reckaa6e84f2016-06-16 15:36:13 -0700620 }
621
John Reckf6481082016-02-02 15:18:23 -0800622 JavaVM* mVm;
623 jobject mWeakRef;
John Reck51aa1892019-01-30 15:28:44 -0800624 uirenderer::Rect mPreviousPosition;
John Reckf6481082016-02-02 15:18:23 -0800625 };
626
627 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reck51aa1892019-01-30 15:28:44 -0800628 renderNode->setPositionListener(new PositionListenerTrampoline(env, listener));
John Reckf6481082016-02-02 15:18:23 -0800629}
630
631// ----------------------------------------------------------------------------
Chris Craik54389792013-12-20 13:28:11 -0800632// JNI Glue
633// ----------------------------------------------------------------------------
634
John Reck32f140aa62018-10-04 15:08:24 -0700635const char* const kClassPathName = "android/graphics/RenderNode";
Chris Craik54389792013-12-20 13:28:11 -0800636
Daniel Micay76f6a862015-09-19 17:31:01 -0400637static const JNINativeMethod gMethods[] = {
John Reck395e9b82016-08-24 13:22:37 -0700638// ----------------------------------------------------------------------------
639// Regular JNI
640// ----------------------------------------------------------------------------
Chris Craik003cc3d2015-10-16 10:24:55 -0700641 { "nCreate", "(Ljava/lang/String;)J", (void*) android_view_RenderNode_create },
John Reck395e9b82016-08-24 13:22:37 -0700642 { "nGetNativeFinalizer", "()J", (void*) android_view_RenderNode_getNativeFinalizer },
Chris Craik003cc3d2015-10-16 10:24:55 -0700643 { "nOutput", "(J)V", (void*) android_view_RenderNode_output },
644 { "nGetDebugSize", "(J)I", (void*) android_view_RenderNode_getDebugSize },
John Recke45b1fd2014-04-15 09:50:16 -0700645 { "nAddAnimator", "(JJ)V", (void*) android_view_RenderNode_addAnimator },
John Reck119907c2014-08-14 09:02:01 -0700646 { "nEndAllAnimators", "(J)V", (void*) android_view_RenderNode_endAllAnimators },
John Reck32f140aa62018-10-04 15:08:24 -0700647 { "nRequestPositionUpdates", "(JLandroid/graphics/RenderNode$PositionUpdateListener;)V", (void*) android_view_RenderNode_requestPositionUpdates },
Chris Craikfc294242016-12-13 18:10:46 -0800648 { "nSetDisplayList", "(JJ)V", (void*) android_view_RenderNode_setDisplayList },
649
John Reck395e9b82016-08-24 13:22:37 -0700650
651// ----------------------------------------------------------------------------
Chris Craikfc294242016-12-13 18:10:46 -0800652// Fast JNI via @CriticalNative annotation in RenderNode.java
653// ----------------------------------------------------------------------------
654 { "nSetDisplayList", "(JJ)V", (void*) android_view_RenderNode_setDisplayList },
655
656
657// ----------------------------------------------------------------------------
658// Critical JNI via @CriticalNative annotation in RenderNode.java
John Reck395e9b82016-08-24 13:22:37 -0700659// ----------------------------------------------------------------------------
John Reck2de950d2017-01-25 10:58:30 -0800660 { "nIsValid", "(J)Z", (void*) android_view_RenderNode_isValid },
John Reck395e9b82016-08-24 13:22:37 -0700661 { "nSetLayerType", "(JI)Z", (void*) android_view_RenderNode_setLayerType },
John Reck470a9192018-12-17 10:55:54 -0800662 { "nGetLayerType", "(J)I", (void*) android_view_RenderNode_getLayerType },
John Reck395e9b82016-08-24 13:22:37 -0700663 { "nSetLayerPaint", "(JJ)Z", (void*) android_view_RenderNode_setLayerPaint },
664 { "nSetStaticMatrix", "(JJ)Z", (void*) android_view_RenderNode_setStaticMatrix },
665 { "nSetAnimationMatrix", "(JJ)Z", (void*) android_view_RenderNode_setAnimationMatrix },
Andrey Kulikovc15c9ca2019-03-12 14:53:06 +0000666 { "nGetAnimationMatrix", "(JJ)Z", (void*) android_view_RenderNode_getAnimationMatrix },
John Reck395e9b82016-08-24 13:22:37 -0700667 { "nSetClipToBounds", "(JZ)Z", (void*) android_view_RenderNode_setClipToBounds },
John Reck470a9192018-12-17 10:55:54 -0800668 { "nGetClipToBounds", "(J)Z", (void*) android_view_RenderNode_getClipToBounds },
John Reck395e9b82016-08-24 13:22:37 -0700669 { "nSetClipBounds", "(JIIII)Z", (void*) android_view_RenderNode_setClipBounds },
670 { "nSetClipBoundsEmpty", "(J)Z", (void*) android_view_RenderNode_setClipBoundsEmpty },
671 { "nSetProjectBackwards", "(JZ)Z", (void*) android_view_RenderNode_setProjectBackwards },
672 { "nSetProjectionReceiver","(JZ)Z", (void*) android_view_RenderNode_setProjectionReceiver },
673
674 { "nSetOutlineRoundRect", "(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect },
675 { "nSetOutlineConvexPath", "(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath },
676 { "nSetOutlineEmpty", "(J)Z", (void*) android_view_RenderNode_setOutlineEmpty },
677 { "nSetOutlineNone", "(J)Z", (void*) android_view_RenderNode_setOutlineNone },
678 { "nHasShadow", "(J)Z", (void*) android_view_RenderNode_hasShadow },
John Reckd8be4a02017-11-17 15:06:24 -0800679 { "nSetSpotShadowColor", "(JI)Z", (void*) android_view_RenderNode_setSpotShadowColor },
680 { "nGetSpotShadowColor", "(J)I", (void*) android_view_RenderNode_getSpotShadowColor },
681 { "nSetAmbientShadowColor","(JI)Z", (void*) android_view_RenderNode_setAmbientShadowColor },
682 { "nGetAmbientShadowColor","(J)I", (void*) android_view_RenderNode_getAmbientShadowColor },
John Reck395e9b82016-08-24 13:22:37 -0700683 { "nSetClipToOutline", "(JZ)Z", (void*) android_view_RenderNode_setClipToOutline },
684 { "nSetRevealClip", "(JZFFF)Z", (void*) android_view_RenderNode_setRevealClip },
685
686 { "nSetAlpha", "(JF)Z", (void*) android_view_RenderNode_setAlpha },
687 { "nSetHasOverlappingRendering", "(JZ)Z",
688 (void*) android_view_RenderNode_setHasOverlappingRendering },
John Reck9ce2bf72018-07-02 18:33:32 -0700689 { "nSetUsageHint", "(JI)V", (void*) android_view_RenderNode_setUsageHint },
John Reck395e9b82016-08-24 13:22:37 -0700690 { "nSetElevation", "(JF)Z", (void*) android_view_RenderNode_setElevation },
691 { "nSetTranslationX", "(JF)Z", (void*) android_view_RenderNode_setTranslationX },
692 { "nSetTranslationY", "(JF)Z", (void*) android_view_RenderNode_setTranslationY },
693 { "nSetTranslationZ", "(JF)Z", (void*) android_view_RenderNode_setTranslationZ },
694 { "nSetRotation", "(JF)Z", (void*) android_view_RenderNode_setRotation },
695 { "nSetRotationX", "(JF)Z", (void*) android_view_RenderNode_setRotationX },
696 { "nSetRotationY", "(JF)Z", (void*) android_view_RenderNode_setRotationY },
697 { "nSetScaleX", "(JF)Z", (void*) android_view_RenderNode_setScaleX },
698 { "nSetScaleY", "(JF)Z", (void*) android_view_RenderNode_setScaleY },
699 { "nSetPivotX", "(JF)Z", (void*) android_view_RenderNode_setPivotX },
700 { "nSetPivotY", "(JF)Z", (void*) android_view_RenderNode_setPivotY },
John Reck8686e1f2018-03-21 16:31:21 -0700701 { "nResetPivot", "(J)Z", (void*) android_view_RenderNode_resetPivot },
John Reck395e9b82016-08-24 13:22:37 -0700702 { "nSetCameraDistance", "(JF)Z", (void*) android_view_RenderNode_setCameraDistance },
703 { "nSetLeft", "(JI)Z", (void*) android_view_RenderNode_setLeft },
704 { "nSetTop", "(JI)Z", (void*) android_view_RenderNode_setTop },
705 { "nSetRight", "(JI)Z", (void*) android_view_RenderNode_setRight },
706 { "nSetBottom", "(JI)Z", (void*) android_view_RenderNode_setBottom },
John Reckddeaa482018-10-30 10:47:43 -0700707 { "nGetLeft", "(J)I", (void*) android_view_RenderNode_getLeft },
708 { "nGetTop", "(J)I", (void*) android_view_RenderNode_getTop },
709 { "nGetRight", "(J)I", (void*) android_view_RenderNode_getRight },
710 { "nGetBottom", "(J)I", (void*) android_view_RenderNode_getBottom },
John Reck395e9b82016-08-24 13:22:37 -0700711 { "nSetLeftTopRightBottom","(JIIII)Z", (void*) android_view_RenderNode_setLeftTopRightBottom },
712 { "nOffsetLeftAndRight", "(JI)Z", (void*) android_view_RenderNode_offsetLeftAndRight },
713 { "nOffsetTopAndBottom", "(JI)Z", (void*) android_view_RenderNode_offsetTopAndBottom },
714
715 { "nHasOverlappingRendering", "(J)Z", (void*) android_view_RenderNode_hasOverlappingRendering },
716 { "nGetClipToOutline", "(J)Z", (void*) android_view_RenderNode_getClipToOutline },
717 { "nGetAlpha", "(J)F", (void*) android_view_RenderNode_getAlpha },
718 { "nGetCameraDistance", "(J)F", (void*) android_view_RenderNode_getCameraDistance },
719 { "nGetScaleX", "(J)F", (void*) android_view_RenderNode_getScaleX },
720 { "nGetScaleY", "(J)F", (void*) android_view_RenderNode_getScaleY },
721 { "nGetElevation", "(J)F", (void*) android_view_RenderNode_getElevation },
722 { "nGetTranslationX", "(J)F", (void*) android_view_RenderNode_getTranslationX },
723 { "nGetTranslationY", "(J)F", (void*) android_view_RenderNode_getTranslationY },
724 { "nGetTranslationZ", "(J)F", (void*) android_view_RenderNode_getTranslationZ },
725 { "nGetRotation", "(J)F", (void*) android_view_RenderNode_getRotation },
726 { "nGetRotationX", "(J)F", (void*) android_view_RenderNode_getRotationX },
727 { "nGetRotationY", "(J)F", (void*) android_view_RenderNode_getRotationY },
728 { "nIsPivotExplicitlySet", "(J)Z", (void*) android_view_RenderNode_isPivotExplicitlySet },
729 { "nHasIdentityMatrix", "(J)Z", (void*) android_view_RenderNode_hasIdentityMatrix },
730
731 { "nGetTransformMatrix", "(JJ)V", (void*) android_view_RenderNode_getTransformMatrix },
732 { "nGetInverseTransformMatrix","(JJ)V", (void*) android_view_RenderNode_getInverseTransformMatrix },
733
734 { "nGetPivotX", "(J)F", (void*) android_view_RenderNode_getPivotX },
735 { "nGetPivotY", "(J)F", (void*) android_view_RenderNode_getPivotY },
John Reck568b2a62018-06-04 17:02:02 -0700736 { "nGetWidth", "(J)I", (void*) android_view_RenderNode_getWidth },
737 { "nGetHeight", "(J)I", (void*) android_view_RenderNode_getHeight },
John Reck1423e132018-09-21 14:30:19 -0700738 { "nSetAllowForceDark", "(JZ)Z", (void*) android_view_RenderNode_setAllowForceDark },
739 { "nGetAllowForceDark", "(J)Z", (void*) android_view_RenderNode_getAllowForceDark },
John Reckf96b2842018-11-29 09:44:10 -0800740 { "nGetUniqueId", "(J)J", (void*) android_view_RenderNode_getUniqueId },
Chris Craik54389792013-12-20 13:28:11 -0800741};
742
John Reckf666ad72014-03-14 16:24:57 -0700743int register_android_view_RenderNode(JNIEnv* env) {
John Reck32f140aa62018-10-04 15:08:24 -0700744 jclass clazz = FindClassOrDie(env, "android/graphics/RenderNode$PositionUpdateListener");
John Reck6b164402018-09-24 15:25:42 -0700745 gPositionListener_PositionChangedMethod = GetMethodIDOrDie(env, clazz,
746 "positionChanged", "(JIIII)V");
747 gPositionListener_PositionLostMethod = GetMethodIDOrDie(env, clazz,
748 "positionLost", "(J)V");
Andreas Gampe987f79f2014-11-18 17:29:46 -0800749 return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
Chris Craik54389792013-12-20 13:28:11 -0800750}
751
752};
753