1a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase/* 2a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * Copyright (C) 2012 The Android Open Source Project 3a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * 4a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * Licensed under the Apache License, Version 2.0 (the "License"); 5a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * you may not use this file except in compliance with the License. 6a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * You may obtain a copy of the License at 7a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * 8a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * http://www.apache.org/licenses/LICENSE-2.0 9a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * 10a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * Unless required by applicable law or agreed to in writing, software 11a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * distributed under the License is distributed on an "AS IS" BASIS, 12a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * See the License for the specific language governing permissions and 14a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * limitations under the License. 15a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase */ 16a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 17a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define LOG_TAG "OpenGLRenderer" 18f648108f83d4e74811919e9811efb8fcc184b8a3John Reck#define ATRACE_TAG ATRACE_TAG_VIEW 19a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 20a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#include <EGL/egl.h> 21a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 22a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#include "jni.h" 23a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#include "GraphicsJNI.h" 24a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#include <nativehelper/JNIHelp.h> 25a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#include <android_runtime/AndroidRuntime.h> 26a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 27e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <Animator.h> 28f648108f83d4e74811919e9811efb8fcc184b8a3John Reck#include <DamageAccumulator.h> 29f648108f83d4e74811919e9811efb8fcc184b8a3John Reck#include <Matrix.h> 30113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <RenderNode.h> 3138f6c034d153bb648d45bce09d80a69ba3e03360John Reck#include <renderthread/CanvasContext.h> 32f648108f83d4e74811919e9811efb8fcc184b8a3John Reck#include <TreeInfo.h> 33dccca44ffda4836b56a21da95a046c9708ffd49csergeyv#include <hwui/Paint.h> 34a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 35987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h" 36987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 37a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasenamespace android { 38a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 39a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haaseusing namespace uirenderer; 40a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 4179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck#define SET_AND_DIRTY(prop, val, dirtyFlag) \ 4279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck (reinterpret_cast<RenderNode*>(renderNodePtr)->mutateStagingProperties().prop(val) \ 4379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck ? (reinterpret_cast<RenderNode*>(renderNodePtr)->setPropertyFieldsDirty(dirtyFlag), true) \ 4479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck : false) 4579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck 4644b49f070aafe8ad44efae87341121cce49ff11cJohn Reckstatic JNIEnv* getenv(JavaVM* vm) { 4744b49f070aafe8ad44efae87341121cce49ff11cJohn Reck JNIEnv* env; 4844b49f070aafe8ad44efae87341121cce49ff11cJohn Reck if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { 4944b49f070aafe8ad44efae87341121cce49ff11cJohn Reck LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", vm); 5044b49f070aafe8ad44efae87341121cce49ff11cJohn Reck } 5144b49f070aafe8ad44efae87341121cce49ff11cJohn Reck return env; 5244b49f070aafe8ad44efae87341121cce49ff11cJohn Reck} 5344b49f070aafe8ad44efae87341121cce49ff11cJohn Reck 5444b49f070aafe8ad44efae87341121cce49ff11cJohn Reckstatic jmethodID gOnRenderNodeDetached; 5544b49f070aafe8ad44efae87341121cce49ff11cJohn Reck 5644b49f070aafe8ad44efae87341121cce49ff11cJohn Reckclass RenderNodeContext : public VirtualLightRefBase { 5744b49f070aafe8ad44efae87341121cce49ff11cJohn Reckpublic: 5844b49f070aafe8ad44efae87341121cce49ff11cJohn Reck RenderNodeContext(JNIEnv* env, jobject jobjRef) { 5944b49f070aafe8ad44efae87341121cce49ff11cJohn Reck env->GetJavaVM(&mVm); 6044b49f070aafe8ad44efae87341121cce49ff11cJohn Reck // This holds a weak ref because otherwise there's a cyclic global ref 6144b49f070aafe8ad44efae87341121cce49ff11cJohn Reck // with this holding a strong global ref to the view which holds 6244b49f070aafe8ad44efae87341121cce49ff11cJohn Reck // a strong ref to RenderNode which holds a strong ref to this. 6344b49f070aafe8ad44efae87341121cce49ff11cJohn Reck mWeakRef = env->NewWeakGlobalRef(jobjRef); 6444b49f070aafe8ad44efae87341121cce49ff11cJohn Reck } 6544b49f070aafe8ad44efae87341121cce49ff11cJohn Reck 6644b49f070aafe8ad44efae87341121cce49ff11cJohn Reck virtual ~RenderNodeContext() { 6744b49f070aafe8ad44efae87341121cce49ff11cJohn Reck JNIEnv* env = getenv(mVm); 6844b49f070aafe8ad44efae87341121cce49ff11cJohn Reck env->DeleteWeakGlobalRef(mWeakRef); 6944b49f070aafe8ad44efae87341121cce49ff11cJohn Reck } 7044b49f070aafe8ad44efae87341121cce49ff11cJohn Reck 7144b49f070aafe8ad44efae87341121cce49ff11cJohn Reck jobject acquireLocalRef(JNIEnv* env) { 7244b49f070aafe8ad44efae87341121cce49ff11cJohn Reck return env->NewLocalRef(mWeakRef); 7344b49f070aafe8ad44efae87341121cce49ff11cJohn Reck } 7444b49f070aafe8ad44efae87341121cce49ff11cJohn Reck 7544b49f070aafe8ad44efae87341121cce49ff11cJohn Reckprivate: 7644b49f070aafe8ad44efae87341121cce49ff11cJohn Reck JavaVM* mVm; 7744b49f070aafe8ad44efae87341121cce49ff11cJohn Reck jweak mWeakRef; 7844b49f070aafe8ad44efae87341121cce49ff11cJohn Reck}; 7944b49f070aafe8ad44efae87341121cce49ff11cJohn Reck 8044b49f070aafe8ad44efae87341121cce49ff11cJohn Reck// Called by ThreadedRenderer's JNI layer 8144b49f070aafe8ad44efae87341121cce49ff11cJohn Reckvoid onRenderNodeRemoved(JNIEnv* env, RenderNode* node) { 8244b49f070aafe8ad44efae87341121cce49ff11cJohn Reck auto context = reinterpret_cast<RenderNodeContext*>(node->getUserContext()); 8344b49f070aafe8ad44efae87341121cce49ff11cJohn Reck if (!context) return; 8444b49f070aafe8ad44efae87341121cce49ff11cJohn Reck jobject jnode = context->acquireLocalRef(env); 8544b49f070aafe8ad44efae87341121cce49ff11cJohn Reck if (!jnode) { 8644b49f070aafe8ad44efae87341121cce49ff11cJohn Reck // The owning node has been GC'd, release the context 8744b49f070aafe8ad44efae87341121cce49ff11cJohn Reck node->setUserContext(nullptr); 8844b49f070aafe8ad44efae87341121cce49ff11cJohn Reck return; 8944b49f070aafe8ad44efae87341121cce49ff11cJohn Reck } 9044b49f070aafe8ad44efae87341121cce49ff11cJohn Reck env->CallVoidMethod(jnode, gOnRenderNodeDetached); 9144b49f070aafe8ad44efae87341121cce49ff11cJohn Reck env->DeleteLocalRef(jnode); 9244b49f070aafe8ad44efae87341121cce49ff11cJohn Reck} 9344b49f070aafe8ad44efae87341121cce49ff11cJohn Reck 9452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy// ---------------------------------------------------------------------------- 9552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy// DisplayList view properties 9652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy// ---------------------------------------------------------------------------- 9752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy 988de65a8e05285df52a1e6f0c1d5616dd233298a7John Reckstatic void android_view_RenderNode_output(JNIEnv* env, 998de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 1008de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 1018de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck renderNode->output(); 1028de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck} 1038de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck 104fe5e7b7346a54537b980796ceeca66bfdbd05561John Reckstatic jint android_view_RenderNode_getDebugSize(JNIEnv* env, 105fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck jobject clazz, jlong renderNodePtr) { 106fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 107fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck return renderNode->getDebugSize(); 108fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck} 109fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck 11044b49f070aafe8ad44efae87341121cce49ff11cJohn Reckstatic jlong android_view_RenderNode_create(JNIEnv* env, jobject thiz, 11144b49f070aafe8ad44efae87341121cce49ff11cJohn Reck jstring name) { 1128de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = new RenderNode(); 1138de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck renderNode->incStrong(0); 11452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy if (name != NULL) { 11552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy const char* textArray = env->GetStringUTFChars(name, NULL); 1168de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck renderNode->setName(textArray); 11752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy env->ReleaseStringUTFChars(name, textArray); 11852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy } 11944b49f070aafe8ad44efae87341121cce49ff11cJohn Reck renderNode->setUserContext(new RenderNodeContext(env, thiz)); 1208de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck return reinterpret_cast<jlong>(renderNode); 12152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy} 12252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy 1238de65a8e05285df52a1e6f0c1d5616dd233298a7John Reckstatic void android_view_RenderNode_destroyRenderNode(JNIEnv* env, 1248de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 1258de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 1268de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck renderNode->decStrong(0); 12744fd8d24f761f82d21e9b00932648a1b6bf91449John Reck} 12844fd8d24f761f82d21e9b00932648a1b6bf91449John Reck 129003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craikstatic void android_view_RenderNode_setDisplayList(JNIEnv* env, 130003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik jobject clazz, jlong renderNodePtr, jlong displayListPtr) { 13151f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck class RemovedObserver : public TreeObserver { 13251f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck public: 13351f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck virtual void onMaybeRemovedFromTree(RenderNode* node) override { 13451f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck maybeRemovedNodes.insert(sp<RenderNode>(node)); 13551f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck } 13651f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck std::set< sp<RenderNode> > maybeRemovedNodes; 13751f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck }; 13851f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck 1398de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 140003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik DisplayList* newData = reinterpret_cast<DisplayList*>(displayListPtr); 14151f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck RemovedObserver observer; 14251f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck renderNode->setStagingDisplayList(newData, &observer); 14351f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck for (auto& node : observer.maybeRemovedNodes) { 14451f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck if (node->hasParents()) continue; 14551f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck onRenderNodeRemoved(env, node.get()); 14651f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck } 14752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy} 14852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy 149a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// ---------------------------------------------------------------------------- 15049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik// RenderProperties - setters 151a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// ---------------------------------------------------------------------------- 152a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 15325fbb3fa1138675379102a44405852555cefccbdJohn Reckstatic jboolean android_view_RenderNode_setLayerType(JNIEnv* env, 15425fbb3fa1138675379102a44405852555cefccbdJohn Reck jobject clazz, jlong renderNodePtr, jint jlayerType) { 15525fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerType layerType = static_cast<LayerType>(jlayerType); 15625fbb3fa1138675379102a44405852555cefccbdJohn Reck return SET_AND_DIRTY(mutateLayerProperties().setType, layerType, RenderNode::GENERIC); 15725fbb3fa1138675379102a44405852555cefccbdJohn Reck} 15825fbb3fa1138675379102a44405852555cefccbdJohn Reck 15925fbb3fa1138675379102a44405852555cefccbdJohn Reckstatic jboolean android_view_RenderNode_setLayerPaint(JNIEnv* env, 16025fbb3fa1138675379102a44405852555cefccbdJohn Reck jobject clazz, jlong renderNodePtr, jlong paintPtr) { 1616ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod Paint* paint = reinterpret_cast<Paint*>(paintPtr); 16225fbb3fa1138675379102a44405852555cefccbdJohn Reck return SET_AND_DIRTY(mutateLayerProperties().setFromPaint, paint, RenderNode::GENERIC); 163a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 164a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 16579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setStaticMatrix(JNIEnv* env, 1668de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, jlong matrixPtr) { 1677a02ea3eaafac782b532ef366863a0b2554ae536Chris Craik SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr); 16879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setStaticMatrix, matrix, RenderNode::GENERIC); 1699420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase} 1709420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase 17179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setAnimationMatrix(JNIEnv* env, 1728de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, jlong matrixPtr) { 1737a02ea3eaafac782b532ef366863a0b2554ae536Chris Craik SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr); 17479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setAnimationMatrix, matrix, RenderNode::GENERIC); 175a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 176a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 17779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setClipToBounds(JNIEnv* env, 1788de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, jboolean clipToBounds) { 17979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setClipToBounds, clipToBounds, RenderNode::GENERIC); 180a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 181a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 182a753f4c6cb8558795e673df1896532cd148781e2Chris Craikstatic jboolean android_view_RenderNode_setClipBounds(JNIEnv* env, 183a753f4c6cb8558795e673df1896532cd148781e2Chris Craik jobject clazz, jlong renderNodePtr, jint left, jint top, jint right, jint bottom) { 184a753f4c6cb8558795e673df1896532cd148781e2Chris Craik android::uirenderer::Rect clipBounds(left, top, right, bottom); 185a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return SET_AND_DIRTY(setClipBounds, clipBounds, RenderNode::GENERIC); 186a753f4c6cb8558795e673df1896532cd148781e2Chris Craik} 187a753f4c6cb8558795e673df1896532cd148781e2Chris Craik 188a753f4c6cb8558795e673df1896532cd148781e2Chris Craikstatic jboolean android_view_RenderNode_setClipBoundsEmpty(JNIEnv* env, 189a753f4c6cb8558795e673df1896532cd148781e2Chris Craik jobject clazz, jlong renderNodePtr) { 190a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return SET_AND_DIRTY(setClipBoundsEmpty,, RenderNode::GENERIC); 191a753f4c6cb8558795e673df1896532cd148781e2Chris Craik} 192a753f4c6cb8558795e673df1896532cd148781e2Chris Craik 19379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setProjectBackwards(JNIEnv* env, 1948de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, jboolean shouldProject) { 19579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setProjectBackwards, shouldProject, RenderNode::GENERIC); 19658f09b352417c4ff7e01365727cbf8a09b9bed23Alan Viverette} 19758f09b352417c4ff7e01365727cbf8a09b9bed23Alan Viverette 19879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setProjectionReceiver(JNIEnv* env, 1998de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, jboolean shouldRecieve) { 20079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setProjectionReceiver, shouldRecieve, RenderNode::GENERIC); 2011df26446b7eac7050767c38ca977fde03a41a033Chris Craik} 2021df26446b7eac7050767c38ca977fde03a41a033Chris Craik 20379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setOutlineRoundRect(JNIEnv* env, 2048de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, jint left, jint top, 20577b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik jint right, jint bottom, jfloat radius, jfloat alpha) { 2068de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 20777b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom, 20877b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik radius, alpha); 209ff941dcd815021bb20d6504eb486acb1e50592c3John Reck renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 21079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 211b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik} 2128c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik 21379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setOutlineConvexPath(JNIEnv* env, 21477b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik jobject clazz, jlong renderNodePtr, jlong outlinePathPtr, jfloat alpha) { 2158de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 216b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr); 21777b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath, alpha); 218ff941dcd815021bb20d6504eb486acb1e50592c3John Reck renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 21979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 220b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik} 2218c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik 22279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setOutlineEmpty(JNIEnv* env, 2238de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 2248de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 2258de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck renderNode->mutateStagingProperties().mutableOutline().setEmpty(); 226ff941dcd815021bb20d6504eb486acb1e50592c3John Reck renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 22779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 228a2fe7affd3d077ac163da90996cb2e5e0ca3b8d1Chris Craik} 229a2fe7affd3d077ac163da90996cb2e5e0ca3b8d1Chris Craik 2300645128b80621edee70f8cab4afb208fe0c26becChris Craikstatic jboolean android_view_RenderNode_setOutlineNone(JNIEnv* env, 2310645128b80621edee70f8cab4afb208fe0c26becChris Craik jobject clazz, jlong renderNodePtr) { 2320645128b80621edee70f8cab4afb208fe0c26becChris Craik RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 2330645128b80621edee70f8cab4afb208fe0c26becChris Craik renderNode->mutateStagingProperties().mutableOutline().setNone(); 2340645128b80621edee70f8cab4afb208fe0c26becChris Craik renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 2350645128b80621edee70f8cab4afb208fe0c26becChris Craik return true; 2360645128b80621edee70f8cab4afb208fe0c26becChris Craik} 2370645128b80621edee70f8cab4afb208fe0c26becChris Craik 2385c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craikstatic jboolean android_view_RenderNode_hasShadow(JNIEnv* env, 2395c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik jobject clazz, jlong renderNodePtr) { 2405c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 2415c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik return renderNode->stagingProperties().hasShadow(); 2425c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik} 2435c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik 24479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setClipToOutline(JNIEnv* env, 2458de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, jboolean clipToOutline) { 2468de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 2478de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck renderNode->mutateStagingProperties().mutableOutline().setShouldClip(clipToOutline); 248ff941dcd815021bb20d6504eb486acb1e50592c3John Reck renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 24979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 2508c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik} 2518c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik 25279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setRevealClip(JNIEnv* env, 253af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik jobject clazz, jlong renderNodePtr, jboolean shouldClip, 2548c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik jfloat x, jfloat y, jfloat radius) { 2558de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 2568de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck renderNode->mutateStagingProperties().mutableRevealClip().set( 257af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik shouldClip, x, y, radius); 258ff941dcd815021bb20d6504eb486acb1e50592c3John Reck renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); 25979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 260fad4593a3c9db193a4308c34168cc91c28218e2bztenghui} 261fad4593a3c9db193a4308c34168cc91c28218e2bztenghui 26279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setAlpha(JNIEnv* env, 2638de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, float alpha) { 26479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setAlpha, alpha, RenderNode::ALPHA); 265a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 266a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 26779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setHasOverlappingRendering(JNIEnv* env, 2688de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, bool hasOverlappingRendering) { 26979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setHasOverlappingRendering, hasOverlappingRendering, 27079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck RenderNode::GENERIC); 271db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase} 272db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase 27379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setElevation(JNIEnv* env, 274cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik jobject clazz, jlong renderNodePtr, float elevation) { 27579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setElevation, elevation, RenderNode::Z); 276cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik} 277cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik 27879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setTranslationX(JNIEnv* env, 2798de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, float tx) { 28079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setTranslationX, tx, RenderNode::TRANSLATION_X | RenderNode::X); 281a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 282a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 28379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setTranslationY(JNIEnv* env, 2848de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, float ty) { 28579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setTranslationY, ty, RenderNode::TRANSLATION_Y | RenderNode::Y); 286a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 287a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 28879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setTranslationZ(JNIEnv* env, 2898de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, float tz) { 29079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setTranslationZ, tz, RenderNode::TRANSLATION_Z | RenderNode::Z); 291f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik} 292f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik 29379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setRotation(JNIEnv* env, 2948de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, float rotation) { 29579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setRotation, rotation, RenderNode::ROTATION); 296a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 297a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 29879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setRotationX(JNIEnv* env, 2998de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, float rx) { 30079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setRotationX, rx, RenderNode::ROTATION_X); 301a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 302a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 30379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setRotationY(JNIEnv* env, 3048de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, float ry) { 30579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setRotationY, ry, RenderNode::ROTATION_Y); 306a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 307a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 30879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setScaleX(JNIEnv* env, 3098de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, float sx) { 31079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setScaleX, sx, RenderNode::SCALE_X); 311a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 312a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 31379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setScaleY(JNIEnv* env, 3148de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, float sy) { 31579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setScaleY, sy, RenderNode::SCALE_Y); 316a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 317a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 31879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setPivotX(JNIEnv* env, 3198de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, float px) { 32079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setPivotX, px, RenderNode::GENERIC); 321a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 322a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 32379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setPivotY(JNIEnv* env, 3248de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, float py) { 32579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setPivotY, py, RenderNode::GENERIC); 326a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 327a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 32879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setCameraDistance(JNIEnv* env, 3298de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, float distance) { 33079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setCameraDistance, distance, RenderNode::GENERIC); 331a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 332a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 33379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setLeft(JNIEnv* env, 3348de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, int left) { 33579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setLeft, left, RenderNode::X); 336a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 337a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 33879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setTop(JNIEnv* env, 3398de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, int top) { 34079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setTop, top, RenderNode::Y); 341a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 342a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 34379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setRight(JNIEnv* env, 3448de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, int right) { 34579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setRight, right, RenderNode::X); 346a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 347a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 34879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setBottom(JNIEnv* env, 3498de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, int bottom) { 35079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(setBottom, bottom, RenderNode::Y); 351a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 352a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 35379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_setLeftTopRightBottom(JNIEnv* env, 3548de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, int left, int top, 355a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase int right, int bottom) { 3568de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 35779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (renderNode->mutateStagingProperties().setLeftTopRightBottom(left, top, right, bottom)) { 35879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck renderNode->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y); 35979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 36079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck } 36179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 362a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 363a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 36479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_offsetLeftAndRight(JNIEnv* env, 365a753f4c6cb8558795e673df1896532cd148781e2Chris Craik jobject clazz, jlong renderNodePtr, jint offset) { 36679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(offsetLeftRight, offset, RenderNode::X); 367a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 368a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 36979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reckstatic jboolean android_view_RenderNode_offsetTopAndBottom(JNIEnv* env, 370a753f4c6cb8558795e673df1896532cd148781e2Chris Craik jobject clazz, jlong renderNodePtr, jint offset) { 37179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return SET_AND_DIRTY(offsetTopBottom, offset, RenderNode::Y); 372a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 373a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 37449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik// ---------------------------------------------------------------------------- 37549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik// RenderProperties - getters 37649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik// ---------------------------------------------------------------------------- 37749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 378f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jboolean android_view_RenderNode_hasOverlappingRendering(JNIEnv* env, 3798de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 3808de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 3818de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck return renderNode->stagingProperties().hasOverlappingRendering(); 38252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy} 38352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy 384deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikstatic jboolean android_view_RenderNode_getClipToOutline(JNIEnv* env, 385deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik jobject clazz, jlong renderNodePtr) { 386deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 387deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik return renderNode->stagingProperties().getOutline().getShouldClip(); 388deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik} 389deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik 390f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getAlpha(JNIEnv* env, 3918de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 3928de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 3938de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck return renderNode->stagingProperties().getAlpha(); 39452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy} 39552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy 396f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getCameraDistance(JNIEnv* env, 3978de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 3988de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 3998de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck return renderNode->stagingProperties().getCameraDistance(); 40052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy} 40152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy 402f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getScaleX(JNIEnv* env, 4038de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 4048de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 4058de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck return renderNode->stagingProperties().getScaleX(); 40652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy} 40752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy 408f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getScaleY(JNIEnv* env, 4098de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 4108de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 4118de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck return renderNode->stagingProperties().getScaleY(); 41252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy} 41352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy 414cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craikstatic jfloat android_view_RenderNode_getElevation(JNIEnv* env, 415cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik jobject clazz, jlong renderNodePtr) { 416cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 417cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik return renderNode->stagingProperties().getElevation(); 418cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik} 419cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik 420f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getTranslationX(JNIEnv* env, 4218de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 4228de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 4238de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck return renderNode->stagingProperties().getTranslationX(); 42452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy} 42552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy 426f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getTranslationY(JNIEnv* env, 4278de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 4288de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 4298de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck return renderNode->stagingProperties().getTranslationY(); 43052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy} 43152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy 43249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craikstatic jfloat android_view_RenderNode_getTranslationZ(JNIEnv* env, 4338de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 4348de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 4358de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck return renderNode->stagingProperties().getTranslationZ(); 43649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik} 43749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 438f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getRotation(JNIEnv* env, 4398de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 4408de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 4418de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck return renderNode->stagingProperties().getRotation(); 44252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy} 44352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy 444f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getRotationX(JNIEnv* env, 4458de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 4468de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 4478de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck return renderNode->stagingProperties().getRotationX(); 44852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy} 44952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy 450f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getRotationY(JNIEnv* env, 4518de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 4528de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 4538de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck return renderNode->stagingProperties().getRotationY(); 45452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy} 45552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy 45649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craikstatic jboolean android_view_RenderNode_isPivotExplicitlySet(JNIEnv* env, 4578de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 4588de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 4598de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck return renderNode->stagingProperties().isPivotExplicitlySet(); 46049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik} 46149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 46249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craikstatic jboolean android_view_RenderNode_hasIdentityMatrix(JNIEnv* env, 4638de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 4648de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 465f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck renderNode->mutateStagingProperties().updateMatrix(); 466f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck return !renderNode->stagingProperties().hasTransformMatrix(); 46749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik} 46849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 46949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik// ---------------------------------------------------------------------------- 47049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik// RenderProperties - computed getters 47149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik// ---------------------------------------------------------------------------- 47249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 47349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craikstatic void android_view_RenderNode_getTransformMatrix(JNIEnv* env, 4748de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) { 4758de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 47649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr); 47749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 4788de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck renderNode->mutateStagingProperties().updateMatrix(); 4798de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck const SkMatrix* transformMatrix = renderNode->stagingProperties().getTransformMatrix(); 48049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 481f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (transformMatrix) { 48249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik *outMatrix = *transformMatrix; 48349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik } else { 48449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik outMatrix->setIdentity(); 48549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik } 48649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik} 48749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 48849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craikstatic void android_view_RenderNode_getInverseTransformMatrix(JNIEnv* env, 4898de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr, jlong outMatrixPtr) { 49049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik // load transform matrix 4918de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck android_view_RenderNode_getTransformMatrix(env, clazz, renderNodePtr, outMatrixPtr); 49249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr); 49349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 49449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik // return it inverted 49549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik if (!outMatrix->invert(outMatrix)) { 49649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik // failed to load inverse, pass back identity 49749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik outMatrix->setIdentity(); 49849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik } 49949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik} 50049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 501f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getPivotX(JNIEnv* env, 5028de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 5038de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 5048de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck renderNode->mutateStagingProperties().updateMatrix(); 5058de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck return renderNode->stagingProperties().getPivotX(); 50652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy} 50752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy 508f666ad7046c0b1b255835f75aeb7d1391067df93John Reckstatic jfloat android_view_RenderNode_getPivotY(JNIEnv* env, 5098de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck jobject clazz, jlong renderNodePtr) { 5108de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 5118de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck renderNode->mutateStagingProperties().updateMatrix(); 5128de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck return renderNode->stagingProperties().getPivotY(); 51352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy} 51452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy 515e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// ---------------------------------------------------------------------------- 516e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// RenderProperties - Animations 517e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// ---------------------------------------------------------------------------- 518e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 519e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic void android_view_RenderNode_addAnimator(JNIEnv* env, jobject clazz, 520e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck jlong renderNodePtr, jlong animatorPtr) { 521e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 522e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr); 523e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck renderNode->addAnimator(animator); 524e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 525e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 526119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic void android_view_RenderNode_endAllAnimators(JNIEnv* env, jobject clazz, 527119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck jlong renderNodePtr) { 528119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 529e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck renderNode->animators().endAllStagingAnimators(); 530119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck} 531119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 532a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// ---------------------------------------------------------------------------- 533f648108f83d4e74811919e9811efb8fcc184b8a3John Reck// SurfaceView position callback 534f648108f83d4e74811919e9811efb8fcc184b8a3John Reck// ---------------------------------------------------------------------------- 535f648108f83d4e74811919e9811efb8fcc184b8a3John Reck 536f648108f83d4e74811919e9811efb8fcc184b8a3John ReckjmethodID gSurfaceViewPositionUpdateMethod; 53734bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn ReckjmethodID gSurfaceViewPositionLostMethod; 538f648108f83d4e74811919e9811efb8fcc184b8a3John Reck 539f648108f83d4e74811919e9811efb8fcc184b8a3John Reckstatic void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject, 540f648108f83d4e74811919e9811efb8fcc184b8a3John Reck jlong renderNodePtr, jobject surfaceview) { 541f648108f83d4e74811919e9811efb8fcc184b8a3John Reck class SurfaceViewPositionUpdater : public RenderNode::PositionListener { 542f648108f83d4e74811919e9811efb8fcc184b8a3John Reck public: 543f648108f83d4e74811919e9811efb8fcc184b8a3John Reck SurfaceViewPositionUpdater(JNIEnv* env, jobject surfaceview) { 544f648108f83d4e74811919e9811efb8fcc184b8a3John Reck env->GetJavaVM(&mVm); 545f648108f83d4e74811919e9811efb8fcc184b8a3John Reck mWeakRef = env->NewWeakGlobalRef(surfaceview); 546f648108f83d4e74811919e9811efb8fcc184b8a3John Reck } 547f648108f83d4e74811919e9811efb8fcc184b8a3John Reck 548f648108f83d4e74811919e9811efb8fcc184b8a3John Reck virtual ~SurfaceViewPositionUpdater() { 549f648108f83d4e74811919e9811efb8fcc184b8a3John Reck jnienv()->DeleteWeakGlobalRef(mWeakRef); 550f648108f83d4e74811919e9811efb8fcc184b8a3John Reck mWeakRef = nullptr; 551f648108f83d4e74811919e9811efb8fcc184b8a3John Reck } 552f648108f83d4e74811919e9811efb8fcc184b8a3John Reck 553f648108f83d4e74811919e9811efb8fcc184b8a3John Reck virtual void onPositionUpdated(RenderNode& node, const TreeInfo& info) override { 554f648108f83d4e74811919e9811efb8fcc184b8a3John Reck if (CC_UNLIKELY(!mWeakRef || !info.updateWindowPositions)) return; 555f648108f83d4e74811919e9811efb8fcc184b8a3John Reck 556f648108f83d4e74811919e9811efb8fcc184b8a3John Reck Matrix4 transform; 557f648108f83d4e74811919e9811efb8fcc184b8a3John Reck info.damageAccumulator->computeCurrentTransform(&transform); 558f648108f83d4e74811919e9811efb8fcc184b8a3John Reck const RenderProperties& props = node.properties(); 559f648108f83d4e74811919e9811efb8fcc184b8a3John Reck uirenderer::Rect bounds(props.getWidth(), props.getHeight()); 560f648108f83d4e74811919e9811efb8fcc184b8a3John Reck transform.mapRect(bounds); 561f648108f83d4e74811919e9811efb8fcc184b8a3John Reck bounds.left -= info.windowInsetLeft; 562f648108f83d4e74811919e9811efb8fcc184b8a3John Reck bounds.right -= info.windowInsetLeft; 563f648108f83d4e74811919e9811efb8fcc184b8a3John Reck bounds.top -= info.windowInsetTop; 564f648108f83d4e74811919e9811efb8fcc184b8a3John Reck bounds.bottom -= info.windowInsetTop; 56538f6c034d153bb648d45bce09d80a69ba3e03360John Reck 5660e974e74252c9419094c7aadb5ec1f537f0902fdChris Craik if (CC_LIKELY(transform.isPureTranslate())) { 5670e974e74252c9419094c7aadb5ec1f537f0902fdChris Craik // snap/round the computed bounds, so they match the rounding behavior 5680e974e74252c9419094c7aadb5ec1f537f0902fdChris Craik // of the clear done in SurfaceView#draw(). 5690e974e74252c9419094c7aadb5ec1f537f0902fdChris Craik bounds.snapToPixelBoundaries(); 5700e974e74252c9419094c7aadb5ec1f537f0902fdChris Craik } else { 5710e974e74252c9419094c7aadb5ec1f537f0902fdChris Craik // Conservatively round out so the punched hole (in the ZOrderOnTop = true case) 5720e974e74252c9419094c7aadb5ec1f537f0902fdChris Craik // doesn't extend beyond the other window 5730e974e74252c9419094c7aadb5ec1f537f0902fdChris Craik bounds.roundOut(); 5740e974e74252c9419094c7aadb5ec1f537f0902fdChris Craik } 5750e974e74252c9419094c7aadb5ec1f537f0902fdChris Craik 57638f6c034d153bb648d45bce09d80a69ba3e03360John Reck auto functor = std::bind( 57738f6c034d153bb648d45bce09d80a69ba3e03360John Reck std::mem_fn(&SurfaceViewPositionUpdater::doUpdatePosition), this, 57828912a508493e583c48772e2a234e0ed66849490John Reck (jlong) info.canvasContext.getFrameNumber(), 57928912a508493e583c48772e2a234e0ed66849490John Reck (jint) bounds.left, (jint) bounds.top, 58038f6c034d153bb648d45bce09d80a69ba3e03360John Reck (jint) bounds.right, (jint) bounds.bottom); 58138f6c034d153bb648d45bce09d80a69ba3e03360John Reck 58238f6c034d153bb648d45bce09d80a69ba3e03360John Reck info.canvasContext.enqueueFrameWork(std::move(functor)); 583f648108f83d4e74811919e9811efb8fcc184b8a3John Reck } 584f648108f83d4e74811919e9811efb8fcc184b8a3John Reck 58534bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck virtual void onPositionLost(RenderNode& node, const TreeInfo* info) override { 58634bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck if (CC_UNLIKELY(!mWeakRef || (info && !info->updateWindowPositions))) return; 58734bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck 58834bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck if (info) { 58934bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck auto functor = std::bind( 59034bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck std::mem_fn(&SurfaceViewPositionUpdater::doNotifyPositionLost), this, 59134bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck (jlong) info->canvasContext.getFrameNumber()); 59234bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck 59334bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck info->canvasContext.enqueueFrameWork(std::move(functor)); 59434bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck } else { 59534bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck doNotifyPositionLost(0); 59634bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck } 59734bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck } 59834bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck 599f648108f83d4e74811919e9811efb8fcc184b8a3John Reck private: 600f648108f83d4e74811919e9811efb8fcc184b8a3John Reck JNIEnv* jnienv() { 601f648108f83d4e74811919e9811efb8fcc184b8a3John Reck JNIEnv* env; 602f648108f83d4e74811919e9811efb8fcc184b8a3John Reck if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { 603f648108f83d4e74811919e9811efb8fcc184b8a3John Reck LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", mVm); 604f648108f83d4e74811919e9811efb8fcc184b8a3John Reck } 605f648108f83d4e74811919e9811efb8fcc184b8a3John Reck return env; 606f648108f83d4e74811919e9811efb8fcc184b8a3John Reck } 607f648108f83d4e74811919e9811efb8fcc184b8a3John Reck 60838f6c034d153bb648d45bce09d80a69ba3e03360John Reck void doUpdatePosition(jlong frameNumber, jint left, jint top, 60938f6c034d153bb648d45bce09d80a69ba3e03360John Reck jint right, jint bottom) { 61038f6c034d153bb648d45bce09d80a69ba3e03360John Reck ATRACE_NAME("Update SurfaceView position"); 61138f6c034d153bb648d45bce09d80a69ba3e03360John Reck 61238f6c034d153bb648d45bce09d80a69ba3e03360John Reck JNIEnv* env = jnienv(); 61338f6c034d153bb648d45bce09d80a69ba3e03360John Reck jobject localref = env->NewLocalRef(mWeakRef); 61438f6c034d153bb648d45bce09d80a69ba3e03360John Reck if (CC_UNLIKELY(!localref)) { 61538f6c034d153bb648d45bce09d80a69ba3e03360John Reck jnienv()->DeleteWeakGlobalRef(mWeakRef); 61638f6c034d153bb648d45bce09d80a69ba3e03360John Reck mWeakRef = nullptr; 61738f6c034d153bb648d45bce09d80a69ba3e03360John Reck return; 61838f6c034d153bb648d45bce09d80a69ba3e03360John Reck } 61938f6c034d153bb648d45bce09d80a69ba3e03360John Reck 62038f6c034d153bb648d45bce09d80a69ba3e03360John Reck env->CallVoidMethod(localref, gSurfaceViewPositionUpdateMethod, 62138f6c034d153bb648d45bce09d80a69ba3e03360John Reck frameNumber, left, top, right, bottom); 62238f6c034d153bb648d45bce09d80a69ba3e03360John Reck env->DeleteLocalRef(localref); 62338f6c034d153bb648d45bce09d80a69ba3e03360John Reck } 62438f6c034d153bb648d45bce09d80a69ba3e03360John Reck 62534bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck void doNotifyPositionLost(jlong frameNumber) { 62634bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck ATRACE_NAME("SurfaceView position lost"); 62734bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck 62834bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck JNIEnv* env = jnienv(); 62934bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck jobject localref = env->NewLocalRef(mWeakRef); 63034bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck if (CC_UNLIKELY(!localref)) { 63134bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck jnienv()->DeleteWeakGlobalRef(mWeakRef); 63234bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck mWeakRef = nullptr; 63334bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck return; 63434bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck } 63534bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck 63634bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck env->CallVoidMethod(localref, gSurfaceViewPositionLostMethod, frameNumber); 63734bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck env->DeleteLocalRef(localref); 63834bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck } 63934bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck 640f648108f83d4e74811919e9811efb8fcc184b8a3John Reck JavaVM* mVm; 641f648108f83d4e74811919e9811efb8fcc184b8a3John Reck jobject mWeakRef; 642f648108f83d4e74811919e9811efb8fcc184b8a3John Reck }; 643f648108f83d4e74811919e9811efb8fcc184b8a3John Reck 644f648108f83d4e74811919e9811efb8fcc184b8a3John Reck RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 645f648108f83d4e74811919e9811efb8fcc184b8a3John Reck renderNode->setPositionListener(new SurfaceViewPositionUpdater(env, surfaceview)); 646f648108f83d4e74811919e9811efb8fcc184b8a3John Reck} 647f648108f83d4e74811919e9811efb8fcc184b8a3John Reck 648f648108f83d4e74811919e9811efb8fcc184b8a3John Reck// ---------------------------------------------------------------------------- 649a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// JNI Glue 650a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// ---------------------------------------------------------------------------- 651a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 652f666ad7046c0b1b255835f75aeb7d1391067df93John Reckconst char* const kClassPathName = "android/view/RenderNode"; 653a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 65476f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = { 655003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik { "nCreate", "(Ljava/lang/String;)J", (void*) android_view_RenderNode_create }, 656003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik { "nDestroyRenderNode", "(J)V", (void*) android_view_RenderNode_destroyRenderNode }, 657003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik { "nSetDisplayList", "(JJ)V", (void*) android_view_RenderNode_setDisplayList }, 658003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik { "nOutput", "(J)V", (void*) android_view_RenderNode_output }, 659003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik { "nGetDebugSize", "(J)I", (void*) android_view_RenderNode_getDebugSize }, 660f666ad7046c0b1b255835f75aeb7d1391067df93John Reck 6614136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetLayerType", "!(JI)Z", (void*) android_view_RenderNode_setLayerType }, 6624136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetLayerPaint", "!(JJ)Z", (void*) android_view_RenderNode_setLayerPaint }, 6634136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetStaticMatrix", "!(JJ)Z", (void*) android_view_RenderNode_setStaticMatrix }, 6644136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetAnimationMatrix", "!(JJ)Z", (void*) android_view_RenderNode_setAnimationMatrix }, 6654136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetClipToBounds", "!(JZ)Z", (void*) android_view_RenderNode_setClipToBounds }, 6664136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetClipBounds", "!(JIIII)Z", (void*) android_view_RenderNode_setClipBounds }, 6674136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetClipBoundsEmpty", "!(J)Z", (void*) android_view_RenderNode_setClipBoundsEmpty }, 6684136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetProjectBackwards", "!(JZ)Z", (void*) android_view_RenderNode_setProjectBackwards }, 6694136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetProjectionReceiver","!(JZ)Z", (void*) android_view_RenderNode_setProjectionReceiver }, 67079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck 67140de9f28f48f80674ae64b7f165b56281e8b9038Chris Craik { "nSetOutlineRoundRect", "!(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect }, 67240de9f28f48f80674ae64b7f165b56281e8b9038Chris Craik { "nSetOutlineConvexPath", "!(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath }, 67340de9f28f48f80674ae64b7f165b56281e8b9038Chris Craik { "nSetOutlineEmpty", "!(J)Z", (void*) android_view_RenderNode_setOutlineEmpty }, 67440de9f28f48f80674ae64b7f165b56281e8b9038Chris Craik { "nSetOutlineNone", "!(J)Z", (void*) android_view_RenderNode_setOutlineNone }, 6754136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nHasShadow", "!(J)Z", (void*) android_view_RenderNode_hasShadow }, 6764136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetClipToOutline", "!(JZ)Z", (void*) android_view_RenderNode_setClipToOutline }, 67740de9f28f48f80674ae64b7f165b56281e8b9038Chris Craik { "nSetRevealClip", "!(JZFFF)Z", (void*) android_view_RenderNode_setRevealClip }, 67879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck 6794136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetAlpha", "!(JF)Z", (void*) android_view_RenderNode_setAlpha }, 6804136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetHasOverlappingRendering", "!(JZ)Z", 681f666ad7046c0b1b255835f75aeb7d1391067df93John Reck (void*) android_view_RenderNode_setHasOverlappingRendering }, 6824136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetElevation", "!(JF)Z", (void*) android_view_RenderNode_setElevation }, 6834136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetTranslationX", "!(JF)Z", (void*) android_view_RenderNode_setTranslationX }, 6844136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetTranslationY", "!(JF)Z", (void*) android_view_RenderNode_setTranslationY }, 6854136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetTranslationZ", "!(JF)Z", (void*) android_view_RenderNode_setTranslationZ }, 6864136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetRotation", "!(JF)Z", (void*) android_view_RenderNode_setRotation }, 6874136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetRotationX", "!(JF)Z", (void*) android_view_RenderNode_setRotationX }, 6884136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetRotationY", "!(JF)Z", (void*) android_view_RenderNode_setRotationY }, 6894136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetScaleX", "!(JF)Z", (void*) android_view_RenderNode_setScaleX }, 6904136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetScaleY", "!(JF)Z", (void*) android_view_RenderNode_setScaleY }, 6914136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetPivotX", "!(JF)Z", (void*) android_view_RenderNode_setPivotX }, 6924136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetPivotY", "!(JF)Z", (void*) android_view_RenderNode_setPivotY }, 6934136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetCameraDistance", "!(JF)Z", (void*) android_view_RenderNode_setCameraDistance }, 6944136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetLeft", "!(JI)Z", (void*) android_view_RenderNode_setLeft }, 6954136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetTop", "!(JI)Z", (void*) android_view_RenderNode_setTop }, 6964136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetRight", "!(JI)Z", (void*) android_view_RenderNode_setRight }, 6974136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetBottom", "!(JI)Z", (void*) android_view_RenderNode_setBottom }, 6984136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nSetLeftTopRightBottom","!(JIIII)Z", (void*) android_view_RenderNode_setLeftTopRightBottom }, 6994136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nOffsetLeftAndRight", "!(JI)Z", (void*) android_view_RenderNode_offsetLeftAndRight }, 7004136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nOffsetTopAndBottom", "!(JI)Z", (void*) android_view_RenderNode_offsetTopAndBottom }, 7014136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik 7024136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nHasOverlappingRendering", "!(J)Z", (void*) android_view_RenderNode_hasOverlappingRendering }, 7034136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetClipToOutline", "!(J)Z", (void*) android_view_RenderNode_getClipToOutline }, 7044136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetAlpha", "!(J)F", (void*) android_view_RenderNode_getAlpha }, 7054136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetCameraDistance", "!(J)F", (void*) android_view_RenderNode_getCameraDistance }, 7064136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetScaleX", "!(J)F", (void*) android_view_RenderNode_getScaleX }, 7074136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetScaleY", "!(J)F", (void*) android_view_RenderNode_getScaleY }, 7084136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetElevation", "!(J)F", (void*) android_view_RenderNode_getElevation }, 7094136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetTranslationX", "!(J)F", (void*) android_view_RenderNode_getTranslationX }, 7104136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetTranslationY", "!(J)F", (void*) android_view_RenderNode_getTranslationY }, 7114136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetTranslationZ", "!(J)F", (void*) android_view_RenderNode_getTranslationZ }, 7124136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetRotation", "!(J)F", (void*) android_view_RenderNode_getRotation }, 7134136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetRotationX", "!(J)F", (void*) android_view_RenderNode_getRotationX }, 7144136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetRotationY", "!(J)F", (void*) android_view_RenderNode_getRotationY }, 7154136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nIsPivotExplicitlySet", "!(J)Z", (void*) android_view_RenderNode_isPivotExplicitlySet }, 7164136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nHasIdentityMatrix", "!(J)Z", (void*) android_view_RenderNode_hasIdentityMatrix }, 7174136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik 7184136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetTransformMatrix", "!(JJ)V", (void*) android_view_RenderNode_getTransformMatrix }, 7194136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetInverseTransformMatrix","!(JJ)V", (void*) android_view_RenderNode_getInverseTransformMatrix }, 7204136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik 7214136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetPivotX", "!(J)F", (void*) android_view_RenderNode_getPivotX }, 7224136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik { "nGetPivotY", "!(J)F", (void*) android_view_RenderNode_getPivotY }, 723e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 724e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck { "nAddAnimator", "(JJ)V", (void*) android_view_RenderNode_addAnimator }, 725119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck { "nEndAllAnimators", "(J)V", (void*) android_view_RenderNode_endAllAnimators }, 726f648108f83d4e74811919e9811efb8fcc184b8a3John Reck 727f648108f83d4e74811919e9811efb8fcc184b8a3John Reck { "nRequestPositionUpdates", "(JLandroid/view/SurfaceView;)V", (void*) android_view_RenderNode_requestPositionUpdates }, 728a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}; 729a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 730f666ad7046c0b1b255835f75aeb7d1391067df93John Reckint register_android_view_RenderNode(JNIEnv* env) { 731f648108f83d4e74811919e9811efb8fcc184b8a3John Reck jclass clazz = FindClassOrDie(env, "android/view/SurfaceView"); 732f648108f83d4e74811919e9811efb8fcc184b8a3John Reck gSurfaceViewPositionUpdateMethod = GetMethodIDOrDie(env, clazz, 733f648108f83d4e74811919e9811efb8fcc184b8a3John Reck "updateWindowPositionRT", "(JIIII)V"); 73434bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck gSurfaceViewPositionLostMethod = GetMethodIDOrDie(env, clazz, 73534bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck "windowPositionLostRT", "(J)V"); 73644b49f070aafe8ad44efae87341121cce49ff11cJohn Reck clazz = FindClassOrDie(env, "android/view/RenderNode"); 73744b49f070aafe8ad44efae87341121cce49ff11cJohn Reck gOnRenderNodeDetached = GetMethodIDOrDie(env, clazz, 73844b49f070aafe8ad44efae87341121cce49ff11cJohn Reck "onRenderNodeDetached", "()V"); 739987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods)); 740a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 741a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 742a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}; 743a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 744