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