1a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase/*
2a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * Copyright (C) 2012 The Android Open Source Project
3a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase *
4a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * Licensed under the Apache License, Version 2.0 (the "License");
5a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * you may not use this file except in compliance with the License.
6a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * You may obtain a copy of the License at
7a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase *
8a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase *      http://www.apache.org/licenses/LICENSE-2.0
9a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase *
10a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * Unless required by applicable law or agreed to in writing, software
11a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * distributed under the License is distributed on an "AS IS" BASIS,
12a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * See the License for the specific language governing permissions and
14a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * limitations under the License.
15a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase */
16a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
17a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define LOG_TAG "OpenGLRenderer"
18a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
19a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#include <EGL/egl.h>
20a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
21a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#include "jni.h"
22a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#include "GraphicsJNI.h"
23a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#include <nativehelper/JNIHelp.h>
24a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#include <android_runtime/AndroidRuntime.h>
25a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
26e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <Animator.h>
27a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#include <DisplayListRenderer.h>
28113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <RenderNode.h>
296ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod#include <Paint.h>
30a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
31a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasenamespace android {
32a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
33a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haaseusing namespace uirenderer;
34a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
35a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase/**
36a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * Note: OpenGLRenderer JNI layer is generated and compiled only on supported
37a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase *       devices. This means all the logic must be compiled only when the
38a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase *       preprocessor variable USE_OPENGL_RENDERER is defined.
39a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase */
40a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#ifdef USE_OPENGL_RENDERER
41a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
4279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck#define SET_AND_DIRTY(prop, val, dirtyFlag) \
4379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    (reinterpret_cast<RenderNode*>(renderNodePtr)->mutateStagingProperties().prop(val) \
4479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        ? (reinterpret_cast<RenderNode*>(renderNodePtr)->setPropertyFieldsDirty(dirtyFlag), true) \
4579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        : false)
4679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck
4752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy// ----------------------------------------------------------------------------
4852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy// DisplayList view properties
4952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy// ----------------------------------------------------------------------------
5052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
518de65a8e05285df52a1e6f0c1d5616dd233298a7John Reckstatic void android_view_RenderNode_output(JNIEnv* env,
528de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
538de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
548de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    renderNode->output();
558de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck}
568de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck
57fe5e7b7346a54537b980796ceeca66bfdbd05561John Reckstatic jint android_view_RenderNode_getDebugSize(JNIEnv* env,
58fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck        jobject clazz, jlong renderNodePtr) {
59fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
60fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    return renderNode->getDebugSize();
61fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck}
62fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck
638de65a8e05285df52a1e6f0c1d5616dd233298a7John Reckstatic jlong android_view_RenderNode_create(JNIEnv* env, jobject clazz, jstring name) {
648de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = new RenderNode();
658de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    renderNode->incStrong(0);
6652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    if (name != NULL) {
6752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        const char* textArray = env->GetStringUTFChars(name, NULL);
688de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        renderNode->setName(textArray);
6952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        env->ReleaseStringUTFChars(name, textArray);
7052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
718de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    return reinterpret_cast<jlong>(renderNode);
7252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy}
7352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
748de65a8e05285df52a1e6f0c1d5616dd233298a7John Reckstatic void android_view_RenderNode_destroyRenderNode(JNIEnv* env,
758de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
768de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
778de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    renderNode->decStrong(0);
7844fd8d24f761f82d21e9b00932648a1b6bf91449John Reck}
7944fd8d24f761f82d21e9b00932648a1b6bf91449John Reck
808de65a8e05285df52a1e6f0c1d5616dd233298a7John Reckstatic void android_view_RenderNode_setDisplayListData(JNIEnv* env,
818de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, jlong newDataPtr) {
828de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
838de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    DisplayListData* newData = reinterpret_cast<DisplayListData*>(newDataPtr);
848de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    renderNode->setStagingDisplayList(newData);
8552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy}
8652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
87a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// ----------------------------------------------------------------------------
8849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik// RenderProperties - setters
89a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// ----------------------------------------------------------------------------
90a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
9125fbb3fa1138675379102a44405852555cefccbdJohn Reckstatic jboolean android_view_RenderNode_setLayerType(JNIEnv* env,
9225fbb3fa1138675379102a44405852555cefccbdJohn Reck        jobject clazz, jlong renderNodePtr, jint jlayerType) {
9325fbb3fa1138675379102a44405852555cefccbdJohn Reck    LayerType layerType = static_cast<LayerType>(jlayerType);
9425fbb3fa1138675379102a44405852555cefccbdJohn Reck    return SET_AND_DIRTY(mutateLayerProperties().setType, layerType, RenderNode::GENERIC);
9525fbb3fa1138675379102a44405852555cefccbdJohn Reck}
9625fbb3fa1138675379102a44405852555cefccbdJohn Reck
9725fbb3fa1138675379102a44405852555cefccbdJohn Reckstatic jboolean android_view_RenderNode_setLayerPaint(JNIEnv* env,
9825fbb3fa1138675379102a44405852555cefccbdJohn Reck        jobject clazz, jlong renderNodePtr, jlong paintPtr) {
996ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod    Paint* paint = reinterpret_cast<Paint*>(paintPtr);
10025fbb3fa1138675379102a44405852555cefccbdJohn Reck    return SET_AND_DIRTY(mutateLayerProperties().setFromPaint, paint, RenderNode::GENERIC);
101a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
102a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
10379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setStaticMatrix(JNIEnv* env,
1048de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, jlong matrixPtr) {
1057a02ea3eaafac782b532ef366863a0b2554ae536Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
10679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setStaticMatrix, matrix, RenderNode::GENERIC);
1079420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase}
1089420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
10979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setAnimationMatrix(JNIEnv* env,
1108de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, jlong matrixPtr) {
1117a02ea3eaafac782b532ef366863a0b2554ae536Chris Craik    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
11279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setAnimationMatrix, matrix, RenderNode::GENERIC);
113a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
114a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
11579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setClipToBounds(JNIEnv* env,
1168de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, jboolean clipToBounds) {
11779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setClipToBounds, clipToBounds, RenderNode::GENERIC);
118a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
119a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
120a753f4c6cb8558795e673df1896532cd148781e2Chris Craikstatic jboolean android_view_RenderNode_setClipBounds(JNIEnv* env,
121a753f4c6cb8558795e673df1896532cd148781e2Chris Craik        jobject clazz, jlong renderNodePtr, jint left, jint top, jint right, jint bottom) {
122a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    android::uirenderer::Rect clipBounds(left, top, right, bottom);
123a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    return SET_AND_DIRTY(setClipBounds, clipBounds, RenderNode::GENERIC);
124a753f4c6cb8558795e673df1896532cd148781e2Chris Craik}
125a753f4c6cb8558795e673df1896532cd148781e2Chris Craik
126a753f4c6cb8558795e673df1896532cd148781e2Chris Craikstatic jboolean android_view_RenderNode_setClipBoundsEmpty(JNIEnv* env,
127a753f4c6cb8558795e673df1896532cd148781e2Chris Craik        jobject clazz, jlong renderNodePtr) {
128a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    return SET_AND_DIRTY(setClipBoundsEmpty,, RenderNode::GENERIC);
129a753f4c6cb8558795e673df1896532cd148781e2Chris Craik}
130a753f4c6cb8558795e673df1896532cd148781e2Chris Craik
13179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setProjectBackwards(JNIEnv* env,
1328de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, jboolean shouldProject) {
13379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setProjectBackwards, shouldProject, RenderNode::GENERIC);
13458f09b352417c4ff7e01365727cbf8a09b9bed23Alan Viverette}
13558f09b352417c4ff7e01365727cbf8a09b9bed23Alan Viverette
13679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setProjectionReceiver(JNIEnv* env,
1378de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, jboolean shouldRecieve) {
13879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setProjectionReceiver, shouldRecieve, RenderNode::GENERIC);
1391df26446b7eac7050767c38ca977fde03a41a033Chris Craik}
1401df26446b7eac7050767c38ca977fde03a41a033Chris Craik
14179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setOutlineRoundRect(JNIEnv* env,
1428de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, jint left, jint top,
14377b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik        jint right, jint bottom, jfloat radius, jfloat alpha) {
1448de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
14577b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik    renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom,
14677b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik            radius, alpha);
147ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
14879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return true;
149b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik}
1508c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
15179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setOutlineConvexPath(JNIEnv* env,
15277b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik        jobject clazz, jlong renderNodePtr, jlong outlinePathPtr, jfloat alpha) {
1538de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
154b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr);
15577b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik    renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath, alpha);
156ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
15779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return true;
158b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik}
1598c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
16079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setOutlineEmpty(JNIEnv* env,
1618de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
1628de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
1638de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    renderNode->mutateStagingProperties().mutableOutline().setEmpty();
164ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
16579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return true;
166a2fe7affd3d077ac163da90996cb2e5e0ca3b8d1Chris Craik}
167a2fe7affd3d077ac163da90996cb2e5e0ca3b8d1Chris Craik
1680645128b80621edee70f8cab4afb208fe0c26becChris Craikstatic jboolean android_view_RenderNode_setOutlineNone(JNIEnv* env,
1690645128b80621edee70f8cab4afb208fe0c26becChris Craik        jobject clazz, jlong renderNodePtr) {
1700645128b80621edee70f8cab4afb208fe0c26becChris Craik    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
1710645128b80621edee70f8cab4afb208fe0c26becChris Craik    renderNode->mutateStagingProperties().mutableOutline().setNone();
1720645128b80621edee70f8cab4afb208fe0c26becChris Craik    renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
1730645128b80621edee70f8cab4afb208fe0c26becChris Craik    return true;
1740645128b80621edee70f8cab4afb208fe0c26becChris Craik}
1750645128b80621edee70f8cab4afb208fe0c26becChris Craik
1765c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craikstatic jboolean android_view_RenderNode_hasShadow(JNIEnv* env,
1775c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik        jobject clazz, jlong renderNodePtr) {
1785c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
1795c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik    return renderNode->stagingProperties().hasShadow();
1805c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik}
1815c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik
18279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setClipToOutline(JNIEnv* env,
1838de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, jboolean clipToOutline) {
1848de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
1858de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    renderNode->mutateStagingProperties().mutableOutline().setShouldClip(clipToOutline);
186ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
18779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return true;
1888c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik}
1898c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
19079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setRevealClip(JNIEnv* env,
191af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik        jobject clazz, jlong renderNodePtr, jboolean shouldClip,
1928c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        jfloat x, jfloat y, jfloat radius) {
1938de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
1948de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    renderNode->mutateStagingProperties().mutableRevealClip().set(
195af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik            shouldClip, x, y, radius);
196ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
19779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return true;
198fad4593a3c9db193a4308c34168cc91c28218e2bztenghui}
199fad4593a3c9db193a4308c34168cc91c28218e2bztenghui
20079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setAlpha(JNIEnv* env,
2018de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, float alpha) {
20279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setAlpha, alpha, RenderNode::ALPHA);
203a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
204a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
20579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setHasOverlappingRendering(JNIEnv* env,
2068de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, bool hasOverlappingRendering) {
20779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setHasOverlappingRendering, hasOverlappingRendering,
20879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            RenderNode::GENERIC);
209db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase}
210db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
21179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setElevation(JNIEnv* env,
212cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik        jobject clazz, jlong renderNodePtr, float elevation) {
21379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setElevation, elevation, RenderNode::Z);
214cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik}
215cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik
21679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setTranslationX(JNIEnv* env,
2178de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, float tx) {
21879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setTranslationX, tx, RenderNode::TRANSLATION_X | RenderNode::X);
219a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
220a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
22179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setTranslationY(JNIEnv* env,
2228de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, float ty) {
22379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setTranslationY, ty, RenderNode::TRANSLATION_Y | RenderNode::Y);
224a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
225a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
22679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setTranslationZ(JNIEnv* env,
2278de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, float tz) {
22879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setTranslationZ, tz, RenderNode::TRANSLATION_Z | RenderNode::Z);
229f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik}
230f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik
23179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setRotation(JNIEnv* env,
2328de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, float rotation) {
23379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setRotation, rotation, RenderNode::ROTATION);
234a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
235a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
23679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setRotationX(JNIEnv* env,
2378de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, float rx) {
23879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setRotationX, rx, RenderNode::ROTATION_X);
239a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
240a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
24179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setRotationY(JNIEnv* env,
2428de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, float ry) {
24379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setRotationY, ry, RenderNode::ROTATION_Y);
244a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
245a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
24679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setScaleX(JNIEnv* env,
2478de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, float sx) {
24879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setScaleX, sx, RenderNode::SCALE_X);
249a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
250a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
25179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setScaleY(JNIEnv* env,
2528de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, float sy) {
25379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setScaleY, sy, RenderNode::SCALE_Y);
254a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
255a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
25679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setPivotX(JNIEnv* env,
2578de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, float px) {
25879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setPivotX, px, RenderNode::GENERIC);
259a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
260a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
26179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setPivotY(JNIEnv* env,
2628de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, float py) {
26379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setPivotY, py, RenderNode::GENERIC);
264a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
265a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
26679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setCameraDistance(JNIEnv* env,
2678de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, float distance) {
26879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setCameraDistance, distance, RenderNode::GENERIC);
269a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
270a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
27179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setLeft(JNIEnv* env,
2728de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, int left) {
27379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setLeft, left, RenderNode::X);
274a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
275a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
27679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setTop(JNIEnv* env,
2778de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, int top) {
27879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setTop, top, RenderNode::Y);
279a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
280a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
28179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setRight(JNIEnv* env,
2828de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, int right) {
28379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setRight, right, RenderNode::X);
284a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
285a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
28679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setBottom(JNIEnv* env,
2878de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, int bottom) {
28879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(setBottom, bottom, RenderNode::Y);
289a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
290a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
29179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setLeftTopRightBottom(JNIEnv* env,
2928de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, int left, int top,
293a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        int right, int bottom) {
2948de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
29579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    if (renderNode->mutateStagingProperties().setLeftTopRightBottom(left, top, right, bottom)) {
29679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        renderNode->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
29779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return true;
29879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    }
29979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return false;
300a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
301a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
30279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_offsetLeftAndRight(JNIEnv* env,
303a753f4c6cb8558795e673df1896532cd148781e2Chris Craik        jobject clazz, jlong renderNodePtr, jint offset) {
30479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(offsetLeftRight, offset, RenderNode::X);
305a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
306a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
30779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_offsetTopAndBottom(JNIEnv* env,
308a753f4c6cb8558795e673df1896532cd148781e2Chris Craik        jobject clazz, jlong renderNodePtr, jint offset) {
30979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    return SET_AND_DIRTY(offsetTopBottom, offset, RenderNode::Y);
310a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
311a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
31249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik// ----------------------------------------------------------------------------
31349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik// RenderProperties - getters
31449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik// ----------------------------------------------------------------------------
31549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
316f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jboolean android_view_RenderNode_hasOverlappingRendering(JNIEnv* env,
3178de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
3188de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
3198de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    return renderNode->stagingProperties().hasOverlappingRendering();
32052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy}
32152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
322deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikstatic jboolean android_view_RenderNode_getClipToOutline(JNIEnv* env,
323deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        jobject clazz, jlong renderNodePtr) {
324deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
325deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    return renderNode->stagingProperties().getOutline().getShouldClip();
326deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik}
327deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
328f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getAlpha(JNIEnv* env,
3298de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
3308de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
3318de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    return renderNode->stagingProperties().getAlpha();
33252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy}
33352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
334f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getCameraDistance(JNIEnv* env,
3358de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
3368de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
3378de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    return renderNode->stagingProperties().getCameraDistance();
33852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy}
33952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
340f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getScaleX(JNIEnv* env,
3418de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
3428de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
3438de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    return renderNode->stagingProperties().getScaleX();
34452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy}
34552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
346f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getScaleY(JNIEnv* env,
3478de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
3488de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
3498de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    return renderNode->stagingProperties().getScaleY();
35052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy}
35152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
352cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craikstatic jfloat android_view_RenderNode_getElevation(JNIEnv* env,
353cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik        jobject clazz, jlong renderNodePtr) {
354cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
355cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    return renderNode->stagingProperties().getElevation();
356cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik}
357cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik
358f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getTranslationX(JNIEnv* env,
3598de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
3608de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
3618de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    return renderNode->stagingProperties().getTranslationX();
36252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy}
36352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
364f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getTranslationY(JNIEnv* env,
3658de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
3668de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
3678de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    return renderNode->stagingProperties().getTranslationY();
36852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy}
36952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
37049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craikstatic jfloat android_view_RenderNode_getTranslationZ(JNIEnv* env,
3718de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
3728de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
3738de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    return renderNode->stagingProperties().getTranslationZ();
37449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik}
37549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
376f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getRotation(JNIEnv* env,
3778de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
3788de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
3798de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    return renderNode->stagingProperties().getRotation();
38052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy}
38152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
382f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getRotationX(JNIEnv* env,
3838de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
3848de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
3858de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    return renderNode->stagingProperties().getRotationX();
38652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy}
38752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
388f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getRotationY(JNIEnv* env,
3898de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
3908de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
3918de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    return renderNode->stagingProperties().getRotationY();
39252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy}
39352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
39449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craikstatic jboolean android_view_RenderNode_isPivotExplicitlySet(JNIEnv* env,
3958de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
3968de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
3978de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    return renderNode->stagingProperties().isPivotExplicitlySet();
39849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik}
39949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
40049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craikstatic jboolean android_view_RenderNode_hasIdentityMatrix(JNIEnv* env,
4018de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
4028de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
403f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    renderNode->mutateStagingProperties().updateMatrix();
404f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    return !renderNode->stagingProperties().hasTransformMatrix();
40549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik}
40649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
40749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik// ----------------------------------------------------------------------------
40849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik// RenderProperties - computed getters
40949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik// ----------------------------------------------------------------------------
41049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
41149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craikstatic void android_view_RenderNode_getTransformMatrix(JNIEnv* env,
4128de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
4138de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
41449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
41549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
4168de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    renderNode->mutateStagingProperties().updateMatrix();
4178de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    const SkMatrix* transformMatrix = renderNode->stagingProperties().getTransformMatrix();
41849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
419f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    if (transformMatrix) {
42049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        *outMatrix = *transformMatrix;
42149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    } else {
42249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        outMatrix->setIdentity();
42349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    }
42449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik}
42549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
42649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craikstatic void android_view_RenderNode_getInverseTransformMatrix(JNIEnv* env,
4278de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
42849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    // load transform matrix
4298de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    android_view_RenderNode_getTransformMatrix(env, clazz, renderNodePtr, outMatrixPtr);
43049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
43149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
43249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    // return it inverted
43349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    if (!outMatrix->invert(outMatrix)) {
43449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        // failed to load inverse, pass back identity
43549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        outMatrix->setIdentity();
43649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    }
43749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik}
43849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
439f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getPivotX(JNIEnv* env,
4408de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
4418de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
4428de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    renderNode->mutateStagingProperties().updateMatrix();
4438de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    return renderNode->stagingProperties().getPivotX();
44452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy}
44552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
446f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getPivotY(JNIEnv* env,
4478de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        jobject clazz, jlong renderNodePtr) {
4488de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
4498de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    renderNode->mutateStagingProperties().updateMatrix();
4508de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    return renderNode->stagingProperties().getPivotY();
45152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy}
45252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
453e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// ----------------------------------------------------------------------------
454e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// RenderProperties - Animations
455e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// ----------------------------------------------------------------------------
456e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
457e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic void android_view_RenderNode_addAnimator(JNIEnv* env, jobject clazz,
458e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        jlong renderNodePtr, jlong animatorPtr) {
459e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
460e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr);
461e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    renderNode->addAnimator(animator);
462e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
463e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
464119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic void android_view_RenderNode_endAllAnimators(JNIEnv* env, jobject clazz,
465119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        jlong renderNodePtr) {
466119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
467e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck    renderNode->animators().endAllStagingAnimators();
468119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck}
469119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
470a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif // USE_OPENGL_RENDERER
471a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
472a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// ----------------------------------------------------------------------------
473a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// JNI Glue
474a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// ----------------------------------------------------------------------------
475a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
476f666ad7046c0b1b255835f75aeb7d1391067df93John Reckconst char* const kClassPathName = "android/view/RenderNode";
477a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
478a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasestatic JNINativeMethod gMethods[] = {
479a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#ifdef USE_OPENGL_RENDERER
4808de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    { "nCreate",               "(Ljava/lang/String;)J",    (void*) android_view_RenderNode_create },
4818de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    { "nDestroyRenderNode",   "(J)V",   (void*) android_view_RenderNode_destroyRenderNode },
4828de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    { "nSetDisplayListData",   "(JJ)V", (void*) android_view_RenderNode_setDisplayListData },
483f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    { "nOutput",               "(J)V",  (void*) android_view_RenderNode_output },
484fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    { "nGetDebugSize",         "(J)I",  (void*) android_view_RenderNode_getDebugSize },
485f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
4864136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetLayerType",         "!(JI)Z",  (void*) android_view_RenderNode_setLayerType },
4874136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetLayerPaint",        "!(JJ)Z",  (void*) android_view_RenderNode_setLayerPaint },
4884136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetStaticMatrix",      "!(JJ)Z",  (void*) android_view_RenderNode_setStaticMatrix },
4894136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetAnimationMatrix",   "!(JJ)Z",  (void*) android_view_RenderNode_setAnimationMatrix },
4904136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetClipToBounds",      "!(JZ)Z",  (void*) android_view_RenderNode_setClipToBounds },
4914136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetClipBounds",        "!(JIIII)Z", (void*) android_view_RenderNode_setClipBounds },
4924136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetClipBoundsEmpty",   "!(J)Z",   (void*) android_view_RenderNode_setClipBoundsEmpty },
4934136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetProjectBackwards",  "!(JZ)Z",  (void*) android_view_RenderNode_setProjectBackwards },
4944136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetProjectionReceiver","!(JZ)Z",  (void*) android_view_RenderNode_setProjectionReceiver },
49579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck
49677b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik    { "nSetOutlineRoundRect",  "(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect },
49777b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik    { "nSetOutlineConvexPath", "(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath },
49879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    { "nSetOutlineEmpty",      "(J)Z",   (void*) android_view_RenderNode_setOutlineEmpty },
4990645128b80621edee70f8cab4afb208fe0c26becChris Craik    { "nSetOutlineNone",       "(J)Z",   (void*) android_view_RenderNode_setOutlineNone },
5004136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nHasShadow",            "!(J)Z",   (void*) android_view_RenderNode_hasShadow },
5014136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetClipToOutline",     "!(JZ)Z",  (void*) android_view_RenderNode_setClipToOutline },
502af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik    { "nSetRevealClip",        "(JZFFF)Z", (void*) android_view_RenderNode_setRevealClip },
50379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck
5044136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetAlpha",             "!(JF)Z",  (void*) android_view_RenderNode_setAlpha },
5054136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetHasOverlappingRendering", "!(JZ)Z",
506f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            (void*) android_view_RenderNode_setHasOverlappingRendering },
5074136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetElevation",         "!(JF)Z",  (void*) android_view_RenderNode_setElevation },
5084136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetTranslationX",      "!(JF)Z",  (void*) android_view_RenderNode_setTranslationX },
5094136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetTranslationY",      "!(JF)Z",  (void*) android_view_RenderNode_setTranslationY },
5104136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetTranslationZ",      "!(JF)Z",  (void*) android_view_RenderNode_setTranslationZ },
5114136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetRotation",          "!(JF)Z",  (void*) android_view_RenderNode_setRotation },
5124136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetRotationX",         "!(JF)Z",  (void*) android_view_RenderNode_setRotationX },
5134136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetRotationY",         "!(JF)Z",  (void*) android_view_RenderNode_setRotationY },
5144136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetScaleX",            "!(JF)Z",  (void*) android_view_RenderNode_setScaleX },
5154136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetScaleY",            "!(JF)Z",  (void*) android_view_RenderNode_setScaleY },
5164136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetPivotX",            "!(JF)Z",  (void*) android_view_RenderNode_setPivotX },
5174136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetPivotY",            "!(JF)Z",  (void*) android_view_RenderNode_setPivotY },
5184136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetCameraDistance",    "!(JF)Z",  (void*) android_view_RenderNode_setCameraDistance },
5194136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetLeft",              "!(JI)Z",  (void*) android_view_RenderNode_setLeft },
5204136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetTop",               "!(JI)Z",  (void*) android_view_RenderNode_setTop },
5214136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetRight",             "!(JI)Z",  (void*) android_view_RenderNode_setRight },
5224136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetBottom",            "!(JI)Z",  (void*) android_view_RenderNode_setBottom },
5234136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetLeftTopRightBottom","!(JIIII)Z", (void*) android_view_RenderNode_setLeftTopRightBottom },
5244136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nOffsetLeftAndRight",   "!(JI)Z",  (void*) android_view_RenderNode_offsetLeftAndRight },
5254136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nOffsetTopAndBottom",   "!(JI)Z",  (void*) android_view_RenderNode_offsetTopAndBottom },
5264136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik
5274136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nHasOverlappingRendering", "!(J)Z",  (void*) android_view_RenderNode_hasOverlappingRendering },
5284136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetClipToOutline",        "!(J)Z",  (void*) android_view_RenderNode_getClipToOutline },
5294136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetAlpha",                "!(J)F",  (void*) android_view_RenderNode_getAlpha },
5304136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetCameraDistance",       "!(J)F",  (void*) android_view_RenderNode_getCameraDistance },
5314136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetScaleX",               "!(J)F",  (void*) android_view_RenderNode_getScaleX },
5324136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetScaleY",               "!(J)F",  (void*) android_view_RenderNode_getScaleY },
5334136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetElevation",            "!(J)F",  (void*) android_view_RenderNode_getElevation },
5344136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetTranslationX",         "!(J)F",  (void*) android_view_RenderNode_getTranslationX },
5354136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetTranslationY",         "!(J)F",  (void*) android_view_RenderNode_getTranslationY },
5364136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetTranslationZ",         "!(J)F",  (void*) android_view_RenderNode_getTranslationZ },
5374136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetRotation",             "!(J)F",  (void*) android_view_RenderNode_getRotation },
5384136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetRotationX",            "!(J)F",  (void*) android_view_RenderNode_getRotationX },
5394136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetRotationY",            "!(J)F",  (void*) android_view_RenderNode_getRotationY },
5404136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nIsPivotExplicitlySet",    "!(J)Z",  (void*) android_view_RenderNode_isPivotExplicitlySet },
5414136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nHasIdentityMatrix",       "!(J)Z",  (void*) android_view_RenderNode_hasIdentityMatrix },
5424136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik
5434136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetTransformMatrix",       "!(JJ)V", (void*) android_view_RenderNode_getTransformMatrix },
5444136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetInverseTransformMatrix","!(JJ)V", (void*) android_view_RenderNode_getInverseTransformMatrix },
5454136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik
5464136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetPivotX",                "!(J)F",  (void*) android_view_RenderNode_getPivotX },
5474136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetPivotY",                "!(J)F",  (void*) android_view_RenderNode_getPivotY },
548e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
549e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    { "nAddAnimator",              "(JJ)V", (void*) android_view_RenderNode_addAnimator },
550119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    { "nEndAllAnimators",          "(J)V", (void*) android_view_RenderNode_endAllAnimators },
551a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif
552a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase};
553a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
554a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#ifdef USE_OPENGL_RENDERER
555a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    #define FIND_CLASS(var, className) \
556a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            var = env->FindClass(className); \
557a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            LOG_FATAL_IF(! var, "Unable to find class " className);
558a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
559a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
560a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            var = env->GetMethodID(clazz, methodName, methodDescriptor); \
561a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            LOG_FATAL_IF(! var, "Unable to find method " methodName);
562a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#else
563a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    #define FIND_CLASS(var, className)
564a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
565a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif
566a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
567f666ad7046c0b1b255835f75aeb7d1391067df93John Reckint register_android_view_RenderNode(JNIEnv* env) {
568a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
569a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
570a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
571a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase};
572a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
573