Home | History | Annotate | Download | only in jni
      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 
     29 namespace android {
     30 
     31 using 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 
     44 static void android_view_GLES20DisplayList_reset(JNIEnv* env,
     45         jobject clazz, DisplayList* displayList) {
     46     displayList->reset();
     47 }
     48 
     49 static jint android_view_GLES20DisplayList_getDisplayListSize(JNIEnv* env,
     50         jobject clazz, DisplayList* displayList) {
     51     return displayList->getSize();
     52 }
     53 
     54 static void android_view_GLES20DisplayList_setDisplayListName(JNIEnv* env,
     55         jobject clazz, DisplayList* displayList, jstring name) {
     56     if (name != NULL) {
     57         const char* textArray = env->GetStringUTFChars(name, NULL);
     58         displayList->setName(textArray);
     59         env->ReleaseStringUTFChars(name, textArray);
     60     }
     61 }
     62 
     63 static void android_view_GLES20DisplayList_destroyDisplayList(JNIEnv* env,
     64         jobject clazz, DisplayList* displayList) {
     65     DisplayList::destroyDisplayListDeferred(displayList);
     66 }
     67 
     68 // ----------------------------------------------------------------------------
     69 // DisplayList view properties
     70 // ----------------------------------------------------------------------------
     71 
     72 static void android_view_GLES20DisplayList_setCaching(JNIEnv* env,
     73         jobject clazz, DisplayList* displayList, jboolean caching) {
     74     displayList->setCaching(caching);
     75 }
     76 
     77 static void android_view_GLES20DisplayList_setStaticMatrix(JNIEnv* env,
     78         jobject clazz, DisplayList* displayList, SkMatrix* matrix) {
     79     displayList->setStaticMatrix(matrix);
     80 }
     81 
     82 static void android_view_GLES20DisplayList_setAnimationMatrix(JNIEnv* env,
     83         jobject clazz, DisplayList* displayList, SkMatrix* matrix) {
     84     displayList->setAnimationMatrix(matrix);
     85 }
     86 
     87 static void android_view_GLES20DisplayList_setClipToBounds(JNIEnv* env,
     88         jobject clazz, DisplayList* displayList, jboolean clipToBounds) {
     89     displayList->setClipToBounds(clipToBounds);
     90 }
     91 
     92 static void android_view_GLES20DisplayList_setAlpha(JNIEnv* env,
     93         jobject clazz, DisplayList* displayList, float alpha) {
     94     displayList->setAlpha(alpha);
     95 }
     96 
     97 static void android_view_GLES20DisplayList_setHasOverlappingRendering(JNIEnv* env,
     98         jobject clazz, DisplayList* displayList, bool hasOverlappingRendering) {
     99     displayList->setHasOverlappingRendering(hasOverlappingRendering);
    100 }
    101 
    102 static void android_view_GLES20DisplayList_setTranslationX(JNIEnv* env,
    103         jobject clazz, DisplayList* displayList, float tx) {
    104     displayList->setTranslationX(tx);
    105 }
    106 
    107 static void android_view_GLES20DisplayList_setTranslationY(JNIEnv* env,
    108         jobject clazz, DisplayList* displayList, float ty) {
    109     displayList->setTranslationY(ty);
    110 }
    111 
    112 static void android_view_GLES20DisplayList_setRotation(JNIEnv* env,
    113         jobject clazz, DisplayList* displayList, float rotation) {
    114     displayList->setRotation(rotation);
    115 }
    116 
    117 static void android_view_GLES20DisplayList_setRotationX(JNIEnv* env,
    118         jobject clazz, DisplayList* displayList, float rx) {
    119     displayList->setRotationX(rx);
    120 }
    121 
    122 static void android_view_GLES20DisplayList_setRotationY(JNIEnv* env,
    123         jobject clazz, DisplayList* displayList, float ry) {
    124     displayList->setRotationY(ry);
    125 }
    126 
    127 static void android_view_GLES20DisplayList_setScaleX(JNIEnv* env,
    128         jobject clazz, DisplayList* displayList, float sx) {
    129     displayList->setScaleX(sx);
    130 }
    131 
    132 static void android_view_GLES20DisplayList_setScaleY(JNIEnv* env,
    133         jobject clazz, DisplayList* displayList, float sy) {
    134     displayList->setScaleY(sy);
    135 }
    136 
    137 static void android_view_GLES20DisplayList_setTransformationInfo(JNIEnv* env,
    138         jobject clazz, DisplayList* displayList, float alpha,
    139         float translationX, float translationY, float rotation, float rotationX, float rotationY,
    140         float scaleX, float scaleY) {
    141     displayList->setAlpha(alpha);
    142     displayList->setTranslationX(translationX);
    143     displayList->setTranslationY(translationY);
    144     displayList->setRotation(rotation);
    145     displayList->setRotationX(rotationX);
    146     displayList->setRotationY(rotationY);
    147     displayList->setScaleX(scaleX);
    148     displayList->setScaleY(scaleY);
    149 }
    150 
    151 static void android_view_GLES20DisplayList_setPivotX(JNIEnv* env,
    152         jobject clazz, DisplayList* displayList, float px) {
    153     displayList->setPivotX(px);
    154 }
    155 
    156 static void android_view_GLES20DisplayList_setPivotY(JNIEnv* env,
    157         jobject clazz, DisplayList* displayList, float py) {
    158     displayList->setPivotY(py);
    159 }
    160 
    161 static void android_view_GLES20DisplayList_setCameraDistance(JNIEnv* env,
    162         jobject clazz, DisplayList* displayList, float distance) {
    163     displayList->setCameraDistance(distance);
    164 }
    165 
    166 static void android_view_GLES20DisplayList_setLeft(JNIEnv* env,
    167         jobject clazz, DisplayList* displayList, int left) {
    168     displayList->setLeft(left);
    169 }
    170 
    171 static void android_view_GLES20DisplayList_setTop(JNIEnv* env,
    172         jobject clazz, DisplayList* displayList, int top) {
    173     displayList->setTop(top);
    174 }
    175 
    176 static void android_view_GLES20DisplayList_setRight(JNIEnv* env,
    177         jobject clazz, DisplayList* displayList, int right) {
    178     displayList->setRight(right);
    179 }
    180 
    181 static void android_view_GLES20DisplayList_setBottom(JNIEnv* env,
    182         jobject clazz, DisplayList* displayList, int bottom) {
    183     displayList->setBottom(bottom);
    184 }
    185 
    186 static void android_view_GLES20DisplayList_setLeftTopRightBottom(JNIEnv* env,
    187         jobject clazz, DisplayList* displayList, int left, int top,
    188         int right, int bottom) {
    189     displayList->setLeftTopRightBottom(left, top, right, bottom);
    190 }
    191 
    192 static void android_view_GLES20DisplayList_offsetLeftAndRight(JNIEnv* env,
    193         jobject clazz, DisplayList* displayList, float offset) {
    194     displayList->offsetLeftRight(offset);
    195 }
    196 
    197 static void android_view_GLES20DisplayList_offsetTopAndBottom(JNIEnv* env,
    198         jobject clazz, DisplayList* displayList, float offset) {
    199     displayList->offsetTopBottom(offset);
    200 }
    201 
    202 static void android_view_GLES20DisplayList_getMatrix(JNIEnv* env,
    203         jobject clazz, DisplayList* displayList, SkMatrix* matrix) {
    204     SkMatrix* source = displayList->getStaticMatrix();
    205     if (source) {
    206         matrix->setConcat(SkMatrix::I(), *source);
    207     } else {
    208         matrix->setIdentity();
    209     }
    210 }
    211 
    212 static jboolean android_view_GLES20DisplayList_hasOverlappingRendering(JNIEnv* env,
    213         jobject clazz, DisplayList* displayList) {
    214     return displayList->hasOverlappingRendering();
    215 }
    216 
    217 static jfloat android_view_GLES20DisplayList_getAlpha(JNIEnv* env,
    218         jobject clazz, DisplayList* displayList) {
    219     return displayList->getAlpha();
    220 }
    221 
    222 static jfloat android_view_GLES20DisplayList_getLeft(JNIEnv* env,
    223         jobject clazz, DisplayList* displayList) {
    224     return displayList->getLeft();
    225 }
    226 
    227 static jfloat android_view_GLES20DisplayList_getTop(JNIEnv* env,
    228         jobject clazz, DisplayList* displayList) {
    229     return displayList->getTop();
    230 }
    231 
    232 static jfloat android_view_GLES20DisplayList_getRight(JNIEnv* env,
    233         jobject clazz, DisplayList* displayList) {
    234     return displayList->getRight();
    235 }
    236 
    237 static jfloat android_view_GLES20DisplayList_getBottom(JNIEnv* env,
    238         jobject clazz, DisplayList* displayList) {
    239     return displayList->getBottom();
    240 }
    241 
    242 static jfloat android_view_GLES20DisplayList_getCameraDistance(JNIEnv* env,
    243         jobject clazz, DisplayList* displayList) {
    244     return displayList->getCameraDistance();
    245 }
    246 
    247 static jfloat android_view_GLES20DisplayList_getScaleX(JNIEnv* env,
    248         jobject clazz, DisplayList* displayList) {
    249     return displayList->getScaleX();
    250 }
    251 
    252 static jfloat android_view_GLES20DisplayList_getScaleY(JNIEnv* env,
    253         jobject clazz, DisplayList* displayList) {
    254     return displayList->getScaleY();
    255 }
    256 
    257 static jfloat android_view_GLES20DisplayList_getTranslationX(JNIEnv* env,
    258         jobject clazz, DisplayList* displayList) {
    259     return displayList->getTranslationX();
    260 }
    261 
    262 static jfloat android_view_GLES20DisplayList_getTranslationY(JNIEnv* env,
    263         jobject clazz, DisplayList* displayList) {
    264     return displayList->getTranslationY();
    265 }
    266 
    267 static jfloat android_view_GLES20DisplayList_getRotation(JNIEnv* env,
    268         jobject clazz, DisplayList* displayList) {
    269     return displayList->getRotation();
    270 }
    271 
    272 static jfloat android_view_GLES20DisplayList_getRotationX(JNIEnv* env,
    273         jobject clazz, DisplayList* displayList) {
    274     return displayList->getRotationX();
    275 }
    276 
    277 static jfloat android_view_GLES20DisplayList_getRotationY(JNIEnv* env,
    278         jobject clazz, DisplayList* displayList) {
    279     return displayList->getRotationY();
    280 }
    281 
    282 static jfloat android_view_GLES20DisplayList_getPivotX(JNIEnv* env,
    283         jobject clazz, DisplayList* displayList) {
    284     return displayList->getPivotX();
    285 }
    286 
    287 static jfloat android_view_GLES20DisplayList_getPivotY(JNIEnv* env,
    288         jobject clazz, DisplayList* displayList) {
    289     return displayList->getPivotY();
    290 }
    291 
    292 #endif // USE_OPENGL_RENDERER
    293 
    294 // ----------------------------------------------------------------------------
    295 // JNI Glue
    296 // ----------------------------------------------------------------------------
    297 
    298 const char* const kClassPathName = "android/view/GLES20DisplayList";
    299 
    300 static JNINativeMethod gMethods[] = {
    301 #ifdef USE_OPENGL_RENDERER
    302     { "nDestroyDisplayList",   "(I)V",   (void*) android_view_GLES20DisplayList_destroyDisplayList },
    303     { "nGetDisplayListSize",   "(I)I",   (void*) android_view_GLES20DisplayList_getDisplayListSize },
    304     { "nSetDisplayListName",   "(ILjava/lang/String;)V",
    305             (void*) android_view_GLES20DisplayList_setDisplayListName },
    306 
    307     { "nReset",                "(I)V",   (void*) android_view_GLES20DisplayList_reset },
    308     { "nSetCaching",           "(IZ)V",  (void*) android_view_GLES20DisplayList_setCaching },
    309     { "nSetStaticMatrix",      "(II)V",  (void*) android_view_GLES20DisplayList_setStaticMatrix },
    310     { "nSetAnimationMatrix",   "(II)V",  (void*) android_view_GLES20DisplayList_setAnimationMatrix },
    311     { "nSetClipToBounds",      "(IZ)V",  (void*) android_view_GLES20DisplayList_setClipToBounds },
    312     { "nSetAlpha",             "(IF)V",  (void*) android_view_GLES20DisplayList_setAlpha },
    313     { "nSetHasOverlappingRendering", "(IZ)V",
    314             (void*) android_view_GLES20DisplayList_setHasOverlappingRendering },
    315     { "nSetTranslationX",      "(IF)V",  (void*) android_view_GLES20DisplayList_setTranslationX },
    316     { "nSetTranslationY",      "(IF)V",  (void*) android_view_GLES20DisplayList_setTranslationY },
    317     { "nSetRotation",          "(IF)V",  (void*) android_view_GLES20DisplayList_setRotation },
    318     { "nSetRotationX",         "(IF)V",  (void*) android_view_GLES20DisplayList_setRotationX },
    319     { "nSetRotationY",         "(IF)V",  (void*) android_view_GLES20DisplayList_setRotationY },
    320     { "nSetScaleX",            "(IF)V",  (void*) android_view_GLES20DisplayList_setScaleX },
    321     { "nSetScaleY",            "(IF)V",  (void*) android_view_GLES20DisplayList_setScaleY },
    322     { "nSetTransformationInfo","(IFFFFFFFF)V",
    323             (void*) android_view_GLES20DisplayList_setTransformationInfo },
    324     { "nSetPivotX",            "(IF)V",  (void*) android_view_GLES20DisplayList_setPivotX },
    325     { "nSetPivotY",            "(IF)V",  (void*) android_view_GLES20DisplayList_setPivotY },
    326     { "nSetCameraDistance",    "(IF)V",  (void*) android_view_GLES20DisplayList_setCameraDistance },
    327     { "nSetLeft",              "(II)V",  (void*) android_view_GLES20DisplayList_setLeft },
    328     { "nSetTop",               "(II)V",  (void*) android_view_GLES20DisplayList_setTop },
    329     { "nSetRight",             "(II)V",  (void*) android_view_GLES20DisplayList_setRight },
    330     { "nSetBottom",            "(II)V",  (void*) android_view_GLES20DisplayList_setBottom },
    331     { "nSetLeftTopRightBottom","(IIIII)V",
    332             (void*) android_view_GLES20DisplayList_setLeftTopRightBottom },
    333     { "nOffsetLeftAndRight",   "(IF)V",  (void*) android_view_GLES20DisplayList_offsetLeftAndRight },
    334     { "nOffsetTopAndBottom",   "(IF)V",  (void*) android_view_GLES20DisplayList_offsetTopAndBottom },
    335 
    336 
    337     { "nGetMatrix",               "(II)V", (void*) android_view_GLES20DisplayList_getMatrix },
    338     { "nHasOverlappingRendering", "(I)Z",  (void*) android_view_GLES20DisplayList_hasOverlappingRendering },
    339     { "nGetAlpha",                "(I)F",  (void*) android_view_GLES20DisplayList_getAlpha },
    340     { "nGetLeft",                 "(I)F",  (void*) android_view_GLES20DisplayList_getLeft },
    341     { "nGetTop",                  "(I)F",  (void*) android_view_GLES20DisplayList_getTop },
    342     { "nGetRight",                "(I)F",  (void*) android_view_GLES20DisplayList_getRight },
    343     { "nGetBottom",               "(I)F",  (void*) android_view_GLES20DisplayList_getBottom },
    344     { "nGetCameraDistance",       "(I)F",  (void*) android_view_GLES20DisplayList_getCameraDistance },
    345     { "nGetScaleX",               "(I)F",  (void*) android_view_GLES20DisplayList_getScaleX },
    346     { "nGetScaleY",               "(I)F",  (void*) android_view_GLES20DisplayList_getScaleY },
    347     { "nGetTranslationX",         "(I)F",  (void*) android_view_GLES20DisplayList_getTranslationX },
    348     { "nGetTranslationY",         "(I)F",  (void*) android_view_GLES20DisplayList_getTranslationY },
    349     { "nGetRotation",             "(I)F",  (void*) android_view_GLES20DisplayList_getRotation },
    350     { "nGetRotationX",            "(I)F",  (void*) android_view_GLES20DisplayList_getRotationX },
    351     { "nGetRotationY",            "(I)F",  (void*) android_view_GLES20DisplayList_getRotationY },
    352     { "nGetPivotX",               "(I)F",  (void*) android_view_GLES20DisplayList_getPivotX },
    353     { "nGetPivotY",               "(I)F",  (void*) android_view_GLES20DisplayList_getPivotY },
    354 #endif
    355 };
    356 
    357 #ifdef USE_OPENGL_RENDERER
    358     #define FIND_CLASS(var, className) \
    359             var = env->FindClass(className); \
    360             LOG_FATAL_IF(! var, "Unable to find class " className);
    361 
    362     #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
    363             var = env->GetMethodID(clazz, methodName, methodDescriptor); \
    364             LOG_FATAL_IF(! var, "Unable to find method " methodName);
    365 #else
    366     #define FIND_CLASS(var, className)
    367     #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
    368 #endif
    369 
    370 int register_android_view_GLES20DisplayList(JNIEnv* env) {
    371     return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
    372 }
    373 
    374 };
    375 
    376