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 16 #ifndef OHOS_RENDER_3D_ANIMATION_JS_H 17 #define OHOS_RENDER_3D_ANIMATION_JS_H 18 19 #include "BaseObjectJS.h" 20 #include "SceneResourceImpl.h" 21 22 class ThreadSafeCallback { 23 public: 24 // can be called from any thread. Release()25 void Release() 26 { 27 napi_status status; 28 if (termfun) { 29 status = 30 napi_release_threadsafe_function(termfun, napi_threadsafe_function_release_mode::napi_tsfn_release); 31 termfun = nullptr; 32 } 33 } Trigger()34 void Trigger() 35 { 36 napi_status status; 37 if (termfun) { 38 status = 39 napi_call_threadsafe_function(termfun, nullptr, napi_threadsafe_function_call_mode::napi_tsfn_blocking); 40 } 41 } 42 43 protected: 44 virtual void Finalize(napi_env) = 0; 45 virtual void Invoked(napi_env) = 0; ThreadSafeCallback(napi_env env,const char * n)46 ThreadSafeCallback(napi_env env, const char* n) 47 { 48 napi_status status; 49 napi_value name; 50 napi_create_string_latin1(env, n, NAPI_AUTO_LENGTH, &name); 51 status = napi_create_threadsafe_function(env, nullptr, nullptr, name, 1, 1, this, &ThreadSafeCallback::Final, 52 this, &ThreadSafeCallback::Call, &termfun); 53 } Call(napi_env env,napi_value js_callback,void * context,void * inData)54 static void Call(napi_env env, napi_value js_callback, void* context, void* inData) 55 { 56 ThreadSafeCallback* data = (ThreadSafeCallback*)context; 57 data->Invoked(env); 58 } Final(napi_env env,void * finalize_data,void * finalize_hint)59 static void Final(napi_env env, void* finalize_data, void* finalize_hint) 60 { 61 ThreadSafeCallback* data = (ThreadSafeCallback*)finalize_data; 62 data->Finalize(env); 63 delete data; 64 }; ~ThreadSafeCallback()65 virtual ~ThreadSafeCallback() 66 { 67 // Called by final on JS thread. 68 Release(); 69 } 70 napi_threadsafe_function termfun { nullptr }; 71 }; 72 73 class AnimationJS : public BaseObject<AnimationJS>, public SceneResourceImpl { 74 public: 75 static constexpr uint32_t ID = 70; 76 static void Init(napi_env env, napi_value exports); 77 AnimationJS(napi_env, napi_callback_info); 78 ~AnimationJS() override; 79 virtual void* GetInstanceImpl(uint32_t id) override; 80 81 private: 82 napi_value GetEnabled(NapiApi::FunctionContext<>& ctx); 83 void SetEnabled(NapiApi::FunctionContext<bool>& ctx); 84 napi_value GetDuration(NapiApi::FunctionContext<>& ctx); 85 napi_value GetRunning(NapiApi::FunctionContext<>& ctx); 86 napi_value GetProgress(NapiApi::FunctionContext<>& ctx); 87 88 napi_value OnFinished(NapiApi::FunctionContext<NapiApi::Function>& ctx); 89 napi_value OnStarted(NapiApi::FunctionContext<NapiApi::Function>& ctx); 90 91 napi_value Pause(NapiApi::FunctionContext<>& ctx); 92 napi_value Restart(NapiApi::FunctionContext<>& ctx); 93 napi_value Seek(NapiApi::FunctionContext<float>& ctx); 94 95 napi_value Start(NapiApi::FunctionContext<>& ctx); 96 napi_value Stop(NapiApi::FunctionContext<>& ctx); 97 napi_value Finish(NapiApi::FunctionContext<>& ctx); 98 99 void DisposeNative() override; 100 void Finalize(napi_env env) override; 101 102 META_NS::IEvent::Token OnFinishedToken_ { 0 }; 103 META_NS::IEvent::Token OnStartedToken_ { 0 }; 104 105 // we don't actually own these two, as lifetime is controlled by napi_threadsafe_function 106 ThreadSafeCallback* OnStartedCB_ { nullptr }; 107 ThreadSafeCallback* OnFinishedCB_ { nullptr }; 108 NapiApi::WeakRef scene_; 109 }; 110 #endif // OHOS_RENDER_3D_ANIMATION_JS_H 111