• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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<AnimationJS>, 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 };
113 #endif
114