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;
537aa6e84f21ddf89ea649a3f00044bc23adfe86978John 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
5767b570deea65bc7ac417a26ce3e4103bcef30e957John Reck            incStrong(0);
57738f6c034d153bb648d45bce09d80a69ba3e03360John Reck            auto functor = std::bind(
5787b570deea65bc7ac417a26ce3e4103bcef30e957John Reck                std::mem_fn(&SurfaceViewPositionUpdater::doUpdatePositionAsync), this,
57928912a508493e583c48772e2a234e0ed66849490John Reck                (jlong) info.canvasContext.getFrameNumber(),
58028912a508493e583c48772e2a234e0ed66849490John Reck                (jint) bounds.left, (jint) bounds.top,
58138f6c034d153bb648d45bce09d80a69ba3e03360John Reck                (jint) bounds.right, (jint) bounds.bottom);
58238f6c034d153bb648d45bce09d80a69ba3e03360John Reck
58338f6c034d153bb648d45bce09d80a69ba3e03360John Reck            info.canvasContext.enqueueFrameWork(std::move(functor));
584f648108f83d4e74811919e9811efb8fcc184b8a3John Reck        }
585f648108f83d4e74811919e9811efb8fcc184b8a3John Reck
586aa6e84f21ddf89ea649a3f00044bc23adfe86978John Reck        virtual void onPositionLost(RenderNode& node, const TreeInfo* info) override {
587aa6e84f21ddf89ea649a3f00044bc23adfe86978John Reck            if (CC_UNLIKELY(!mWeakRef || (info && !info->updateWindowPositions))) return;
588aa6e84f21ddf89ea649a3f00044bc23adfe86978John Reck
5897b570deea65bc7ac417a26ce3e4103bcef30e957John Reck            ATRACE_NAME("SurfaceView position lost");
5907b570deea65bc7ac417a26ce3e4103bcef30e957John Reck            JNIEnv* env = jnienv();
5917b570deea65bc7ac417a26ce3e4103bcef30e957John Reck            jobject localref = env->NewLocalRef(mWeakRef);
5927b570deea65bc7ac417a26ce3e4103bcef30e957John Reck            if (CC_UNLIKELY(!localref)) {
5937b570deea65bc7ac417a26ce3e4103bcef30e957John Reck                jnienv()->DeleteWeakGlobalRef(mWeakRef);
5947b570deea65bc7ac417a26ce3e4103bcef30e957John Reck                mWeakRef = nullptr;
5957b570deea65bc7ac417a26ce3e4103bcef30e957John Reck                return;
596aa6e84f21ddf89ea649a3f00044bc23adfe86978John Reck            }
5977b570deea65bc7ac417a26ce3e4103bcef30e957John Reck
5987b570deea65bc7ac417a26ce3e4103bcef30e957John Reck            env->CallVoidMethod(localref, gSurfaceViewPositionLostMethod,
5997b570deea65bc7ac417a26ce3e4103bcef30e957John Reck                    info ? info->canvasContext.getFrameNumber() : 0);
6007b570deea65bc7ac417a26ce3e4103bcef30e957John Reck            env->DeleteLocalRef(localref);
601aa6e84f21ddf89ea649a3f00044bc23adfe86978John Reck        }
602aa6e84f21ddf89ea649a3f00044bc23adfe86978John Reck
603f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    private:
604f648108f83d4e74811919e9811efb8fcc184b8a3John Reck        JNIEnv* jnienv() {
605f648108f83d4e74811919e9811efb8fcc184b8a3John Reck            JNIEnv* env;
606f648108f83d4e74811919e9811efb8fcc184b8a3John Reck            if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
607f648108f83d4e74811919e9811efb8fcc184b8a3John Reck                LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", mVm);
608f648108f83d4e74811919e9811efb8fcc184b8a3John Reck            }
609f648108f83d4e74811919e9811efb8fcc184b8a3John Reck            return env;
610f648108f83d4e74811919e9811efb8fcc184b8a3John Reck        }
611f648108f83d4e74811919e9811efb8fcc184b8a3John Reck
6127b570deea65bc7ac417a26ce3e4103bcef30e957John Reck        void doUpdatePositionAsync(jlong frameNumber, jint left, jint top,
61338f6c034d153bb648d45bce09d80a69ba3e03360John Reck                jint right, jint bottom) {
61438f6c034d153bb648d45bce09d80a69ba3e03360John Reck            ATRACE_NAME("Update SurfaceView position");
61538f6c034d153bb648d45bce09d80a69ba3e03360John Reck
61638f6c034d153bb648d45bce09d80a69ba3e03360John Reck            JNIEnv* env = jnienv();
61738f6c034d153bb648d45bce09d80a69ba3e03360John Reck            jobject localref = env->NewLocalRef(mWeakRef);
61838f6c034d153bb648d45bce09d80a69ba3e03360John Reck            if (CC_UNLIKELY(!localref)) {
6197b570deea65bc7ac417a26ce3e4103bcef30e957John Reck                env->DeleteWeakGlobalRef(mWeakRef);
620aa6e84f21ddf89ea649a3f00044bc23adfe86978John Reck                mWeakRef = nullptr;
6217b570deea65bc7ac417a26ce3e4103bcef30e957John Reck            } else {
6227b570deea65bc7ac417a26ce3e4103bcef30e957John Reck                env->CallVoidMethod(localref, gSurfaceViewPositionUpdateMethod,
6237b570deea65bc7ac417a26ce3e4103bcef30e957John Reck                        frameNumber, left, top, right, bottom);
6247b570deea65bc7ac417a26ce3e4103bcef30e957John Reck                env->DeleteLocalRef(localref);
625aa6e84f21ddf89ea649a3f00044bc23adfe86978John Reck            }
626aa6e84f21ddf89ea649a3f00044bc23adfe86978John Reck
6277b570deea65bc7ac417a26ce3e4103bcef30e957John Reck            // We need to release ourselves here
6287b570deea65bc7ac417a26ce3e4103bcef30e957John Reck            decStrong(0);
629aa6e84f21ddf89ea649a3f00044bc23adfe86978John Reck        }
630aa6e84f21ddf89ea649a3f00044bc23adfe86978John Reck
631f648108f83d4e74811919e9811efb8fcc184b8a3John Reck        JavaVM* mVm;
632f648108f83d4e74811919e9811efb8fcc184b8a3John Reck        jobject mWeakRef;
633f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    };
634f648108f83d4e74811919e9811efb8fcc184b8a3John Reck
635f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
636f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    renderNode->setPositionListener(new SurfaceViewPositionUpdater(env, surfaceview));
637f648108f83d4e74811919e9811efb8fcc184b8a3John Reck}
638f648108f83d4e74811919e9811efb8fcc184b8a3John Reck
639f648108f83d4e74811919e9811efb8fcc184b8a3John Reck// ----------------------------------------------------------------------------
640a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// JNI Glue
641a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// ----------------------------------------------------------------------------
642a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
643f666ad7046c0b1b255835f75aeb7d1391067df93John Reckconst char* const kClassPathName = "android/view/RenderNode";
644a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
64576f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = {
646003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    { "nCreate",               "(Ljava/lang/String;)J", (void*) android_view_RenderNode_create },
647003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    { "nDestroyRenderNode",    "(J)V",    (void*) android_view_RenderNode_destroyRenderNode },
648003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    { "nSetDisplayList",       "(JJ)V",   (void*) android_view_RenderNode_setDisplayList },
649003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    { "nOutput",               "(J)V",    (void*) android_view_RenderNode_output },
650003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    { "nGetDebugSize",         "(J)I",    (void*) android_view_RenderNode_getDebugSize },
651f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
6524136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetLayerType",         "!(JI)Z",  (void*) android_view_RenderNode_setLayerType },
6534136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetLayerPaint",        "!(JJ)Z",  (void*) android_view_RenderNode_setLayerPaint },
6544136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetStaticMatrix",      "!(JJ)Z",  (void*) android_view_RenderNode_setStaticMatrix },
6554136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetAnimationMatrix",   "!(JJ)Z",  (void*) android_view_RenderNode_setAnimationMatrix },
6564136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetClipToBounds",      "!(JZ)Z",  (void*) android_view_RenderNode_setClipToBounds },
6574136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetClipBounds",        "!(JIIII)Z", (void*) android_view_RenderNode_setClipBounds },
6584136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetClipBoundsEmpty",   "!(J)Z",   (void*) android_view_RenderNode_setClipBoundsEmpty },
6594136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetProjectBackwards",  "!(JZ)Z",  (void*) android_view_RenderNode_setProjectBackwards },
6604136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetProjectionReceiver","!(JZ)Z",  (void*) android_view_RenderNode_setProjectionReceiver },
66179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck
66240de9f28f48f80674ae64b7f165b56281e8b9038Chris Craik    { "nSetOutlineRoundRect",  "!(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect },
66340de9f28f48f80674ae64b7f165b56281e8b9038Chris Craik    { "nSetOutlineConvexPath", "!(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath },
66440de9f28f48f80674ae64b7f165b56281e8b9038Chris Craik    { "nSetOutlineEmpty",      "!(J)Z",   (void*) android_view_RenderNode_setOutlineEmpty },
66540de9f28f48f80674ae64b7f165b56281e8b9038Chris Craik    { "nSetOutlineNone",       "!(J)Z",   (void*) android_view_RenderNode_setOutlineNone },
6664136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nHasShadow",            "!(J)Z",   (void*) android_view_RenderNode_hasShadow },
6674136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetClipToOutline",     "!(JZ)Z",  (void*) android_view_RenderNode_setClipToOutline },
66840de9f28f48f80674ae64b7f165b56281e8b9038Chris Craik    { "nSetRevealClip",        "!(JZFFF)Z", (void*) android_view_RenderNode_setRevealClip },
66979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck
6704136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetAlpha",             "!(JF)Z",  (void*) android_view_RenderNode_setAlpha },
6714136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetHasOverlappingRendering", "!(JZ)Z",
672f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            (void*) android_view_RenderNode_setHasOverlappingRendering },
6734136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetElevation",         "!(JF)Z",  (void*) android_view_RenderNode_setElevation },
6744136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetTranslationX",      "!(JF)Z",  (void*) android_view_RenderNode_setTranslationX },
6754136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetTranslationY",      "!(JF)Z",  (void*) android_view_RenderNode_setTranslationY },
6764136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetTranslationZ",      "!(JF)Z",  (void*) android_view_RenderNode_setTranslationZ },
6774136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetRotation",          "!(JF)Z",  (void*) android_view_RenderNode_setRotation },
6784136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetRotationX",         "!(JF)Z",  (void*) android_view_RenderNode_setRotationX },
6794136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetRotationY",         "!(JF)Z",  (void*) android_view_RenderNode_setRotationY },
6804136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetScaleX",            "!(JF)Z",  (void*) android_view_RenderNode_setScaleX },
6814136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetScaleY",            "!(JF)Z",  (void*) android_view_RenderNode_setScaleY },
6824136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetPivotX",            "!(JF)Z",  (void*) android_view_RenderNode_setPivotX },
6834136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetPivotY",            "!(JF)Z",  (void*) android_view_RenderNode_setPivotY },
6844136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetCameraDistance",    "!(JF)Z",  (void*) android_view_RenderNode_setCameraDistance },
6854136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetLeft",              "!(JI)Z",  (void*) android_view_RenderNode_setLeft },
6864136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetTop",               "!(JI)Z",  (void*) android_view_RenderNode_setTop },
6874136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetRight",             "!(JI)Z",  (void*) android_view_RenderNode_setRight },
6884136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetBottom",            "!(JI)Z",  (void*) android_view_RenderNode_setBottom },
6894136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nSetLeftTopRightBottom","!(JIIII)Z", (void*) android_view_RenderNode_setLeftTopRightBottom },
6904136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nOffsetLeftAndRight",   "!(JI)Z",  (void*) android_view_RenderNode_offsetLeftAndRight },
6914136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nOffsetTopAndBottom",   "!(JI)Z",  (void*) android_view_RenderNode_offsetTopAndBottom },
6924136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik
6934136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nHasOverlappingRendering", "!(J)Z",  (void*) android_view_RenderNode_hasOverlappingRendering },
6944136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetClipToOutline",        "!(J)Z",  (void*) android_view_RenderNode_getClipToOutline },
6954136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetAlpha",                "!(J)F",  (void*) android_view_RenderNode_getAlpha },
6964136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetCameraDistance",       "!(J)F",  (void*) android_view_RenderNode_getCameraDistance },
6974136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetScaleX",               "!(J)F",  (void*) android_view_RenderNode_getScaleX },
6984136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetScaleY",               "!(J)F",  (void*) android_view_RenderNode_getScaleY },
6994136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetElevation",            "!(J)F",  (void*) android_view_RenderNode_getElevation },
7004136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetTranslationX",         "!(J)F",  (void*) android_view_RenderNode_getTranslationX },
7014136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetTranslationY",         "!(J)F",  (void*) android_view_RenderNode_getTranslationY },
7024136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetTranslationZ",         "!(J)F",  (void*) android_view_RenderNode_getTranslationZ },
7034136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetRotation",             "!(J)F",  (void*) android_view_RenderNode_getRotation },
7044136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetRotationX",            "!(J)F",  (void*) android_view_RenderNode_getRotationX },
7054136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetRotationY",            "!(J)F",  (void*) android_view_RenderNode_getRotationY },
7064136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nIsPivotExplicitlySet",    "!(J)Z",  (void*) android_view_RenderNode_isPivotExplicitlySet },
7074136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nHasIdentityMatrix",       "!(J)Z",  (void*) android_view_RenderNode_hasIdentityMatrix },
7084136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik
7094136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetTransformMatrix",       "!(JJ)V", (void*) android_view_RenderNode_getTransformMatrix },
7104136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetInverseTransformMatrix","!(JJ)V", (void*) android_view_RenderNode_getInverseTransformMatrix },
7114136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik
7124136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetPivotX",                "!(J)F",  (void*) android_view_RenderNode_getPivotX },
7134136a0aeac9bb95aa615d4fc1f12378829d26c80Chris Craik    { "nGetPivotY",                "!(J)F",  (void*) android_view_RenderNode_getPivotY },
714e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
715e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    { "nAddAnimator",              "(JJ)V", (void*) android_view_RenderNode_addAnimator },
716119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    { "nEndAllAnimators",          "(J)V", (void*) android_view_RenderNode_endAllAnimators },
717f648108f83d4e74811919e9811efb8fcc184b8a3John Reck
718f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    { "nRequestPositionUpdates",   "(JLandroid/view/SurfaceView;)V", (void*) android_view_RenderNode_requestPositionUpdates },
719a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase};
720a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
721f666ad7046c0b1b255835f75aeb7d1391067df93John Reckint register_android_view_RenderNode(JNIEnv* env) {
722f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    jclass clazz = FindClassOrDie(env, "android/view/SurfaceView");
723f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    gSurfaceViewPositionUpdateMethod = GetMethodIDOrDie(env, clazz,
7243387913237b1f73a775d10e83e1feb8a9b5d1831Robert Carr            "updateWindowPosition_renderWorker", "(JIIII)V");
725aa6e84f21ddf89ea649a3f00044bc23adfe86978John Reck    gSurfaceViewPositionLostMethod = GetMethodIDOrDie(env, clazz,
7263387913237b1f73a775d10e83e1feb8a9b5d1831Robert Carr            "windowPositionLost_uiRtSync", "(J)V");
72744b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    clazz = FindClassOrDie(env, "android/view/RenderNode");
72844b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    gOnRenderNodeDetached = GetMethodIDOrDie(env, clazz,
72944b49f070aafe8ad44efae87341121cce49ff11cJohn Reck            "onRenderNodeDetached", "()V");
730987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
731a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
732a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
733a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase};
734a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
735