android_view_RenderNode.cpp revision d0a0b2a3140bfb1819a116413ce9d81886697a07
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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().mutableOutline().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->mutateStagingProperties().mutableOutline().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->mutateStagingProperties().mutableOutline().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->mutateStagingProperties().mutableOutline().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().setAlpha(alpha); 203 displayList->mutateStagingProperties().setTranslationX(translationX); 204 displayList->mutateStagingProperties().setTranslationY(translationY); 205 displayList->mutateStagingProperties().setTranslationZ(translationZ); 206 displayList->mutateStagingProperties().setRotation(rotation); 207 displayList->mutateStagingProperties().setRotationX(rotationX); 208 displayList->mutateStagingProperties().setRotationY(rotationY); 209 displayList->mutateStagingProperties().setScaleX(scaleX); 210 displayList->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->mutateStagingProperties().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->stagingProperties().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->stagingProperties().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->stagingProperties().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->stagingProperties().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->stagingProperties().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->stagingProperties().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->stagingProperties().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->stagingProperties().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->stagingProperties().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->stagingProperties().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->stagingProperties().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->stagingProperties().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->stagingProperties().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->stagingProperties().getRotationY(); 356} 357 358static jfloat android_view_RenderNode_getPivotX(JNIEnv* env, 359 jobject clazz, jlong displayListPtr) { 360 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 361 displayList->mutateStagingProperties().updateMatrix(); 362 return displayList->stagingProperties().getPivotX(); 363} 364 365static jfloat android_view_RenderNode_getPivotY(JNIEnv* env, 366 jobject clazz, jlong displayListPtr) { 367 RenderNode* displayList = reinterpret_cast<RenderNode*>(displayListPtr); 368 displayList->mutateStagingProperties().updateMatrix(); 369 return displayList->stagingProperties().getPivotY(); 370} 371 372#endif // USE_OPENGL_RENDERER 373 374// ---------------------------------------------------------------------------- 375// JNI Glue 376// ---------------------------------------------------------------------------- 377 378const char* const kClassPathName = "android/view/RenderNode"; 379 380static JNINativeMethod gMethods[] = { 381#ifdef USE_OPENGL_RENDERER 382 { "nCreate", "()J", (void*) android_view_RenderNode_create }, 383 { "nDestroyDisplayList", "(J)V", (void*) android_view_RenderNode_destroyDisplayList }, 384 { "nSetDisplayListName", "(JLjava/lang/String;)V", 385 (void*) android_view_RenderNode_setDisplayListName }, 386 { "nOutput", "(J)V", (void*) android_view_RenderNode_output }, 387 388 { "nSetCaching", "(JZ)V", (void*) android_view_RenderNode_setCaching }, 389 { "nSetStaticMatrix", "(JJ)V", (void*) android_view_RenderNode_setStaticMatrix }, 390 { "nSetAnimationMatrix", "(JJ)V", (void*) android_view_RenderNode_setAnimationMatrix }, 391 { "nSetClipToBounds", "(JZ)V", (void*) android_view_RenderNode_setClipToBounds }, 392 { "nSetProjectBackwards", "(JZ)V", (void*) android_view_RenderNode_setProjectBackwards }, 393 { "nSetProjectionReceiver","(JZ)V", (void*) android_view_RenderNode_setProjectionReceiver }, 394 395 { "nSetOutlineRoundRect", "(JIIIIF)V", (void*) android_view_RenderNode_setOutlineRoundRect }, 396 { "nSetOutlineConvexPath", "(JJ)V", (void*) android_view_RenderNode_setOutlineConvexPath }, 397 { "nSetOutlineEmpty", "(J)V", (void*) android_view_RenderNode_setOutlineEmpty }, 398 { "nSetClipToOutline", "(JZ)V", (void*) android_view_RenderNode_setClipToOutline }, 399 400 { "nSetAlpha", "(JF)V", (void*) android_view_RenderNode_setAlpha }, 401 { "nSetHasOverlappingRendering", "(JZ)V", 402 (void*) android_view_RenderNode_setHasOverlappingRendering }, 403 { "nSetTranslationX", "(JF)V", (void*) android_view_RenderNode_setTranslationX }, 404 { "nSetTranslationY", "(JF)V", (void*) android_view_RenderNode_setTranslationY }, 405 { "nSetTranslationZ", "(JF)V", (void*) android_view_RenderNode_setTranslationZ }, 406 { "nSetRotation", "(JF)V", (void*) android_view_RenderNode_setRotation }, 407 { "nSetRotationX", "(JF)V", (void*) android_view_RenderNode_setRotationX }, 408 { "nSetRotationY", "(JF)V", (void*) android_view_RenderNode_setRotationY }, 409 { "nSetScaleX", "(JF)V", (void*) android_view_RenderNode_setScaleX }, 410 { "nSetScaleY", "(JF)V", (void*) android_view_RenderNode_setScaleY }, 411 { "nSetTransformationInfo","(JFFFFFFFFF)V", 412 (void*) android_view_RenderNode_setTransformationInfo }, 413 { "nSetPivotX", "(JF)V", (void*) android_view_RenderNode_setPivotX }, 414 { "nSetPivotY", "(JF)V", (void*) android_view_RenderNode_setPivotY }, 415 { "nSetCameraDistance", "(JF)V", (void*) android_view_RenderNode_setCameraDistance }, 416 { "nSetLeft", "(JI)V", (void*) android_view_RenderNode_setLeft }, 417 { "nSetTop", "(JI)V", (void*) android_view_RenderNode_setTop }, 418 { "nSetRight", "(JI)V", (void*) android_view_RenderNode_setRight }, 419 { "nSetBottom", "(JI)V", (void*) android_view_RenderNode_setBottom }, 420 { "nSetLeftTopRightBottom","(JIIII)V", (void*) android_view_RenderNode_setLeftTopRightBottom }, 421 { "nOffsetLeftAndRight", "(JF)V", (void*) android_view_RenderNode_offsetLeftAndRight }, 422 { "nOffsetTopAndBottom", "(JF)V", (void*) android_view_RenderNode_offsetTopAndBottom }, 423 424 { "nHasOverlappingRendering", "(J)Z", (void*) android_view_RenderNode_hasOverlappingRendering }, 425 { "nGetAlpha", "(J)F", (void*) android_view_RenderNode_getAlpha }, 426 { "nGetLeft", "(J)F", (void*) android_view_RenderNode_getLeft }, 427 { "nGetTop", "(J)F", (void*) android_view_RenderNode_getTop }, 428 { "nGetRight", "(J)F", (void*) android_view_RenderNode_getRight }, 429 { "nGetBottom", "(J)F", (void*) android_view_RenderNode_getBottom }, 430 { "nGetCameraDistance", "(J)F", (void*) android_view_RenderNode_getCameraDistance }, 431 { "nGetScaleX", "(J)F", (void*) android_view_RenderNode_getScaleX }, 432 { "nGetScaleY", "(J)F", (void*) android_view_RenderNode_getScaleY }, 433 { "nGetTranslationX", "(J)F", (void*) android_view_RenderNode_getTranslationX }, 434 { "nGetTranslationY", "(J)F", (void*) android_view_RenderNode_getTranslationY }, 435 { "nGetRotation", "(J)F", (void*) android_view_RenderNode_getRotation }, 436 { "nGetRotationX", "(J)F", (void*) android_view_RenderNode_getRotationX }, 437 { "nGetRotationY", "(J)F", (void*) android_view_RenderNode_getRotationY }, 438 { "nGetPivotX", "(J)F", (void*) android_view_RenderNode_getPivotX }, 439 { "nGetPivotY", "(J)F", (void*) android_view_RenderNode_getPivotY }, 440#endif 441}; 442 443#ifdef USE_OPENGL_RENDERER 444 #define FIND_CLASS(var, className) \ 445 var = env->FindClass(className); \ 446 LOG_FATAL_IF(! var, "Unable to find class " className); 447 448 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 449 var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 450 LOG_FATAL_IF(! var, "Unable to find method " methodName); 451#else 452 #define FIND_CLASS(var, className) 453 #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) 454#endif 455 456int register_android_view_RenderNode(JNIEnv* env) { 457 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 458} 459 460}; 461 462