1 /* 2 * Copyright (C) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #ifndef ANIMATION_JS_H 16 #define ANIMATION_JS_H 17 18 #include <meta/interface/animation/modifiers/intf_speed.h> 19 20 #include "BaseObjectJS.h" 21 #include "SceneResourceImpl.h" 22 23 class ThreadSafeCallback { 24 public: 25 // can be called from any thread. Release()26 void Release() 27 { 28 napi_status status; 29 if (termfun) { 30 status = 31 napi_release_threadsafe_function(termfun, napi_threadsafe_function_release_mode::napi_tsfn_release); 32 termfun = nullptr; 33 } 34 } Trigger()35 void Trigger() 36 { 37 napi_status status; 38 if (termfun) { 39 status = 40 napi_call_threadsafe_function(termfun, nullptr, napi_threadsafe_function_call_mode::napi_tsfn_blocking); 41 } 42 } 43 44 protected: 45 virtual void Finalize(napi_env) = 0; 46 virtual void Invoked(napi_env) = 0; ThreadSafeCallback(napi_env env,const char * n)47 ThreadSafeCallback(napi_env env, const char* n) 48 { 49 napi_status status; 50 napi_value name; 51 napi_create_string_latin1(env, n, NAPI_AUTO_LENGTH, &name); 52 status = napi_create_threadsafe_function(env, nullptr, nullptr, name, 0, 1, this, &ThreadSafeCallback::Final, 53 this, &ThreadSafeCallback::Call, &termfun); 54 } Call(napi_env env,napi_value js_callback,void * context,void * inData)55 static void Call(napi_env env, napi_value js_callback, void* context, void* inData) 56 { 57 ThreadSafeCallback* data = (ThreadSafeCallback*)context; 58 data->Invoked(env); 59 } Final(napi_env env,void * finalize_data,void * finalize_hint)60 static void Final(napi_env env, void* finalize_data, void* finalize_hint) 61 { 62 ThreadSafeCallback* data = (ThreadSafeCallback*)finalize_data; 63 data->Finalize(env); 64 delete data; 65 }; ~ThreadSafeCallback()66 virtual ~ThreadSafeCallback() 67 { 68 // Called by final on JS thread. 69 Release(); 70 } 71 napi_threadsafe_function termfun { nullptr }; 72 }; 73 74 class AnimationJS : public BaseObject, public SceneResourceImpl { 75 public: 76 static constexpr uint32_t ID = 70; 77 static void Init(napi_env env, napi_value exports); 78 AnimationJS(napi_env, napi_callback_info); 79 ~AnimationJS() override; 80 virtual void* GetInstanceImpl(uint32_t id) override; 81 82 private: 83 napi_value GetSpeed(NapiApi::FunctionContext<>& ctx); 84 void SetSpeed(NapiApi::FunctionContext<float>& ctx); 85 napi_value GetEnabled(NapiApi::FunctionContext<>& ctx); 86 void SetEnabled(NapiApi::FunctionContext<bool>& ctx); 87 napi_value GetDuration(NapiApi::FunctionContext<>& ctx); 88 napi_value GetRunning(NapiApi::FunctionContext<>& ctx); 89 napi_value GetProgress(NapiApi::FunctionContext<>& ctx); 90 91 napi_value OnFinished(NapiApi::FunctionContext<NapiApi::Function>& ctx); 92 napi_value OnStarted(NapiApi::FunctionContext<NapiApi::Function>& ctx); 93 94 napi_value Pause(NapiApi::FunctionContext<>& ctx); 95 napi_value Restart(NapiApi::FunctionContext<>& ctx); 96 napi_value Seek(NapiApi::FunctionContext<float>& ctx); 97 98 napi_value Start(NapiApi::FunctionContext<>& ctx); 99 napi_value Stop(NapiApi::FunctionContext<>& ctx); 100 napi_value Finish(NapiApi::FunctionContext<>& ctx); 101 102 void DisposeNative(void*) override; 103 void Finalize(napi_env env) override; 104 105 META_NS::IEvent::Token OnFinishedToken_ { 0 }; 106 META_NS::IEvent::Token OnStartedToken_ { 0 }; 107 108 // we don't actually own these two, as lifetime is controlled by napi_threadsafe_function 109 ThreadSafeCallback* OnStartedCB_ { nullptr }; 110 ThreadSafeCallback* OnFinishedCB_ { nullptr }; 111 META_NS::AnimationModifiers::ISpeed::Ptr speedModifier_; 112 #define USE_ANIMATION_STATE_COMPONENT_ON_COMPLETED 0 113 #if defined(USE_ANIMATION_STATE_COMPONENT_ON_COMPLETED) && (USE_ANIMATION_STATE_COMPONENT_ON_COMPLETED==1) 114 META_NS::IProperty::Ptr completed_; 115 #endif 116 META_NS::Event<META_NS::IEvent> OnCompletedEvent_; 117 }; 118 #endif 119