android_view_RenderNode.cpp revision fe5e7b7346a54537b980796ceeca66bfdbd05561
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 <Animator.h> 27#include <DisplayListRenderer.h> 28#include <RenderNode.h> 29 30namespace android { 31 32using namespace uirenderer; 33 34/** 35 * Note: OpenGLRenderer JNI layer is generated and compiled only on supported 36 * devices. This means all the logic must be compiled only when the 37 * preprocessor variable USE_OPENGL_RENDERER is defined. 38 */ 39#ifdef USE_OPENGL_RENDERER 40 41// ---------------------------------------------------------------------------- 42// DisplayList view properties 43// ---------------------------------------------------------------------------- 44 45static void android_view_RenderNode_output(JNIEnv* env, 46 jobject clazz, jlong renderNodePtr) { 47 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 48 renderNode->output(); 49} 50 51static jint android_view_RenderNode_getDebugSize(JNIEnv* env, 52 jobject clazz, jlong renderNodePtr) { 53 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 54 return renderNode->getDebugSize(); 55} 56 57static jlong android_view_RenderNode_create(JNIEnv* env, jobject clazz, jstring name) { 58 RenderNode* renderNode = new RenderNode(); 59 renderNode->incStrong(0); 60 if (name != NULL) { 61 const char* textArray = env->GetStringUTFChars(name, NULL); 62 renderNode->setName(textArray); 63 env->ReleaseStringUTFChars(name, textArray); 64 } 65 return reinterpret_cast<jlong>(renderNode); 66} 67 68static void android_view_RenderNode_destroyRenderNode(JNIEnv* env, 69 jobject clazz, jlong renderNodePtr) { 70 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 71 renderNode->decStrong(0); 72} 73 74static void android_view_RenderNode_setDisplayListData(JNIEnv* env, 75 jobject clazz, jlong renderNodePtr, jlong newDataPtr) { 76 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 77 DisplayListData* newData = reinterpret_cast<DisplayListData*>(newDataPtr); 78 renderNode->setStagingDisplayList(newData); 79} 80 81// ---------------------------------------------------------------------------- 82// RenderProperties - setters 83// ---------------------------------------------------------------------------- 84 85static void android_view_RenderNode_setCaching(JNIEnv* env, 86 jobject clazz, jlong renderNodePtr, jboolean caching) { 87 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 88 renderNode->mutateStagingProperties().setCaching(caching); 89 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 90} 91 92static void android_view_RenderNode_setStaticMatrix(JNIEnv* env, 93 jobject clazz, jlong renderNodePtr, jlong matrixPtr) { 94 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 95 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr); 96 renderNode->mutateStagingProperties().setStaticMatrix(matrix); 97 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 98} 99 100static void android_view_RenderNode_setAnimationMatrix(JNIEnv* env, 101 jobject clazz, jlong renderNodePtr, jlong matrixPtr) { 102 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 103 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr); 104 renderNode->mutateStagingProperties().setAnimationMatrix(matrix); 105 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 106} 107 108static void android_view_RenderNode_setClipToBounds(JNIEnv* env, 109 jobject clazz, jlong renderNodePtr, jboolean clipToBounds) { 110 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 111 renderNode->mutateStagingProperties().setClipToBounds(clipToBounds); 112 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 113} 114 115static void android_view_RenderNode_setProjectBackwards(JNIEnv* env, 116 jobject clazz, jlong renderNodePtr, jboolean shouldProject) { 117 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 118 renderNode->mutateStagingProperties().setProjectBackwards(shouldProject); 119 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 120} 121 122static void android_view_RenderNode_setProjectionReceiver(JNIEnv* env, 123 jobject clazz, jlong renderNodePtr, jboolean shouldRecieve) { 124 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 125 renderNode->mutateStagingProperties().setProjectionReceiver(shouldRecieve); 126 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 127} 128 129static void android_view_RenderNode_setOutlineRoundRect(JNIEnv* env, 130 jobject clazz, jlong renderNodePtr, jint left, jint top, 131 jint right, jint bottom, jfloat radius) { 132 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 133 renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom, radius); 134 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 135} 136 137static void android_view_RenderNode_setOutlineConvexPath(JNIEnv* env, 138 jobject clazz, jlong renderNodePtr, jlong outlinePathPtr) { 139 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 140 SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr); 141 renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath); 142 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 143} 144 145static void android_view_RenderNode_setOutlineEmpty(JNIEnv* env, 146 jobject clazz, jlong renderNodePtr) { 147 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 148 renderNode->mutateStagingProperties().mutableOutline().setEmpty(); 149 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 150} 151 152static void android_view_RenderNode_setClipToOutline(JNIEnv* env, 153 jobject clazz, jlong renderNodePtr, jboolean clipToOutline) { 154 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 155 renderNode->mutateStagingProperties().mutableOutline().setShouldClip(clipToOutline); 156 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 157} 158 159static void android_view_RenderNode_setRevealClip(JNIEnv* env, 160 jobject clazz, jlong renderNodePtr, jboolean shouldClip, jboolean inverseClip, 161 jfloat x, jfloat y, jfloat radius) { 162 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 163 renderNode->mutateStagingProperties().mutableRevealClip().set( 164 shouldClip, inverseClip, x, y, radius); 165 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 166} 167 168static void android_view_RenderNode_setAlpha(JNIEnv* env, 169 jobject clazz, jlong renderNodePtr, float alpha) { 170 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 171 renderNode->mutateStagingProperties().setAlpha(alpha); 172 renderNode->setPropertyFieldsDirty(RenderNode::ALPHA); 173} 174 175static void android_view_RenderNode_setHasOverlappingRendering(JNIEnv* env, 176 jobject clazz, jlong renderNodePtr, bool hasOverlappingRendering) { 177 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 178 renderNode->mutateStagingProperties().setHasOverlappingRendering(hasOverlappingRendering); 179 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 180} 181 182static void android_view_RenderNode_setElevation(JNIEnv* env, 183 jobject clazz, jlong renderNodePtr, float elevation) { 184 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 185 renderNode->mutateStagingProperties().setElevation(elevation); 186 renderNode->setPropertyFieldsDirty(RenderNode::Z); 187} 188 189static void android_view_RenderNode_setTranslationX(JNIEnv* env, 190 jobject clazz, jlong renderNodePtr, float tx) { 191 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 192 renderNode->mutateStagingProperties().setTranslationX(tx); 193 renderNode->setPropertyFieldsDirty(RenderNode::TRANSLATION_X | RenderNode::X); 194} 195 196static void android_view_RenderNode_setTranslationY(JNIEnv* env, 197 jobject clazz, jlong renderNodePtr, float ty) { 198 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 199 renderNode->mutateStagingProperties().setTranslationY(ty); 200 renderNode->setPropertyFieldsDirty(RenderNode::TRANSLATION_Y | RenderNode::Y); 201} 202 203static void android_view_RenderNode_setTranslationZ(JNIEnv* env, 204 jobject clazz, jlong renderNodePtr, float tz) { 205 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 206 renderNode->mutateStagingProperties().setTranslationZ(tz); 207 renderNode->setPropertyFieldsDirty(RenderNode::TRANSLATION_Z | RenderNode::Z); 208} 209 210static void android_view_RenderNode_setRotation(JNIEnv* env, 211 jobject clazz, jlong renderNodePtr, float rotation) { 212 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 213 renderNode->mutateStagingProperties().setRotation(rotation); 214 renderNode->setPropertyFieldsDirty(RenderNode::ROTATION); 215} 216 217static void android_view_RenderNode_setRotationX(JNIEnv* env, 218 jobject clazz, jlong renderNodePtr, float rx) { 219 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 220 renderNode->mutateStagingProperties().setRotationX(rx); 221 renderNode->setPropertyFieldsDirty(RenderNode::ROTATION_X); 222} 223 224static void android_view_RenderNode_setRotationY(JNIEnv* env, 225 jobject clazz, jlong renderNodePtr, float ry) { 226 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 227 renderNode->mutateStagingProperties().setRotationY(ry); 228 renderNode->setPropertyFieldsDirty(RenderNode::ROTATION_Y); 229} 230 231static void android_view_RenderNode_setScaleX(JNIEnv* env, 232 jobject clazz, jlong renderNodePtr, float sx) { 233 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 234 renderNode->mutateStagingProperties().setScaleX(sx); 235 renderNode->setPropertyFieldsDirty(RenderNode::SCALE_X); 236} 237 238static void android_view_RenderNode_setScaleY(JNIEnv* env, 239 jobject clazz, jlong renderNodePtr, float sy) { 240 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 241 renderNode->mutateStagingProperties().setScaleY(sy); 242 renderNode->setPropertyFieldsDirty(RenderNode::SCALE_Y); 243} 244 245static void android_view_RenderNode_setPivotX(JNIEnv* env, 246 jobject clazz, jlong renderNodePtr, float px) { 247 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 248 renderNode->mutateStagingProperties().setPivotX(px); 249 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 250} 251 252static void android_view_RenderNode_setPivotY(JNIEnv* env, 253 jobject clazz, jlong renderNodePtr, float py) { 254 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 255 renderNode->mutateStagingProperties().setPivotY(py); 256 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 257} 258 259static void android_view_RenderNode_setCameraDistance(JNIEnv* env, 260 jobject clazz, jlong renderNodePtr, float distance) { 261 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 262 renderNode->mutateStagingProperties().setCameraDistance(distance); 263 renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 264} 265 266static void android_view_RenderNode_setLeft(JNIEnv* env, 267 jobject clazz, jlong renderNodePtr, int left) { 268 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 269 renderNode->mutateStagingProperties().setLeft(left); 270 renderNode->setPropertyFieldsDirty(RenderNode::X); 271} 272 273static void android_view_RenderNode_setTop(JNIEnv* env, 274 jobject clazz, jlong renderNodePtr, int top) { 275 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 276 renderNode->mutateStagingProperties().setTop(top); 277 renderNode->setPropertyFieldsDirty(RenderNode::Y); 278} 279 280static void android_view_RenderNode_setRight(JNIEnv* env, 281 jobject clazz, jlong renderNodePtr, int right) { 282 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 283 renderNode->mutateStagingProperties().setRight(right); 284 renderNode->setPropertyFieldsDirty(RenderNode::X); 285} 286 287static void android_view_RenderNode_setBottom(JNIEnv* env, 288 jobject clazz, jlong renderNodePtr, int bottom) { 289 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 290 renderNode->mutateStagingProperties().setBottom(bottom); 291 renderNode->setPropertyFieldsDirty(RenderNode::Y); 292} 293 294static void android_view_RenderNode_setLeftTopRightBottom(JNIEnv* env, 295 jobject clazz, jlong renderNodePtr, int left, int top, 296 int right, int bottom) { 297 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 298 renderNode->mutateStagingProperties().setLeftTopRightBottom(left, top, right, bottom); 299 renderNode->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y); 300} 301 302static void android_view_RenderNode_offsetLeftAndRight(JNIEnv* env, 303 jobject clazz, jlong renderNodePtr, float offset) { 304 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 305 renderNode->mutateStagingProperties().offsetLeftRight(offset); 306 renderNode->setPropertyFieldsDirty(RenderNode::X); 307} 308 309static void android_view_RenderNode_offsetTopAndBottom(JNIEnv* env, 310 jobject clazz, jlong renderNodePtr, float offset) { 311 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 312 renderNode->mutateStagingProperties().offsetTopBottom(offset); 313 renderNode->setPropertyFieldsDirty(RenderNode::Y); 314} 315 316// ---------------------------------------------------------------------------- 317// RenderProperties - getters 318// ---------------------------------------------------------------------------- 319 320static jboolean android_view_RenderNode_hasOverlappingRendering(JNIEnv* env, 321 jobject clazz, jlong renderNodePtr) { 322 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 323 return renderNode->stagingProperties().hasOverlappingRendering(); 324} 325 326static jboolean android_view_RenderNode_getClipToOutline(JNIEnv* env, 327 jobject clazz, jlong renderNodePtr) { 328 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 329 return renderNode->stagingProperties().getOutline().getShouldClip(); 330} 331 332static jfloat android_view_RenderNode_getAlpha(JNIEnv* env, 333 jobject clazz, jlong renderNodePtr) { 334 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 335 return renderNode->stagingProperties().getAlpha(); 336} 337 338static jfloat android_view_RenderNode_getLeft(JNIEnv* env, 339 jobject clazz, jlong renderNodePtr) { 340 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 341 return renderNode->stagingProperties().getLeft(); 342} 343 344static jfloat android_view_RenderNode_getTop(JNIEnv* env, 345 jobject clazz, jlong renderNodePtr) { 346 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 347 return renderNode->stagingProperties().getTop(); 348} 349 350static jfloat android_view_RenderNode_getRight(JNIEnv* env, 351 jobject clazz, jlong renderNodePtr) { 352 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 353 return renderNode->stagingProperties().getRight(); 354} 355 356static jfloat android_view_RenderNode_getBottom(JNIEnv* env, 357 jobject clazz, jlong renderNodePtr) { 358 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 359 return renderNode->stagingProperties().getBottom(); 360} 361 362static jfloat android_view_RenderNode_getCameraDistance(JNIEnv* env, 363 jobject clazz, jlong renderNodePtr) { 364 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 365 return renderNode->stagingProperties().getCameraDistance(); 366} 367 368static jfloat android_view_RenderNode_getScaleX(JNIEnv* env, 369 jobject clazz, jlong renderNodePtr) { 370 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 371 return renderNode->stagingProperties().getScaleX(); 372} 373 374static jfloat android_view_RenderNode_getScaleY(JNIEnv* env, 375 jobject clazz, jlong renderNodePtr) { 376 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 377 return renderNode->stagingProperties().getScaleY(); 378} 379 380static jfloat android_view_RenderNode_getElevation(JNIEnv* env, 381 jobject clazz, jlong renderNodePtr) { 382 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 383 return renderNode->stagingProperties().getElevation(); 384} 385 386static jfloat android_view_RenderNode_getTranslationX(JNIEnv* env, 387 jobject clazz, jlong renderNodePtr) { 388 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 389 return renderNode->stagingProperties().getTranslationX(); 390} 391 392static jfloat android_view_RenderNode_getTranslationY(JNIEnv* env, 393 jobject clazz, jlong renderNodePtr) { 394 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 395 return renderNode->stagingProperties().getTranslationY(); 396} 397 398static jfloat android_view_RenderNode_getTranslationZ(JNIEnv* env, 399 jobject clazz, jlong renderNodePtr) { 400 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 401 return renderNode->stagingProperties().getTranslationZ(); 402} 403 404static jfloat android_view_RenderNode_getRotation(JNIEnv* env, 405 jobject clazz, jlong renderNodePtr) { 406 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 407 return renderNode->stagingProperties().getRotation(); 408} 409 410static jfloat android_view_RenderNode_getRotationX(JNIEnv* env, 411 jobject clazz, jlong renderNodePtr) { 412 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 413 return renderNode->stagingProperties().getRotationX(); 414} 415 416static jfloat android_view_RenderNode_getRotationY(JNIEnv* env, 417 jobject clazz, jlong renderNodePtr) { 418 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 419 return renderNode->stagingProperties().getRotationY(); 420} 421 422static jboolean android_view_RenderNode_isPivotExplicitlySet(JNIEnv* env, 423 jobject clazz, jlong renderNodePtr) { 424 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 425 return renderNode->stagingProperties().isPivotExplicitlySet(); 426} 427 428static jboolean android_view_RenderNode_hasIdentityMatrix(JNIEnv* env, 429 jobject clazz, jlong renderNodePtr) { 430 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 431 renderNode->mutateStagingProperties().updateMatrix(); 432 return !renderNode->stagingProperties().hasTransformMatrix(); 433} 434 435// ---------------------------------------------------------------------------- 436// RenderProperties - computed getters 437// ---------------------------------------------------------------------------- 438 439static void android_view_RenderNode_getTransformMatrix(JNIEnv* env, 440 jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) { 441 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 442 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr); 443 444 renderNode->mutateStagingProperties().updateMatrix(); 445 const SkMatrix* transformMatrix = renderNode->stagingProperties().getTransformMatrix(); 446 447 if (transformMatrix) { 448 *outMatrix = *transformMatrix; 449 } else { 450 outMatrix->setIdentity(); 451 } 452} 453 454static void android_view_RenderNode_getInverseTransformMatrix(JNIEnv* env, 455 jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) { 456 // load transform matrix 457 android_view_RenderNode_getTransformMatrix(env, clazz, renderNodePtr, outMatrixPtr); 458 SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr); 459 460 // return it inverted 461 if (!outMatrix->invert(outMatrix)) { 462 // failed to load inverse, pass back identity 463 outMatrix->setIdentity(); 464 } 465} 466 467static jfloat android_view_RenderNode_getPivotX(JNIEnv* env, 468 jobject clazz, jlong renderNodePtr) { 469 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 470 renderNode->mutateStagingProperties().updateMatrix(); 471 return renderNode->stagingProperties().getPivotX(); 472} 473 474static jfloat android_view_RenderNode_getPivotY(JNIEnv* env, 475 jobject clazz, jlong renderNodePtr) { 476 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 477 renderNode->mutateStagingProperties().updateMatrix(); 478 return renderNode->stagingProperties().getPivotY(); 479} 480 481// ---------------------------------------------------------------------------- 482// RenderProperties - Animations 483// ---------------------------------------------------------------------------- 484 485static void android_view_RenderNode_addAnimator(JNIEnv* env, jobject clazz, 486 jlong renderNodePtr, jlong animatorPtr) { 487 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 488 RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr); 489 renderNode->addAnimator(animator); 490} 491 492static void android_view_RenderNode_removeAnimator(JNIEnv* env, jobject clazz, 493 jlong renderNodePtr, jlong animatorPtr) { 494 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 495 RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr); 496 renderNode->removeAnimator(animator); 497} 498 499 500#endif // USE_OPENGL_RENDERER 501 502// ---------------------------------------------------------------------------- 503// JNI Glue 504// ---------------------------------------------------------------------------- 505 506const char* const kClassPathName = "android/view/RenderNode"; 507 508static JNINativeMethod gMethods[] = { 509#ifdef USE_OPENGL_RENDERER 510 { "nCreate", "(Ljava/lang/String;)J", (void*) android_view_RenderNode_create }, 511 { "nDestroyRenderNode", "(J)V", (void*) android_view_RenderNode_destroyRenderNode }, 512 { "nSetDisplayListData", "(JJ)V", (void*) android_view_RenderNode_setDisplayListData }, 513 { "nOutput", "(J)V", (void*) android_view_RenderNode_output }, 514 { "nGetDebugSize", "(J)I", (void*) android_view_RenderNode_getDebugSize }, 515 516 { "nSetCaching", "(JZ)V", (void*) android_view_RenderNode_setCaching }, 517 { "nSetStaticMatrix", "(JJ)V", (void*) android_view_RenderNode_setStaticMatrix }, 518 { "nSetAnimationMatrix", "(JJ)V", (void*) android_view_RenderNode_setAnimationMatrix }, 519 { "nSetClipToBounds", "(JZ)V", (void*) android_view_RenderNode_setClipToBounds }, 520 { "nSetProjectBackwards", "(JZ)V", (void*) android_view_RenderNode_setProjectBackwards }, 521 { "nSetProjectionReceiver","(JZ)V", (void*) android_view_RenderNode_setProjectionReceiver }, 522 523 { "nSetOutlineRoundRect", "(JIIIIF)V", (void*) android_view_RenderNode_setOutlineRoundRect }, 524 { "nSetOutlineConvexPath", "(JJ)V", (void*) android_view_RenderNode_setOutlineConvexPath }, 525 { "nSetOutlineEmpty", "(J)V", (void*) android_view_RenderNode_setOutlineEmpty }, 526 { "nSetClipToOutline", "(JZ)V", (void*) android_view_RenderNode_setClipToOutline }, 527 { "nSetRevealClip", "(JZZFFF)V", (void*) android_view_RenderNode_setRevealClip }, 528 529 { "nSetAlpha", "(JF)V", (void*) android_view_RenderNode_setAlpha }, 530 { "nSetHasOverlappingRendering", "(JZ)V", 531 (void*) android_view_RenderNode_setHasOverlappingRendering }, 532 { "nSetElevation", "(JF)V", (void*) android_view_RenderNode_setElevation }, 533 { "nSetTranslationX", "(JF)V", (void*) android_view_RenderNode_setTranslationX }, 534 { "nSetTranslationY", "(JF)V", (void*) android_view_RenderNode_setTranslationY }, 535 { "nSetTranslationZ", "(JF)V", (void*) android_view_RenderNode_setTranslationZ }, 536 { "nSetRotation", "(JF)V", (void*) android_view_RenderNode_setRotation }, 537 { "nSetRotationX", "(JF)V", (void*) android_view_RenderNode_setRotationX }, 538 { "nSetRotationY", "(JF)V", (void*) android_view_RenderNode_setRotationY }, 539 { "nSetScaleX", "(JF)V", (void*) android_view_RenderNode_setScaleX }, 540 { "nSetScaleY", "(JF)V", (void*) android_view_RenderNode_setScaleY }, 541 { "nSetPivotX", "(JF)V", (void*) android_view_RenderNode_setPivotX }, 542 { "nSetPivotY", "(JF)V", (void*) android_view_RenderNode_setPivotY }, 543 { "nSetCameraDistance", "(JF)V", (void*) android_view_RenderNode_setCameraDistance }, 544 { "nSetLeft", "(JI)V", (void*) android_view_RenderNode_setLeft }, 545 { "nSetTop", "(JI)V", (void*) android_view_RenderNode_setTop }, 546 { "nSetRight", "(JI)V", (void*) android_view_RenderNode_setRight }, 547 { "nSetBottom", "(JI)V", (void*) android_view_RenderNode_setBottom }, 548 { "nSetLeftTopRightBottom","(JIIII)V", (void*) android_view_RenderNode_setLeftTopRightBottom }, 549 { "nOffsetLeftAndRight", "(JF)V", (void*) android_view_RenderNode_offsetLeftAndRight }, 550 { "nOffsetTopAndBottom", "(JF)V", (void*) android_view_RenderNode_offsetTopAndBottom }, 551 552 { "nHasOverlappingRendering", "(J)Z", (void*) android_view_RenderNode_hasOverlappingRendering }, 553 { "nGetClipToOutline", "(J)Z", (void*) android_view_RenderNode_getClipToOutline }, 554 { "nGetAlpha", "(J)F", (void*) android_view_RenderNode_getAlpha }, 555 { "nGetLeft", "(J)F", (void*) android_view_RenderNode_getLeft }, 556 { "nGetTop", "(J)F", (void*) android_view_RenderNode_getTop }, 557 { "nGetRight", "(J)F", (void*) android_view_RenderNode_getRight }, 558 { "nGetBottom", "(J)F", (void*) android_view_RenderNode_getBottom }, 559 { "nGetCameraDistance", "(J)F", (void*) android_view_RenderNode_getCameraDistance }, 560 { "nGetScaleX", "(J)F", (void*) android_view_RenderNode_getScaleX }, 561 { "nGetScaleY", "(J)F", (void*) android_view_RenderNode_getScaleY }, 562 { "nGetElevation", "(J)F", (void*) android_view_RenderNode_getElevation }, 563 { "nGetTranslationX", "(J)F", (void*) android_view_RenderNode_getTranslationX }, 564 { "nGetTranslationY", "(J)F", (void*) android_view_RenderNode_getTranslationY }, 565 { "nGetTranslationZ", "(J)F", (void*) android_view_RenderNode_getTranslationZ }, 566 { "nGetRotation", "(J)F", (void*) android_view_RenderNode_getRotation }, 567 { "nGetRotationX", "(J)F", (void*) android_view_RenderNode_getRotationX }, 568 { "nGetRotationY", "(J)F", (void*) android_view_RenderNode_getRotationY }, 569 { "nIsPivotExplicitlySet", "(J)Z", (void*) android_view_RenderNode_isPivotExplicitlySet }, 570 { "nHasIdentityMatrix", "(J)Z", (void*) android_view_RenderNode_hasIdentityMatrix }, 571 572 { "nGetTransformMatrix", "(JJ)V", (void*) android_view_RenderNode_getTransformMatrix }, 573 { "nGetInverseTransformMatrix","(JJ)V", (void*) android_view_RenderNode_getInverseTransformMatrix }, 574 575 { "nGetPivotX", "(J)F", (void*) android_view_RenderNode_getPivotX }, 576 { "nGetPivotY", "(J)F", (void*) android_view_RenderNode_getPivotY }, 577 578 { "nAddAnimator", "(JJ)V", (void*) android_view_RenderNode_addAnimator }, 579 { "nRemoveAnimator", "(JJ)V", (void*) android_view_RenderNode_removeAnimator }, 580#endif 581}; 582 583#ifdef USE_OPENGL_RENDERER 584 #define FIND_CLASS(var, className) \ 585 var = env->FindClass(className); \ 586 LOG_FATAL_IF(! var, "Unable to find class " className); 587 588 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 589 var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 590 LOG_FATAL_IF(! var, "Unable to find method " methodName); 591#else 592 #define FIND_CLASS(var, className) 593 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) 594#endif 595 596int register_android_view_RenderNode(JNIEnv* env) { 597 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 598} 599 600}; 601 602