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 <DisplayListRenderer.h> 27 28 namespace android { 29 30 using namespace uirenderer; 31 32 /** 33 * Note: OpenGLRenderer JNI layer is generated and compiled only on supported 34 * devices. This means all the logic must be compiled only when the 35 * preprocessor variable USE_OPENGL_RENDERER is defined. 36 */ 37 #ifdef USE_OPENGL_RENDERER 38 39 // ---------------------------------------------------------------------------- 40 // DisplayList view properties 41 // ---------------------------------------------------------------------------- 42 43 static void android_view_GLES20DisplayList_setCaching(JNIEnv* env, 44 jobject clazz, DisplayList* displayList, jboolean caching) { 45 displayList->setCaching(caching); 46 } 47 48 static void android_view_GLES20DisplayList_setStaticMatrix(JNIEnv* env, 49 jobject clazz, DisplayList* displayList, SkMatrix* matrix) { 50 displayList->setStaticMatrix(matrix); 51 } 52 53 static void android_view_GLES20DisplayList_setAnimationMatrix(JNIEnv* env, 54 jobject clazz, DisplayList* displayList, SkMatrix* matrix) { 55 displayList->setAnimationMatrix(matrix); 56 } 57 58 static void android_view_GLES20DisplayList_setClipChildren(JNIEnv* env, 59 jobject clazz, DisplayList* displayList, jboolean clipChildren) { 60 displayList->setClipChildren(clipChildren); 61 } 62 63 static void android_view_GLES20DisplayList_setAlpha(JNIEnv* env, 64 jobject clazz, DisplayList* displayList, float alpha) { 65 displayList->setAlpha(alpha); 66 } 67 68 static void android_view_GLES20DisplayList_setHasOverlappingRendering(JNIEnv* env, 69 jobject clazz, DisplayList* displayList, bool hasOverlappingRendering) { 70 displayList->setHasOverlappingRendering(hasOverlappingRendering); 71 } 72 73 static void android_view_GLES20DisplayList_setTranslationX(JNIEnv* env, 74 jobject clazz, DisplayList* displayList, float tx) { 75 displayList->setTranslationX(tx); 76 } 77 78 static void android_view_GLES20DisplayList_setTranslationY(JNIEnv* env, 79 jobject clazz, DisplayList* displayList, float ty) { 80 displayList->setTranslationY(ty); 81 } 82 83 static void android_view_GLES20DisplayList_setRotation(JNIEnv* env, 84 jobject clazz, DisplayList* displayList, float rotation) { 85 displayList->setRotation(rotation); 86 } 87 88 static void android_view_GLES20DisplayList_setRotationX(JNIEnv* env, 89 jobject clazz, DisplayList* displayList, float rx) { 90 displayList->setRotationX(rx); 91 } 92 93 static void android_view_GLES20DisplayList_setRotationY(JNIEnv* env, 94 jobject clazz, DisplayList* displayList, float ry) { 95 displayList->setRotationY(ry); 96 } 97 98 static void android_view_GLES20DisplayList_setScaleX(JNIEnv* env, 99 jobject clazz, DisplayList* displayList, float sx) { 100 displayList->setScaleX(sx); 101 } 102 103 static void android_view_GLES20DisplayList_setScaleY(JNIEnv* env, 104 jobject clazz, DisplayList* displayList, float sy) { 105 displayList->setScaleY(sy); 106 } 107 108 static void android_view_GLES20DisplayList_setTransformationInfo(JNIEnv* env, 109 jobject clazz, DisplayList* displayList, float alpha, 110 float translationX, float translationY, float rotation, float rotationX, float rotationY, 111 float scaleX, float scaleY) { 112 displayList->setAlpha(alpha); 113 displayList->setTranslationX(translationX); 114 displayList->setTranslationY(translationY); 115 displayList->setRotation(rotation); 116 displayList->setRotationX(rotationX); 117 displayList->setRotationY(rotationY); 118 displayList->setScaleX(scaleX); 119 displayList->setScaleY(scaleY); 120 } 121 122 static void android_view_GLES20DisplayList_setPivotX(JNIEnv* env, 123 jobject clazz, DisplayList* displayList, float px) { 124 displayList->setPivotX(px); 125 } 126 127 static void android_view_GLES20DisplayList_setPivotY(JNIEnv* env, 128 jobject clazz, DisplayList* displayList, float py) { 129 displayList->setPivotY(py); 130 } 131 132 static void android_view_GLES20DisplayList_setCameraDistance(JNIEnv* env, 133 jobject clazz, DisplayList* displayList, float distance) { 134 displayList->setCameraDistance(distance); 135 } 136 137 static void android_view_GLES20DisplayList_setLeft(JNIEnv* env, 138 jobject clazz, DisplayList* displayList, int left) { 139 displayList->setLeft(left); 140 } 141 142 static void android_view_GLES20DisplayList_setTop(JNIEnv* env, 143 jobject clazz, DisplayList* displayList, int top) { 144 displayList->setTop(top); 145 } 146 147 static void android_view_GLES20DisplayList_setRight(JNIEnv* env, 148 jobject clazz, DisplayList* displayList, int right) { 149 displayList->setRight(right); 150 } 151 152 static void android_view_GLES20DisplayList_setBottom(JNIEnv* env, 153 jobject clazz, DisplayList* displayList, int bottom) { 154 displayList->setBottom(bottom); 155 } 156 157 static void android_view_GLES20DisplayList_setLeftTop(JNIEnv* env, 158 jobject clazz, DisplayList* displayList, int left, int top) { 159 displayList->setLeftTop(left, top); 160 } 161 162 static void android_view_GLES20DisplayList_setLeftTopRightBottom(JNIEnv* env, 163 jobject clazz, DisplayList* displayList, int left, int top, 164 int right, int bottom) { 165 displayList->setLeftTopRightBottom(left, top, right, bottom); 166 } 167 168 static void android_view_GLES20DisplayList_offsetLeftRight(JNIEnv* env, 169 jobject clazz, DisplayList* displayList, int offset) { 170 displayList->offsetLeftRight(offset); 171 } 172 173 static void android_view_GLES20DisplayList_offsetTopBottom(JNIEnv* env, 174 jobject clazz, DisplayList* displayList, int offset) { 175 displayList->offsetTopBottom(offset); 176 } 177 178 #endif // USE_OPENGL_RENDERER 179 180 // ---------------------------------------------------------------------------- 181 // JNI Glue 182 // ---------------------------------------------------------------------------- 183 184 const char* const kClassPathName = "android/view/GLES20DisplayList"; 185 186 static JNINativeMethod gMethods[] = { 187 #ifdef USE_OPENGL_RENDERER 188 { "nSetCaching", "(IZ)V", (void*) android_view_GLES20DisplayList_setCaching }, 189 { "nSetStaticMatrix", "(II)V", (void*) android_view_GLES20DisplayList_setStaticMatrix }, 190 { "nSetAnimationMatrix", "(II)V", (void*) android_view_GLES20DisplayList_setAnimationMatrix }, 191 { "nSetClipChildren", "(IZ)V", (void*) android_view_GLES20DisplayList_setClipChildren }, 192 { "nSetAlpha", "(IF)V", (void*) android_view_GLES20DisplayList_setAlpha }, 193 { "nSetHasOverlappingRendering", "(IZ)V", 194 (void*) android_view_GLES20DisplayList_setHasOverlappingRendering }, 195 { "nSetTranslationX", "(IF)V", (void*) android_view_GLES20DisplayList_setTranslationX }, 196 { "nSetTranslationY", "(IF)V", (void*) android_view_GLES20DisplayList_setTranslationY }, 197 { "nSetRotation", "(IF)V", (void*) android_view_GLES20DisplayList_setRotation }, 198 { "nSetRotationX", "(IF)V", (void*) android_view_GLES20DisplayList_setRotationX }, 199 { "nSetRotationY", "(IF)V", (void*) android_view_GLES20DisplayList_setRotationY }, 200 { "nSetScaleX", "(IF)V", (void*) android_view_GLES20DisplayList_setScaleX }, 201 { "nSetScaleY", "(IF)V", (void*) android_view_GLES20DisplayList_setScaleY }, 202 { "nSetTransformationInfo","(IFFFFFFFF)V", 203 (void*) android_view_GLES20DisplayList_setTransformationInfo }, 204 { "nSetPivotX", "(IF)V", (void*) android_view_GLES20DisplayList_setPivotX }, 205 { "nSetPivotY", "(IF)V", (void*) android_view_GLES20DisplayList_setPivotY }, 206 { "nSetCameraDistance", "(IF)V", (void*) android_view_GLES20DisplayList_setCameraDistance }, 207 { "nSetLeft", "(II)V", (void*) android_view_GLES20DisplayList_setLeft }, 208 { "nSetTop", "(II)V", (void*) android_view_GLES20DisplayList_setTop }, 209 { "nSetRight", "(II)V", (void*) android_view_GLES20DisplayList_setRight }, 210 { "nSetBottom", "(II)V", (void*) android_view_GLES20DisplayList_setBottom }, 211 { "nSetLeftTop", "(III)V", (void*) android_view_GLES20DisplayList_setLeftTop }, 212 { "nSetLeftTopRightBottom","(IIIII)V", 213 (void*) android_view_GLES20DisplayList_setLeftTopRightBottom }, 214 { "nOffsetLeftRight", "(II)V", (void*) android_view_GLES20DisplayList_offsetLeftRight }, 215 { "nOffsetTopBottom", "(II)V", (void*) android_view_GLES20DisplayList_offsetTopBottom }, 216 217 #endif 218 }; 219 220 #ifdef USE_OPENGL_RENDERER 221 #define FIND_CLASS(var, className) \ 222 var = env->FindClass(className); \ 223 LOG_FATAL_IF(! var, "Unable to find class " className); 224 225 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 226 var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 227 LOG_FATAL_IF(! var, "Unable to find method " methodName); 228 #else 229 #define FIND_CLASS(var, className) 230 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) 231 #endif 232 233 int register_android_view_GLES20DisplayList(JNIEnv* env) { 234 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 235 } 236 237 }; 238 239