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