blob: 26022e0afe9136609f32101dc21dc60aad52d6f0 [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>
Chris Craik54389792013-12-20 13:28:11 -080029
30namespace android {
31
32using namespace uirenderer;
33
34/**
35 * Note: OpenGLRenderer JNI layer is generated and compiled only on supported
36 * devices. This means all the logic must be compiled only when the
37 * preprocessor variable USE_OPENGL_RENDERER is defined.
38 */
39#ifdef USE_OPENGL_RENDERER
40
41// ----------------------------------------------------------------------------
42// DisplayList view properties
43// ----------------------------------------------------------------------------
44
John Reck8de65a82014-04-09 15:23:38 -070045static void android_view_RenderNode_output(JNIEnv* env,
46 jobject clazz, jlong renderNodePtr) {
47 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
48 renderNode->output();
49}
50
John Reckfe5e7b72014-05-23 17:42:28 -070051static jint android_view_RenderNode_getDebugSize(JNIEnv* env,
52 jobject clazz, jlong renderNodePtr) {
53 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
54 return renderNode->getDebugSize();
55}
56
John Reck8de65a82014-04-09 15:23:38 -070057static jlong android_view_RenderNode_create(JNIEnv* env, jobject clazz, jstring name) {
58 RenderNode* renderNode = new RenderNode();
59 renderNode->incStrong(0);
Chris Craik54389792013-12-20 13:28:11 -080060 if (name != NULL) {
61 const char* textArray = env->GetStringUTFChars(name, NULL);
John Reck8de65a82014-04-09 15:23:38 -070062 renderNode->setName(textArray);
Chris Craik54389792013-12-20 13:28:11 -080063 env->ReleaseStringUTFChars(name, textArray);
64 }
John Reck8de65a82014-04-09 15:23:38 -070065 return reinterpret_cast<jlong>(renderNode);
Chris Craik54389792013-12-20 13:28:11 -080066}
67
John Reck8de65a82014-04-09 15:23:38 -070068static void android_view_RenderNode_destroyRenderNode(JNIEnv* env,
69 jobject clazz, jlong renderNodePtr) {
70 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
71 renderNode->decStrong(0);
Chris Craik54389792013-12-20 13:28:11 -080072}
73
John Reck8de65a82014-04-09 15:23:38 -070074static void android_view_RenderNode_setDisplayListData(JNIEnv* env,
75 jobject clazz, jlong renderNodePtr, jlong newDataPtr) {
76 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
77 DisplayListData* newData = reinterpret_cast<DisplayListData*>(newDataPtr);
78 renderNode->setStagingDisplayList(newData);
Chris Craik54389792013-12-20 13:28:11 -080079}
80
81// ----------------------------------------------------------------------------
Chris Craik49e6c732014-03-31 12:34:11 -070082// RenderProperties - setters
Chris Craik54389792013-12-20 13:28:11 -080083// ----------------------------------------------------------------------------
84
John Reckf666ad72014-03-14 16:24:57 -070085static void android_view_RenderNode_setCaching(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -070086 jobject clazz, jlong renderNodePtr, jboolean caching) {
87 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
88 renderNode->mutateStagingProperties().setCaching(caching);
John Reckff941dc2014-05-14 16:34:14 -070089 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -080090}
91
John Reckf666ad72014-03-14 16:24:57 -070092static void android_view_RenderNode_setStaticMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -070093 jobject clazz, jlong renderNodePtr, jlong matrixPtr) {
94 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik7a02ea32013-12-27 16:43:22 -080095 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
John Reck8de65a82014-04-09 15:23:38 -070096 renderNode->mutateStagingProperties().setStaticMatrix(matrix);
John Reckff941dc2014-05-14 16:34:14 -070097 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -080098}
99
John Reckf666ad72014-03-14 16:24:57 -0700100static void android_view_RenderNode_setAnimationMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700101 jobject clazz, jlong renderNodePtr, jlong matrixPtr) {
102 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik7a02ea32013-12-27 16:43:22 -0800103 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
John Reck8de65a82014-04-09 15:23:38 -0700104 renderNode->mutateStagingProperties().setAnimationMatrix(matrix);
John Reckff941dc2014-05-14 16:34:14 -0700105 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800106}
107
John Reckf666ad72014-03-14 16:24:57 -0700108static void android_view_RenderNode_setClipToBounds(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700109 jobject clazz, jlong renderNodePtr, jboolean clipToBounds) {
110 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
111 renderNode->mutateStagingProperties().setClipToBounds(clipToBounds);
John Reckff941dc2014-05-14 16:34:14 -0700112 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800113}
114
John Reckf666ad72014-03-14 16:24:57 -0700115static void android_view_RenderNode_setProjectBackwards(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700116 jobject clazz, jlong renderNodePtr, jboolean shouldProject) {
117 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
118 renderNode->mutateStagingProperties().setProjectBackwards(shouldProject);
John Reckff941dc2014-05-14 16:34:14 -0700119 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
Alan Viverette58f09b32014-01-08 17:18:19 -0800120}
121
John Reckf666ad72014-03-14 16:24:57 -0700122static void android_view_RenderNode_setProjectionReceiver(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700123 jobject clazz, jlong renderNodePtr, jboolean shouldRecieve) {
124 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
125 renderNode->mutateStagingProperties().setProjectionReceiver(shouldRecieve);
John Reckff941dc2014-05-14 16:34:14 -0700126 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
Chris Craik1df26442014-02-05 16:50:41 -0800127}
128
Chris Craikb49f4462014-03-20 12:44:20 -0700129static void android_view_RenderNode_setOutlineRoundRect(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700130 jobject clazz, jlong renderNodePtr, jint left, jint top,
Chris Craikb49f4462014-03-20 12:44:20 -0700131 jint right, jint bottom, jfloat radius) {
John Reck8de65a82014-04-09 15:23:38 -0700132 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
133 renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom, radius);
John Reckff941dc2014-05-14 16:34:14 -0700134 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
Chris Craikb49f4462014-03-20 12:44:20 -0700135}
Chris Craik8c271ca2014-03-25 10:33:01 -0700136
Chris Craikb49f4462014-03-20 12:44:20 -0700137static void android_view_RenderNode_setOutlineConvexPath(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700138 jobject clazz, jlong renderNodePtr, jlong outlinePathPtr) {
139 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craikb49f4462014-03-20 12:44:20 -0700140 SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr);
John Reck8de65a82014-04-09 15:23:38 -0700141 renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath);
John Reckff941dc2014-05-14 16:34:14 -0700142 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
Chris Craikb49f4462014-03-20 12:44:20 -0700143}
Chris Craik8c271ca2014-03-25 10:33:01 -0700144
Chris Craikb49f4462014-03-20 12:44:20 -0700145static void android_view_RenderNode_setOutlineEmpty(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700146 jobject clazz, jlong renderNodePtr) {
147 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
148 renderNode->mutateStagingProperties().mutableOutline().setEmpty();
John Reckff941dc2014-05-14 16:34:14 -0700149 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
Chris Craika2fe7af2014-01-28 17:25:06 -0800150}
151
John Reckf666ad72014-03-14 16:24:57 -0700152static void android_view_RenderNode_setClipToOutline(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700153 jobject clazz, jlong renderNodePtr, jboolean clipToOutline) {
154 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
155 renderNode->mutateStagingProperties().mutableOutline().setShouldClip(clipToOutline);
John Reckff941dc2014-05-14 16:34:14 -0700156 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
Chris Craik8c271ca2014-03-25 10:33:01 -0700157}
158
159static void android_view_RenderNode_setRevealClip(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700160 jobject clazz, jlong renderNodePtr, jboolean shouldClip, jboolean inverseClip,
Chris Craik8c271ca2014-03-25 10:33:01 -0700161 jfloat x, jfloat y, jfloat radius) {
John Reck8de65a82014-04-09 15:23:38 -0700162 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
163 renderNode->mutateStagingProperties().mutableRevealClip().set(
Chris Craik8c271ca2014-03-25 10:33:01 -0700164 shouldClip, inverseClip, x, y, radius);
John Reckff941dc2014-05-14 16:34:14 -0700165 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
ztenghuifad45932014-02-06 10:33:58 -0800166}
167
John Reckf666ad72014-03-14 16:24:57 -0700168static void android_view_RenderNode_setAlpha(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700169 jobject clazz, jlong renderNodePtr, float alpha) {
170 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
171 renderNode->mutateStagingProperties().setAlpha(alpha);
John Reckff941dc2014-05-14 16:34:14 -0700172 renderNode->setPropertyFieldsDirty(RenderNode::ALPHA);
Chris Craik54389792013-12-20 13:28:11 -0800173}
174
John Reckf666ad72014-03-14 16:24:57 -0700175static void android_view_RenderNode_setHasOverlappingRendering(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700176 jobject clazz, jlong renderNodePtr, bool hasOverlappingRendering) {
177 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
178 renderNode->mutateStagingProperties().setHasOverlappingRendering(hasOverlappingRendering);
John Reckff941dc2014-05-14 16:34:14 -0700179 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800180}
181
Chris Craikcc39e162014-04-25 18:34:11 -0700182static void android_view_RenderNode_setElevation(JNIEnv* env,
183 jobject clazz, jlong renderNodePtr, float elevation) {
184 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
185 renderNode->mutateStagingProperties().setElevation(elevation);
John Reckff941dc2014-05-14 16:34:14 -0700186 renderNode->setPropertyFieldsDirty(RenderNode::Z);
Chris Craikcc39e162014-04-25 18:34:11 -0700187}
188
John Reckf666ad72014-03-14 16:24:57 -0700189static void android_view_RenderNode_setTranslationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700190 jobject clazz, jlong renderNodePtr, float tx) {
191 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
192 renderNode->mutateStagingProperties().setTranslationX(tx);
John Reckff941dc2014-05-14 16:34:14 -0700193 renderNode->setPropertyFieldsDirty(RenderNode::TRANSLATION_X | RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800194}
195
John Reckf666ad72014-03-14 16:24:57 -0700196static void android_view_RenderNode_setTranslationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700197 jobject clazz, jlong renderNodePtr, float ty) {
198 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
199 renderNode->mutateStagingProperties().setTranslationY(ty);
John Reckff941dc2014-05-14 16:34:14 -0700200 renderNode->setPropertyFieldsDirty(RenderNode::TRANSLATION_Y | RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800201}
202
John Reckf666ad72014-03-14 16:24:57 -0700203static void android_view_RenderNode_setTranslationZ(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700204 jobject clazz, jlong renderNodePtr, float tz) {
205 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
206 renderNode->mutateStagingProperties().setTranslationZ(tz);
John Reckff941dc2014-05-14 16:34:14 -0700207 renderNode->setPropertyFieldsDirty(RenderNode::TRANSLATION_Z | RenderNode::Z);
Chris Craik54389792013-12-20 13:28:11 -0800208}
209
John Reckf666ad72014-03-14 16:24:57 -0700210static void android_view_RenderNode_setRotation(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700211 jobject clazz, jlong renderNodePtr, float rotation) {
212 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
213 renderNode->mutateStagingProperties().setRotation(rotation);
John Reckff941dc2014-05-14 16:34:14 -0700214 renderNode->setPropertyFieldsDirty(RenderNode::ROTATION);
Chris Craik54389792013-12-20 13:28:11 -0800215}
216
John Reckf666ad72014-03-14 16:24:57 -0700217static void android_view_RenderNode_setRotationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700218 jobject clazz, jlong renderNodePtr, float rx) {
219 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
220 renderNode->mutateStagingProperties().setRotationX(rx);
John Reckff941dc2014-05-14 16:34:14 -0700221 renderNode->setPropertyFieldsDirty(RenderNode::ROTATION_X);
Chris Craik54389792013-12-20 13:28:11 -0800222}
223
John Reckf666ad72014-03-14 16:24:57 -0700224static void android_view_RenderNode_setRotationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700225 jobject clazz, jlong renderNodePtr, float ry) {
226 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
227 renderNode->mutateStagingProperties().setRotationY(ry);
John Reckff941dc2014-05-14 16:34:14 -0700228 renderNode->setPropertyFieldsDirty(RenderNode::ROTATION_Y);
Chris Craik54389792013-12-20 13:28:11 -0800229}
230
John Reckf666ad72014-03-14 16:24:57 -0700231static void android_view_RenderNode_setScaleX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700232 jobject clazz, jlong renderNodePtr, float sx) {
233 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
234 renderNode->mutateStagingProperties().setScaleX(sx);
John Reckff941dc2014-05-14 16:34:14 -0700235 renderNode->setPropertyFieldsDirty(RenderNode::SCALE_X);
Chris Craik54389792013-12-20 13:28:11 -0800236}
237
John Reckf666ad72014-03-14 16:24:57 -0700238static void android_view_RenderNode_setScaleY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700239 jobject clazz, jlong renderNodePtr, float sy) {
240 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
241 renderNode->mutateStagingProperties().setScaleY(sy);
John Reckff941dc2014-05-14 16:34:14 -0700242 renderNode->setPropertyFieldsDirty(RenderNode::SCALE_Y);
Chris Craik54389792013-12-20 13:28:11 -0800243}
244
John Reckf666ad72014-03-14 16:24:57 -0700245static void android_view_RenderNode_setPivotX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700246 jobject clazz, jlong renderNodePtr, float px) {
247 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
248 renderNode->mutateStagingProperties().setPivotX(px);
John Reckff941dc2014-05-14 16:34:14 -0700249 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800250}
251
John Reckf666ad72014-03-14 16:24:57 -0700252static void android_view_RenderNode_setPivotY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700253 jobject clazz, jlong renderNodePtr, float py) {
254 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
255 renderNode->mutateStagingProperties().setPivotY(py);
John Reckff941dc2014-05-14 16:34:14 -0700256 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800257}
258
John Reckf666ad72014-03-14 16:24:57 -0700259static void android_view_RenderNode_setCameraDistance(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700260 jobject clazz, jlong renderNodePtr, float distance) {
261 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
262 renderNode->mutateStagingProperties().setCameraDistance(distance);
John Reckff941dc2014-05-14 16:34:14 -0700263 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
Chris Craik54389792013-12-20 13:28:11 -0800264}
265
John Reckf666ad72014-03-14 16:24:57 -0700266static void android_view_RenderNode_setLeft(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700267 jobject clazz, jlong renderNodePtr, int left) {
268 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
269 renderNode->mutateStagingProperties().setLeft(left);
John Reckff941dc2014-05-14 16:34:14 -0700270 renderNode->setPropertyFieldsDirty(RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800271}
272
John Reckf666ad72014-03-14 16:24:57 -0700273static void android_view_RenderNode_setTop(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700274 jobject clazz, jlong renderNodePtr, int top) {
275 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
276 renderNode->mutateStagingProperties().setTop(top);
John Reckff941dc2014-05-14 16:34:14 -0700277 renderNode->setPropertyFieldsDirty(RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800278}
279
John Reckf666ad72014-03-14 16:24:57 -0700280static void android_view_RenderNode_setRight(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700281 jobject clazz, jlong renderNodePtr, int right) {
282 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
283 renderNode->mutateStagingProperties().setRight(right);
John Reckff941dc2014-05-14 16:34:14 -0700284 renderNode->setPropertyFieldsDirty(RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800285}
286
John Reckf666ad72014-03-14 16:24:57 -0700287static void android_view_RenderNode_setBottom(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700288 jobject clazz, jlong renderNodePtr, int bottom) {
289 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
290 renderNode->mutateStagingProperties().setBottom(bottom);
John Reckff941dc2014-05-14 16:34:14 -0700291 renderNode->setPropertyFieldsDirty(RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800292}
293
John Reckf666ad72014-03-14 16:24:57 -0700294static void android_view_RenderNode_setLeftTopRightBottom(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700295 jobject clazz, jlong renderNodePtr, int left, int top,
Chris Craik54389792013-12-20 13:28:11 -0800296 int right, int bottom) {
John Reck8de65a82014-04-09 15:23:38 -0700297 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
298 renderNode->mutateStagingProperties().setLeftTopRightBottom(left, top, right, bottom);
John Reckff941dc2014-05-14 16:34:14 -0700299 renderNode->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800300}
301
John Reckf666ad72014-03-14 16:24:57 -0700302static void android_view_RenderNode_offsetLeftAndRight(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700303 jobject clazz, jlong renderNodePtr, float offset) {
304 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
305 renderNode->mutateStagingProperties().offsetLeftRight(offset);
John Reckff941dc2014-05-14 16:34:14 -0700306 renderNode->setPropertyFieldsDirty(RenderNode::X);
Chris Craik54389792013-12-20 13:28:11 -0800307}
308
John Reckf666ad72014-03-14 16:24:57 -0700309static void android_view_RenderNode_offsetTopAndBottom(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700310 jobject clazz, jlong renderNodePtr, float offset) {
311 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
312 renderNode->mutateStagingProperties().offsetTopBottom(offset);
John Reckff941dc2014-05-14 16:34:14 -0700313 renderNode->setPropertyFieldsDirty(RenderNode::Y);
Chris Craik54389792013-12-20 13:28:11 -0800314}
315
Chris Craik49e6c732014-03-31 12:34:11 -0700316// ----------------------------------------------------------------------------
317// RenderProperties - getters
318// ----------------------------------------------------------------------------
319
John Reckf666ad72014-03-14 16:24:57 -0700320static jboolean android_view_RenderNode_hasOverlappingRendering(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700321 jobject clazz, jlong renderNodePtr) {
322 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
323 return renderNode->stagingProperties().hasOverlappingRendering();
Chris Craik54389792013-12-20 13:28:11 -0800324}
325
Chris Craikdeeda3d2014-05-05 19:09:33 -0700326static jboolean android_view_RenderNode_getClipToOutline(JNIEnv* env,
327 jobject clazz, jlong renderNodePtr) {
328 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
329 return renderNode->stagingProperties().getOutline().getShouldClip();
330}
331
John Reckf666ad72014-03-14 16:24:57 -0700332static jfloat android_view_RenderNode_getAlpha(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700333 jobject clazz, jlong renderNodePtr) {
334 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
335 return renderNode->stagingProperties().getAlpha();
Chris Craik54389792013-12-20 13:28:11 -0800336}
337
John Reckf666ad72014-03-14 16:24:57 -0700338static jfloat android_view_RenderNode_getLeft(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700339 jobject clazz, jlong renderNodePtr) {
340 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
341 return renderNode->stagingProperties().getLeft();
Chris Craik54389792013-12-20 13:28:11 -0800342}
343
John Reckf666ad72014-03-14 16:24:57 -0700344static jfloat android_view_RenderNode_getTop(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700345 jobject clazz, jlong renderNodePtr) {
346 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
347 return renderNode->stagingProperties().getTop();
Chris Craik54389792013-12-20 13:28:11 -0800348}
349
John Reckf666ad72014-03-14 16:24:57 -0700350static jfloat android_view_RenderNode_getRight(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700351 jobject clazz, jlong renderNodePtr) {
352 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
353 return renderNode->stagingProperties().getRight();
Chris Craik54389792013-12-20 13:28:11 -0800354}
355
John Reckf666ad72014-03-14 16:24:57 -0700356static jfloat android_view_RenderNode_getBottom(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700357 jobject clazz, jlong renderNodePtr) {
358 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
359 return renderNode->stagingProperties().getBottom();
Chris Craik54389792013-12-20 13:28:11 -0800360}
361
John Reckf666ad72014-03-14 16:24:57 -0700362static jfloat android_view_RenderNode_getCameraDistance(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700363 jobject clazz, jlong renderNodePtr) {
364 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
365 return renderNode->stagingProperties().getCameraDistance();
Chris Craik54389792013-12-20 13:28:11 -0800366}
367
John Reckf666ad72014-03-14 16:24:57 -0700368static jfloat android_view_RenderNode_getScaleX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700369 jobject clazz, jlong renderNodePtr) {
370 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
371 return renderNode->stagingProperties().getScaleX();
Chris Craik54389792013-12-20 13:28:11 -0800372}
373
John Reckf666ad72014-03-14 16:24:57 -0700374static jfloat android_view_RenderNode_getScaleY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700375 jobject clazz, jlong renderNodePtr) {
376 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
377 return renderNode->stagingProperties().getScaleY();
Chris Craik54389792013-12-20 13:28:11 -0800378}
379
Chris Craikcc39e162014-04-25 18:34:11 -0700380static jfloat android_view_RenderNode_getElevation(JNIEnv* env,
381 jobject clazz, jlong renderNodePtr) {
382 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
383 return renderNode->stagingProperties().getElevation();
384}
385
John Reckf666ad72014-03-14 16:24:57 -0700386static jfloat android_view_RenderNode_getTranslationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700387 jobject clazz, jlong renderNodePtr) {
388 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
389 return renderNode->stagingProperties().getTranslationX();
Chris Craik54389792013-12-20 13:28:11 -0800390}
391
John Reckf666ad72014-03-14 16:24:57 -0700392static jfloat android_view_RenderNode_getTranslationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700393 jobject clazz, jlong renderNodePtr) {
394 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
395 return renderNode->stagingProperties().getTranslationY();
Chris Craik54389792013-12-20 13:28:11 -0800396}
397
Chris Craik49e6c732014-03-31 12:34:11 -0700398static jfloat android_view_RenderNode_getTranslationZ(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700399 jobject clazz, jlong renderNodePtr) {
400 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
401 return renderNode->stagingProperties().getTranslationZ();
Chris Craik49e6c732014-03-31 12:34:11 -0700402}
403
John Reckf666ad72014-03-14 16:24:57 -0700404static jfloat android_view_RenderNode_getRotation(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700405 jobject clazz, jlong renderNodePtr) {
406 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
407 return renderNode->stagingProperties().getRotation();
Chris Craik54389792013-12-20 13:28:11 -0800408}
409
John Reckf666ad72014-03-14 16:24:57 -0700410static jfloat android_view_RenderNode_getRotationX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700411 jobject clazz, jlong renderNodePtr) {
412 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
413 return renderNode->stagingProperties().getRotationX();
Chris Craik54389792013-12-20 13:28:11 -0800414}
415
John Reckf666ad72014-03-14 16:24:57 -0700416static jfloat android_view_RenderNode_getRotationY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700417 jobject clazz, jlong renderNodePtr) {
418 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
419 return renderNode->stagingProperties().getRotationY();
Chris Craik54389792013-12-20 13:28:11 -0800420}
421
Chris Craik49e6c732014-03-31 12:34:11 -0700422static jboolean android_view_RenderNode_isPivotExplicitlySet(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700423 jobject clazz, jlong renderNodePtr) {
424 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
425 return renderNode->stagingProperties().isPivotExplicitlySet();
Chris Craik49e6c732014-03-31 12:34:11 -0700426}
427
428static jboolean android_view_RenderNode_hasIdentityMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700429 jobject clazz, jlong renderNodePtr) {
430 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
John Reckf7483e32014-04-11 08:54:47 -0700431 renderNode->mutateStagingProperties().updateMatrix();
432 return !renderNode->stagingProperties().hasTransformMatrix();
Chris Craik49e6c732014-03-31 12:34:11 -0700433}
434
435// ----------------------------------------------------------------------------
436// RenderProperties - computed getters
437// ----------------------------------------------------------------------------
438
439static void android_view_RenderNode_getTransformMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700440 jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
441 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
454static void android_view_RenderNode_getInverseTransformMatrix(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700455 jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
Chris Craik49e6c732014-03-31 12:34:11 -0700456 // load transform matrix
John Reck8de65a82014-04-09 15:23:38 -0700457 android_view_RenderNode_getTransformMatrix(env, clazz, 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
John Reckf666ad72014-03-14 16:24:57 -0700467static jfloat android_view_RenderNode_getPivotX(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700468 jobject clazz, jlong renderNodePtr) {
469 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
470 renderNode->mutateStagingProperties().updateMatrix();
471 return renderNode->stagingProperties().getPivotX();
Chris Craik54389792013-12-20 13:28:11 -0800472}
473
John Reckf666ad72014-03-14 16:24:57 -0700474static jfloat android_view_RenderNode_getPivotY(JNIEnv* env,
John Reck8de65a82014-04-09 15:23:38 -0700475 jobject clazz, jlong renderNodePtr) {
476 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
477 renderNode->mutateStagingProperties().updateMatrix();
478 return renderNode->stagingProperties().getPivotY();
Chris Craik54389792013-12-20 13:28:11 -0800479}
480
John Recke45b1fd2014-04-15 09:50:16 -0700481// ----------------------------------------------------------------------------
482// RenderProperties - Animations
483// ----------------------------------------------------------------------------
484
485static void android_view_RenderNode_addAnimator(JNIEnv* env, jobject clazz,
486 jlong renderNodePtr, jlong animatorPtr) {
487 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
488 RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr);
489 renderNode->addAnimator(animator);
490}
491
492static void android_view_RenderNode_removeAnimator(JNIEnv* env, jobject clazz,
493 jlong renderNodePtr, jlong animatorPtr) {
494 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
495 RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr);
496 renderNode->removeAnimator(animator);
497}
498
499
Chris Craik54389792013-12-20 13:28:11 -0800500#endif // USE_OPENGL_RENDERER
501
502// ----------------------------------------------------------------------------
503// JNI Glue
504// ----------------------------------------------------------------------------
505
John Reckf666ad72014-03-14 16:24:57 -0700506const char* const kClassPathName = "android/view/RenderNode";
Chris Craik54389792013-12-20 13:28:11 -0800507
508static JNINativeMethod gMethods[] = {
509#ifdef USE_OPENGL_RENDERER
John Reck8de65a82014-04-09 15:23:38 -0700510 { "nCreate", "(Ljava/lang/String;)J", (void*) android_view_RenderNode_create },
511 { "nDestroyRenderNode", "(J)V", (void*) android_view_RenderNode_destroyRenderNode },
512 { "nSetDisplayListData", "(JJ)V", (void*) android_view_RenderNode_setDisplayListData },
John Reckf666ad72014-03-14 16:24:57 -0700513 { "nOutput", "(J)V", (void*) android_view_RenderNode_output },
John Reckfe5e7b72014-05-23 17:42:28 -0700514 { "nGetDebugSize", "(J)I", (void*) android_view_RenderNode_getDebugSize },
Chris Craik54389792013-12-20 13:28:11 -0800515
John Reckf666ad72014-03-14 16:24:57 -0700516 { "nSetCaching", "(JZ)V", (void*) android_view_RenderNode_setCaching },
517 { "nSetStaticMatrix", "(JJ)V", (void*) android_view_RenderNode_setStaticMatrix },
518 { "nSetAnimationMatrix", "(JJ)V", (void*) android_view_RenderNode_setAnimationMatrix },
519 { "nSetClipToBounds", "(JZ)V", (void*) android_view_RenderNode_setClipToBounds },
John Reckf666ad72014-03-14 16:24:57 -0700520 { "nSetProjectBackwards", "(JZ)V", (void*) android_view_RenderNode_setProjectBackwards },
521 { "nSetProjectionReceiver","(JZ)V", (void*) android_view_RenderNode_setProjectionReceiver },
Chris Craikb49f4462014-03-20 12:44:20 -0700522
523 { "nSetOutlineRoundRect", "(JIIIIF)V", (void*) android_view_RenderNode_setOutlineRoundRect },
524 { "nSetOutlineConvexPath", "(JJ)V", (void*) android_view_RenderNode_setOutlineConvexPath },
525 { "nSetOutlineEmpty", "(J)V", (void*) android_view_RenderNode_setOutlineEmpty },
John Reckf666ad72014-03-14 16:24:57 -0700526 { "nSetClipToOutline", "(JZ)V", (void*) android_view_RenderNode_setClipToOutline },
Chris Craik8c271ca2014-03-25 10:33:01 -0700527 { "nSetRevealClip", "(JZZFFF)V", (void*) android_view_RenderNode_setRevealClip },
Chris Craikb49f4462014-03-20 12:44:20 -0700528
John Reckf666ad72014-03-14 16:24:57 -0700529 { "nSetAlpha", "(JF)V", (void*) android_view_RenderNode_setAlpha },
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000530 { "nSetHasOverlappingRendering", "(JZ)V",
John Reckf666ad72014-03-14 16:24:57 -0700531 (void*) android_view_RenderNode_setHasOverlappingRendering },
Chris Craikcc39e162014-04-25 18:34:11 -0700532 { "nSetElevation", "(JF)V", (void*) android_view_RenderNode_setElevation },
John Reckf666ad72014-03-14 16:24:57 -0700533 { "nSetTranslationX", "(JF)V", (void*) android_view_RenderNode_setTranslationX },
534 { "nSetTranslationY", "(JF)V", (void*) android_view_RenderNode_setTranslationY },
535 { "nSetTranslationZ", "(JF)V", (void*) android_view_RenderNode_setTranslationZ },
536 { "nSetRotation", "(JF)V", (void*) android_view_RenderNode_setRotation },
537 { "nSetRotationX", "(JF)V", (void*) android_view_RenderNode_setRotationX },
538 { "nSetRotationY", "(JF)V", (void*) android_view_RenderNode_setRotationY },
539 { "nSetScaleX", "(JF)V", (void*) android_view_RenderNode_setScaleX },
540 { "nSetScaleY", "(JF)V", (void*) android_view_RenderNode_setScaleY },
John Reckf666ad72014-03-14 16:24:57 -0700541 { "nSetPivotX", "(JF)V", (void*) android_view_RenderNode_setPivotX },
542 { "nSetPivotY", "(JF)V", (void*) android_view_RenderNode_setPivotY },
543 { "nSetCameraDistance", "(JF)V", (void*) android_view_RenderNode_setCameraDistance },
544 { "nSetLeft", "(JI)V", (void*) android_view_RenderNode_setLeft },
545 { "nSetTop", "(JI)V", (void*) android_view_RenderNode_setTop },
546 { "nSetRight", "(JI)V", (void*) android_view_RenderNode_setRight },
547 { "nSetBottom", "(JI)V", (void*) android_view_RenderNode_setBottom },
548 { "nSetLeftTopRightBottom","(JIIII)V", (void*) android_view_RenderNode_setLeftTopRightBottom },
549 { "nOffsetLeftAndRight", "(JF)V", (void*) android_view_RenderNode_offsetLeftAndRight },
550 { "nOffsetTopAndBottom", "(JF)V", (void*) android_view_RenderNode_offsetTopAndBottom },
Chris Craik54389792013-12-20 13:28:11 -0800551
John Reckf666ad72014-03-14 16:24:57 -0700552 { "nHasOverlappingRendering", "(J)Z", (void*) android_view_RenderNode_hasOverlappingRendering },
Chris Craikdeeda3d2014-05-05 19:09:33 -0700553 { "nGetClipToOutline", "(J)Z", (void*) android_view_RenderNode_getClipToOutline },
John Reckf666ad72014-03-14 16:24:57 -0700554 { "nGetAlpha", "(J)F", (void*) android_view_RenderNode_getAlpha },
555 { "nGetLeft", "(J)F", (void*) android_view_RenderNode_getLeft },
556 { "nGetTop", "(J)F", (void*) android_view_RenderNode_getTop },
557 { "nGetRight", "(J)F", (void*) android_view_RenderNode_getRight },
558 { "nGetBottom", "(J)F", (void*) android_view_RenderNode_getBottom },
559 { "nGetCameraDistance", "(J)F", (void*) android_view_RenderNode_getCameraDistance },
560 { "nGetScaleX", "(J)F", (void*) android_view_RenderNode_getScaleX },
561 { "nGetScaleY", "(J)F", (void*) android_view_RenderNode_getScaleY },
Chris Craikcc39e162014-04-25 18:34:11 -0700562 { "nGetElevation", "(J)F", (void*) android_view_RenderNode_getElevation },
John Reckf666ad72014-03-14 16:24:57 -0700563 { "nGetTranslationX", "(J)F", (void*) android_view_RenderNode_getTranslationX },
564 { "nGetTranslationY", "(J)F", (void*) android_view_RenderNode_getTranslationY },
Chris Craik49e6c732014-03-31 12:34:11 -0700565 { "nGetTranslationZ", "(J)F", (void*) android_view_RenderNode_getTranslationZ },
John Reckf666ad72014-03-14 16:24:57 -0700566 { "nGetRotation", "(J)F", (void*) android_view_RenderNode_getRotation },
567 { "nGetRotationX", "(J)F", (void*) android_view_RenderNode_getRotationX },
568 { "nGetRotationY", "(J)F", (void*) android_view_RenderNode_getRotationY },
Chris Craik49e6c732014-03-31 12:34:11 -0700569 { "nIsPivotExplicitlySet", "(J)Z", (void*) android_view_RenderNode_isPivotExplicitlySet },
570 { "nHasIdentityMatrix", "(J)Z", (void*) android_view_RenderNode_hasIdentityMatrix },
571
572 { "nGetTransformMatrix", "(JJ)V", (void*) android_view_RenderNode_getTransformMatrix },
573 { "nGetInverseTransformMatrix","(JJ)V", (void*) android_view_RenderNode_getInverseTransformMatrix },
574
575 { "nGetPivotX", "(J)F", (void*) android_view_RenderNode_getPivotX },
576 { "nGetPivotY", "(J)F", (void*) android_view_RenderNode_getPivotY },
John Recke45b1fd2014-04-15 09:50:16 -0700577
578 { "nAddAnimator", "(JJ)V", (void*) android_view_RenderNode_addAnimator },
579 { "nRemoveAnimator", "(JJ)V", (void*) android_view_RenderNode_removeAnimator },
Chris Craik54389792013-12-20 13:28:11 -0800580#endif
581};
582
583#ifdef USE_OPENGL_RENDERER
584 #define FIND_CLASS(var, className) \
585 var = env->FindClass(className); \
586 LOG_FATAL_IF(! var, "Unable to find class " className);
587
588 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
589 var = env->GetMethodID(clazz, methodName, methodDescriptor); \
590 LOG_FATAL_IF(! var, "Unable to find method " methodName);
591#else
592 #define FIND_CLASS(var, className)
593 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
594#endif
595
John Reckf666ad72014-03-14 16:24:57 -0700596int register_android_view_RenderNode(JNIEnv* env) {
Chris Craik54389792013-12-20 13:28:11 -0800597 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
598}
599
600};
601