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