android_view_RenderNode.cpp revision 34f67f26e355925aa1e00a20bc11e09b8dc32988
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_setAlpha(JNIEnv* env, 132 jobject clazz, jlong displayListPtr, float alpha) { 133 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 134 displayList->properties().setAlpha(alpha); 135} 136 137static void android_view_RenderNode_setHasOverlappingRendering(JNIEnv* env, 138 jobject clazz, jlong displayListPtr, bool hasOverlappingRendering) { 139 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 140 displayList->properties().setHasOverlappingRendering(hasOverlappingRendering); 141} 142 143static void android_view_RenderNode_setTranslationX(JNIEnv* env, 144 jobject clazz, jlong displayListPtr, float tx) { 145 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 146 displayList->properties().setTranslationX(tx); 147} 148 149static void android_view_RenderNode_setTranslationY(JNIEnv* env, 150 jobject clazz, jlong displayListPtr, float ty) { 151 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 152 displayList->properties().setTranslationY(ty); 153} 154 155static void android_view_RenderNode_setTranslationZ(JNIEnv* env, 156 jobject clazz, jlong displayListPtr, float tz) { 157 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 158 displayList->properties().setTranslationZ(tz); 159} 160 161static void android_view_RenderNode_setRotation(JNIEnv* env, 162 jobject clazz, jlong displayListPtr, float rotation) { 163 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 164 displayList->properties().setRotation(rotation); 165} 166 167static void android_view_RenderNode_setRotationX(JNIEnv* env, 168 jobject clazz, jlong displayListPtr, float rx) { 169 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 170 displayList->properties().setRotationX(rx); 171} 172 173static void android_view_RenderNode_setRotationY(JNIEnv* env, 174 jobject clazz, jlong displayListPtr, float ry) { 175 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 176 displayList->properties().setRotationY(ry); 177} 178 179static void android_view_RenderNode_setScaleX(JNIEnv* env, 180 jobject clazz, jlong displayListPtr, float sx) { 181 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 182 displayList->properties().setScaleX(sx); 183} 184 185static void android_view_RenderNode_setScaleY(JNIEnv* env, 186 jobject clazz, jlong displayListPtr, float sy) { 187 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 188 displayList->properties().setScaleY(sy); 189} 190 191static void android_view_RenderNode_setTransformationInfo(JNIEnv* env, 192 jobject clazz, jlong displayListPtr, float alpha, 193 float translationX, float translationY, float translationZ, 194 float rotation, float rotationX, float rotationY, float scaleX, float scaleY) { 195 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 196 displayList->properties().setAlpha(alpha); 197 displayList->properties().setTranslationX(translationX); 198 displayList->properties().setTranslationY(translationY); 199 displayList->properties().setTranslationZ(translationZ); 200 displayList->properties().setRotation(rotation); 201 displayList->properties().setRotationX(rotationX); 202 displayList->properties().setRotationY(rotationY); 203 displayList->properties().setScaleX(scaleX); 204 displayList->properties().setScaleY(scaleY); 205} 206 207static void android_view_RenderNode_setPivotX(JNIEnv* env, 208 jobject clazz, jlong displayListPtr, float px) { 209 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 210 displayList->properties().setPivotX(px); 211} 212 213static void android_view_RenderNode_setPivotY(JNIEnv* env, 214 jobject clazz, jlong displayListPtr, float py) { 215 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 216 displayList->properties().setPivotY(py); 217} 218 219static void android_view_RenderNode_setCameraDistance(JNIEnv* env, 220 jobject clazz, jlong displayListPtr, float distance) { 221 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 222 displayList->properties().setCameraDistance(distance); 223} 224 225static void android_view_RenderNode_setLeft(JNIEnv* env, 226 jobject clazz, jlong displayListPtr, int left) { 227 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 228 displayList->properties().setLeft(left); 229} 230 231static void android_view_RenderNode_setTop(JNIEnv* env, 232 jobject clazz, jlong displayListPtr, int top) { 233 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 234 displayList->properties().setTop(top); 235} 236 237static void android_view_RenderNode_setRight(JNIEnv* env, 238 jobject clazz, jlong displayListPtr, int right) { 239 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 240 displayList->properties().setRight(right); 241} 242 243static void android_view_RenderNode_setBottom(JNIEnv* env, 244 jobject clazz, jlong displayListPtr, int bottom) { 245 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 246 displayList->properties().setBottom(bottom); 247} 248 249static void android_view_RenderNode_setLeftTopRightBottom(JNIEnv* env, 250 jobject clazz, jlong displayListPtr, int left, int top, 251 int right, int bottom) { 252 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 253 displayList->properties().setLeftTopRightBottom(left, top, right, bottom); 254} 255 256static void android_view_RenderNode_offsetLeftAndRight(JNIEnv* env, 257 jobject clazz, jlong displayListPtr, float offset) { 258 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 259 displayList->properties().offsetLeftRight(offset); 260} 261 262static void android_view_RenderNode_offsetTopAndBottom(JNIEnv* env, 263 jobject clazz, jlong displayListPtr, float offset) { 264 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 265 displayList->properties().offsetTopBottom(offset); 266} 267 268static jboolean android_view_RenderNode_hasOverlappingRendering(JNIEnv* env, 269 jobject clazz, jlong displayListPtr) { 270 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 271 return displayList->properties().hasOverlappingRendering(); 272} 273 274static jfloat android_view_RenderNode_getAlpha(JNIEnv* env, 275 jobject clazz, jlong displayListPtr) { 276 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 277 return displayList->properties().getAlpha(); 278} 279 280static jfloat android_view_RenderNode_getLeft(JNIEnv* env, 281 jobject clazz, jlong displayListPtr) { 282 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 283 return displayList->properties().getLeft(); 284} 285 286static jfloat android_view_RenderNode_getTop(JNIEnv* env, 287 jobject clazz, jlong displayListPtr) { 288 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 289 return displayList->properties().getTop(); 290} 291 292static jfloat android_view_RenderNode_getRight(JNIEnv* env, 293 jobject clazz, jlong displayListPtr) { 294 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 295 return displayList->properties().getRight(); 296} 297 298static jfloat android_view_RenderNode_getBottom(JNIEnv* env, 299 jobject clazz, jlong displayListPtr) { 300 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 301 return displayList->properties().getBottom(); 302} 303 304static jfloat android_view_RenderNode_getCameraDistance(JNIEnv* env, 305 jobject clazz, jlong displayListPtr) { 306 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 307 return displayList->properties().getCameraDistance(); 308} 309 310static jfloat android_view_RenderNode_getScaleX(JNIEnv* env, 311 jobject clazz, jlong displayListPtr) { 312 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 313 return displayList->properties().getScaleX(); 314} 315 316static jfloat android_view_RenderNode_getScaleY(JNIEnv* env, 317 jobject clazz, jlong displayListPtr) { 318 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 319 return displayList->properties().getScaleY(); 320} 321 322static jfloat android_view_RenderNode_getTranslationX(JNIEnv* env, 323 jobject clazz, jlong displayListPtr) { 324 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 325 return displayList->properties().getTranslationX(); 326} 327 328static jfloat android_view_RenderNode_getTranslationY(JNIEnv* env, 329 jobject clazz, jlong displayListPtr) { 330 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 331 return displayList->properties().getTranslationY(); 332} 333 334static jfloat android_view_RenderNode_getRotation(JNIEnv* env, 335 jobject clazz, jlong displayListPtr) { 336 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 337 return displayList->properties().getRotation(); 338} 339 340static jfloat android_view_RenderNode_getRotationX(JNIEnv* env, 341 jobject clazz, jlong displayListPtr) { 342 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 343 return displayList->properties().getRotationX(); 344} 345 346static jfloat android_view_RenderNode_getRotationY(JNIEnv* env, 347 jobject clazz, jlong displayListPtr) { 348 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 349 return displayList->properties().getRotationY(); 350} 351 352static jfloat android_view_RenderNode_getPivotX(JNIEnv* env, 353 jobject clazz, jlong displayListPtr) { 354 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 355 return displayList->properties().getPivotX(); 356} 357 358static jfloat android_view_RenderNode_getPivotY(JNIEnv* env, 359 jobject clazz, jlong displayListPtr) { 360 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 361 return displayList->properties().getPivotY(); 362} 363 364#endif // USE_OPENGL_RENDERER 365 366// ---------------------------------------------------------------------------- 367// JNI Glue 368// ---------------------------------------------------------------------------- 369 370const char* const kClassPathName = "android/view/RenderNode"; 371 372static JNINativeMethod gMethods[] = { 373#ifdef USE_OPENGL_RENDERER 374 { "nCreate", "()J", (void*) android_view_RenderNode_create }, 375 { "nDestroyDisplayList", "(J)V", (void*) android_view_RenderNode_destroyDisplayList }, 376 { "nSetDisplayListName", "(JLjava/lang/String;)V", 377 (void*) android_view_RenderNode_setDisplayListName }, 378 { "nOutput", "(J)V", (void*) android_view_RenderNode_output }, 379 380 { "nSetCaching", "(JZ)V", (void*) android_view_RenderNode_setCaching }, 381 { "nSetStaticMatrix", "(JJ)V", (void*) android_view_RenderNode_setStaticMatrix }, 382 { "nSetAnimationMatrix", "(JJ)V", (void*) android_view_RenderNode_setAnimationMatrix }, 383 { "nSetClipToBounds", "(JZ)V", (void*) android_view_RenderNode_setClipToBounds }, 384 { "nSetIsolatedZVolume", "(JZ)V", (void*) android_view_RenderNode_setIsolatedZVolume }, 385 { "nSetProjectBackwards", "(JZ)V", (void*) android_view_RenderNode_setProjectBackwards }, 386 { "nSetProjectionReceiver","(JZ)V", (void*) android_view_RenderNode_setProjectionReceiver }, 387 { "nSetOutline", "(JJ)V", (void*) android_view_RenderNode_setOutline }, 388 { "nSetClipToOutline", "(JZ)V", (void*) android_view_RenderNode_setClipToOutline }, 389 { "nSetAlpha", "(JF)V", (void*) android_view_RenderNode_setAlpha }, 390 { "nSetHasOverlappingRendering", "(JZ)V", 391 (void*) android_view_RenderNode_setHasOverlappingRendering }, 392 { "nSetTranslationX", "(JF)V", (void*) android_view_RenderNode_setTranslationX }, 393 { "nSetTranslationY", "(JF)V", (void*) android_view_RenderNode_setTranslationY }, 394 { "nSetTranslationZ", "(JF)V", (void*) android_view_RenderNode_setTranslationZ }, 395 { "nSetRotation", "(JF)V", (void*) android_view_RenderNode_setRotation }, 396 { "nSetRotationX", "(JF)V", (void*) android_view_RenderNode_setRotationX }, 397 { "nSetRotationY", "(JF)V", (void*) android_view_RenderNode_setRotationY }, 398 { "nSetScaleX", "(JF)V", (void*) android_view_RenderNode_setScaleX }, 399 { "nSetScaleY", "(JF)V", (void*) android_view_RenderNode_setScaleY }, 400 { "nSetTransformationInfo","(JFFFFFFFFF)V", 401 (void*) android_view_RenderNode_setTransformationInfo }, 402 { "nSetPivotX", "(JF)V", (void*) android_view_RenderNode_setPivotX }, 403 { "nSetPivotY", "(JF)V", (void*) android_view_RenderNode_setPivotY }, 404 { "nSetCameraDistance", "(JF)V", (void*) android_view_RenderNode_setCameraDistance }, 405 { "nSetLeft", "(JI)V", (void*) android_view_RenderNode_setLeft }, 406 { "nSetTop", "(JI)V", (void*) android_view_RenderNode_setTop }, 407 { "nSetRight", "(JI)V", (void*) android_view_RenderNode_setRight }, 408 { "nSetBottom", "(JI)V", (void*) android_view_RenderNode_setBottom }, 409 { "nSetLeftTopRightBottom","(JIIII)V", (void*) android_view_RenderNode_setLeftTopRightBottom }, 410 { "nOffsetLeftAndRight", "(JF)V", (void*) android_view_RenderNode_offsetLeftAndRight }, 411 { "nOffsetTopAndBottom", "(JF)V", (void*) android_view_RenderNode_offsetTopAndBottom }, 412 413 { "nHasOverlappingRendering", "(J)Z", (void*) android_view_RenderNode_hasOverlappingRendering }, 414 { "nGetAlpha", "(J)F", (void*) android_view_RenderNode_getAlpha }, 415 { "nGetLeft", "(J)F", (void*) android_view_RenderNode_getLeft }, 416 { "nGetTop", "(J)F", (void*) android_view_RenderNode_getTop }, 417 { "nGetRight", "(J)F", (void*) android_view_RenderNode_getRight }, 418 { "nGetBottom", "(J)F", (void*) android_view_RenderNode_getBottom }, 419 { "nGetCameraDistance", "(J)F", (void*) android_view_RenderNode_getCameraDistance }, 420 { "nGetScaleX", "(J)F", (void*) android_view_RenderNode_getScaleX }, 421 { "nGetScaleY", "(J)F", (void*) android_view_RenderNode_getScaleY }, 422 { "nGetTranslationX", "(J)F", (void*) android_view_RenderNode_getTranslationX }, 423 { "nGetTranslationY", "(J)F", (void*) android_view_RenderNode_getTranslationY }, 424 { "nGetRotation", "(J)F", (void*) android_view_RenderNode_getRotation }, 425 { "nGetRotationX", "(J)F", (void*) android_view_RenderNode_getRotationX }, 426 { "nGetRotationY", "(J)F", (void*) android_view_RenderNode_getRotationY }, 427 { "nGetPivotX", "(J)F", (void*) android_view_RenderNode_getPivotX }, 428 { "nGetPivotY", "(J)F", (void*) android_view_RenderNode_getPivotY }, 429#endif 430}; 431 432#ifdef USE_OPENGL_RENDERER 433 #define FIND_CLASS(var, className) \ 434 var = env->FindClass(className); \ 435 LOG_FATAL_IF(! var, "Unable to find class " className); 436 437 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 438 var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 439 LOG_FATAL_IF(! var, "Unable to find method " methodName); 440#else 441 #define FIND_CLASS(var, className) 442 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) 443#endif 444 445int register_android_view_RenderNode(JNIEnv* env) { 446 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 447} 448 449}; 450 451