blob: 949f4ff2066f0d085e8079eeb85b376f7085f05c [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"
18
19#include <EGL/egl.h>
20
21#include "jni.h"
22#include "GraphicsJNI.h"
23#include <nativehelper/JNIHelp.h>
24#include <android_runtime/AndroidRuntime.h>
25
John Recke45b1fd2014-04-15 09:50:16 -070026#include <Animator.h>
Chris Craik54389792013-12-20 13:28:11 -080027#include <DisplayListRenderer.h>
John Reck113e0822014-03-18 09:22:59 -070028#include <RenderNode.h>
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -040029#include <Paint.h>
Chris Craik54389792013-12-20 13:28:11 -080030
31namespace android {
32
33using namespace uirenderer;
34
35/**
36 * Note: OpenGLRenderer JNI layer is generated and compiled only on supported
37 * devices. This means all the logic must be compiled only when the
38 * preprocessor variable USE_OPENGL_RENDERER is defined.
39 */
40#ifdef USE_OPENGL_RENDERER
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
John Reck8de65a82014-04-09 15:23:38 -070051static void android_view_RenderNode_output(JNIEnv* env,
52 jobject clazz, jlong renderNodePtr) {
53 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
54 renderNode->output();
55}
56
John Reckfe5e7b72014-05-23 17:42:28 -070057static jint android_view_RenderNode_getDebugSize(JNIEnv* env,
58 jobject clazz, jlong renderNodePtr) {
59 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
60 return renderNode->getDebugSize();
61}
62
John Reck8de65a82014-04-09 15:23:38 -070063static jlong android_view_RenderNode_create(JNIEnv* env, jobject clazz, jstring name) {
64 RenderNode* renderNode = new RenderNode();
65 renderNode->incStrong(0);
Chris Craik54389792013-12-20 13:28:11 -080066 if (name != NULL) {
67 const char* textArray = env->GetStringUTFChars(name, NULL);
John Reck8de65a82014-04-09 15:23:38 -070068 renderNode->setName(textArray);
Chris Craik54389792013-12-20 13:28:11 -080069 env->ReleaseStringUTFChars(name, textArray);
70 }
John Reck8de65a82014-04-09 15:23:38 -070071 return reinterpret_cast<jlong>(renderNode);
Chris Craik54389792013-12-20 13:28:11 -080072}
73
John Reck8de65a82014-04-09 15:23:38 -070074static void android_view_RenderNode_destroyRenderNode(JNIEnv* env,
75 jobject clazz, jlong renderNodePtr) {
76 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
77 renderNode->decStrong(0);
Chris Craik54389792013-12-20 13:28:11 -080078}
79
John Reck8de65a82014-04-09 15:23:38 -070080static void android_view_RenderNode_setDisplayListData(JNIEnv* env,
81 jobject clazz, jlong renderNodePtr, jlong newDataPtr) {
82 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
83 DisplayListData* newData = reinterpret_cast<DisplayListData*>(newDataPtr);
84 renderNode->setStagingDisplayList(newData);
Chris Craik54389792013-12-20 13:28:11 -080085}
86
87// ----------------------------------------------------------------------------
Chris Craik49e6c732014-03-31 12:34:11 -070088// RenderProperties - setters
Chris Craik54389792013-12-20 13:28:11 -080089// ----------------------------------------------------------------------------
90
John Reck25fbb3f2014-06-12 13:46:45 -070091static jboolean android_view_RenderNode_setLayerType(JNIEnv* env,
92 jobject clazz, jlong renderNodePtr, jint jlayerType) {
93 LayerType layerType = static_cast<LayerType>(jlayerType);
94 return SET_AND_DIRTY(mutateLayerProperties().setType, layerType, RenderNode::GENERIC);
95}
96
97static jboolean android_view_RenderNode_setLayerPaint(JNIEnv* env,
98 jobject clazz, jlong renderNodePtr, jlong paintPtr) {
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -040099 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
John Reck25fbb3f2014-06-12 13:46:45 -0700100 return SET_AND_DIRTY(mutateLayerProperties().setFromPaint, paint, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800101}
102
John Reck79c7de72014-05-23 10:33:31 -0700103static jboolean android_view_RenderNode_setStaticMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700104 jobject clazz, jlong renderNodePtr, jlong matrixPtr) {
Chris Craik7a02ea32013-12-27 16:43:22 -0800105 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
John Reck79c7de72014-05-23 10:33:31 -0700106 return SET_AND_DIRTY(setStaticMatrix, matrix, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800107}
108
John Reck79c7de72014-05-23 10:33:31 -0700109static jboolean android_view_RenderNode_setAnimationMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700110 jobject clazz, 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
John Reck79c7de72014-05-23 10:33:31 -0700115static jboolean android_view_RenderNode_setClipToBounds(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700116 jobject clazz, jlong renderNodePtr, 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 Craika753f4c2014-07-24 12:39:17 -0700120static jboolean android_view_RenderNode_setClipBounds(JNIEnv* env,
121 jobject clazz, jlong renderNodePtr, jint left, jint top, jint right, jint bottom) {
122 android::uirenderer::Rect clipBounds(left, top, right, bottom);
123 return SET_AND_DIRTY(setClipBounds, clipBounds, RenderNode::GENERIC);
124}
125
126static jboolean android_view_RenderNode_setClipBoundsEmpty(JNIEnv* env,
127 jobject clazz, jlong renderNodePtr) {
128 return SET_AND_DIRTY(setClipBoundsEmpty,, RenderNode::GENERIC);
129}
130
John Reck79c7de72014-05-23 10:33:31 -0700131static jboolean android_view_RenderNode_setProjectBackwards(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700132 jobject clazz, jlong renderNodePtr, 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
John Reck79c7de72014-05-23 10:33:31 -0700136static jboolean android_view_RenderNode_setProjectionReceiver(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700137 jobject clazz, jlong renderNodePtr, 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
John Reck79c7de72014-05-23 10:33:31 -0700141static jboolean android_view_RenderNode_setOutlineRoundRect(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700142 jobject clazz, jlong renderNodePtr, jint left, jint top,
Chris Craik77b5cad2014-07-30 18:23:07 -0700143 jint right, jint bottom, jfloat radius, jfloat alpha) {
John Reck8de65a82014-04-09 15:23:38 -0700144 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik77b5cad2014-07-30 18:23:07 -0700145 renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom,
146 radius, alpha);
John Reckff941dc2014-05-14 16:34:14 -0700147 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700148 return true;
Chris Craikb49f4462014-03-20 12:44:20 -0700149}
Chris Craik8c271ca2014-03-25 10:33:01 -0700150
John Reck79c7de72014-05-23 10:33:31 -0700151static jboolean android_view_RenderNode_setOutlineConvexPath(JNIEnv* env,
Chris Craik77b5cad2014-07-30 18:23:07 -0700152 jobject clazz, jlong renderNodePtr, jlong outlinePathPtr, jfloat alpha) {
John Reck8de65a82014-04-09 15:23:38 -0700153 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craikb49f4462014-03-20 12:44:20 -0700154 SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr);
Chris Craik77b5cad2014-07-30 18:23:07 -0700155 renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath, alpha);
John Reckff941dc2014-05-14 16:34:14 -0700156 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700157 return true;
Chris Craikb49f4462014-03-20 12:44:20 -0700158}
Chris Craik8c271ca2014-03-25 10:33:01 -0700159
John Reck79c7de72014-05-23 10:33:31 -0700160static jboolean android_view_RenderNode_setOutlineEmpty(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700161 jobject clazz, jlong renderNodePtr) {
162 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
163 renderNode->mutateStagingProperties().mutableOutline().setEmpty();
John Reckff941dc2014-05-14 16:34:14 -0700164 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700165 return true;
Chris Craika2fe7af2014-01-28 17:25:06 -0800166}
167
Chris Craik06451282014-07-21 10:25:54 -0700168static jboolean android_view_RenderNode_setOutlineNone(JNIEnv* env,
169 jobject clazz, jlong renderNodePtr) {
170 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
171 renderNode->mutateStagingProperties().mutableOutline().setNone();
172 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
173 return true;
174}
175
John Reck79c7de72014-05-23 10:33:31 -0700176static jboolean android_view_RenderNode_setClipToOutline(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700177 jobject clazz, jlong renderNodePtr, jboolean clipToOutline) {
178 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
179 renderNode->mutateStagingProperties().mutableOutline().setShouldClip(clipToOutline);
John Reckff941dc2014-05-14 16:34:14 -0700180 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700181 return true;
Chris Craik8c271ca2014-03-25 10:33:01 -0700182}
183
John Reck79c7de72014-05-23 10:33:31 -0700184static jboolean android_view_RenderNode_setRevealClip(JNIEnv* env,
Chris Craikaf4d04c2014-07-29 12:50:14 -0700185 jobject clazz, jlong renderNodePtr, jboolean shouldClip,
Chris Craik8c271ca2014-03-25 10:33:01 -0700186 jfloat x, jfloat y, jfloat radius) {
John Reck8de65a82014-04-09 15:23:38 -0700187 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
188 renderNode->mutateStagingProperties().mutableRevealClip().set(
Chris Craikaf4d04c2014-07-29 12:50:14 -0700189 shouldClip, x, y, radius);
John Reckff941dc2014-05-14 16:34:14 -0700190 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700191 return true;
ztenghuifad45932014-02-06 10:33:58 -0800192}
193
John Reck79c7de72014-05-23 10:33:31 -0700194static jboolean android_view_RenderNode_setAlpha(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700195 jobject clazz, jlong renderNodePtr, float alpha) {
John Reck79c7de72014-05-23 10:33:31 -0700196 return SET_AND_DIRTY(setAlpha, alpha, RenderNode::ALPHA);
Chris Craik54389792013-12-20 13:28:11 -0800197}
198
John Reck79c7de72014-05-23 10:33:31 -0700199static jboolean android_view_RenderNode_setHasOverlappingRendering(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700200 jobject clazz, jlong renderNodePtr, bool hasOverlappingRendering) {
John Reck79c7de72014-05-23 10:33:31 -0700201 return SET_AND_DIRTY(setHasOverlappingRendering, hasOverlappingRendering,
202 RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800203}
204
John Reck79c7de72014-05-23 10:33:31 -0700205static jboolean android_view_RenderNode_setElevation(JNIEnv* env,
Chris Craikcc39e162014-04-25 18:34:11 -0700206 jobject clazz, jlong renderNodePtr, float elevation) {
John Reck79c7de72014-05-23 10:33:31 -0700207 return SET_AND_DIRTY(setElevation, elevation, RenderNode::Z);
Chris Craikcc39e162014-04-25 18:34:11 -0700208}
209
John Reck79c7de72014-05-23 10:33:31 -0700210static jboolean android_view_RenderNode_setTranslationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700211 jobject clazz, jlong renderNodePtr, float tx) {
John Reck79c7de72014-05-23 10:33:31 -0700212 return SET_AND_DIRTY(setTranslationX, tx, RenderNode::TRANSLATION_X | RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800213}
214
John Reck79c7de72014-05-23 10:33:31 -0700215static jboolean android_view_RenderNode_setTranslationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700216 jobject clazz, jlong renderNodePtr, float ty) {
John Reck79c7de72014-05-23 10:33:31 -0700217 return SET_AND_DIRTY(setTranslationY, ty, RenderNode::TRANSLATION_Y | RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800218}
219
John Reck79c7de72014-05-23 10:33:31 -0700220static jboolean android_view_RenderNode_setTranslationZ(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700221 jobject clazz, jlong renderNodePtr, float tz) {
John Reck79c7de72014-05-23 10:33:31 -0700222 return SET_AND_DIRTY(setTranslationZ, tz, RenderNode::TRANSLATION_Z | RenderNode::Z);
Chris Craik54389792013-12-20 13:28:11 -0800223}
224
John Reck79c7de72014-05-23 10:33:31 -0700225static jboolean android_view_RenderNode_setRotation(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700226 jobject clazz, jlong renderNodePtr, float rotation) {
John Reck79c7de72014-05-23 10:33:31 -0700227 return SET_AND_DIRTY(setRotation, rotation, RenderNode::ROTATION);
Chris Craik54389792013-12-20 13:28:11 -0800228}
229
John Reck79c7de72014-05-23 10:33:31 -0700230static jboolean android_view_RenderNode_setRotationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700231 jobject clazz, jlong renderNodePtr, float rx) {
John Reck79c7de72014-05-23 10:33:31 -0700232 return SET_AND_DIRTY(setRotationX, rx, RenderNode::ROTATION_X);
Chris Craik54389792013-12-20 13:28:11 -0800233}
234
John Reck79c7de72014-05-23 10:33:31 -0700235static jboolean android_view_RenderNode_setRotationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700236 jobject clazz, jlong renderNodePtr, float ry) {
John Reck79c7de72014-05-23 10:33:31 -0700237 return SET_AND_DIRTY(setRotationY, ry, RenderNode::ROTATION_Y);
Chris Craik54389792013-12-20 13:28:11 -0800238}
239
John Reck79c7de72014-05-23 10:33:31 -0700240static jboolean android_view_RenderNode_setScaleX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700241 jobject clazz, jlong renderNodePtr, float sx) {
John Reck79c7de72014-05-23 10:33:31 -0700242 return SET_AND_DIRTY(setScaleX, sx, RenderNode::SCALE_X);
Chris Craik54389792013-12-20 13:28:11 -0800243}
244
John Reck79c7de72014-05-23 10:33:31 -0700245static jboolean android_view_RenderNode_setScaleY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700246 jobject clazz, jlong renderNodePtr, float sy) {
John Reck79c7de72014-05-23 10:33:31 -0700247 return SET_AND_DIRTY(setScaleY, sy, RenderNode::SCALE_Y);
Chris Craik54389792013-12-20 13:28:11 -0800248}
249
John Reck79c7de72014-05-23 10:33:31 -0700250static jboolean android_view_RenderNode_setPivotX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700251 jobject clazz, jlong renderNodePtr, float px) {
John Reck79c7de72014-05-23 10:33:31 -0700252 return SET_AND_DIRTY(setPivotX, px, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800253}
254
John Reck79c7de72014-05-23 10:33:31 -0700255static jboolean android_view_RenderNode_setPivotY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700256 jobject clazz, jlong renderNodePtr, float py) {
John Reck79c7de72014-05-23 10:33:31 -0700257 return SET_AND_DIRTY(setPivotY, py, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800258}
259
John Reck79c7de72014-05-23 10:33:31 -0700260static jboolean android_view_RenderNode_setCameraDistance(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700261 jobject clazz, jlong renderNodePtr, float distance) {
John Reck79c7de72014-05-23 10:33:31 -0700262 return SET_AND_DIRTY(setCameraDistance, distance, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800263}
264
John Reck79c7de72014-05-23 10:33:31 -0700265static jboolean android_view_RenderNode_setLeft(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700266 jobject clazz, jlong renderNodePtr, int left) {
John Reck79c7de72014-05-23 10:33:31 -0700267 return SET_AND_DIRTY(setLeft, left, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800268}
269
John Reck79c7de72014-05-23 10:33:31 -0700270static jboolean android_view_RenderNode_setTop(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700271 jobject clazz, jlong renderNodePtr, int top) {
John Reck79c7de72014-05-23 10:33:31 -0700272 return SET_AND_DIRTY(setTop, top, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800273}
274
John Reck79c7de72014-05-23 10:33:31 -0700275static jboolean android_view_RenderNode_setRight(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700276 jobject clazz, jlong renderNodePtr, int right) {
John Reck79c7de72014-05-23 10:33:31 -0700277 return SET_AND_DIRTY(setRight, right, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800278}
279
John Reck79c7de72014-05-23 10:33:31 -0700280static jboolean android_view_RenderNode_setBottom(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700281 jobject clazz, jlong renderNodePtr, int bottom) {
John Reck79c7de72014-05-23 10:33:31 -0700282 return SET_AND_DIRTY(setBottom, bottom, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800283}
284
John Reck79c7de72014-05-23 10:33:31 -0700285static jboolean android_view_RenderNode_setLeftTopRightBottom(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700286 jobject clazz, jlong renderNodePtr, int left, int top,
Chris Craik54389792013-12-20 13:28:11 -0800287 int right, int bottom) {
John Reck8de65a82014-04-09 15:23:38 -0700288 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reck79c7de72014-05-23 10:33:31 -0700289 if (renderNode->mutateStagingProperties().setLeftTopRightBottom(left, top, right, bottom)) {
290 renderNode->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
291 return true;
292 }
293 return false;
Chris Craik54389792013-12-20 13:28:11 -0800294}
295
John Reck79c7de72014-05-23 10:33:31 -0700296static jboolean android_view_RenderNode_offsetLeftAndRight(JNIEnv* env,
Chris Craika753f4c2014-07-24 12:39:17 -0700297 jobject clazz, jlong renderNodePtr, jint offset) {
John Reck79c7de72014-05-23 10:33:31 -0700298 return SET_AND_DIRTY(offsetLeftRight, offset, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800299}
300
John Reck79c7de72014-05-23 10:33:31 -0700301static jboolean android_view_RenderNode_offsetTopAndBottom(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(offsetTopBottom, offset, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800304}
305
Chris Craik49e6c732014-03-31 12:34:11 -0700306// ----------------------------------------------------------------------------
307// RenderProperties - getters
308// ----------------------------------------------------------------------------
309
John Reckf666ad72014-03-14 16:24:57 -0700310static jboolean android_view_RenderNode_hasOverlappingRendering(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700311 jobject clazz, jlong renderNodePtr) {
312 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
313 return renderNode->stagingProperties().hasOverlappingRendering();
Chris Craik54389792013-12-20 13:28:11 -0800314}
315
Chris Craikdeeda3d2014-05-05 19:09:33 -0700316static jboolean android_view_RenderNode_getClipToOutline(JNIEnv* env,
317 jobject clazz, jlong renderNodePtr) {
318 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
319 return renderNode->stagingProperties().getOutline().getShouldClip();
320}
321
John Reckf666ad72014-03-14 16:24:57 -0700322static jfloat android_view_RenderNode_getAlpha(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700323 jobject clazz, jlong renderNodePtr) {
324 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
325 return renderNode->stagingProperties().getAlpha();
Chris Craik54389792013-12-20 13:28:11 -0800326}
327
John Reckf666ad72014-03-14 16:24:57 -0700328static jfloat android_view_RenderNode_getCameraDistance(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700329 jobject clazz, jlong renderNodePtr) {
330 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
331 return renderNode->stagingProperties().getCameraDistance();
Chris Craik54389792013-12-20 13:28:11 -0800332}
333
John Reckf666ad72014-03-14 16:24:57 -0700334static jfloat android_view_RenderNode_getScaleX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700335 jobject clazz, jlong renderNodePtr) {
336 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
337 return renderNode->stagingProperties().getScaleX();
Chris Craik54389792013-12-20 13:28:11 -0800338}
339
John Reckf666ad72014-03-14 16:24:57 -0700340static jfloat android_view_RenderNode_getScaleY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700341 jobject clazz, jlong renderNodePtr) {
342 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
343 return renderNode->stagingProperties().getScaleY();
Chris Craik54389792013-12-20 13:28:11 -0800344}
345
Chris Craikcc39e162014-04-25 18:34:11 -0700346static jfloat android_view_RenderNode_getElevation(JNIEnv* env,
347 jobject clazz, jlong renderNodePtr) {
348 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
349 return renderNode->stagingProperties().getElevation();
350}
351
John Reckf666ad72014-03-14 16:24:57 -0700352static jfloat android_view_RenderNode_getTranslationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700353 jobject clazz, jlong renderNodePtr) {
354 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
355 return renderNode->stagingProperties().getTranslationX();
Chris Craik54389792013-12-20 13:28:11 -0800356}
357
John Reckf666ad72014-03-14 16:24:57 -0700358static jfloat android_view_RenderNode_getTranslationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700359 jobject clazz, jlong renderNodePtr) {
360 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
361 return renderNode->stagingProperties().getTranslationY();
Chris Craik54389792013-12-20 13:28:11 -0800362}
363
Chris Craik49e6c732014-03-31 12:34:11 -0700364static jfloat android_view_RenderNode_getTranslationZ(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700365 jobject clazz, jlong renderNodePtr) {
366 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
367 return renderNode->stagingProperties().getTranslationZ();
Chris Craik49e6c732014-03-31 12:34:11 -0700368}
369
John Reckf666ad72014-03-14 16:24:57 -0700370static jfloat android_view_RenderNode_getRotation(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700371 jobject clazz, jlong renderNodePtr) {
372 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
373 return renderNode->stagingProperties().getRotation();
Chris Craik54389792013-12-20 13:28:11 -0800374}
375
John Reckf666ad72014-03-14 16:24:57 -0700376static jfloat android_view_RenderNode_getRotationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700377 jobject clazz, jlong renderNodePtr) {
378 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
379 return renderNode->stagingProperties().getRotationX();
Chris Craik54389792013-12-20 13:28:11 -0800380}
381
John Reckf666ad72014-03-14 16:24:57 -0700382static jfloat android_view_RenderNode_getRotationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700383 jobject clazz, jlong renderNodePtr) {
384 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
385 return renderNode->stagingProperties().getRotationY();
Chris Craik54389792013-12-20 13:28:11 -0800386}
387
Chris Craik49e6c732014-03-31 12:34:11 -0700388static jboolean android_view_RenderNode_isPivotExplicitlySet(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700389 jobject clazz, jlong renderNodePtr) {
390 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
391 return renderNode->stagingProperties().isPivotExplicitlySet();
Chris Craik49e6c732014-03-31 12:34:11 -0700392}
393
394static jboolean android_view_RenderNode_hasIdentityMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700395 jobject clazz, jlong renderNodePtr) {
396 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reckf7483e32014-04-11 08:54:47 -0700397 renderNode->mutateStagingProperties().updateMatrix();
398 return !renderNode->stagingProperties().hasTransformMatrix();
Chris Craik49e6c732014-03-31 12:34:11 -0700399}
400
401// ----------------------------------------------------------------------------
402// RenderProperties - computed getters
403// ----------------------------------------------------------------------------
404
405static void android_view_RenderNode_getTransformMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700406 jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
407 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik49e6c732014-03-31 12:34:11 -0700408 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
409
John Reck8de65a82014-04-09 15:23:38 -0700410 renderNode->mutateStagingProperties().updateMatrix();
411 const SkMatrix* transformMatrix = renderNode->stagingProperties().getTransformMatrix();
Chris Craik49e6c732014-03-31 12:34:11 -0700412
John Reckf7483e32014-04-11 08:54:47 -0700413 if (transformMatrix) {
Chris Craik49e6c732014-03-31 12:34:11 -0700414 *outMatrix = *transformMatrix;
415 } else {
416 outMatrix->setIdentity();
417 }
418}
419
420static void android_view_RenderNode_getInverseTransformMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700421 jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
Chris Craik49e6c732014-03-31 12:34:11 -0700422 // load transform matrix
John Reck8de65a82014-04-09 15:23:38 -0700423 android_view_RenderNode_getTransformMatrix(env, clazz, renderNodePtr, outMatrixPtr);
Chris Craik49e6c732014-03-31 12:34:11 -0700424 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
425
426 // return it inverted
427 if (!outMatrix->invert(outMatrix)) {
428 // failed to load inverse, pass back identity
429 outMatrix->setIdentity();
430 }
431}
432
John Reckf666ad72014-03-14 16:24:57 -0700433static jfloat android_view_RenderNode_getPivotX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700434 jobject clazz, jlong renderNodePtr) {
435 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
436 renderNode->mutateStagingProperties().updateMatrix();
437 return renderNode->stagingProperties().getPivotX();
Chris Craik54389792013-12-20 13:28:11 -0800438}
439
John Reckf666ad72014-03-14 16:24:57 -0700440static jfloat android_view_RenderNode_getPivotY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700441 jobject clazz, jlong renderNodePtr) {
442 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
443 renderNode->mutateStagingProperties().updateMatrix();
444 return renderNode->stagingProperties().getPivotY();
Chris Craik54389792013-12-20 13:28:11 -0800445}
446
John Recke45b1fd2014-04-15 09:50:16 -0700447// ----------------------------------------------------------------------------
448// RenderProperties - Animations
449// ----------------------------------------------------------------------------
450
451static void android_view_RenderNode_addAnimator(JNIEnv* env, jobject clazz,
452 jlong renderNodePtr, jlong animatorPtr) {
453 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
454 RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr);
455 renderNode->addAnimator(animator);
456}
457
John Reck119907c2014-08-14 09:02:01 -0700458static void android_view_RenderNode_endAllAnimators(JNIEnv* env, jobject clazz,
459 jlong renderNodePtr) {
460 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Recke2478d42014-09-03 16:46:05 -0700461 renderNode->animators().endAllStagingAnimators();
John Reck119907c2014-08-14 09:02:01 -0700462}
463
Chris Craik54389792013-12-20 13:28:11 -0800464#endif // USE_OPENGL_RENDERER
465
466// ----------------------------------------------------------------------------
467// JNI Glue
468// ----------------------------------------------------------------------------
469
John Reckf666ad72014-03-14 16:24:57 -0700470const char* const kClassPathName = "android/view/RenderNode";
Chris Craik54389792013-12-20 13:28:11 -0800471
472static JNINativeMethod gMethods[] = {
473#ifdef USE_OPENGL_RENDERER
John Reck8de65a82014-04-09 15:23:38 -0700474 { "nCreate", "(Ljava/lang/String;)J", (void*) android_view_RenderNode_create },
475 { "nDestroyRenderNode", "(J)V", (void*) android_view_RenderNode_destroyRenderNode },
476 { "nSetDisplayListData", "(JJ)V", (void*) android_view_RenderNode_setDisplayListData },
John Reckf666ad72014-03-14 16:24:57 -0700477 { "nOutput", "(J)V", (void*) android_view_RenderNode_output },
John Reckfe5e7b72014-05-23 17:42:28 -0700478 { "nGetDebugSize", "(J)I", (void*) android_view_RenderNode_getDebugSize },
Chris Craik54389792013-12-20 13:28:11 -0800479
John Reck25fbb3f2014-06-12 13:46:45 -0700480 { "nSetLayerType", "(JI)Z", (void*) android_view_RenderNode_setLayerType },
481 { "nSetLayerPaint", "(JJ)Z", (void*) android_view_RenderNode_setLayerPaint },
John Reck79c7de72014-05-23 10:33:31 -0700482 { "nSetStaticMatrix", "(JJ)Z", (void*) android_view_RenderNode_setStaticMatrix },
483 { "nSetAnimationMatrix", "(JJ)Z", (void*) android_view_RenderNode_setAnimationMatrix },
484 { "nSetClipToBounds", "(JZ)Z", (void*) android_view_RenderNode_setClipToBounds },
Chris Craika753f4c2014-07-24 12:39:17 -0700485 { "nSetClipBounds", "(JIIII)Z", (void*) android_view_RenderNode_setClipBounds },
486 { "nSetClipBoundsEmpty", "(J)Z", (void*) android_view_RenderNode_setClipBoundsEmpty },
John Reck79c7de72014-05-23 10:33:31 -0700487 { "nSetProjectBackwards", "(JZ)Z", (void*) android_view_RenderNode_setProjectBackwards },
488 { "nSetProjectionReceiver","(JZ)Z", (void*) android_view_RenderNode_setProjectionReceiver },
Chris Craikb49f4462014-03-20 12:44:20 -0700489
Chris Craik77b5cad2014-07-30 18:23:07 -0700490 { "nSetOutlineRoundRect", "(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect },
491 { "nSetOutlineConvexPath", "(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath },
John Reck79c7de72014-05-23 10:33:31 -0700492 { "nSetOutlineEmpty", "(J)Z", (void*) android_view_RenderNode_setOutlineEmpty },
Chris Craik06451282014-07-21 10:25:54 -0700493 { "nSetOutlineNone", "(J)Z", (void*) android_view_RenderNode_setOutlineNone },
John Reck79c7de72014-05-23 10:33:31 -0700494 { "nSetClipToOutline", "(JZ)Z", (void*) android_view_RenderNode_setClipToOutline },
Chris Craikaf4d04c2014-07-29 12:50:14 -0700495 { "nSetRevealClip", "(JZFFF)Z", (void*) android_view_RenderNode_setRevealClip },
Chris Craikb49f4462014-03-20 12:44:20 -0700496
John Reck79c7de72014-05-23 10:33:31 -0700497 { "nSetAlpha", "(JF)Z", (void*) android_view_RenderNode_setAlpha },
498 { "nSetHasOverlappingRendering", "(JZ)Z",
John Reckf666ad72014-03-14 16:24:57 -0700499 (void*) android_view_RenderNode_setHasOverlappingRendering },
John Reck79c7de72014-05-23 10:33:31 -0700500 { "nSetElevation", "(JF)Z", (void*) android_view_RenderNode_setElevation },
501 { "nSetTranslationX", "(JF)Z", (void*) android_view_RenderNode_setTranslationX },
502 { "nSetTranslationY", "(JF)Z", (void*) android_view_RenderNode_setTranslationY },
503 { "nSetTranslationZ", "(JF)Z", (void*) android_view_RenderNode_setTranslationZ },
504 { "nSetRotation", "(JF)Z", (void*) android_view_RenderNode_setRotation },
505 { "nSetRotationX", "(JF)Z", (void*) android_view_RenderNode_setRotationX },
506 { "nSetRotationY", "(JF)Z", (void*) android_view_RenderNode_setRotationY },
507 { "nSetScaleX", "(JF)Z", (void*) android_view_RenderNode_setScaleX },
508 { "nSetScaleY", "(JF)Z", (void*) android_view_RenderNode_setScaleY },
509 { "nSetPivotX", "(JF)Z", (void*) android_view_RenderNode_setPivotX },
510 { "nSetPivotY", "(JF)Z", (void*) android_view_RenderNode_setPivotY },
511 { "nSetCameraDistance", "(JF)Z", (void*) android_view_RenderNode_setCameraDistance },
512 { "nSetLeft", "(JI)Z", (void*) android_view_RenderNode_setLeft },
513 { "nSetTop", "(JI)Z", (void*) android_view_RenderNode_setTop },
514 { "nSetRight", "(JI)Z", (void*) android_view_RenderNode_setRight },
515 { "nSetBottom", "(JI)Z", (void*) android_view_RenderNode_setBottom },
516 { "nSetLeftTopRightBottom","(JIIII)Z", (void*) android_view_RenderNode_setLeftTopRightBottom },
Chris Craika753f4c2014-07-24 12:39:17 -0700517 { "nOffsetLeftAndRight", "(JI)Z", (void*) android_view_RenderNode_offsetLeftAndRight },
518 { "nOffsetTopAndBottom", "(JI)Z", (void*) android_view_RenderNode_offsetTopAndBottom },
Chris Craik54389792013-12-20 13:28:11 -0800519
John Reckf666ad72014-03-14 16:24:57 -0700520 { "nHasOverlappingRendering", "(J)Z", (void*) android_view_RenderNode_hasOverlappingRendering },
Chris Craikdeeda3d2014-05-05 19:09:33 -0700521 { "nGetClipToOutline", "(J)Z", (void*) android_view_RenderNode_getClipToOutline },
John Reckf666ad72014-03-14 16:24:57 -0700522 { "nGetAlpha", "(J)F", (void*) android_view_RenderNode_getAlpha },
John Reckf666ad72014-03-14 16:24:57 -0700523 { "nGetCameraDistance", "(J)F", (void*) android_view_RenderNode_getCameraDistance },
524 { "nGetScaleX", "(J)F", (void*) android_view_RenderNode_getScaleX },
525 { "nGetScaleY", "(J)F", (void*) android_view_RenderNode_getScaleY },
Chris Craikcc39e162014-04-25 18:34:11 -0700526 { "nGetElevation", "(J)F", (void*) android_view_RenderNode_getElevation },
John Reckf666ad72014-03-14 16:24:57 -0700527 { "nGetTranslationX", "(J)F", (void*) android_view_RenderNode_getTranslationX },
528 { "nGetTranslationY", "(J)F", (void*) android_view_RenderNode_getTranslationY },
Chris Craik49e6c732014-03-31 12:34:11 -0700529 { "nGetTranslationZ", "(J)F", (void*) android_view_RenderNode_getTranslationZ },
John Reckf666ad72014-03-14 16:24:57 -0700530 { "nGetRotation", "(J)F", (void*) android_view_RenderNode_getRotation },
531 { "nGetRotationX", "(J)F", (void*) android_view_RenderNode_getRotationX },
532 { "nGetRotationY", "(J)F", (void*) android_view_RenderNode_getRotationY },
Chris Craik49e6c732014-03-31 12:34:11 -0700533 { "nIsPivotExplicitlySet", "(J)Z", (void*) android_view_RenderNode_isPivotExplicitlySet },
534 { "nHasIdentityMatrix", "(J)Z", (void*) android_view_RenderNode_hasIdentityMatrix },
535
536 { "nGetTransformMatrix", "(JJ)V", (void*) android_view_RenderNode_getTransformMatrix },
537 { "nGetInverseTransformMatrix","(JJ)V", (void*) android_view_RenderNode_getInverseTransformMatrix },
538
539 { "nGetPivotX", "(J)F", (void*) android_view_RenderNode_getPivotX },
540 { "nGetPivotY", "(J)F", (void*) android_view_RenderNode_getPivotY },
John Recke45b1fd2014-04-15 09:50:16 -0700541
542 { "nAddAnimator", "(JJ)V", (void*) android_view_RenderNode_addAnimator },
John Reck119907c2014-08-14 09:02:01 -0700543 { "nEndAllAnimators", "(J)V", (void*) android_view_RenderNode_endAllAnimators },
Chris Craik54389792013-12-20 13:28:11 -0800544#endif
545};
546
547#ifdef USE_OPENGL_RENDERER
548 #define FIND_CLASS(var, className) \
549 var = env->FindClass(className); \
550 LOG_FATAL_IF(! var, "Unable to find class " className);
551
552 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
553 var = env->GetMethodID(clazz, methodName, methodDescriptor); \
554 LOG_FATAL_IF(! var, "Unable to find method " methodName);
555#else
556 #define FIND_CLASS(var, className)
557 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
558#endif
559
John Reckf666ad72014-03-14 16:24:57 -0700560int register_android_view_RenderNode(JNIEnv* env) {
Chris Craik54389792013-12-20 13:28:11 -0800561 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
562}
563
564};
565