• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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