android_view_RenderNode.cpp revision 2bcad176757386d906157bb898167fbcebe9f55e
1/*
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
26#include <Animator.h>
27#include <DisplayListRenderer.h>
28#include <RenderNode.h>
29
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
45static void android_view_RenderNode_output(JNIEnv* env,
46        jobject clazz, jlong renderNodePtr) {
47    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
48    renderNode->output();
49}
50
51static jlong android_view_RenderNode_create(JNIEnv* env, jobject clazz, jstring name) {
52    RenderNode* renderNode = new RenderNode();
53    renderNode->incStrong(0);
54    if (name != NULL) {
55        const char* textArray = env->GetStringUTFChars(name, NULL);
56        renderNode->setName(textArray);
57        env->ReleaseStringUTFChars(name, textArray);
58    }
59    return reinterpret_cast<jlong>(renderNode);
60}
61
62static void android_view_RenderNode_destroyRenderNode(JNIEnv* env,
63        jobject clazz, jlong renderNodePtr) {
64    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
65    renderNode->decStrong(0);
66}
67
68static void android_view_RenderNode_setDisplayListData(JNIEnv* env,
69        jobject clazz, jlong renderNodePtr, jlong newDataPtr) {
70    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
71    DisplayListData* newData = reinterpret_cast<DisplayListData*>(newDataPtr);
72    renderNode->setStagingDisplayList(newData);
73}
74
75// ----------------------------------------------------------------------------
76// RenderProperties - setters
77// ----------------------------------------------------------------------------
78
79static void android_view_RenderNode_setCaching(JNIEnv* env,
80        jobject clazz, jlong renderNodePtr, jboolean caching) {
81    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
82    renderNode->mutateStagingProperties().setCaching(caching);
83}
84
85static void android_view_RenderNode_setStaticMatrix(JNIEnv* env,
86        jobject clazz, jlong renderNodePtr, jlong matrixPtr) {
87    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
88    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
89    renderNode->mutateStagingProperties().setStaticMatrix(matrix);
90}
91
92static void android_view_RenderNode_setAnimationMatrix(JNIEnv* env,
93        jobject clazz, jlong renderNodePtr, jlong matrixPtr) {
94    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
95    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
96    renderNode->mutateStagingProperties().setAnimationMatrix(matrix);
97}
98
99static void android_view_RenderNode_setClipToBounds(JNIEnv* env,
100        jobject clazz, jlong renderNodePtr, jboolean clipToBounds) {
101    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
102    renderNode->mutateStagingProperties().setClipToBounds(clipToBounds);
103}
104
105static void android_view_RenderNode_setProjectBackwards(JNIEnv* env,
106        jobject clazz, jlong renderNodePtr, jboolean shouldProject) {
107    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
108    renderNode->mutateStagingProperties().setProjectBackwards(shouldProject);
109}
110
111static void android_view_RenderNode_setProjectionReceiver(JNIEnv* env,
112        jobject clazz, jlong renderNodePtr, jboolean shouldRecieve) {
113    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
114    renderNode->mutateStagingProperties().setProjectionReceiver(shouldRecieve);
115}
116
117static void android_view_RenderNode_setOutlineRoundRect(JNIEnv* env,
118        jobject clazz, jlong renderNodePtr, jint left, jint top,
119        jint right, jint bottom, jfloat radius) {
120    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
121    renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom, radius);
122}
123
124static void android_view_RenderNode_setOutlineConvexPath(JNIEnv* env,
125        jobject clazz, jlong renderNodePtr, jlong outlinePathPtr) {
126    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
127    SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr);
128    renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath);
129}
130
131static void android_view_RenderNode_setOutlineEmpty(JNIEnv* env,
132        jobject clazz, jlong renderNodePtr) {
133    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
134    renderNode->mutateStagingProperties().mutableOutline().setEmpty();
135}
136
137static void android_view_RenderNode_setClipToOutline(JNIEnv* env,
138        jobject clazz, jlong renderNodePtr, jboolean clipToOutline) {
139    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
140    renderNode->mutateStagingProperties().mutableOutline().setShouldClip(clipToOutline);
141}
142
143static void android_view_RenderNode_setRevealClip(JNIEnv* env,
144        jobject clazz, jlong renderNodePtr, jboolean shouldClip, jboolean inverseClip,
145        jfloat x, jfloat y, jfloat radius) {
146    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
147    renderNode->mutateStagingProperties().mutableRevealClip().set(
148            shouldClip, inverseClip, x, y, radius);
149}
150
151static void android_view_RenderNode_setAlpha(JNIEnv* env,
152        jobject clazz, jlong renderNodePtr, float alpha) {
153    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
154    renderNode->mutateStagingProperties().setAlpha(alpha);
155}
156
157static void android_view_RenderNode_setHasOverlappingRendering(JNIEnv* env,
158        jobject clazz, jlong renderNodePtr, bool hasOverlappingRendering) {
159    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
160    renderNode->mutateStagingProperties().setHasOverlappingRendering(hasOverlappingRendering);
161}
162
163static void android_view_RenderNode_setElevation(JNIEnv* env,
164        jobject clazz, jlong renderNodePtr, float elevation) {
165    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
166    renderNode->mutateStagingProperties().setElevation(elevation);
167}
168
169static void android_view_RenderNode_setTranslationX(JNIEnv* env,
170        jobject clazz, jlong renderNodePtr, float tx) {
171    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
172    renderNode->mutateStagingProperties().setTranslationX(tx);
173}
174
175static void android_view_RenderNode_setTranslationY(JNIEnv* env,
176        jobject clazz, jlong renderNodePtr, float ty) {
177    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
178    renderNode->mutateStagingProperties().setTranslationY(ty);
179}
180
181static void android_view_RenderNode_setTranslationZ(JNIEnv* env,
182        jobject clazz, jlong renderNodePtr, float tz) {
183    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
184    renderNode->mutateStagingProperties().setTranslationZ(tz);
185}
186
187static void android_view_RenderNode_setRotation(JNIEnv* env,
188        jobject clazz, jlong renderNodePtr, float rotation) {
189    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
190    renderNode->mutateStagingProperties().setRotation(rotation);
191}
192
193static void android_view_RenderNode_setRotationX(JNIEnv* env,
194        jobject clazz, jlong renderNodePtr, float rx) {
195    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
196    renderNode->mutateStagingProperties().setRotationX(rx);
197}
198
199static void android_view_RenderNode_setRotationY(JNIEnv* env,
200        jobject clazz, jlong renderNodePtr, float ry) {
201    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
202    renderNode->mutateStagingProperties().setRotationY(ry);
203}
204
205static void android_view_RenderNode_setScaleX(JNIEnv* env,
206        jobject clazz, jlong renderNodePtr, float sx) {
207    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
208    renderNode->mutateStagingProperties().setScaleX(sx);
209}
210
211static void android_view_RenderNode_setScaleY(JNIEnv* env,
212        jobject clazz, jlong renderNodePtr, float sy) {
213    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
214    renderNode->mutateStagingProperties().setScaleY(sy);
215}
216
217static void android_view_RenderNode_setPivotX(JNIEnv* env,
218        jobject clazz, jlong renderNodePtr, float px) {
219    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
220    renderNode->mutateStagingProperties().setPivotX(px);
221}
222
223static void android_view_RenderNode_setPivotY(JNIEnv* env,
224        jobject clazz, jlong renderNodePtr, float py) {
225    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
226    renderNode->mutateStagingProperties().setPivotY(py);
227}
228
229static void android_view_RenderNode_setCameraDistance(JNIEnv* env,
230        jobject clazz, jlong renderNodePtr, float distance) {
231    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
232    renderNode->mutateStagingProperties().setCameraDistance(distance);
233}
234
235static void android_view_RenderNode_setLeft(JNIEnv* env,
236        jobject clazz, jlong renderNodePtr, int left) {
237    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
238    renderNode->mutateStagingProperties().setLeft(left);
239}
240
241static void android_view_RenderNode_setTop(JNIEnv* env,
242        jobject clazz, jlong renderNodePtr, int top) {
243    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
244    renderNode->mutateStagingProperties().setTop(top);
245}
246
247static void android_view_RenderNode_setRight(JNIEnv* env,
248        jobject clazz, jlong renderNodePtr, int right) {
249    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
250    renderNode->mutateStagingProperties().setRight(right);
251}
252
253static void android_view_RenderNode_setBottom(JNIEnv* env,
254        jobject clazz, jlong renderNodePtr, int bottom) {
255    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
256    renderNode->mutateStagingProperties().setBottom(bottom);
257}
258
259static void android_view_RenderNode_setLeftTopRightBottom(JNIEnv* env,
260        jobject clazz, jlong renderNodePtr, int left, int top,
261        int right, int bottom) {
262    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
263    renderNode->mutateStagingProperties().setLeftTopRightBottom(left, top, right, bottom);
264}
265
266static void android_view_RenderNode_offsetLeftAndRight(JNIEnv* env,
267        jobject clazz, jlong renderNodePtr, float offset) {
268    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
269    renderNode->mutateStagingProperties().offsetLeftRight(offset);
270}
271
272static void android_view_RenderNode_offsetTopAndBottom(JNIEnv* env,
273        jobject clazz, jlong renderNodePtr, float offset) {
274    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
275    renderNode->mutateStagingProperties().offsetTopBottom(offset);
276}
277
278// ----------------------------------------------------------------------------
279// RenderProperties - getters
280// ----------------------------------------------------------------------------
281
282static jboolean android_view_RenderNode_hasOverlappingRendering(JNIEnv* env,
283        jobject clazz, jlong renderNodePtr) {
284    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
285    return renderNode->stagingProperties().hasOverlappingRendering();
286}
287
288static jfloat android_view_RenderNode_getAlpha(JNIEnv* env,
289        jobject clazz, jlong renderNodePtr) {
290    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
291    return renderNode->stagingProperties().getAlpha();
292}
293
294static jfloat android_view_RenderNode_getLeft(JNIEnv* env,
295        jobject clazz, jlong renderNodePtr) {
296    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
297    return renderNode->stagingProperties().getLeft();
298}
299
300static jfloat android_view_RenderNode_getTop(JNIEnv* env,
301        jobject clazz, jlong renderNodePtr) {
302    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
303    return renderNode->stagingProperties().getTop();
304}
305
306static jfloat android_view_RenderNode_getRight(JNIEnv* env,
307        jobject clazz, jlong renderNodePtr) {
308    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
309    return renderNode->stagingProperties().getRight();
310}
311
312static jfloat android_view_RenderNode_getBottom(JNIEnv* env,
313        jobject clazz, jlong renderNodePtr) {
314    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
315    return renderNode->stagingProperties().getBottom();
316}
317
318static jfloat android_view_RenderNode_getCameraDistance(JNIEnv* env,
319        jobject clazz, jlong renderNodePtr) {
320    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
321    return renderNode->stagingProperties().getCameraDistance();
322}
323
324static jfloat android_view_RenderNode_getScaleX(JNIEnv* env,
325        jobject clazz, jlong renderNodePtr) {
326    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
327    return renderNode->stagingProperties().getScaleX();
328}
329
330static jfloat android_view_RenderNode_getScaleY(JNIEnv* env,
331        jobject clazz, jlong renderNodePtr) {
332    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
333    return renderNode->stagingProperties().getScaleY();
334}
335
336static jfloat android_view_RenderNode_getElevation(JNIEnv* env,
337        jobject clazz, jlong renderNodePtr) {
338    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
339    return renderNode->stagingProperties().getElevation();
340}
341
342static jfloat android_view_RenderNode_getTranslationX(JNIEnv* env,
343        jobject clazz, jlong renderNodePtr) {
344    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
345    return renderNode->stagingProperties().getTranslationX();
346}
347
348static jfloat android_view_RenderNode_getTranslationY(JNIEnv* env,
349        jobject clazz, jlong renderNodePtr) {
350    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
351    return renderNode->stagingProperties().getTranslationY();
352}
353
354static jfloat android_view_RenderNode_getTranslationZ(JNIEnv* env,
355        jobject clazz, jlong renderNodePtr) {
356    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
357    return renderNode->stagingProperties().getTranslationZ();
358}
359
360static jfloat android_view_RenderNode_getRotation(JNIEnv* env,
361        jobject clazz, jlong renderNodePtr) {
362    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
363    return renderNode->stagingProperties().getRotation();
364}
365
366static jfloat android_view_RenderNode_getRotationX(JNIEnv* env,
367        jobject clazz, jlong renderNodePtr) {
368    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
369    return renderNode->stagingProperties().getRotationX();
370}
371
372static jfloat android_view_RenderNode_getRotationY(JNIEnv* env,
373        jobject clazz, jlong renderNodePtr) {
374    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
375    return renderNode->stagingProperties().getRotationY();
376}
377
378static jboolean android_view_RenderNode_isPivotExplicitlySet(JNIEnv* env,
379        jobject clazz, jlong renderNodePtr) {
380    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
381    return renderNode->stagingProperties().isPivotExplicitlySet();
382}
383
384static jboolean android_view_RenderNode_hasIdentityMatrix(JNIEnv* env,
385        jobject clazz, jlong renderNodePtr) {
386    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
387    renderNode->mutateStagingProperties().updateMatrix();
388    return !renderNode->stagingProperties().hasTransformMatrix();
389}
390
391// ----------------------------------------------------------------------------
392// RenderProperties - computed getters
393// ----------------------------------------------------------------------------
394
395static void android_view_RenderNode_getTransformMatrix(JNIEnv* env,
396        jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
397    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
398    SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
399
400    renderNode->mutateStagingProperties().updateMatrix();
401    const SkMatrix* transformMatrix = renderNode->stagingProperties().getTransformMatrix();
402
403    if (transformMatrix) {
404        *outMatrix = *transformMatrix;
405    } else {
406        outMatrix->setIdentity();
407    }
408}
409
410static void android_view_RenderNode_getInverseTransformMatrix(JNIEnv* env,
411        jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) {
412    // load transform matrix
413    android_view_RenderNode_getTransformMatrix(env, clazz, renderNodePtr, outMatrixPtr);
414    SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr);
415
416    // return it inverted
417    if (!outMatrix->invert(outMatrix)) {
418        // failed to load inverse, pass back identity
419        outMatrix->setIdentity();
420    }
421}
422
423static jfloat android_view_RenderNode_getPivotX(JNIEnv* env,
424        jobject clazz, jlong renderNodePtr) {
425    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
426    renderNode->mutateStagingProperties().updateMatrix();
427    return renderNode->stagingProperties().getPivotX();
428}
429
430static jfloat android_view_RenderNode_getPivotY(JNIEnv* env,
431        jobject clazz, jlong renderNodePtr) {
432    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
433    renderNode->mutateStagingProperties().updateMatrix();
434    return renderNode->stagingProperties().getPivotY();
435}
436
437// ----------------------------------------------------------------------------
438// RenderProperties - Animations
439// ----------------------------------------------------------------------------
440
441static void android_view_RenderNode_addAnimator(JNIEnv* env, jobject clazz,
442        jlong renderNodePtr, jlong animatorPtr) {
443    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
444    RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr);
445    renderNode->addAnimator(animator);
446}
447
448static void android_view_RenderNode_removeAnimator(JNIEnv* env, jobject clazz,
449        jlong renderNodePtr, jlong animatorPtr) {
450    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
451    RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr);
452    renderNode->removeAnimator(animator);
453}
454
455
456#endif // USE_OPENGL_RENDERER
457
458// ----------------------------------------------------------------------------
459// JNI Glue
460// ----------------------------------------------------------------------------
461
462const char* const kClassPathName = "android/view/RenderNode";
463
464static JNINativeMethod gMethods[] = {
465#ifdef USE_OPENGL_RENDERER
466    { "nCreate",               "(Ljava/lang/String;)J",    (void*) android_view_RenderNode_create },
467    { "nDestroyRenderNode",   "(J)V",   (void*) android_view_RenderNode_destroyRenderNode },
468    { "nSetDisplayListData",   "(JJ)V", (void*) android_view_RenderNode_setDisplayListData },
469    { "nOutput",               "(J)V",  (void*) android_view_RenderNode_output },
470
471    { "nSetCaching",           "(JZ)V",  (void*) android_view_RenderNode_setCaching },
472    { "nSetStaticMatrix",      "(JJ)V",  (void*) android_view_RenderNode_setStaticMatrix },
473    { "nSetAnimationMatrix",   "(JJ)V",  (void*) android_view_RenderNode_setAnimationMatrix },
474    { "nSetClipToBounds",      "(JZ)V",  (void*) android_view_RenderNode_setClipToBounds },
475    { "nSetProjectBackwards",  "(JZ)V",  (void*) android_view_RenderNode_setProjectBackwards },
476    { "nSetProjectionReceiver","(JZ)V",  (void*) android_view_RenderNode_setProjectionReceiver },
477
478    { "nSetOutlineRoundRect",  "(JIIIIF)V", (void*) android_view_RenderNode_setOutlineRoundRect },
479    { "nSetOutlineConvexPath", "(JJ)V",  (void*) android_view_RenderNode_setOutlineConvexPath },
480    { "nSetOutlineEmpty",      "(J)V",   (void*) android_view_RenderNode_setOutlineEmpty },
481    { "nSetClipToOutline",     "(JZ)V",  (void*) android_view_RenderNode_setClipToOutline },
482    { "nSetRevealClip",        "(JZZFFF)V", (void*) android_view_RenderNode_setRevealClip },
483
484    { "nSetAlpha",             "(JF)V",  (void*) android_view_RenderNode_setAlpha },
485    { "nSetHasOverlappingRendering", "(JZ)V",
486            (void*) android_view_RenderNode_setHasOverlappingRendering },
487    { "nSetElevation",         "(JF)V",  (void*) android_view_RenderNode_setElevation },
488    { "nSetTranslationX",      "(JF)V",  (void*) android_view_RenderNode_setTranslationX },
489    { "nSetTranslationY",      "(JF)V",  (void*) android_view_RenderNode_setTranslationY },
490    { "nSetTranslationZ",      "(JF)V",  (void*) android_view_RenderNode_setTranslationZ },
491    { "nSetRotation",          "(JF)V",  (void*) android_view_RenderNode_setRotation },
492    { "nSetRotationX",         "(JF)V",  (void*) android_view_RenderNode_setRotationX },
493    { "nSetRotationY",         "(JF)V",  (void*) android_view_RenderNode_setRotationY },
494    { "nSetScaleX",            "(JF)V",  (void*) android_view_RenderNode_setScaleX },
495    { "nSetScaleY",            "(JF)V",  (void*) android_view_RenderNode_setScaleY },
496    { "nSetPivotX",            "(JF)V",  (void*) android_view_RenderNode_setPivotX },
497    { "nSetPivotY",            "(JF)V",  (void*) android_view_RenderNode_setPivotY },
498    { "nSetCameraDistance",    "(JF)V",  (void*) android_view_RenderNode_setCameraDistance },
499    { "nSetLeft",              "(JI)V",  (void*) android_view_RenderNode_setLeft },
500    { "nSetTop",               "(JI)V",  (void*) android_view_RenderNode_setTop },
501    { "nSetRight",             "(JI)V",  (void*) android_view_RenderNode_setRight },
502    { "nSetBottom",            "(JI)V",  (void*) android_view_RenderNode_setBottom },
503    { "nSetLeftTopRightBottom","(JIIII)V", (void*) android_view_RenderNode_setLeftTopRightBottom },
504    { "nOffsetLeftAndRight",   "(JF)V",  (void*) android_view_RenderNode_offsetLeftAndRight },
505    { "nOffsetTopAndBottom",   "(JF)V",  (void*) android_view_RenderNode_offsetTopAndBottom },
506
507    { "nHasOverlappingRendering", "(J)Z",  (void*) android_view_RenderNode_hasOverlappingRendering },
508    { "nGetAlpha",                "(J)F",  (void*) android_view_RenderNode_getAlpha },
509    { "nGetLeft",                 "(J)F",  (void*) android_view_RenderNode_getLeft },
510    { "nGetTop",                  "(J)F",  (void*) android_view_RenderNode_getTop },
511    { "nGetRight",                "(J)F",  (void*) android_view_RenderNode_getRight },
512    { "nGetBottom",               "(J)F",  (void*) android_view_RenderNode_getBottom },
513    { "nGetCameraDistance",       "(J)F",  (void*) android_view_RenderNode_getCameraDistance },
514    { "nGetScaleX",               "(J)F",  (void*) android_view_RenderNode_getScaleX },
515    { "nGetScaleY",               "(J)F",  (void*) android_view_RenderNode_getScaleY },
516    { "nGetElevation",            "(J)F",  (void*) android_view_RenderNode_getElevation },
517    { "nGetTranslationX",         "(J)F",  (void*) android_view_RenderNode_getTranslationX },
518    { "nGetTranslationY",         "(J)F",  (void*) android_view_RenderNode_getTranslationY },
519    { "nGetTranslationZ",         "(J)F",  (void*) android_view_RenderNode_getTranslationZ },
520    { "nGetRotation",             "(J)F",  (void*) android_view_RenderNode_getRotation },
521    { "nGetRotationX",            "(J)F",  (void*) android_view_RenderNode_getRotationX },
522    { "nGetRotationY",            "(J)F",  (void*) android_view_RenderNode_getRotationY },
523    { "nIsPivotExplicitlySet",    "(J)Z",  (void*) android_view_RenderNode_isPivotExplicitlySet },
524    { "nHasIdentityMatrix",       "(J)Z",  (void*) android_view_RenderNode_hasIdentityMatrix },
525
526    { "nGetTransformMatrix",       "(JJ)V", (void*) android_view_RenderNode_getTransformMatrix },
527    { "nGetInverseTransformMatrix","(JJ)V", (void*) android_view_RenderNode_getInverseTransformMatrix },
528
529    { "nGetPivotX",                "(J)F",  (void*) android_view_RenderNode_getPivotX },
530    { "nGetPivotY",                "(J)F",  (void*) android_view_RenderNode_getPivotY },
531
532    { "nAddAnimator",              "(JJ)V", (void*) android_view_RenderNode_addAnimator },
533    { "nRemoveAnimator",           "(JJ)V", (void*) android_view_RenderNode_removeAnimator },
534#endif
535};
536
537#ifdef USE_OPENGL_RENDERER
538    #define FIND_CLASS(var, className) \
539            var = env->FindClass(className); \
540            LOG_FATAL_IF(! var, "Unable to find class " className);
541
542    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
543            var = env->GetMethodID(clazz, methodName, methodDescriptor); \
544            LOG_FATAL_IF(! var, "Unable to find method " methodName);
545#else
546    #define FIND_CLASS(var, className)
547    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
548#endif
549
550int register_android_view_RenderNode(JNIEnv* env) {
551    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
552}
553
554};
555
556