android_view_RenderNode.cpp revision ef09d8cf946443e7f4ac4541f843368ac4338c59
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 <DisplayList.h>
27#include <DisplayListRenderer.h>
28
29namespace android {
30
31using namespace uirenderer;
32
33/**
34 * Note: OpenGLRenderer JNI layer is generated and compiled only on supported
35 *       devices. This means all the logic must be compiled only when the
36 *       preprocessor variable USE_OPENGL_RENDERER is defined.
37 */
38#ifdef USE_OPENGL_RENDERER
39
40// ----------------------------------------------------------------------------
41// DisplayList view properties
42// ----------------------------------------------------------------------------
43
44static void android_view_RenderNode_setDisplayListName(JNIEnv* env,
45        jobject clazz, jlong displayListPtr, jstring name) {
46    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
47    if (name != NULL) {
48        const char* textArray = env->GetStringUTFChars(name, NULL);
49        displayList->setName(textArray);
50        env->ReleaseStringUTFChars(name, textArray);
51    }
52}
53
54static void android_view_RenderNode_output(JNIEnv* env,
55        jobject clazz, jlong displayListPtr) {
56    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
57    displayList->output();
58}
59
60static jlong android_view_RenderNode_create(JNIEnv* env, jobject clazz) {
61    RenderNode* displayList = new RenderNode();
62    return reinterpret_cast<jlong>(displayList);
63}
64
65static void android_view_RenderNode_destroyDisplayList(JNIEnv* env,
66        jobject clazz, jlong displayListPtr) {
67    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
68    RenderNode::destroyDisplayListDeferred(displayList);
69}
70
71// ----------------------------------------------------------------------------
72// DisplayList view properties
73// ----------------------------------------------------------------------------
74
75static void android_view_RenderNode_setCaching(JNIEnv* env,
76        jobject clazz, jlong displayListPtr, jboolean caching) {
77    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
78    displayList->properties().setCaching(caching);
79}
80
81static void android_view_RenderNode_setStaticMatrix(JNIEnv* env,
82        jobject clazz, jlong displayListPtr, jlong matrixPtr) {
83    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
84    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
85    displayList->properties().setStaticMatrix(matrix);
86}
87
88static void android_view_RenderNode_setAnimationMatrix(JNIEnv* env,
89        jobject clazz, jlong displayListPtr, jlong matrixPtr) {
90    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
91    SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
92    displayList->properties().setAnimationMatrix(matrix);
93}
94
95static void android_view_RenderNode_setClipToBounds(JNIEnv* env,
96        jobject clazz, jlong displayListPtr, jboolean clipToBounds) {
97    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
98    displayList->properties().setClipToBounds(clipToBounds);
99}
100
101static void android_view_RenderNode_setIsolatedZVolume(JNIEnv* env,
102        jobject clazz, jlong displayListPtr, jboolean shouldIsolate) {
103    // No-op, TODO: Remove Java usage of this method
104}
105
106static void android_view_RenderNode_setProjectBackwards(JNIEnv* env,
107        jobject clazz, jlong displayListPtr, jboolean shouldProject) {
108    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
109    displayList->properties().setProjectBackwards(shouldProject);
110}
111
112static void android_view_RenderNode_setProjectionReceiver(JNIEnv* env,
113        jobject clazz, jlong displayListPtr, jboolean shouldRecieve) {
114    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
115    displayList->properties().setProjectionReceiver(shouldRecieve);
116}
117
118static void android_view_RenderNode_setOutline(JNIEnv* env,
119        jobject clazz, jlong displayListPtr, jlong outlinePathPtr) {
120    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
121    SkPath* outline = reinterpret_cast<SkPath*>(outlinePathPtr);
122    displayList->properties().setOutline(outline);
123}
124
125static void android_view_RenderNode_setClipToOutline(JNIEnv* env,
126        jobject clazz, jlong displayListPtr, jboolean clipToOutline) {
127    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
128    displayList->properties().setClipToOutline(clipToOutline);
129}
130
131static void android_view_RenderNode_setCastsShadow(JNIEnv* env,
132        jobject clazz, jlong displayListPtr, jboolean castsShadow) {
133    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
134    displayList->properties().setCastsShadow(castsShadow);
135}
136
137static void android_view_RenderNode_setUsesGlobalCamera(JNIEnv* env,
138        jobject clazz, jlong displayListPtr, jboolean usesGlobalCamera) {
139    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
140    displayList->properties().setUsesGlobalCamera(usesGlobalCamera);
141}
142
143static void android_view_RenderNode_setAlpha(JNIEnv* env,
144        jobject clazz, jlong displayListPtr, float alpha) {
145    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
146    displayList->properties().setAlpha(alpha);
147}
148
149static void android_view_RenderNode_setHasOverlappingRendering(JNIEnv* env,
150        jobject clazz, jlong displayListPtr, bool hasOverlappingRendering) {
151    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
152    displayList->properties().setHasOverlappingRendering(hasOverlappingRendering);
153}
154
155static void android_view_RenderNode_setTranslationX(JNIEnv* env,
156        jobject clazz, jlong displayListPtr, float tx) {
157    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
158    displayList->properties().setTranslationX(tx);
159}
160
161static void android_view_RenderNode_setTranslationY(JNIEnv* env,
162        jobject clazz, jlong displayListPtr, float ty) {
163    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
164    displayList->properties().setTranslationY(ty);
165}
166
167static void android_view_RenderNode_setTranslationZ(JNIEnv* env,
168        jobject clazz, jlong displayListPtr, float tz) {
169    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
170    displayList->properties().setTranslationZ(tz);
171}
172
173static void android_view_RenderNode_setRotation(JNIEnv* env,
174        jobject clazz, jlong displayListPtr, float rotation) {
175    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
176    displayList->properties().setRotation(rotation);
177}
178
179static void android_view_RenderNode_setRotationX(JNIEnv* env,
180        jobject clazz, jlong displayListPtr, float rx) {
181    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
182    displayList->properties().setRotationX(rx);
183}
184
185static void android_view_RenderNode_setRotationY(JNIEnv* env,
186        jobject clazz, jlong displayListPtr, float ry) {
187    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
188    displayList->properties().setRotationY(ry);
189}
190
191static void android_view_RenderNode_setScaleX(JNIEnv* env,
192        jobject clazz, jlong displayListPtr, float sx) {
193    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
194    displayList->properties().setScaleX(sx);
195}
196
197static void android_view_RenderNode_setScaleY(JNIEnv* env,
198        jobject clazz, jlong displayListPtr, float sy) {
199    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
200    displayList->properties().setScaleY(sy);
201}
202
203static void android_view_RenderNode_setTransformationInfo(JNIEnv* env,
204        jobject clazz, jlong displayListPtr, float alpha,
205        float translationX, float translationY, float translationZ,
206        float rotation, float rotationX, float rotationY, float scaleX, float scaleY) {
207    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
208    displayList->properties().setAlpha(alpha);
209    displayList->properties().setTranslationX(translationX);
210    displayList->properties().setTranslationY(translationY);
211    displayList->properties().setTranslationZ(translationZ);
212    displayList->properties().setRotation(rotation);
213    displayList->properties().setRotationX(rotationX);
214    displayList->properties().setRotationY(rotationY);
215    displayList->properties().setScaleX(scaleX);
216    displayList->properties().setScaleY(scaleY);
217}
218
219static void android_view_RenderNode_setPivotX(JNIEnv* env,
220        jobject clazz, jlong displayListPtr, float px) {
221    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
222    displayList->properties().setPivotX(px);
223}
224
225static void android_view_RenderNode_setPivotY(JNIEnv* env,
226        jobject clazz, jlong displayListPtr, float py) {
227    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
228    displayList->properties().setPivotY(py);
229}
230
231static void android_view_RenderNode_setCameraDistance(JNIEnv* env,
232        jobject clazz, jlong displayListPtr, float distance) {
233    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
234    displayList->properties().setCameraDistance(distance);
235}
236
237static void android_view_RenderNode_setLeft(JNIEnv* env,
238        jobject clazz, jlong displayListPtr, int left) {
239    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
240    displayList->properties().setLeft(left);
241}
242
243static void android_view_RenderNode_setTop(JNIEnv* env,
244        jobject clazz, jlong displayListPtr, int top) {
245    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
246    displayList->properties().setTop(top);
247}
248
249static void android_view_RenderNode_setRight(JNIEnv* env,
250        jobject clazz, jlong displayListPtr, int right) {
251    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
252    displayList->properties().setRight(right);
253}
254
255static void android_view_RenderNode_setBottom(JNIEnv* env,
256        jobject clazz, jlong displayListPtr, int bottom) {
257    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
258    displayList->properties().setBottom(bottom);
259}
260
261static void android_view_RenderNode_setLeftTopRightBottom(JNIEnv* env,
262        jobject clazz, jlong displayListPtr, int left, int top,
263        int right, int bottom) {
264    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
265    displayList->properties().setLeftTopRightBottom(left, top, right, bottom);
266}
267
268static void android_view_RenderNode_offsetLeftAndRight(JNIEnv* env,
269        jobject clazz, jlong displayListPtr, float offset) {
270    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
271    displayList->properties().offsetLeftRight(offset);
272}
273
274static void android_view_RenderNode_offsetTopAndBottom(JNIEnv* env,
275        jobject clazz, jlong displayListPtr, float offset) {
276    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
277    displayList->properties().offsetTopBottom(offset);
278}
279
280static jboolean android_view_RenderNode_hasOverlappingRendering(JNIEnv* env,
281        jobject clazz, jlong displayListPtr) {
282    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
283    return displayList->properties().hasOverlappingRendering();
284}
285
286static jfloat android_view_RenderNode_getAlpha(JNIEnv* env,
287        jobject clazz, jlong displayListPtr) {
288    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
289    return displayList->properties().getAlpha();
290}
291
292static jfloat android_view_RenderNode_getLeft(JNIEnv* env,
293        jobject clazz, jlong displayListPtr) {
294    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
295    return displayList->properties().getLeft();
296}
297
298static jfloat android_view_RenderNode_getTop(JNIEnv* env,
299        jobject clazz, jlong displayListPtr) {
300    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
301    return displayList->properties().getTop();
302}
303
304static jfloat android_view_RenderNode_getRight(JNIEnv* env,
305        jobject clazz, jlong displayListPtr) {
306    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
307    return displayList->properties().getRight();
308}
309
310static jfloat android_view_RenderNode_getBottom(JNIEnv* env,
311        jobject clazz, jlong displayListPtr) {
312    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
313    return displayList->properties().getBottom();
314}
315
316static jfloat android_view_RenderNode_getCameraDistance(JNIEnv* env,
317        jobject clazz, jlong displayListPtr) {
318    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
319    return displayList->properties().getCameraDistance();
320}
321
322static jfloat android_view_RenderNode_getScaleX(JNIEnv* env,
323        jobject clazz, jlong displayListPtr) {
324    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
325    return displayList->properties().getScaleX();
326}
327
328static jfloat android_view_RenderNode_getScaleY(JNIEnv* env,
329        jobject clazz, jlong displayListPtr) {
330    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
331    return displayList->properties().getScaleY();
332}
333
334static jfloat android_view_RenderNode_getTranslationX(JNIEnv* env,
335        jobject clazz, jlong displayListPtr) {
336    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
337    return displayList->properties().getTranslationX();
338}
339
340static jfloat android_view_RenderNode_getTranslationY(JNIEnv* env,
341        jobject clazz, jlong displayListPtr) {
342    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
343    return displayList->properties().getTranslationY();
344}
345
346static jfloat android_view_RenderNode_getRotation(JNIEnv* env,
347        jobject clazz, jlong displayListPtr) {
348    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
349    return displayList->properties().getRotation();
350}
351
352static jfloat android_view_RenderNode_getRotationX(JNIEnv* env,
353        jobject clazz, jlong displayListPtr) {
354    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
355    return displayList->properties().getRotationX();
356}
357
358static jfloat android_view_RenderNode_getRotationY(JNIEnv* env,
359        jobject clazz, jlong displayListPtr) {
360    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
361    return displayList->properties().getRotationY();
362}
363
364static jfloat android_view_RenderNode_getPivotX(JNIEnv* env,
365        jobject clazz, jlong displayListPtr) {
366    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
367    return displayList->properties().getPivotX();
368}
369
370static jfloat android_view_RenderNode_getPivotY(JNIEnv* env,
371        jobject clazz, jlong displayListPtr) {
372    RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr);
373    return displayList->properties().getPivotY();
374}
375
376#endif // USE_OPENGL_RENDERER
377
378// ----------------------------------------------------------------------------
379// JNI Glue
380// ----------------------------------------------------------------------------
381
382const char* const kClassPathName = "android/view/RenderNode";
383
384static JNINativeMethod gMethods[] = {
385#ifdef USE_OPENGL_RENDERER
386    { "nCreate",               "()J",    (void*) android_view_RenderNode_create },
387    { "nDestroyDisplayList",   "(J)V",   (void*) android_view_RenderNode_destroyDisplayList },
388    { "nSetDisplayListName",   "(JLjava/lang/String;)V",
389            (void*) android_view_RenderNode_setDisplayListName },
390    { "nOutput",               "(J)V",  (void*) android_view_RenderNode_output },
391
392    { "nSetCaching",           "(JZ)V",  (void*) android_view_RenderNode_setCaching },
393    { "nSetStaticMatrix",      "(JJ)V",  (void*) android_view_RenderNode_setStaticMatrix },
394    { "nSetAnimationMatrix",   "(JJ)V",  (void*) android_view_RenderNode_setAnimationMatrix },
395    { "nSetClipToBounds",      "(JZ)V",  (void*) android_view_RenderNode_setClipToBounds },
396    { "nSetIsolatedZVolume",   "(JZ)V",  (void*) android_view_RenderNode_setIsolatedZVolume },
397    { "nSetProjectBackwards",  "(JZ)V",  (void*) android_view_RenderNode_setProjectBackwards },
398    { "nSetProjectionReceiver","(JZ)V",  (void*) android_view_RenderNode_setProjectionReceiver },
399    { "nSetOutline",           "(JJ)V",  (void*) android_view_RenderNode_setOutline },
400    { "nSetClipToOutline",     "(JZ)V",  (void*) android_view_RenderNode_setClipToOutline },
401    { "nSetCastsShadow",       "(JZ)V",  (void*) android_view_RenderNode_setCastsShadow },
402    { "nSetUsesGlobalCamera",  "(JZ)V",  (void*) android_view_RenderNode_setUsesGlobalCamera },
403    { "nSetAlpha",             "(JF)V",  (void*) android_view_RenderNode_setAlpha },
404    { "nSetHasOverlappingRendering", "(JZ)V",
405            (void*) android_view_RenderNode_setHasOverlappingRendering },
406    { "nSetTranslationX",      "(JF)V",  (void*) android_view_RenderNode_setTranslationX },
407    { "nSetTranslationY",      "(JF)V",  (void*) android_view_RenderNode_setTranslationY },
408    { "nSetTranslationZ",      "(JF)V",  (void*) android_view_RenderNode_setTranslationZ },
409    { "nSetRotation",          "(JF)V",  (void*) android_view_RenderNode_setRotation },
410    { "nSetRotationX",         "(JF)V",  (void*) android_view_RenderNode_setRotationX },
411    { "nSetRotationY",         "(JF)V",  (void*) android_view_RenderNode_setRotationY },
412    { "nSetScaleX",            "(JF)V",  (void*) android_view_RenderNode_setScaleX },
413    { "nSetScaleY",            "(JF)V",  (void*) android_view_RenderNode_setScaleY },
414    { "nSetTransformationInfo","(JFFFFFFFFF)V",
415            (void*) android_view_RenderNode_setTransformationInfo },
416    { "nSetPivotX",            "(JF)V",  (void*) android_view_RenderNode_setPivotX },
417    { "nSetPivotY",            "(JF)V",  (void*) android_view_RenderNode_setPivotY },
418    { "nSetCameraDistance",    "(JF)V",  (void*) android_view_RenderNode_setCameraDistance },
419    { "nSetLeft",              "(JI)V",  (void*) android_view_RenderNode_setLeft },
420    { "nSetTop",               "(JI)V",  (void*) android_view_RenderNode_setTop },
421    { "nSetRight",             "(JI)V",  (void*) android_view_RenderNode_setRight },
422    { "nSetBottom",            "(JI)V",  (void*) android_view_RenderNode_setBottom },
423    { "nSetLeftTopRightBottom","(JIIII)V", (void*) android_view_RenderNode_setLeftTopRightBottom },
424    { "nOffsetLeftAndRight",   "(JF)V",  (void*) android_view_RenderNode_offsetLeftAndRight },
425    { "nOffsetTopAndBottom",   "(JF)V",  (void*) android_view_RenderNode_offsetTopAndBottom },
426
427    { "nHasOverlappingRendering", "(J)Z",  (void*) android_view_RenderNode_hasOverlappingRendering },
428    { "nGetAlpha",                "(J)F",  (void*) android_view_RenderNode_getAlpha },
429    { "nGetLeft",                 "(J)F",  (void*) android_view_RenderNode_getLeft },
430    { "nGetTop",                  "(J)F",  (void*) android_view_RenderNode_getTop },
431    { "nGetRight",                "(J)F",  (void*) android_view_RenderNode_getRight },
432    { "nGetBottom",               "(J)F",  (void*) android_view_RenderNode_getBottom },
433    { "nGetCameraDistance",       "(J)F",  (void*) android_view_RenderNode_getCameraDistance },
434    { "nGetScaleX",               "(J)F",  (void*) android_view_RenderNode_getScaleX },
435    { "nGetScaleY",               "(J)F",  (void*) android_view_RenderNode_getScaleY },
436    { "nGetTranslationX",         "(J)F",  (void*) android_view_RenderNode_getTranslationX },
437    { "nGetTranslationY",         "(J)F",  (void*) android_view_RenderNode_getTranslationY },
438    { "nGetRotation",             "(J)F",  (void*) android_view_RenderNode_getRotation },
439    { "nGetRotationX",            "(J)F",  (void*) android_view_RenderNode_getRotationX },
440    { "nGetRotationY",            "(J)F",  (void*) android_view_RenderNode_getRotationY },
441    { "nGetPivotX",               "(J)F",  (void*) android_view_RenderNode_getPivotX },
442    { "nGetPivotY",               "(J)F",  (void*) android_view_RenderNode_getPivotY },
443#endif
444};
445
446#ifdef USE_OPENGL_RENDERER
447    #define FIND_CLASS(var, className) \
448            var = env->FindClass(className); \
449            LOG_FATAL_IF(! var, "Unable to find class " className);
450
451    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
452            var = env->GetMethodID(clazz, methodName, methodDescriptor); \
453            LOG_FATAL_IF(! var, "Unable to find method " methodName);
454#else
455    #define FIND_CLASS(var, className)
456    #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
457#endif
458
459int register_android_view_RenderNode(JNIEnv* env) {
460    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
461}
462
463};
464
465