blob: 2b5a961ab02e1fe323dcc5612526b04848c2a0c3 [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
Andreas Gampe987f79f2014-11-18 17:29:46 -080031#include "core_jni_helpers.h"
32
Chris Craik54389792013-12-20 13:28:11 -080033namespace android {
34
35using namespace uirenderer;
36
John Reck79c7de72014-05-23 10:33:31 -070037#define SET_AND_DIRTY(prop, val, dirtyFlag) \
38 (reinterpret_cast<RenderNode*>(renderNodePtr)->mutateStagingProperties().prop(val) \
39 ? (reinterpret_cast<RenderNode*>(renderNodePtr)->setPropertyFieldsDirty(dirtyFlag), true) \
40 : false)
41
Chris Craik54389792013-12-20 13:28:11 -080042// ----------------------------------------------------------------------------
43// DisplayList view properties
44// ----------------------------------------------------------------------------
45
John Reck8de65a82014-04-09 15:23:38 -070046static void android_view_RenderNode_output(JNIEnv* env,
47 jobject clazz, jlong renderNodePtr) {
48 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
49 renderNode->output();
50}
51
John Reckfe5e7b72014-05-23 17:42:28 -070052static jint android_view_RenderNode_getDebugSize(JNIEnv* env,
53 jobject clazz, jlong renderNodePtr) {
54 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
55 return renderNode->getDebugSize();
56}
57
John Reck8de65a82014-04-09 15:23:38 -070058static jlong android_view_RenderNode_create(JNIEnv* env, jobject clazz, jstring name) {
59 RenderNode* renderNode = new RenderNode();
60 renderNode->incStrong(0);
Chris Craik54389792013-12-20 13:28:11 -080061 if (name != NULL) {
62 const char* textArray = env->GetStringUTFChars(name, NULL);
John Reck8de65a82014-04-09 15:23:38 -070063 renderNode->setName(textArray);
Chris Craik54389792013-12-20 13:28:11 -080064 env->ReleaseStringUTFChars(name, textArray);
65 }
John Reck8de65a82014-04-09 15:23:38 -070066 return reinterpret_cast<jlong>(renderNode);
Chris Craik54389792013-12-20 13:28:11 -080067}
68
John Reck8de65a82014-04-09 15:23:38 -070069static void android_view_RenderNode_destroyRenderNode(JNIEnv* env,
70 jobject clazz, jlong renderNodePtr) {
71 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
72 renderNode->decStrong(0);
Chris Craik54389792013-12-20 13:28:11 -080073}
74
John Reck8de65a82014-04-09 15:23:38 -070075static void android_view_RenderNode_setDisplayListData(JNIEnv* env,
76 jobject clazz, jlong renderNodePtr, jlong newDataPtr) {
77 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
78 DisplayListData* newData = reinterpret_cast<DisplayListData*>(newDataPtr);
79 renderNode->setStagingDisplayList(newData);
Chris Craik54389792013-12-20 13:28:11 -080080}
81
82// ----------------------------------------------------------------------------
Chris Craik49e6c732014-03-31 12:34:11 -070083// RenderProperties - setters
Chris Craik54389792013-12-20 13:28:11 -080084// ----------------------------------------------------------------------------
85
John Reck25fbb3f2014-06-12 13:46:45 -070086static jboolean android_view_RenderNode_setLayerType(JNIEnv* env,
87 jobject clazz, jlong renderNodePtr, jint jlayerType) {
88 LayerType layerType = static_cast<LayerType>(jlayerType);
89 return SET_AND_DIRTY(mutateLayerProperties().setType, layerType, RenderNode::GENERIC);
90}
91
92static jboolean android_view_RenderNode_setLayerPaint(JNIEnv* env,
93 jobject clazz, jlong renderNodePtr, jlong paintPtr) {
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -040094 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
John Reck25fbb3f2014-06-12 13:46:45 -070095 return SET_AND_DIRTY(mutateLayerProperties().setFromPaint, paint, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -080096}
97
John Reck79c7de72014-05-23 10:33:31 -070098static jboolean android_view_RenderNode_setStaticMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -070099 jobject clazz, jlong renderNodePtr, jlong matrixPtr) {
Chris Craik7a02ea32013-12-27 16:43:22 -0800100 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
John Reck79c7de72014-05-23 10:33:31 -0700101 return SET_AND_DIRTY(setStaticMatrix, matrix, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800102}
103
John Reck79c7de72014-05-23 10:33:31 -0700104static jboolean android_view_RenderNode_setAnimationMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700105 jobject clazz, 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(setAnimationMatrix, matrix, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800108}
109
John Reck79c7de72014-05-23 10:33:31 -0700110static jboolean android_view_RenderNode_setClipToBounds(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700111 jobject clazz, jlong renderNodePtr, jboolean clipToBounds) {
John Reck79c7de72014-05-23 10:33:31 -0700112 return SET_AND_DIRTY(setClipToBounds, clipToBounds, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800113}
114
Chris Craika753f4c2014-07-24 12:39:17 -0700115static jboolean android_view_RenderNode_setClipBounds(JNIEnv* env,
116 jobject clazz, jlong renderNodePtr, jint left, jint top, jint right, jint bottom) {
117 android::uirenderer::Rect clipBounds(left, top, right, bottom);
118 return SET_AND_DIRTY(setClipBounds, clipBounds, RenderNode::GENERIC);
119}
120
121static jboolean android_view_RenderNode_setClipBoundsEmpty(JNIEnv* env,
122 jobject clazz, jlong renderNodePtr) {
123 return SET_AND_DIRTY(setClipBoundsEmpty,, RenderNode::GENERIC);
124}
125
John Reck79c7de72014-05-23 10:33:31 -0700126static jboolean android_view_RenderNode_setProjectBackwards(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700127 jobject clazz, jlong renderNodePtr, jboolean shouldProject) {
John Reck79c7de72014-05-23 10:33:31 -0700128 return SET_AND_DIRTY(setProjectBackwards, shouldProject, RenderNode::GENERIC);
Alan Viverette58f09b32014-01-08 17:18:19 -0800129}
130
John Reck79c7de72014-05-23 10:33:31 -0700131static jboolean android_view_RenderNode_setProjectionReceiver(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700132 jobject clazz, jlong renderNodePtr, jboolean shouldRecieve) {
John Reck79c7de72014-05-23 10:33:31 -0700133 return SET_AND_DIRTY(setProjectionReceiver, shouldRecieve, RenderNode::GENERIC);
Chris Craik1df26442014-02-05 16:50:41 -0800134}
135
John Reck79c7de72014-05-23 10:33:31 -0700136static jboolean android_view_RenderNode_setOutlineRoundRect(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700137 jobject clazz, jlong renderNodePtr, jint left, jint top,
Chris Craik77b5cad2014-07-30 18:23:07 -0700138 jint right, jint bottom, jfloat radius, jfloat alpha) {
John Reck8de65a82014-04-09 15:23:38 -0700139 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik77b5cad2014-07-30 18:23:07 -0700140 renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom,
141 radius, alpha);
John Reckff941dc2014-05-14 16:34:14 -0700142 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700143 return true;
Chris Craikb49f4462014-03-20 12:44:20 -0700144}
Chris Craik8c271ca2014-03-25 10:33:01 -0700145
John Reck79c7de72014-05-23 10:33:31 -0700146static jboolean android_view_RenderNode_setOutlineConvexPath(JNIEnv* env,
Chris Craik77b5cad2014-07-30 18:23:07 -0700147 jobject clazz, jlong renderNodePtr, jlong outlinePathPtr, jfloat alpha) {
John Reck8de65a82014-04-09 15:23:38 -0700148 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craikb49f4462014-03-20 12:44:20 -0700149 SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr);
Chris Craik77b5cad2014-07-30 18:23:07 -0700150 renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath, alpha);
John Reckff941dc2014-05-14 16:34:14 -0700151 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700152 return true;
Chris Craikb49f4462014-03-20 12:44:20 -0700153}
Chris Craik8c271ca2014-03-25 10:33:01 -0700154
John Reck79c7de72014-05-23 10:33:31 -0700155static jboolean android_view_RenderNode_setOutlineEmpty(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700156 jobject clazz, jlong renderNodePtr) {
157 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
158 renderNode->mutateStagingProperties().mutableOutline().setEmpty();
John Reckff941dc2014-05-14 16:34:14 -0700159 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700160 return true;
Chris Craika2fe7af2014-01-28 17:25:06 -0800161}
162
Chris Craik06451282014-07-21 10:25:54 -0700163static jboolean android_view_RenderNode_setOutlineNone(JNIEnv* env,
164 jobject clazz, jlong renderNodePtr) {
165 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
166 renderNode->mutateStagingProperties().mutableOutline().setNone();
167 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
168 return true;
169}
170
Chris Craik5c75c522014-09-05 14:08:08 -0700171static jboolean android_view_RenderNode_hasShadow(JNIEnv* env,
172 jobject clazz, jlong renderNodePtr) {
173 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
174 return renderNode->stagingProperties().hasShadow();
175}
176
John Reck79c7de72014-05-23 10:33:31 -0700177static jboolean android_view_RenderNode_setClipToOutline(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700178 jobject clazz, jlong renderNodePtr, jboolean clipToOutline) {
179 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
180 renderNode->mutateStagingProperties().mutableOutline().setShouldClip(clipToOutline);
John Reckff941dc2014-05-14 16:34:14 -0700181 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700182 return true;
Chris Craik8c271ca2014-03-25 10:33:01 -0700183}
184
John Reck79c7de72014-05-23 10:33:31 -0700185static jboolean android_view_RenderNode_setRevealClip(JNIEnv* env,
Chris Craikaf4d04c2014-07-29 12:50:14 -0700186 jobject clazz, jlong renderNodePtr, jboolean shouldClip,
Chris Craik8c271ca2014-03-25 10:33:01 -0700187 jfloat x, jfloat y, jfloat radius) {
John Reck8de65a82014-04-09 15:23:38 -0700188 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
189 renderNode->mutateStagingProperties().mutableRevealClip().set(
Chris Craikaf4d04c2014-07-29 12:50:14 -0700190 shouldClip, x, y, radius);
John Reckff941dc2014-05-14 16:34:14 -0700191 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
John Reck79c7de72014-05-23 10:33:31 -0700192 return true;
ztenghuifad45932014-02-06 10:33:58 -0800193}
194
John Reck79c7de72014-05-23 10:33:31 -0700195static jboolean android_view_RenderNode_setAlpha(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700196 jobject clazz, jlong renderNodePtr, float alpha) {
John Reck79c7de72014-05-23 10:33:31 -0700197 return SET_AND_DIRTY(setAlpha, alpha, RenderNode::ALPHA);
Chris Craik54389792013-12-20 13:28:11 -0800198}
199
John Reck79c7de72014-05-23 10:33:31 -0700200static jboolean android_view_RenderNode_setHasOverlappingRendering(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700201 jobject clazz, jlong renderNodePtr, bool hasOverlappingRendering) {
John Reck79c7de72014-05-23 10:33:31 -0700202 return SET_AND_DIRTY(setHasOverlappingRendering, hasOverlappingRendering,
203 RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800204}
205
John Reck79c7de72014-05-23 10:33:31 -0700206static jboolean android_view_RenderNode_setElevation(JNIEnv* env,
Chris Craikcc39e162014-04-25 18:34:11 -0700207 jobject clazz, jlong renderNodePtr, float elevation) {
John Reck79c7de72014-05-23 10:33:31 -0700208 return SET_AND_DIRTY(setElevation, elevation, RenderNode::Z);
Chris Craikcc39e162014-04-25 18:34:11 -0700209}
210
John Reck79c7de72014-05-23 10:33:31 -0700211static jboolean android_view_RenderNode_setTranslationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700212 jobject clazz, jlong renderNodePtr, float tx) {
John Reck79c7de72014-05-23 10:33:31 -0700213 return SET_AND_DIRTY(setTranslationX, tx, RenderNode::TRANSLATION_X | RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800214}
215
John Reck79c7de72014-05-23 10:33:31 -0700216static jboolean android_view_RenderNode_setTranslationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700217 jobject clazz, jlong renderNodePtr, float ty) {
John Reck79c7de72014-05-23 10:33:31 -0700218 return SET_AND_DIRTY(setTranslationY, ty, RenderNode::TRANSLATION_Y | RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800219}
220
John Reck79c7de72014-05-23 10:33:31 -0700221static jboolean android_view_RenderNode_setTranslationZ(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700222 jobject clazz, jlong renderNodePtr, float tz) {
John Reck79c7de72014-05-23 10:33:31 -0700223 return SET_AND_DIRTY(setTranslationZ, tz, RenderNode::TRANSLATION_Z | RenderNode::Z);
Chris Craik54389792013-12-20 13:28:11 -0800224}
225
John Reck79c7de72014-05-23 10:33:31 -0700226static jboolean android_view_RenderNode_setRotation(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700227 jobject clazz, jlong renderNodePtr, float rotation) {
John Reck79c7de72014-05-23 10:33:31 -0700228 return SET_AND_DIRTY(setRotation, rotation, RenderNode::ROTATION);
Chris Craik54389792013-12-20 13:28:11 -0800229}
230
John Reck79c7de72014-05-23 10:33:31 -0700231static jboolean android_view_RenderNode_setRotationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700232 jobject clazz, jlong renderNodePtr, float rx) {
John Reck79c7de72014-05-23 10:33:31 -0700233 return SET_AND_DIRTY(setRotationX, rx, RenderNode::ROTATION_X);
Chris Craik54389792013-12-20 13:28:11 -0800234}
235
John Reck79c7de72014-05-23 10:33:31 -0700236static jboolean android_view_RenderNode_setRotationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700237 jobject clazz, jlong renderNodePtr, float ry) {
John Reck79c7de72014-05-23 10:33:31 -0700238 return SET_AND_DIRTY(setRotationY, ry, RenderNode::ROTATION_Y);
Chris Craik54389792013-12-20 13:28:11 -0800239}
240
John Reck79c7de72014-05-23 10:33:31 -0700241static jboolean android_view_RenderNode_setScaleX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700242 jobject clazz, jlong renderNodePtr, float sx) {
John Reck79c7de72014-05-23 10:33:31 -0700243 return SET_AND_DIRTY(setScaleX, sx, RenderNode::SCALE_X);
Chris Craik54389792013-12-20 13:28:11 -0800244}
245
John Reck79c7de72014-05-23 10:33:31 -0700246static jboolean android_view_RenderNode_setScaleY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700247 jobject clazz, jlong renderNodePtr, float sy) {
John Reck79c7de72014-05-23 10:33:31 -0700248 return SET_AND_DIRTY(setScaleY, sy, RenderNode::SCALE_Y);
Chris Craik54389792013-12-20 13:28:11 -0800249}
250
John Reck79c7de72014-05-23 10:33:31 -0700251static jboolean android_view_RenderNode_setPivotX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700252 jobject clazz, jlong renderNodePtr, float px) {
John Reck79c7de72014-05-23 10:33:31 -0700253 return SET_AND_DIRTY(setPivotX, px, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800254}
255
John Reck79c7de72014-05-23 10:33:31 -0700256static jboolean android_view_RenderNode_setPivotY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700257 jobject clazz, jlong renderNodePtr, float py) {
John Reck79c7de72014-05-23 10:33:31 -0700258 return SET_AND_DIRTY(setPivotY, py, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800259}
260
John Reck79c7de72014-05-23 10:33:31 -0700261static jboolean android_view_RenderNode_setCameraDistance(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700262 jobject clazz, jlong renderNodePtr, float distance) {
John Reck79c7de72014-05-23 10:33:31 -0700263 return SET_AND_DIRTY(setCameraDistance, distance, RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800264}
265
John Reck79c7de72014-05-23 10:33:31 -0700266static jboolean android_view_RenderNode_setLeft(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700267 jobject clazz, jlong renderNodePtr, int left) {
John Reck79c7de72014-05-23 10:33:31 -0700268 return SET_AND_DIRTY(setLeft, left, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800269}
270
John Reck79c7de72014-05-23 10:33:31 -0700271static jboolean android_view_RenderNode_setTop(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700272 jobject clazz, jlong renderNodePtr, int top) {
John Reck79c7de72014-05-23 10:33:31 -0700273 return SET_AND_DIRTY(setTop, top, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800274}
275
John Reck79c7de72014-05-23 10:33:31 -0700276static jboolean android_view_RenderNode_setRight(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700277 jobject clazz, jlong renderNodePtr, int right) {
John Reck79c7de72014-05-23 10:33:31 -0700278 return SET_AND_DIRTY(setRight, right, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800279}
280
John Reck79c7de72014-05-23 10:33:31 -0700281static jboolean android_view_RenderNode_setBottom(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700282 jobject clazz, jlong renderNodePtr, int bottom) {
John Reck79c7de72014-05-23 10:33:31 -0700283 return SET_AND_DIRTY(setBottom, bottom, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800284}
285
John Reck79c7de72014-05-23 10:33:31 -0700286static jboolean android_view_RenderNode_setLeftTopRightBottom(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700287 jobject clazz, jlong renderNodePtr, int left, int top,
Chris Craik54389792013-12-20 13:28:11 -0800288 int right, int bottom) {
John Reck8de65a82014-04-09 15:23:38 -0700289 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reck79c7de72014-05-23 10:33:31 -0700290 if (renderNode->mutateStagingProperties().setLeftTopRightBottom(left, top, right, bottom)) {
291 renderNode->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
292 return true;
293 }
294 return false;
Chris Craik54389792013-12-20 13:28:11 -0800295}
296
John Reck79c7de72014-05-23 10:33:31 -0700297static jboolean android_view_RenderNode_offsetLeftAndRight(JNIEnv* env,
Chris Craika753f4c2014-07-24 12:39:17 -0700298 jobject clazz, jlong renderNodePtr, jint offset) {
John Reck79c7de72014-05-23 10:33:31 -0700299 return SET_AND_DIRTY(offsetLeftRight, offset, RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800300}
301
John Reck79c7de72014-05-23 10:33:31 -0700302static jboolean android_view_RenderNode_offsetTopAndBottom(JNIEnv* env,
Chris Craika753f4c2014-07-24 12:39:17 -0700303 jobject clazz, jlong renderNodePtr, jint offset) {
John Reck79c7de72014-05-23 10:33:31 -0700304 return SET_AND_DIRTY(offsetTopBottom, offset, RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800305}
306
Chris Craik49e6c732014-03-31 12:34:11 -0700307// ----------------------------------------------------------------------------
308// RenderProperties - getters
309// ----------------------------------------------------------------------------
310
John Reckf666ad72014-03-14 16:24:57 -0700311static jboolean android_view_RenderNode_hasOverlappingRendering(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700312 jobject clazz, jlong renderNodePtr) {
313 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
314 return renderNode->stagingProperties().hasOverlappingRendering();
Chris Craik54389792013-12-20 13:28:11 -0800315}
316
Chris Craikdeeda3d2014-05-05 19:09:33 -0700317static jboolean android_view_RenderNode_getClipToOutline(JNIEnv* env,
318 jobject clazz, jlong renderNodePtr) {
319 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
320 return renderNode->stagingProperties().getOutline().getShouldClip();
321}
322
John Reckf666ad72014-03-14 16:24:57 -0700323static jfloat android_view_RenderNode_getAlpha(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700324 jobject clazz, jlong renderNodePtr) {
325 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
326 return renderNode->stagingProperties().getAlpha();
Chris Craik54389792013-12-20 13:28:11 -0800327}
328
John Reckf666ad72014-03-14 16:24:57 -0700329static jfloat android_view_RenderNode_getCameraDistance(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700330 jobject clazz, jlong renderNodePtr) {
331 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
332 return renderNode->stagingProperties().getCameraDistance();
Chris Craik54389792013-12-20 13:28:11 -0800333}
334
John Reckf666ad72014-03-14 16:24:57 -0700335static jfloat android_view_RenderNode_getScaleX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700336 jobject clazz, jlong renderNodePtr) {
337 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
338 return renderNode->stagingProperties().getScaleX();
Chris Craik54389792013-12-20 13:28:11 -0800339}
340
John Reckf666ad72014-03-14 16:24:57 -0700341static jfloat android_view_RenderNode_getScaleY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700342 jobject clazz, jlong renderNodePtr) {
343 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
344 return renderNode->stagingProperties().getScaleY();
Chris Craik54389792013-12-20 13:28:11 -0800345}
346
Chris Craikcc39e162014-04-25 18:34:11 -0700347static jfloat android_view_RenderNode_getElevation(JNIEnv* env,
348 jobject clazz, jlong renderNodePtr) {
349 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
350 return renderNode->stagingProperties().getElevation();
351}
352
John Reckf666ad72014-03-14 16:24:57 -0700353static jfloat android_view_RenderNode_getTranslationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700354 jobject clazz, jlong renderNodePtr) {
355 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
356 return renderNode->stagingProperties().getTranslationX();
Chris Craik54389792013-12-20 13:28:11 -0800357}
358
John Reckf666ad72014-03-14 16:24:57 -0700359static jfloat android_view_RenderNode_getTranslationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700360 jobject clazz, jlong renderNodePtr) {
361 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
362 return renderNode->stagingProperties().getTranslationY();
Chris Craik54389792013-12-20 13:28:11 -0800363}
364
Chris Craik49e6c732014-03-31 12:34:11 -0700365static jfloat android_view_RenderNode_getTranslationZ(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700366 jobject clazz, jlong renderNodePtr) {
367 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
368 return renderNode->stagingProperties().getTranslationZ();
Chris Craik49e6c732014-03-31 12:34:11 -0700369}
370
John Reckf666ad72014-03-14 16:24:57 -0700371static jfloat android_view_RenderNode_getRotation(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700372 jobject clazz, jlong renderNodePtr) {
373 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
374 return renderNode->stagingProperties().getRotation();
Chris Craik54389792013-12-20 13:28:11 -0800375}
376
John Reckf666ad72014-03-14 16:24:57 -0700377static jfloat android_view_RenderNode_getRotationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700378 jobject clazz, jlong renderNodePtr) {
379 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
380 return renderNode->stagingProperties().getRotationX();
Chris Craik54389792013-12-20 13:28:11 -0800381}
382
John Reckf666ad72014-03-14 16:24:57 -0700383static jfloat android_view_RenderNode_getRotationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700384 jobject clazz, jlong renderNodePtr) {
385 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
386 return renderNode->stagingProperties().getRotationY();
Chris Craik54389792013-12-20 13:28:11 -0800387}
388
Chris Craik49e6c732014-03-31 12:34:11 -0700389static jboolean android_view_RenderNode_isPivotExplicitlySet(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700390 jobject clazz, jlong renderNodePtr) {
391 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
392 return renderNode->stagingProperties().isPivotExplicitlySet();
Chris Craik49e6c732014-03-31 12:34:11 -0700393}
394
395static jboolean android_view_RenderNode_hasIdentityMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700396 jobject clazz, jlong renderNodePtr) {
397 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reckf7483e32014-04-11 08:54:47 -0700398 renderNode->mutateStagingProperties().updateMatrix();
399 return !renderNode->stagingProperties().hasTransformMatrix();
Chris Craik49e6c732014-03-31 12:34:11 -0700400}
401
402// ----------------------------------------------------------------------------
403// RenderProperties - computed getters
404// ----------------------------------------------------------------------------
405
406static void android_view_RenderNode_getTransformMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700407 jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
408 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik49e6c732014-03-31 12:34:11 -0700409 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
410
John Reck8de65a82014-04-09 15:23:38 -0700411 renderNode->mutateStagingProperties().updateMatrix();
412 const SkMatrix* transformMatrix = renderNode->stagingProperties().getTransformMatrix();
Chris Craik49e6c732014-03-31 12:34:11 -0700413
John Reckf7483e32014-04-11 08:54:47 -0700414 if (transformMatrix) {
Chris Craik49e6c732014-03-31 12:34:11 -0700415 *outMatrix = *transformMatrix;
416 } else {
417 outMatrix->setIdentity();
418 }
419}
420
421static void android_view_RenderNode_getInverseTransformMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700422 jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
Chris Craik49e6c732014-03-31 12:34:11 -0700423 // load transform matrix
John Reck8de65a82014-04-09 15:23:38 -0700424 android_view_RenderNode_getTransformMatrix(env, clazz, renderNodePtr, outMatrixPtr);
Chris Craik49e6c732014-03-31 12:34:11 -0700425 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
426
427 // return it inverted
428 if (!outMatrix->invert(outMatrix)) {
429 // failed to load inverse, pass back identity
430 outMatrix->setIdentity();
431 }
432}
433
John Reckf666ad72014-03-14 16:24:57 -0700434static jfloat android_view_RenderNode_getPivotX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700435 jobject clazz, jlong renderNodePtr) {
436 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
437 renderNode->mutateStagingProperties().updateMatrix();
438 return renderNode->stagingProperties().getPivotX();
Chris Craik54389792013-12-20 13:28:11 -0800439}
440
John Reckf666ad72014-03-14 16:24:57 -0700441static jfloat android_view_RenderNode_getPivotY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700442 jobject clazz, jlong renderNodePtr) {
443 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
444 renderNode->mutateStagingProperties().updateMatrix();
445 return renderNode->stagingProperties().getPivotY();
Chris Craik54389792013-12-20 13:28:11 -0800446}
447
John Recke45b1fd2014-04-15 09:50:16 -0700448// ----------------------------------------------------------------------------
449// RenderProperties - Animations
450// ----------------------------------------------------------------------------
451
452static void android_view_RenderNode_addAnimator(JNIEnv* env, jobject clazz,
453 jlong renderNodePtr, jlong animatorPtr) {
454 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
455 RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr);
456 renderNode->addAnimator(animator);
457}
458
John Reck119907c2014-08-14 09:02:01 -0700459static void android_view_RenderNode_endAllAnimators(JNIEnv* env, jobject clazz,
460 jlong renderNodePtr) {
461 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Recke2478d42014-09-03 16:46:05 -0700462 renderNode->animators().endAllStagingAnimators();
John Reck119907c2014-08-14 09:02:01 -0700463}
464
Chris Craik54389792013-12-20 13:28:11 -0800465// ----------------------------------------------------------------------------
466// JNI Glue
467// ----------------------------------------------------------------------------
468
John Reckf666ad72014-03-14 16:24:57 -0700469const char* const kClassPathName = "android/view/RenderNode";
Chris Craik54389792013-12-20 13:28:11 -0800470
471static JNINativeMethod gMethods[] = {
John Reck8de65a82014-04-09 15:23:38 -0700472 { "nCreate", "(Ljava/lang/String;)J", (void*) android_view_RenderNode_create },
473 { "nDestroyRenderNode", "(J)V", (void*) android_view_RenderNode_destroyRenderNode },
474 { "nSetDisplayListData", "(JJ)V", (void*) android_view_RenderNode_setDisplayListData },
John Reckf666ad72014-03-14 16:24:57 -0700475 { "nOutput", "(J)V", (void*) android_view_RenderNode_output },
John Reckfe5e7b72014-05-23 17:42:28 -0700476 { "nGetDebugSize", "(J)I", (void*) android_view_RenderNode_getDebugSize },
Chris Craik54389792013-12-20 13:28:11 -0800477
Chris Craik4136a0a2014-10-07 15:09:46 -0700478 { "nSetLayerType", "!(JI)Z", (void*) android_view_RenderNode_setLayerType },
479 { "nSetLayerPaint", "!(JJ)Z", (void*) android_view_RenderNode_setLayerPaint },
480 { "nSetStaticMatrix", "!(JJ)Z", (void*) android_view_RenderNode_setStaticMatrix },
481 { "nSetAnimationMatrix", "!(JJ)Z", (void*) android_view_RenderNode_setAnimationMatrix },
482 { "nSetClipToBounds", "!(JZ)Z", (void*) android_view_RenderNode_setClipToBounds },
483 { "nSetClipBounds", "!(JIIII)Z", (void*) android_view_RenderNode_setClipBounds },
484 { "nSetClipBoundsEmpty", "!(J)Z", (void*) android_view_RenderNode_setClipBoundsEmpty },
485 { "nSetProjectBackwards", "!(JZ)Z", (void*) android_view_RenderNode_setProjectBackwards },
486 { "nSetProjectionReceiver","!(JZ)Z", (void*) android_view_RenderNode_setProjectionReceiver },
Chris Craikb49f4462014-03-20 12:44:20 -0700487
Chris Craik77b5cad2014-07-30 18:23:07 -0700488 { "nSetOutlineRoundRect", "(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect },
489 { "nSetOutlineConvexPath", "(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath },
John Reck79c7de72014-05-23 10:33:31 -0700490 { "nSetOutlineEmpty", "(J)Z", (void*) android_view_RenderNode_setOutlineEmpty },
Chris Craik06451282014-07-21 10:25:54 -0700491 { "nSetOutlineNone", "(J)Z", (void*) android_view_RenderNode_setOutlineNone },
Chris Craik4136a0a2014-10-07 15:09:46 -0700492 { "nHasShadow", "!(J)Z", (void*) android_view_RenderNode_hasShadow },
493 { "nSetClipToOutline", "!(JZ)Z", (void*) android_view_RenderNode_setClipToOutline },
Chris Craikaf4d04c2014-07-29 12:50:14 -0700494 { "nSetRevealClip", "(JZFFF)Z", (void*) android_view_RenderNode_setRevealClip },
Chris Craikb49f4462014-03-20 12:44:20 -0700495
Chris Craik4136a0a2014-10-07 15:09:46 -0700496 { "nSetAlpha", "!(JF)Z", (void*) android_view_RenderNode_setAlpha },
497 { "nSetHasOverlappingRendering", "!(JZ)Z",
John Reckf666ad72014-03-14 16:24:57 -0700498 (void*) android_view_RenderNode_setHasOverlappingRendering },
Chris Craik4136a0a2014-10-07 15:09:46 -0700499 { "nSetElevation", "!(JF)Z", (void*) android_view_RenderNode_setElevation },
500 { "nSetTranslationX", "!(JF)Z", (void*) android_view_RenderNode_setTranslationX },
501 { "nSetTranslationY", "!(JF)Z", (void*) android_view_RenderNode_setTranslationY },
502 { "nSetTranslationZ", "!(JF)Z", (void*) android_view_RenderNode_setTranslationZ },
503 { "nSetRotation", "!(JF)Z", (void*) android_view_RenderNode_setRotation },
504 { "nSetRotationX", "!(JF)Z", (void*) android_view_RenderNode_setRotationX },
505 { "nSetRotationY", "!(JF)Z", (void*) android_view_RenderNode_setRotationY },
506 { "nSetScaleX", "!(JF)Z", (void*) android_view_RenderNode_setScaleX },
507 { "nSetScaleY", "!(JF)Z", (void*) android_view_RenderNode_setScaleY },
508 { "nSetPivotX", "!(JF)Z", (void*) android_view_RenderNode_setPivotX },
509 { "nSetPivotY", "!(JF)Z", (void*) android_view_RenderNode_setPivotY },
510 { "nSetCameraDistance", "!(JF)Z", (void*) android_view_RenderNode_setCameraDistance },
511 { "nSetLeft", "!(JI)Z", (void*) android_view_RenderNode_setLeft },
512 { "nSetTop", "!(JI)Z", (void*) android_view_RenderNode_setTop },
513 { "nSetRight", "!(JI)Z", (void*) android_view_RenderNode_setRight },
514 { "nSetBottom", "!(JI)Z", (void*) android_view_RenderNode_setBottom },
515 { "nSetLeftTopRightBottom","!(JIIII)Z", (void*) android_view_RenderNode_setLeftTopRightBottom },
516 { "nOffsetLeftAndRight", "!(JI)Z", (void*) android_view_RenderNode_offsetLeftAndRight },
517 { "nOffsetTopAndBottom", "!(JI)Z", (void*) android_view_RenderNode_offsetTopAndBottom },
Chris Craik54389792013-12-20 13:28:11 -0800518
Chris Craik4136a0a2014-10-07 15:09:46 -0700519 { "nHasOverlappingRendering", "!(J)Z", (void*) android_view_RenderNode_hasOverlappingRendering },
520 { "nGetClipToOutline", "!(J)Z", (void*) android_view_RenderNode_getClipToOutline },
521 { "nGetAlpha", "!(J)F", (void*) android_view_RenderNode_getAlpha },
522 { "nGetCameraDistance", "!(J)F", (void*) android_view_RenderNode_getCameraDistance },
523 { "nGetScaleX", "!(J)F", (void*) android_view_RenderNode_getScaleX },
524 { "nGetScaleY", "!(J)F", (void*) android_view_RenderNode_getScaleY },
525 { "nGetElevation", "!(J)F", (void*) android_view_RenderNode_getElevation },
526 { "nGetTranslationX", "!(J)F", (void*) android_view_RenderNode_getTranslationX },
527 { "nGetTranslationY", "!(J)F", (void*) android_view_RenderNode_getTranslationY },
528 { "nGetTranslationZ", "!(J)F", (void*) android_view_RenderNode_getTranslationZ },
529 { "nGetRotation", "!(J)F", (void*) android_view_RenderNode_getRotation },
530 { "nGetRotationX", "!(J)F", (void*) android_view_RenderNode_getRotationX },
531 { "nGetRotationY", "!(J)F", (void*) android_view_RenderNode_getRotationY },
532 { "nIsPivotExplicitlySet", "!(J)Z", (void*) android_view_RenderNode_isPivotExplicitlySet },
533 { "nHasIdentityMatrix", "!(J)Z", (void*) android_view_RenderNode_hasIdentityMatrix },
Chris Craik49e6c732014-03-31 12:34:11 -0700534
Chris Craik4136a0a2014-10-07 15:09:46 -0700535 { "nGetTransformMatrix", "!(JJ)V", (void*) android_view_RenderNode_getTransformMatrix },
536 { "nGetInverseTransformMatrix","!(JJ)V", (void*) android_view_RenderNode_getInverseTransformMatrix },
Chris Craik49e6c732014-03-31 12:34:11 -0700537
Chris Craik4136a0a2014-10-07 15:09:46 -0700538 { "nGetPivotX", "!(J)F", (void*) android_view_RenderNode_getPivotX },
539 { "nGetPivotY", "!(J)F", (void*) android_view_RenderNode_getPivotY },
John Recke45b1fd2014-04-15 09:50:16 -0700540
541 { "nAddAnimator", "(JJ)V", (void*) android_view_RenderNode_addAnimator },
John Reck119907c2014-08-14 09:02:01 -0700542 { "nEndAllAnimators", "(J)V", (void*) android_view_RenderNode_endAllAnimators },
Chris Craik54389792013-12-20 13:28:11 -0800543};
544
John Reckf666ad72014-03-14 16:24:57 -0700545int register_android_view_RenderNode(JNIEnv* env) {
Andreas Gampe987f79f2014-11-18 17:29:46 -0800546 return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
Chris Craik54389792013-12-20 13:28:11 -0800547}
548
549};
550