1 /*
2 * Copyright (c) 2021 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 #include "command/rs_animation_command.h"
17
18 namespace OHOS {
19 namespace Rosen {
20
21 namespace {
22 static AnimationCommandHelper::FinishCallbackProcessor finishCallbackProcessor = nullptr;
23 }
24
AnimationFinishCallback(RSContext & context,NodeId targetId,AnimationId animId)25 void AnimationCommandHelper::AnimationFinishCallback(RSContext& context, NodeId targetId, AnimationId animId)
26 {
27 if (finishCallbackProcessor != nullptr) {
28 finishCallbackProcessor(targetId, animId);
29 }
30 }
31
SetFinishCallbackProcessor(FinishCallbackProcessor processor)32 void AnimationCommandHelper::SetFinishCallbackProcessor(FinishCallbackProcessor processor)
33 {
34 finishCallbackProcessor = processor;
35 }
36
CreateAnimation(RSContext & context,NodeId targetId,const std::shared_ptr<RSRenderAnimation> & animation)37 void AnimationCommandHelper::CreateAnimation(
38 RSContext& context, NodeId targetId, const std::shared_ptr<RSRenderAnimation>& animation)
39 {
40 auto node = context.GetNodeMap().GetRenderNode<RSRenderNode>(targetId);
41 if (node == nullptr) {
42 return;
43 }
44 node->GetAnimationManager().AddAnimation(animation);
45 auto modifier = node->GetModifier(animation->GetPropertyId());
46 if (modifier != nullptr) {
47 animation->AttachRenderProperty(modifier->GetProperty());
48 }
49 auto beginTime = context.GetTransactionTimestamp();
50 auto currentTime = context.GetCurrentTimestamp();
51 if (beginTime != 0 && (currentTime - beginTime) > static_cast<unsigned long>(animation->GetDuration() * MS_TO_NS)) {
52 // If the animation is already finished before the transaction is executed, we should directly start then finish
53 // it.
54 animation->SetStartTime(beginTime);
55 animation->Attach(node.get());
56 animation->Animate(currentTime);
57 } else {
58 // else, we should set the start time to the current time.
59 animation->SetStartTime(currentTime);
60 animation->Attach(node.get());
61 }
62 // register node as animating node
63 context.RegisterAnimatingRenderNode(node);
64 }
65 } // namespace Rosen
66 } // namespace OHOS
67