1 /*
2  * Copyright (c) 2021-2023 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 "ui/rs_node.h"
17 
18 #include <algorithm>
19 #include <memory>
20 #include <sstream>
21 #include <string>
22 
23 #include "rs_trace.h"
24 #include "sandbox_utils.h"
25 
26 #include "animation/rs_animation.h"
27 #include "animation/rs_animation_group.h"
28 #include "animation/rs_animation_callback.h"
29 #include "animation/rs_implicit_animator.h"
30 #include "animation/rs_implicit_animator_map.h"
31 #include "animation/rs_render_particle_animation.h"
32 #include "command/rs_base_node_command.h"
33 #include "command/rs_node_command.h"
34 #include "common/rs_color.h"
35 #include "common/rs_common_def.h"
36 #include "common/rs_obj_abs_geometry.h"
37 #include "common/rs_vector4.h"
38 #include "modifier/rs_modifier.h"
39 #include "modifier/rs_property.h"
40 #include "modifier/rs_property_modifier.h"
41 #include "pipeline/rs_node_map.h"
42 #include "platform/common/rs_log.h"
43 #include "render/rs_filter.h"
44 #include "render/rs_material_filter.h"
45 #include "render/rs_blur_filter.h"
46 #include "render/rs_path.h"
47 #include "transaction/rs_transaction_proxy.h"
48 #include "ui/rs_canvas_drawing_node.h"
49 #include "ui/rs_canvas_node.h"
50 #include "ui/rs_display_node.h"
51 #include "ui/rs_frame_rate_policy.h"
52 #include "ui/rs_proxy_node.h"
53 #include "ui/rs_root_node.h"
54 #include "ui/rs_surface_node.h"
55 
56 #ifdef _WIN32
57 #include <windows.h>
58 #define gettid GetCurrentThreadId
59 #endif
60 
61 #ifdef __APPLE__
62 #define gettid getpid
63 #endif
64 
65 #ifdef __gnu_linux__
66 #include <sys/types.h>
67 #include <sys/syscall.h>
68 #define gettid []() -> int32_t { return static_cast<int32_t>(syscall(SYS_gettid)); }
69 #endif
70 
71 namespace OHOS {
72 namespace Rosen {
73 namespace {
74 static bool g_isUniRenderEnabled = false;
75 static const std::unordered_map<RSUINodeType, std::string> RSUINodeTypeStrs = {
76     {RSUINodeType::UNKNOW,              "UNKNOW"},
77     {RSUINodeType::DISPLAY_NODE,        "DisplayNode"},
78     {RSUINodeType::RS_NODE,             "RsNode"},
79     {RSUINodeType::SURFACE_NODE,        "SurfaceNode"},
80     {RSUINodeType::PROXY_NODE,          "ProxyNode"},
81     {RSUINodeType::CANVAS_NODE,         "CanvasNode"},
82     {RSUINodeType::ROOT_NODE,           "RootNode"},
83     {RSUINodeType::EFFECT_NODE,         "EffectNode"},
84     {RSUINodeType::CANVAS_DRAWING_NODE, "CanvasDrawingNode"},
85 };
86 std::once_flag flag_;
IsPathAnimatableModifier(const RSModifierType & type)87 bool IsPathAnimatableModifier(const RSModifierType& type)
88 {
89     if (type == RSModifierType::BOUNDS || type == RSModifierType::FRAME || type == RSModifierType::TRANSLATE) {
90         return true;
91     }
92     return false;
93 }
94 }
95 
RSNode(bool isRenderServiceNode,NodeId id,bool isTextureExportNode)96 RSNode::RSNode(bool isRenderServiceNode, NodeId id, bool isTextureExportNode)
97     : isRenderServiceNode_(isRenderServiceNode), isTextureExportNode_(isTextureExportNode),
98     id_(id), stagingPropertiesExtractor_(id), showingPropertiesFreezer_(id)
99 {
100     InitUniRenderEnabled();
101     if (g_isUniRenderEnabled && isTextureExportNode) {
102         std::call_once(flag_, []() {
103             auto renderThreadClient = RSIRenderClient::CreateRenderThreadClient();
104             auto transactionProxy = RSTransactionProxy::GetInstance();
105             if (transactionProxy != nullptr) {
106                 transactionProxy->SetRenderThreadClient(renderThreadClient);
107             }
108         });
109     }
110     hasCreateRenderNodeInRT_ = isTextureExportNode;
111     hasCreateRenderNodeInRS_ = !hasCreateRenderNodeInRT_;
112     UpdateImplicitAnimator();
113 }
114 
RSNode(bool isRenderServiceNode,bool isTextureExportNode)115 RSNode::RSNode(bool isRenderServiceNode, bool isTextureExportNode)
116     : RSNode(isRenderServiceNode, GenerateId(), isTextureExportNode) {}
117 
~RSNode()118 RSNode::~RSNode()
119 {
120     FallbackAnimationsToRoot();
121     ClearAllModifiers();
122 
123     // break current (ui) parent-child relationship.
124     // render nodes will check if its child is expired and remove it, no need to manually remove it here.
125     if (auto parentPtr = RSNodeMap::Instance().GetNode(parent_)) {
126         parentPtr->RemoveChildById(id_);
127     }
128     // unregister node from node map
129     RSNodeMap::MutableInstance().UnregisterNode(id_);
130 
131     // tell RT/RS to destroy related render node
132     auto transactionProxy = RSTransactionProxy::GetInstance();
133     if (transactionProxy == nullptr || skipDestroyCommandInDestructor_) {
134         return;
135     }
136     std::unique_ptr<RSCommand> command = std::make_unique<RSBaseNodeDestroy>(id_);
137     transactionProxy->AddCommand(command, IsRenderServiceNode());
138     if ((IsRenderServiceNode() && hasCreateRenderNodeInRT_) ||
139         (!IsRenderServiceNode() && hasCreateRenderNodeInRS_)) {
140         command = std::make_unique<RSBaseNodeDestroy>(id_);
141         transactionProxy->AddCommand(command, !IsRenderServiceNode());
142     }
143 }
144 
OpenImplicitAnimation(const RSAnimationTimingProtocol & timingProtocol,const RSAnimationTimingCurve & timingCurve,const std::function<void ()> & finishCallback)145 void RSNode::OpenImplicitAnimation(const RSAnimationTimingProtocol& timingProtocol,
146     const RSAnimationTimingCurve& timingCurve, const std::function<void()>& finishCallback)
147 {
148     auto implicitAnimator = RSImplicitAnimatorMap::Instance().GetAnimator(gettid());
149     if (implicitAnimator == nullptr) {
150         ROSEN_LOGE("Failed to open implicit animation, implicit animator is null!");
151         return;
152     }
153 
154     std::shared_ptr<AnimationFinishCallback> animationFinishCallback;
155     if (finishCallback != nullptr) {
156         animationFinishCallback =
157             std::make_shared<AnimationFinishCallback>(finishCallback, timingProtocol.GetFinishCallbackType());
158     }
159     implicitAnimator->OpenImplicitAnimation(timingProtocol, timingCurve, std::move(animationFinishCallback));
160 }
161 
CloseImplicitAnimation()162 std::vector<std::shared_ptr<RSAnimation>> RSNode::CloseImplicitAnimation()
163 {
164     auto implicitAnimator = RSImplicitAnimatorMap::Instance().GetAnimator(gettid());
165     if (implicitAnimator == nullptr) {
166         ROSEN_LOGE("Failed to close implicit animation, implicit animator is null!");
167         return {};
168     }
169 
170     return implicitAnimator->CloseImplicitAnimation();
171 }
172 
CloseImplicitCancelAnimation()173 bool RSNode::CloseImplicitCancelAnimation()
174 {
175     auto implicitAnimator = RSImplicitAnimatorMap::Instance().GetAnimator(gettid());
176     if (implicitAnimator == nullptr) {
177         ROSEN_LOGE("Failed to close implicit animation for cancel, implicit animator is null!");
178         return false;
179     }
180 
181     return implicitAnimator->CloseImplicitCancelAnimation();
182 }
183 
SetFrameNodeInfo(int32_t id,std::string tag)184 void RSNode::SetFrameNodeInfo(int32_t id, std::string tag)
185 {
186     frameNodeId_ = id;
187     frameNodeTag_ = tag;
188 }
189 
GetFrameNodeId()190 int32_t RSNode::GetFrameNodeId()
191 {
192     return frameNodeId_;
193 }
194 
GetFrameNodeTag()195 std::string RSNode::GetFrameNodeTag()
196 {
197     return frameNodeTag_;
198 }
199 
AddKeyFrame(float fraction,const RSAnimationTimingCurve & timingCurve,const PropertyCallback & propertyCallback)200 void RSNode::AddKeyFrame(
201     float fraction, const RSAnimationTimingCurve& timingCurve, const PropertyCallback& propertyCallback)
202 {
203     auto implicitAnimator = RSImplicitAnimatorMap::Instance().GetAnimator(gettid());
204     if (implicitAnimator == nullptr) {
205         ROSEN_LOGE("Failed to add keyframe, implicit animator is null!");
206         return;
207     }
208 
209     implicitAnimator->BeginImplicitKeyFrameAnimation(fraction, timingCurve);
210     propertyCallback();
211     implicitAnimator->EndImplicitKeyFrameAnimation();
212 }
213 
AddKeyFrame(float fraction,const PropertyCallback & propertyCallback)214 void RSNode::AddKeyFrame(float fraction, const PropertyCallback& propertyCallback)
215 {
216     auto implicitAnimator = RSImplicitAnimatorMap::Instance().GetAnimator(gettid());
217     if (implicitAnimator == nullptr) {
218         ROSEN_LOGE("Failed to add keyframe, implicit animator is null!");
219         return;
220     }
221 
222     implicitAnimator->BeginImplicitKeyFrameAnimation(fraction);
223     propertyCallback();
224     implicitAnimator->EndImplicitKeyFrameAnimation();
225 }
226 
AddDurationKeyFrame(int duration,const RSAnimationTimingCurve & timingCurve,const PropertyCallback & propertyCallback)227 void RSNode::AddDurationKeyFrame(
228     int duration, const RSAnimationTimingCurve& timingCurve, const PropertyCallback& propertyCallback)
229 {
230     auto implicitAnimator = RSImplicitAnimatorMap::Instance().GetAnimator(gettid());
231     if (implicitAnimator == nullptr) {
232         ROSEN_LOGE("Failed to add keyframe, implicit animator is null!");
233         return;
234     }
235 
236     implicitAnimator->BeginImplicitDurationKeyFrameAnimation(duration, timingCurve);
237     propertyCallback();
238     implicitAnimator->EndImplicitDurationKeyFrameAnimation();
239 }
240 
IsImplicitAnimationOpen()241 bool RSNode::IsImplicitAnimationOpen()
242 {
243     auto implicitAnimator = RSImplicitAnimatorMap::Instance().GetAnimator(gettid());
244     return implicitAnimator && implicitAnimator->NeedImplicitAnimation();
245 }
246 
Animate(const RSAnimationTimingProtocol & timingProtocol,const RSAnimationTimingCurve & timingCurve,const PropertyCallback & propertyCallback,const std::function<void ()> & finishCallback,const std::function<void ()> & repeatCallback)247 std::vector<std::shared_ptr<RSAnimation>> RSNode::Animate(const RSAnimationTimingProtocol& timingProtocol,
248     const RSAnimationTimingCurve& timingCurve, const PropertyCallback& propertyCallback,
249     const std::function<void()>& finishCallback, const std::function<void()>& repeatCallback)
250 {
251     if (propertyCallback == nullptr) {
252         ROSEN_LOGE("Failed to add curve animation, property callback is null!");
253         return {};
254     }
255 
256     auto implicitAnimator = RSImplicitAnimatorMap::Instance().GetAnimator(gettid());
257     if (implicitAnimator == nullptr) {
258         ROSEN_LOGE("Failed to open implicit animation, implicit animator is null!");
259         return {};
260     }
261     std::shared_ptr<AnimationFinishCallback> animationFinishCallback;
262     if (finishCallback != nullptr) {
263         animationFinishCallback =
264             std::make_shared<AnimationFinishCallback>(finishCallback, timingProtocol.GetFinishCallbackType());
265     }
266     std::shared_ptr<AnimationRepeatCallback> animationRepeatCallback;
267     if (repeatCallback != nullptr) {
268         animationRepeatCallback = std::make_shared<AnimationRepeatCallback>(repeatCallback);
269     }
270     implicitAnimator->OpenImplicitAnimation(
271         timingProtocol, timingCurve, std::move(animationFinishCallback), std::move(animationRepeatCallback));
272     propertyCallback();
273     return implicitAnimator->CloseImplicitAnimation();
274 }
275 
AnimateWithCurrentOptions(const PropertyCallback & propertyCallback,const std::function<void ()> & finishCallback,bool timingSensitive)276 std::vector<std::shared_ptr<RSAnimation>> RSNode::AnimateWithCurrentOptions(
277     const PropertyCallback& propertyCallback, const std::function<void()>& finishCallback, bool timingSensitive)
278 {
279     if (propertyCallback == nullptr) {
280         ROSEN_LOGE("Failed to add curve animation, property callback is null!");
281         return {};
282     }
283     if (finishCallback == nullptr) {
284         ROSEN_LOGE("Failed to add curve animation, finish callback is null!");
285         propertyCallback();
286         return {};
287     }
288 
289     auto implicitAnimator = RSImplicitAnimatorMap::Instance().GetAnimator(gettid());
290     if (implicitAnimator == nullptr) {
291         ROSEN_LOGE("Failed to open implicit animation, implicit animator is null!");
292         propertyCallback();
293         return {};
294     }
295     auto finishCallbackType =
296         timingSensitive ? FinishCallbackType::TIME_SENSITIVE : FinishCallbackType::TIME_INSENSITIVE;
297     // re-use the current options and replace the finish callback
298     auto animationFinishCallback = std::make_shared<AnimationFinishCallback>(finishCallback, finishCallbackType);
299     implicitAnimator->OpenImplicitAnimation(std::move(animationFinishCallback));
300     propertyCallback();
301     return implicitAnimator->CloseImplicitAnimation();
302 }
303 
AnimateWithCurrentCallback(const RSAnimationTimingProtocol & timingProtocol,const RSAnimationTimingCurve & timingCurve,const PropertyCallback & propertyCallback)304 std::vector<std::shared_ptr<RSAnimation>> RSNode::AnimateWithCurrentCallback(
305     const RSAnimationTimingProtocol& timingProtocol, const RSAnimationTimingCurve& timingCurve,
306     const PropertyCallback& propertyCallback)
307 {
308     if (propertyCallback == nullptr) {
309         ROSEN_LOGE("Failed to add curve animation, property callback is null!");
310         return {};
311     }
312 
313     auto implicitAnimator = RSImplicitAnimatorMap::Instance().GetAnimator(gettid());
314     if (implicitAnimator == nullptr) {
315         ROSEN_LOGE("Failed to open implicit animation, implicit animator is null!");
316         return {};
317     }
318     // re-use the current finish callback and replace the options
319     implicitAnimator->OpenImplicitAnimation(timingProtocol, timingCurve);
320     propertyCallback();
321     return implicitAnimator->CloseImplicitAnimation();
322 }
323 
ExecuteWithoutAnimation(const PropertyCallback & callback,std::shared_ptr<RSImplicitAnimator> implicitAnimator)324 void RSNode::ExecuteWithoutAnimation(
325     const PropertyCallback& callback, std::shared_ptr<RSImplicitAnimator> implicitAnimator)
326 {
327     if (callback == nullptr) {
328         ROSEN_LOGE("Failed to execute without animation, property callback is null!");
329         return;
330     }
331     if (implicitAnimator == nullptr) {
332         implicitAnimator = RSImplicitAnimatorMap::Instance().GetAnimator(gettid());
333     }
334     if (implicitAnimator == nullptr) {
335         callback();
336     } else {
337         implicitAnimator->ExecuteWithoutAnimation(callback);
338     }
339 }
340 
FallbackAnimationsToRoot()341 void RSNode::FallbackAnimationsToRoot()
342 {
343     auto target = RSNodeMap::Instance().GetAnimationFallbackNode();
344     if (target == nullptr) {
345         ROSEN_LOGE("Failed to move animation to root, root node is null!");
346         return;
347     }
348     std::unique_lock<std::recursive_mutex> lock(animationMutex_);
349     for (auto& [animationId, animation] : animations_) {
350         if (animation && animation->GetRepeatCount() == -1) {
351             continue;
352         }
353         RSNodeMap::MutableInstance().RegisterAnimationInstanceId(animationId, id_, instanceId_);
354         target->AddAnimationInner(std::move(animation));
355     }
356     animations_.clear();
357 }
358 
AddAnimationInner(const std::shared_ptr<RSAnimation> & animation)359 void RSNode::AddAnimationInner(const std::shared_ptr<RSAnimation>& animation)
360 {
361     std::unique_lock<std::recursive_mutex> lock(animationMutex_);
362     animations_.emplace(animation->GetId(), animation);
363     animatingPropertyNum_[animation->GetPropertyId()]++;
364 }
365 
RemoveAnimationInner(const std::shared_ptr<RSAnimation> & animation)366 void RSNode::RemoveAnimationInner(const std::shared_ptr<RSAnimation>& animation)
367 {
368     std::unique_lock<std::recursive_mutex> lock(animationMutex_);
369     if (auto it = animatingPropertyNum_.find(animation->GetPropertyId()); it != animatingPropertyNum_.end()) {
370         it->second--;
371         if (it->second == 0) {
372             animatingPropertyNum_.erase(it);
373             animation->SetPropertyOnAllAnimationFinish();
374         }
375     }
376     animations_.erase(animation->GetId());
377 }
378 
FinishAnimationByProperty(const PropertyId & id)379 void RSNode::FinishAnimationByProperty(const PropertyId& id)
380 {
381     std::unique_lock<std::recursive_mutex> lock(animationMutex_);
382     for (const auto& [animationId, animation] : animations_) {
383         if (animation->GetPropertyId() == id) {
384             animation->Finish();
385         }
386     }
387 }
388 
CancelAnimationByProperty(const PropertyId & id,const bool needForceSync)389 void RSNode::CancelAnimationByProperty(const PropertyId& id, const bool needForceSync)
390 {
391     std::vector<std::shared_ptr<RSAnimation>> toBeRemoved;
392     {
393         std::unique_lock<std::recursive_mutex> lock(animationMutex_);
394         animatingPropertyNum_.erase(id);
395         EraseIf(animations_, [id, &toBeRemoved](const auto& pair) {
396             if (pair.second && (pair.second->GetPropertyId() == id)) {
397                 toBeRemoved.emplace_back(pair.second);
398                 return true;
399             }
400             return false;
401         });
402     }
403     // Destroy the cancelled animations outside the lock, since destroying them may trigger OnFinish callbacks, and
404     // callbacks may add/remove other animations, doing this with the lock would cause a deadlock.
405     toBeRemoved.clear();
406 
407     if (needForceSync) {
408         // Avoid animation on current property not cancelled in RS
409         auto transactionProxy = RSTransactionProxy::GetInstance();
410         if (transactionProxy == nullptr) {
411             ROSEN_LOGE("RSNode::CancelAnimationByProperty, failed to get RSTransactionProxy!");
412             return;
413         }
414 
415         std::unique_ptr<RSCommand> command = std::make_unique<RSAnimationCancel>(id_, id);
416         transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), id_);
417         if (NeedForcedSendToRemote()) {
418             std::unique_ptr<RSCommand> commandForRemote = std::make_unique<RSAnimationCancel>(id_, id);
419             transactionProxy->AddCommand(commandForRemote, true, GetFollowType(), id_);
420         }
421     }
422 }
423 
GetStagingProperties() const424 const RSModifierExtractor& RSNode::GetStagingProperties() const
425 {
426     return stagingPropertiesExtractor_;
427 }
428 
GetShowingProperties() const429 const RSShowingPropertiesFreezer& RSNode::GetShowingProperties() const
430 {
431     return showingPropertiesFreezer_;
432 }
433 
AddAnimation(const std::shared_ptr<RSAnimation> & animation,bool isStartAnimation)434 void RSNode::AddAnimation(const std::shared_ptr<RSAnimation>& animation, bool isStartAnimation)
435 {
436     if (animation == nullptr) {
437         ROSEN_LOGE("Failed to add animation, animation is null!");
438         return;
439     }
440 
441     auto animationId = animation->GetId();
442     {
443         std::unique_lock<std::recursive_mutex> lock(animationMutex_);
444         if (animations_.find(animationId) != animations_.end()) {
445             ROSEN_LOGE("Failed to add animation, animation already exists!");
446             return;
447         }
448     }
449 
450     // Note: Animation cancellation logic is now handled by RSImplicitAnimator. The code below might cause Spring
451     // Animations with a zero duration to not inherit velocity correctly, an issue slated for future resolution.
452     // This code is retained to ensure backward compatibility with specific arkui component animations.
453     if (animation->GetDuration() <= 0 && id_ != 0) {
454         FinishAnimationByProperty(animation->GetPropertyId());
455     }
456 
457     AddAnimationInner(animation);
458 
459     animation->StartInner(shared_from_this());
460     if (!isStartAnimation) {
461         animation->Pause();
462     }
463 }
464 
RemoveAllAnimations()465 void RSNode::RemoveAllAnimations()
466 {
467     std::unique_lock<std::recursive_mutex> lock(animationMutex_);
468     for (const auto& [id, animation] : animations_) {
469         RemoveAnimation(animation);
470     }
471 }
472 
RemoveAnimation(const std::shared_ptr<RSAnimation> & animation)473 void RSNode::RemoveAnimation(const std::shared_ptr<RSAnimation>& animation)
474 {
475     if (animation == nullptr) {
476         ROSEN_LOGE("Failed to remove animation, animation is null!");
477         return;
478     }
479 
480     {
481         std::unique_lock<std::recursive_mutex> lock(animationMutex_);
482         if (animations_.find(animation->GetId()) == animations_.end()) {
483             ROSEN_LOGE("Failed to remove animation, animation not exists!");
484             return;
485         }
486     }
487     animation->Finish();
488 }
489 
SetMotionPathOption(const std::shared_ptr<RSMotionPathOption> & motionPathOption)490 void RSNode::SetMotionPathOption(const std::shared_ptr<RSMotionPathOption>& motionPathOption)
491 {
492     motionPathOption_ = motionPathOption;
493     UpdateModifierMotionPathOption();
494 }
495 
SetMagnifierParams(const std::shared_ptr<RSMagnifierParams> & para)496 void RSNode::SetMagnifierParams(const std::shared_ptr<RSMagnifierParams>& para)
497 {
498     SetProperty<RSMagnifierParamsModifier, RSProperty<std::shared_ptr<RSMagnifierParams>>>(
499         RSModifierType::MAGNIFIER_PARA, para);
500 }
501 
GetMotionPathOption() const502 const std::shared_ptr<RSMotionPathOption> RSNode::GetMotionPathOption() const
503 {
504     return motionPathOption_;
505 }
506 
HasPropertyAnimation(const PropertyId & id)507 bool RSNode::HasPropertyAnimation(const PropertyId& id)
508 {
509     std::unique_lock<std::recursive_mutex> lock(animationMutex_);
510     auto it = animatingPropertyNum_.find(id);
511     return it != animatingPropertyNum_.end() && it->second > 0;
512 }
513 
GetAnimationByPropertyId(const PropertyId & id)514 std::vector<AnimationId> RSNode::GetAnimationByPropertyId(const PropertyId& id)
515 {
516     std::unique_lock<std::recursive_mutex> lock(animationMutex_);
517     std::vector<AnimationId> animations;
518     for (auto& [animateId, animation] : animations_) {
519         if (animation->GetPropertyId() == id) {
520             animations.push_back(animateId);
521         }
522     }
523     return animations;
524 }
525 
IsGeometryDirty() const526 bool RSNode::IsGeometryDirty() const
527 {
528     return dirtyType_ & static_cast<uint32_t>(NodeDirtyType::GEOMETRY);
529 }
530 
IsAppearanceDirty() const531 bool RSNode::IsAppearanceDirty() const
532 {
533     return dirtyType_ & static_cast<uint32_t>(NodeDirtyType::APPEARANCE);
534 }
535 
MarkDirty(NodeDirtyType type,bool isDirty)536 void RSNode::MarkDirty(NodeDirtyType type, bool isDirty)
537 {
538     if (isDirty) {
539         dirtyType_ |= static_cast<uint32_t>(type);
540     } else {
541         dirtyType_ &= ~static_cast<uint32_t>(type);
542     }
543 }
544 
GetGlobalPositionX() const545 float RSNode::GetGlobalPositionX() const
546 {
547     return globalPositionX_;
548 }
549 
GetGlobalPositionY() const550 float RSNode::GetGlobalPositionY() const
551 {
552     return globalPositionY_;
553 }
554 
GetLocalGeometry() const555 std::shared_ptr<RSObjAbsGeometry> RSNode::GetLocalGeometry() const
556 {
557     return localGeometry_;
558 }
559 
GetGlobalGeometry() const560 std::shared_ptr<RSObjAbsGeometry> RSNode::GetGlobalGeometry() const
561 {
562     return globalGeometry_;
563 }
564 
UpdateLocalGeometry()565 void RSNode::UpdateLocalGeometry()
566 {
567     if (!IsGeometryDirty()) {
568         return;
569     }
570     localGeometry_ = std::make_shared<RSObjAbsGeometry>();
571     for (const auto& [_, modifier] : modifiers_) {
572         if (modifier->GetPropertyModifierType() == RSPropertyModifierType::GEOMETRY) {
573             modifier->Apply(localGeometry_);
574         }
575     }
576 }
577 
UpdateGlobalGeometry(const std::shared_ptr<RSObjAbsGeometry> & parentGlobalGeometry)578 void RSNode::UpdateGlobalGeometry(const std::shared_ptr<RSObjAbsGeometry>& parentGlobalGeometry)
579 {
580     if (parentGlobalGeometry == nullptr || localGeometry_ == nullptr) {
581         return;
582     }
583     if (globalGeometry_ == nullptr) {
584         globalGeometry_ = std::make_shared<RSObjAbsGeometry>();
585     }
586     *globalGeometry_ = *localGeometry_;
587     globalGeometry_->UpdateMatrix(&parentGlobalGeometry->GetAbsMatrix(), std::nullopt);
588 
589     float parentGlobalPositionX = 0.f;
590     float parentGlobalPositionY = 0.f;
591     auto parent = GetParent();
592     if (parent) {
593         parentGlobalPositionX = parent->globalPositionX_;
594         parentGlobalPositionY = parent->globalPositionY_;
595     }
596     globalPositionX_ = parentGlobalPositionX + localGeometry_->GetX();
597     globalPositionY_ = parentGlobalPositionY + localGeometry_->GetY();
598 }
599 
600 template<typename ModifierName, typename PropertyName, typename T>
SetProperty(RSModifierType modifierType,T value)601 void RSNode::SetProperty(RSModifierType modifierType, T value)
602 {
603     std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
604     auto iter = propertyModifiers_.find(modifierType);
605     if (iter != propertyModifiers_.end()) {
606         auto property = std::static_pointer_cast<PropertyName>(iter->second->GetProperty());
607         if (property == nullptr) {
608             ROSEN_LOGE("RSNode::SetProperty: failed to set property, property is null!");
609             return;
610         }
611         property->Set(value);
612         return;
613     }
614     auto property = std::make_shared<PropertyName>(value);
615     auto propertyModifier = std::make_shared<ModifierName>(property);
616     propertyModifiers_.emplace(modifierType, propertyModifier);
617     AddModifier(propertyModifier);
618 }
619 
620 // alpha
SetAlpha(float alpha)621 void RSNode::SetAlpha(float alpha)
622 {
623     SetProperty<RSAlphaModifier, RSAnimatableProperty<float>>(RSModifierType::ALPHA, alpha);
624 }
625 
SetAlphaOffscreen(bool alphaOffscreen)626 void RSNode::SetAlphaOffscreen(bool alphaOffscreen)
627 {
628     SetProperty<RSAlphaOffscreenModifier, RSProperty<bool>>(RSModifierType::ALPHA_OFFSCREEN, alphaOffscreen);
629 }
630 
631 // Bounds
SetBounds(const Vector4f & bounds)632 void RSNode::SetBounds(const Vector4f& bounds)
633 {
634     SetProperty<RSBoundsModifier, RSAnimatableProperty<Vector4f>>(RSModifierType::BOUNDS, bounds);
635     OnBoundsSizeChanged();
636 }
637 
SetBounds(float positionX,float positionY,float width,float height)638 void RSNode::SetBounds(float positionX, float positionY, float width, float height)
639 {
640     SetBounds({ positionX, positionY, width, height });
641 }
642 
SetBoundsWidth(float width)643 void RSNode::SetBoundsWidth(float width)
644 {
645     std::map<RSModifierType, std::shared_ptr<RSModifier>>::iterator iter;
646     {
647         std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
648         iter = propertyModifiers_.find(RSModifierType::BOUNDS);
649         if (iter == propertyModifiers_.end()) {
650             SetBounds(0.f, 0.f, width, 0.f);
651             return;
652         }
653     }
654 
655     auto property = std::static_pointer_cast<RSAnimatableProperty<Vector4f>>(iter->second->GetProperty());
656     if (property == nullptr) {
657         return;
658     }
659     auto bounds = property->Get();
660     bounds.z_ = width;
661     property->Set(bounds);
662     OnBoundsSizeChanged();
663 }
664 
SetBoundsHeight(float height)665 void RSNode::SetBoundsHeight(float height)
666 {
667     std::map<RSModifierType, std::shared_ptr<RSModifier>>::iterator iter;
668     {
669         std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
670         iter = propertyModifiers_.find(RSModifierType::BOUNDS);
671         if (iter == propertyModifiers_.end()) {
672             SetBounds(0.f, 0.f, 0.f, height);
673             return;
674         }
675     }
676 
677     auto property = std::static_pointer_cast<RSAnimatableProperty<Vector4f>>(iter->second->GetProperty());
678     if (property == nullptr) {
679         return;
680     }
681     auto bounds = property->Get();
682     bounds.w_ = height;
683     property->Set(bounds);
684     OnBoundsSizeChanged();
685 }
686 
687 // Frame
SetFrame(const Vector4f & bounds)688 void RSNode::SetFrame(const Vector4f& bounds)
689 {
690     SetProperty<RSFrameModifier, RSAnimatableProperty<Vector4f>>(RSModifierType::FRAME, bounds);
691 }
692 
SetFrame(float positionX,float positionY,float width,float height)693 void RSNode::SetFrame(float positionX, float positionY, float width, float height)
694 {
695     SetFrame({ positionX, positionY, width, height });
696 }
697 
SetFramePositionX(float positionX)698 void RSNode::SetFramePositionX(float positionX)
699 {
700     std::map<RSModifierType, std::shared_ptr<RSModifier>>::iterator iter;
701     {
702         std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
703         iter = propertyModifiers_.find(RSModifierType::FRAME);
704         if (iter == propertyModifiers_.end()) {
705             SetFrame(positionX, 0.f, 0.f, 0.f);
706             return;
707         }
708     }
709 
710     auto property = std::static_pointer_cast<RSAnimatableProperty<Vector4f>>(iter->second->GetProperty());
711     if (property == nullptr) {
712         return;
713     }
714     auto frame = property->Get();
715     frame.x_ = positionX;
716     property->Set(frame);
717 }
718 
SetFramePositionY(float positionY)719 void RSNode::SetFramePositionY(float positionY)
720 {
721     std::map<RSModifierType, std::shared_ptr<RSModifier>>::iterator iter;
722     {
723         std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
724         iter = propertyModifiers_.find(RSModifierType::FRAME);
725         if (iter == propertyModifiers_.end()) {
726             SetFrame(0.f, positionY, 0.f, 0.f);
727             return;
728         }
729     }
730     auto property = std::static_pointer_cast<RSAnimatableProperty<Vector4f>>(iter->second->GetProperty());
731     if (property == nullptr) {
732         return;
733     }
734     auto frame = property->Get();
735     frame.y_ = positionY;
736     property->Set(frame);
737 }
738 
SetSandBox(std::optional<Vector2f> parentPosition)739 void RSNode::SetSandBox(std::optional<Vector2f> parentPosition)
740 {
741     if (!parentPosition.has_value()) {
742         std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
743         auto iter = propertyModifiers_.find(RSModifierType::SANDBOX);
744         if (iter != propertyModifiers_.end()) {
745             RemoveModifier(iter->second);
746             propertyModifiers_.erase(iter);
747         }
748         return;
749     }
750     SetProperty<RSSandBoxModifier, RSAnimatableProperty<Vector2f>>(RSModifierType::SANDBOX, parentPosition.value());
751 }
752 
SetPositionZ(float positionZ)753 void RSNode::SetPositionZ(float positionZ)
754 {
755     SetProperty<RSPositionZModifier, RSAnimatableProperty<float>>(RSModifierType::POSITION_Z, positionZ);
756 }
757 
SetPositionZApplicableCamera3D(bool isApplicable)758 void RSNode::SetPositionZApplicableCamera3D(bool isApplicable)
759 {
760     SetProperty<RSPositionZApplicableCamera3DModifier, RSProperty<bool>>(
761         RSModifierType::POSITION_Z_APPLICABLE_CAMERA3D, isApplicable);
762 }
763 
764 // pivot
SetPivot(const Vector2f & pivot)765 void RSNode::SetPivot(const Vector2f& pivot)
766 {
767     SetProperty<RSPivotModifier, RSAnimatableProperty<Vector2f>>(RSModifierType::PIVOT, pivot);
768 }
769 
SetPivot(float pivotX,float pivotY)770 void RSNode::SetPivot(float pivotX, float pivotY)
771 {
772     SetPivot({ pivotX, pivotY });
773 }
774 
SetPivotX(float pivotX)775 void RSNode::SetPivotX(float pivotX)
776 {
777     std::map<RSModifierType, std::shared_ptr<RSModifier>>::iterator iter;
778     {
779         std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
780         iter = propertyModifiers_.find(RSModifierType::PIVOT);
781         if (iter == propertyModifiers_.end()) {
782             SetPivot(pivotX, 0.5f);
783             return;
784         }
785     }
786 
787     auto property = std::static_pointer_cast<RSAnimatableProperty<Vector2f>>(iter->second->GetProperty());
788     if (property == nullptr) {
789         return;
790     }
791     auto pivot = property->Get();
792     pivot.x_ = pivotX;
793     property->Set(pivot);
794 }
795 
SetPivotY(float pivotY)796 void RSNode::SetPivotY(float pivotY)
797 {
798     std::map<RSModifierType, std::shared_ptr<RSModifier>>::iterator iter;
799     {
800         std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
801         iter = propertyModifiers_.find(RSModifierType::PIVOT);
802         if (iter == propertyModifiers_.end()) {
803             SetPivot(0.5f, pivotY);
804             return;
805         }
806     }
807 
808     auto property = std::static_pointer_cast<RSAnimatableProperty<Vector2f>>(iter->second->GetProperty());
809     if (property == nullptr) {
810         return;
811     }
812     auto pivot = property->Get();
813     pivot.y_ = pivotY;
814     property->Set(pivot);
815 }
816 
SetPivotZ(const float pivotZ)817 void RSNode::SetPivotZ(const float pivotZ)
818 {
819     SetProperty<RSPivotZModifier, RSAnimatableProperty<float>>(RSModifierType::PIVOT_Z, pivotZ);
820 }
821 
SetCornerRadius(float cornerRadius)822 void RSNode::SetCornerRadius(float cornerRadius)
823 {
824     SetCornerRadius(Vector4f(cornerRadius));
825 }
826 
SetCornerRadius(const Vector4f & cornerRadius)827 void RSNode::SetCornerRadius(const Vector4f& cornerRadius)
828 {
829     SetProperty<RSCornerRadiusModifier, RSAnimatableProperty<Vector4f>>(RSModifierType::CORNER_RADIUS, cornerRadius);
830 }
831 
832 // transform
SetRotation(const Quaternion & quaternion)833 void RSNode::SetRotation(const Quaternion& quaternion)
834 {
835     SetProperty<RSQuaternionModifier, RSAnimatableProperty<Quaternion>>(RSModifierType::QUATERNION, quaternion);
836 }
837 
SetRotation(float degree)838 void RSNode::SetRotation(float degree)
839 {
840     SetProperty<RSRotationModifier, RSAnimatableProperty<float>>(RSModifierType::ROTATION, degree);
841 }
842 
SetRotation(float degreeX,float degreeY,float degreeZ)843 void RSNode::SetRotation(float degreeX, float degreeY, float degreeZ)
844 {
845     SetRotationX(degreeX);
846     SetRotationY(degreeY);
847     SetRotation(degreeZ);
848 }
849 
SetRotationX(float degree)850 void RSNode::SetRotationX(float degree)
851 {
852     SetProperty<RSRotationXModifier, RSAnimatableProperty<float>>(RSModifierType::ROTATION_X, degree);
853 }
854 
SetRotationY(float degree)855 void RSNode::SetRotationY(float degree)
856 {
857     SetProperty<RSRotationYModifier, RSAnimatableProperty<float>>(RSModifierType::ROTATION_Y, degree);
858 }
859 
SetCameraDistance(float cameraDistance)860 void RSNode::SetCameraDistance(float cameraDistance)
861 {
862     SetProperty<RSCameraDistanceModifier, RSAnimatableProperty<float>>(RSModifierType::CAMERA_DISTANCE, cameraDistance);
863 }
864 
SetTranslate(const Vector2f & translate)865 void RSNode::SetTranslate(const Vector2f& translate)
866 {
867     SetProperty<RSTranslateModifier, RSAnimatableProperty<Vector2f>>(RSModifierType::TRANSLATE, translate);
868 }
869 
SetTranslate(float translateX,float translateY,float translateZ)870 void RSNode::SetTranslate(float translateX, float translateY, float translateZ)
871 {
872     SetTranslate({ translateX, translateY });
873     SetTranslateZ(translateZ);
874 }
875 
SetTranslateX(float translate)876 void RSNode::SetTranslateX(float translate)
877 {
878     std::map<RSModifierType, std::shared_ptr<RSModifier>>::iterator iter;
879     {
880         std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
881         iter = propertyModifiers_.find(RSModifierType::TRANSLATE);
882         if (iter == propertyModifiers_.end()) {
883             SetTranslate({ translate, 0.f });
884             return;
885         }
886     }
887 
888     auto property = std::static_pointer_cast<RSAnimatableProperty<Vector2f>>(iter->second->GetProperty());
889     if (property == nullptr) {
890         return;
891     }
892     auto trans = property->Get();
893     trans.x_ = translate;
894     property->Set(trans);
895 }
896 
SetTranslateY(float translate)897 void RSNode::SetTranslateY(float translate)
898 {
899     std::map<RSModifierType, std::shared_ptr<RSModifier>>::iterator iter;
900     {
901         std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
902         iter = propertyModifiers_.find(RSModifierType::TRANSLATE);
903         if (iter == propertyModifiers_.end()) {
904             SetTranslate({ 0.f, translate });
905             return;
906         }
907     }
908     auto property = std::static_pointer_cast<RSAnimatableProperty<Vector2f>>(iter->second->GetProperty());
909     if (property == nullptr) {
910         return;
911     }
912     auto trans = property->Get();
913     trans.y_ = translate;
914     property->Set(trans);
915 }
916 
SetTranslateZ(float translate)917 void RSNode::SetTranslateZ(float translate)
918 {
919     SetProperty<RSTranslateZModifier, RSAnimatableProperty<float>>(RSModifierType::TRANSLATE_Z, translate);
920 }
921 
SetScale(float scale)922 void RSNode::SetScale(float scale)
923 {
924     SetScale({ scale, scale });
925 }
926 
SetScale(float scaleX,float scaleY)927 void RSNode::SetScale(float scaleX, float scaleY)
928 {
929     SetScale({ scaleX, scaleY });
930 }
931 
SetScale(const Vector2f & scale)932 void RSNode::SetScale(const Vector2f& scale)
933 {
934     SetProperty<RSScaleModifier, RSAnimatableProperty<Vector2f>>(RSModifierType::SCALE, scale);
935 }
936 
SetScaleX(float scaleX)937 void RSNode::SetScaleX(float scaleX)
938 {
939     std::map<RSModifierType, std::shared_ptr<RSModifier>>::iterator iter;
940     {
941         std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
942         iter = propertyModifiers_.find(RSModifierType::SCALE);
943         if (iter == propertyModifiers_.end()) {
944             SetScale(scaleX, 1.f);
945             return;
946         }
947     }
948 
949     auto property = std::static_pointer_cast<RSAnimatableProperty<Vector2f>>(iter->second->GetProperty());
950     if (property == nullptr) {
951         return;
952     }
953     auto scale = property->Get();
954     scale.x_ = scaleX;
955     property->Set(scale);
956 }
957 
SetScaleY(float scaleY)958 void RSNode::SetScaleY(float scaleY)
959 {
960     std::map<RSModifierType, std::shared_ptr<RSModifier>>::iterator iter;
961     {
962         std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
963         iter = propertyModifiers_.find(RSModifierType::SCALE);
964         if (iter == propertyModifiers_.end()) {
965             SetScale(1.f, scaleY);
966             return;
967         }
968     }
969 
970     auto property = std::static_pointer_cast<RSAnimatableProperty<Vector2f>>(iter->second->GetProperty());
971     if (property == nullptr) {
972         return;
973     }
974     auto scale = property->Get();
975     scale.y_ = scaleY;
976     property->Set(scale);
977 }
978 
SetSkew(float skew)979 void RSNode::SetSkew(float skew)
980 {
981     SetSkew({ skew, skew });
982 }
983 
SetSkew(float skewX,float skewY)984 void RSNode::SetSkew(float skewX, float skewY)
985 {
986     SetSkew({ skewX, skewY });
987 }
988 
SetSkew(const Vector2f & skew)989 void RSNode::SetSkew(const Vector2f& skew)
990 {
991     SetProperty<RSSkewModifier, RSAnimatableProperty<Vector2f>>(RSModifierType::SKEW, skew);
992 }
993 
SetSkewX(float skewX)994 void RSNode::SetSkewX(float skewX)
995 {
996     std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
997     auto iter = propertyModifiers_.find(RSModifierType::SKEW);
998     if (iter == propertyModifiers_.end()) {
999         SetSkew(skewX, 0.f);
1000         return;
1001     }
1002 
1003     auto property = std::static_pointer_cast<RSAnimatableProperty<Vector2f>>(iter->second->GetProperty());
1004     if (property == nullptr) {
1005         return;
1006     }
1007     auto skew = property->Get();
1008     skew.x_ = skewX;
1009     property->Set(skew);
1010 }
1011 
SetSkewY(float skewY)1012 void RSNode::SetSkewY(float skewY)
1013 {
1014     std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
1015     auto iter = propertyModifiers_.find(RSModifierType::SKEW);
1016     if (iter == propertyModifiers_.end()) {
1017         SetSkew(0.f, skewY);
1018         return;
1019     }
1020 
1021     auto property = std::static_pointer_cast<RSAnimatableProperty<Vector2f>>(iter->second->GetProperty());
1022     if (property == nullptr) {
1023         return;
1024     }
1025     auto skew = property->Get();
1026     skew.y_ = skewY;
1027     property->Set(skew);
1028 }
1029 
SetPersp(float persp)1030 void RSNode::SetPersp(float persp)
1031 {
1032     SetPersp({ persp, persp });
1033 }
1034 
SetPersp(float perspX,float perspY)1035 void RSNode::SetPersp(float perspX, float perspY)
1036 {
1037     SetPersp({ perspX, perspY });
1038 }
1039 
SetPersp(const Vector2f & persp)1040 void RSNode::SetPersp(const Vector2f& persp)
1041 {
1042     SetProperty<RSPerspModifier, RSAnimatableProperty<Vector2f>>(RSModifierType::PERSP, persp);
1043 }
1044 
SetPerspX(float perspX)1045 void RSNode::SetPerspX(float perspX)
1046 {
1047     std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
1048     auto iter = propertyModifiers_.find(RSModifierType::PERSP);
1049     if (iter == propertyModifiers_.end()) {
1050         SetPersp(perspX, 0.f);
1051         return;
1052     }
1053 
1054     auto property = std::static_pointer_cast<RSAnimatableProperty<Vector2f>>(iter->second->GetProperty());
1055     if (property == nullptr) {
1056         return;
1057     }
1058     auto persp = property->Get();
1059     persp.x_ = perspX;
1060     property->Set(persp);
1061 }
1062 
SetPerspY(float perspY)1063 void RSNode::SetPerspY(float perspY)
1064 {
1065     std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
1066     auto iter = propertyModifiers_.find(RSModifierType::PERSP);
1067     if (iter == propertyModifiers_.end()) {
1068         SetPersp(0.f, perspY);
1069         return;
1070     }
1071 
1072     auto property = std::static_pointer_cast<RSAnimatableProperty<Vector2f>>(iter->second->GetProperty());
1073     if (property == nullptr) {
1074         return;
1075     }
1076     auto persp = property->Get();
1077     persp.y_ = perspY;
1078     property->Set(persp);
1079 }
1080 
1081 // Set the foreground color of the control
SetEnvForegroundColor(uint32_t colorValue)1082 void RSNode::SetEnvForegroundColor(uint32_t colorValue)
1083 {
1084     auto color = Color::FromArgbInt(colorValue);
1085     SetProperty<RSEnvForegroundColorModifier, RSAnimatableProperty<Color>>(RSModifierType::ENV_FOREGROUND_COLOR, color);
1086 }
1087 
1088 // Set the foreground color strategy of the control
SetEnvForegroundColorStrategy(ForegroundColorStrategyType strategyType)1089 void RSNode::SetEnvForegroundColorStrategy(ForegroundColorStrategyType strategyType)
1090 {
1091     SetProperty<RSEnvForegroundColorStrategyModifier,
1092         RSProperty<ForegroundColorStrategyType>>(RSModifierType::ENV_FOREGROUND_COLOR_STRATEGY, strategyType);
1093 }
1094 
1095 // Set ParticleParams
SetParticleParams(std::vector<ParticleParams> & particleParams,const std::function<void ()> & finishCallback)1096 void RSNode::SetParticleParams(std::vector<ParticleParams>& particleParams, const std::function<void()>& finishCallback)
1097 {
1098     std::vector<std::shared_ptr<ParticleRenderParams>> particlesRenderParams;
1099     for (size_t i = 0; i < particleParams.size(); i++) {
1100         particlesRenderParams.push_back(particleParams[i].SetParamsToRenderParticle());
1101     }
1102 
1103     SetParticleDrawRegion(particleParams);
1104     auto property = std::make_shared<RSPropertyBase>();
1105     auto propertyId = property->GetId();
1106     auto uiAnimation = std::make_shared<RSAnimationGroup>();
1107     auto animationId = uiAnimation->GetId();
1108     AddAnimation(uiAnimation);
1109     if (finishCallback != nullptr) {
1110         uiAnimation->SetFinishCallback(std::make_shared<AnimationFinishCallback>(finishCallback));
1111     }
1112     auto animation =
1113         std::make_shared<RSRenderParticleAnimation>(animationId, propertyId, std::move(particlesRenderParams));
1114 
1115     std::unique_ptr<RSCommand> command = std::make_unique<RSAnimationCreateParticle>(GetId(), animation);
1116     auto transactionProxy = RSTransactionProxy::GetInstance();
1117     if (transactionProxy != nullptr) {
1118         transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), GetId());
1119         if (NeedForcedSendToRemote()) {
1120             std::unique_ptr<RSCommand> cmdForRemote =
1121                 std::make_unique<RSAnimationCreateParticle>(GetId(), animation);
1122             transactionProxy->AddCommand(cmdForRemote, true, GetFollowType(), GetId());
1123         }
1124     }
1125 }
1126 
SetParticleDrawRegion(std::vector<ParticleParams> & particleParams)1127 void RSNode::SetParticleDrawRegion(std::vector<ParticleParams>& particleParams)
1128 {
1129     Vector4f bounds = GetStagingProperties().GetBounds();
1130     float boundsRight = bounds.x_ + bounds.z_;
1131     float boundsBottom = bounds.y_ + bounds.w_;
1132     size_t emitterCount = particleParams.size();
1133     std::vector<float> left(emitterCount);
1134     std::vector<float> top(emitterCount);
1135     std::vector<float> right(emitterCount);
1136     std::vector<float> bottom(emitterCount);
1137     for (size_t i = 0; i < emitterCount; i++) {
1138         auto particleType = particleParams[i].emitterConfig_.type_;
1139         auto position = particleParams[i].emitterConfig_.position_;
1140         auto emitSize = particleParams[i].emitterConfig_.emitSize_;
1141         float scaleMax = particleParams[i].scale_.val_.end_;
1142         if (particleType == ParticleType::POINTS) {
1143             auto diameMax = particleParams[i].emitterConfig_.radius_ * 2 * scaleMax; // diameter = 2 * radius
1144             left[i] = std::min(bounds.x_ - diameMax, bounds.x_ + position.x_ - diameMax);
1145             top[i] = std::min(bounds.y_ - diameMax, bounds.y_ + position.y_ - diameMax);
1146             right[i] = std::max(boundsRight + diameMax + diameMax, position.x_ + emitSize.x_ + diameMax + diameMax);
1147             bottom[i] = std::max(boundsBottom + diameMax + diameMax, position.y_ + emitSize.y_ + diameMax + diameMax);
1148         } else {
1149             float imageSizeWidth = 0.f;
1150             float imageSizeHeight = 0.f;
1151             auto image = particleParams[i].emitterConfig_.image_;
1152             auto imageSize = particleParams[i].emitterConfig_.imageSize_;
1153             if (image == nullptr)
1154                 continue;
1155             auto pixelMap = image->GetPixelMap();
1156             if (pixelMap != nullptr) {
1157                 imageSizeWidth = std::max(imageSize.x_, static_cast<float>(pixelMap->GetWidth()));
1158                 imageSizeHeight = std::max(imageSize.y_, static_cast<float>(pixelMap->GetHeight()));
1159             }
1160             float imageSizeWidthMax = imageSizeWidth * scaleMax;
1161             float imageSizeHeightMax = imageSizeHeight * scaleMax;
1162             left[i] = std::min(bounds.x_ - imageSizeWidthMax, bounds.x_ + position.x_ - imageSizeWidthMax);
1163             top[i] = std::min(bounds.y_ - imageSizeHeightMax, bounds.y_ + position.y_ - imageSizeHeightMax);
1164             right[i] = std::max(boundsRight + imageSizeWidthMax + imageSizeWidthMax,
1165                 position.x_ + emitSize.x_ + imageSizeWidthMax + imageSizeWidthMax);
1166             bottom[i] = std::max(boundsBottom + imageSizeHeightMax + imageSizeHeightMax,
1167                 position.y_ + emitSize.y_ + imageSizeHeightMax + imageSizeHeightMax);
1168         }
1169     }
1170     if (emitterCount != 0) {
1171         float l = *std::min_element(left.begin(), left.end());
1172         float t = *std::min_element(top.begin(), top.end());
1173         boundsRight = *std::max_element(right.begin(), right.end());
1174         boundsBottom = *std::max_element(bottom.begin(), bottom.end());
1175         SetDrawRegion(std::make_shared<RectF>(l - bounds.x_, t - bounds.y_, boundsRight - l, boundsBottom - t));
1176     }
1177 }
1178 
1179 // Update Particle Emitter
SetEmitterUpdater(const std::vector<std::shared_ptr<EmitterUpdater>> & para)1180 void RSNode::SetEmitterUpdater(const std::vector<std::shared_ptr<EmitterUpdater>>& para)
1181 {
1182     SetProperty<RSEmitterUpdaterModifier, RSProperty<std::vector<std::shared_ptr<EmitterUpdater>>>>(
1183         RSModifierType::PARTICLE_EMITTER_UPDATER, para);
1184 }
1185 
1186 // Set Particle Noise Field
SetParticleNoiseFields(const std::shared_ptr<ParticleNoiseFields> & para)1187 void RSNode::SetParticleNoiseFields(const std::shared_ptr<ParticleNoiseFields>& para)
1188 {
1189     SetProperty<RSParticleNoiseFieldsModifier, RSProperty<std::shared_ptr<ParticleNoiseFields>>>(
1190         RSModifierType::PARTICLE_NOISE_FIELD, para);
1191 }
1192 
1193 // foreground
SetForegroundColor(uint32_t colorValue)1194 void RSNode::SetForegroundColor(uint32_t colorValue)
1195 {
1196     auto color = Color::FromArgbInt(colorValue);
1197     SetProperty<RSForegroundColorModifier, RSAnimatableProperty<Color>>(RSModifierType::FOREGROUND_COLOR, color);
1198 }
1199 
SetBackgroundColor(uint32_t colorValue)1200 void RSNode::SetBackgroundColor(uint32_t colorValue)
1201 {
1202     auto color = Color::FromArgbInt(colorValue);
1203     SetProperty<RSBackgroundColorModifier, RSAnimatableProperty<Color>>(RSModifierType::BACKGROUND_COLOR, color);
1204 }
1205 
SetBackgroundShader(const std::shared_ptr<RSShader> & shader)1206 void RSNode::SetBackgroundShader(const std::shared_ptr<RSShader>& shader)
1207 {
1208     SetProperty<RSBackgroundShaderModifier, RSProperty<std::shared_ptr<RSShader>>>(
1209         RSModifierType::BACKGROUND_SHADER, shader);
1210 }
1211 
1212 // background
SetBgImage(const std::shared_ptr<RSImage> & image)1213 void RSNode::SetBgImage(const std::shared_ptr<RSImage>& image)
1214 {
1215     if (image) {
1216         image->SetNodeId(GetId());
1217     }
1218     SetProperty<RSBgImageModifier, RSProperty<std::shared_ptr<RSImage>>>(RSModifierType::BG_IMAGE, image);
1219 }
1220 
SetBgImageInnerRect(const Vector4f & rect)1221 void RSNode::SetBgImageInnerRect(const Vector4f& rect)
1222 {
1223     SetProperty<RSBgImageInnerRectModifier, RSAnimatableProperty<Vector4f>>(
1224         RSModifierType::BG_IMAGE_INNER_RECT, rect);
1225 }
1226 
SetBgImageSize(float width,float height)1227 void RSNode::SetBgImageSize(float width, float height)
1228 {
1229     SetBgImageWidth(width);
1230     SetBgImageHeight(height);
1231 }
1232 
SetBgImageWidth(float width)1233 void RSNode::SetBgImageWidth(float width)
1234 {
1235     SetProperty<RSBgImageWidthModifier, RSAnimatableProperty<float>>(RSModifierType::BG_IMAGE_WIDTH, width);
1236 }
1237 
SetBgImageHeight(float height)1238 void RSNode::SetBgImageHeight(float height)
1239 {
1240     SetProperty<RSBgImageHeightModifier, RSAnimatableProperty<float>>(RSModifierType::BG_IMAGE_HEIGHT, height);
1241 }
1242 
SetBgImagePosition(float positionX,float positionY)1243 void RSNode::SetBgImagePosition(float positionX, float positionY)
1244 {
1245     SetBgImagePositionX(positionX);
1246     SetBgImagePositionY(positionY);
1247 }
1248 
SetBgImagePositionX(float positionX)1249 void RSNode::SetBgImagePositionX(float positionX)
1250 {
1251     SetProperty<RSBgImagePositionXModifier, RSAnimatableProperty<float>>(
1252         RSModifierType::BG_IMAGE_POSITION_X, positionX);
1253 }
1254 
SetBgImagePositionY(float positionY)1255 void RSNode::SetBgImagePositionY(float positionY)
1256 {
1257     SetProperty<RSBgImagePositionYModifier, RSAnimatableProperty<float>>(
1258         RSModifierType::BG_IMAGE_POSITION_Y, positionY);
1259 }
1260 
1261 // set inner border color
SetBorderColor(uint32_t colorValue)1262 void RSNode::SetBorderColor(uint32_t colorValue)
1263 {
1264     SetBorderColor(colorValue, colorValue, colorValue, colorValue);
1265 }
1266 
1267 // set inner border color
SetBorderColor(uint32_t left,uint32_t top,uint32_t right,uint32_t bottom)1268 void RSNode::SetBorderColor(uint32_t left, uint32_t top, uint32_t right, uint32_t bottom)
1269 {
1270     Vector4<Color> color(Color::FromArgbInt(left), Color::FromArgbInt(top),
1271                          Color::FromArgbInt(right), Color::FromArgbInt(bottom));
1272     SetBorderColor(color);
1273 }
1274 
1275 // set inner border color
SetBorderColor(const Vector4<Color> & color)1276 void RSNode::SetBorderColor(const Vector4<Color>& color)
1277 {
1278     SetProperty<RSBorderColorModifier, RSAnimatableProperty<Vector4<Color>>>(RSModifierType::BORDER_COLOR, color);
1279 }
1280 
1281 // set inner border width
SetBorderWidth(float width)1282 void RSNode::SetBorderWidth(float width)
1283 {
1284     SetBorderWidth(width, width, width, width);
1285 }
1286 
1287 // set inner border width
SetBorderWidth(float left,float top,float right,float bottom)1288 void RSNode::SetBorderWidth(float left, float top, float right, float bottom)
1289 {
1290     Vector4f width(left, top, right, bottom);
1291     SetBorderWidth(width);
1292 }
1293 
1294 // set inner border width
SetBorderWidth(const Vector4f & width)1295 void RSNode::SetBorderWidth(const Vector4f& width)
1296 {
1297     SetProperty<RSBorderWidthModifier, RSAnimatableProperty<Vector4f>>(RSModifierType::BORDER_WIDTH, width);
1298 }
1299 
1300 // set inner border style
SetBorderStyle(uint32_t styleValue)1301 void RSNode::SetBorderStyle(uint32_t styleValue)
1302 {
1303     SetBorderStyle(styleValue, styleValue, styleValue, styleValue);
1304 }
1305 
1306 // set inner border style
SetBorderStyle(uint32_t left,uint32_t top,uint32_t right,uint32_t bottom)1307 void RSNode::SetBorderStyle(uint32_t left, uint32_t top, uint32_t right, uint32_t bottom)
1308 {
1309     Vector4<BorderStyle> style(static_cast<BorderStyle>(left), static_cast<BorderStyle>(top),
1310                                static_cast<BorderStyle>(right), static_cast<BorderStyle>(bottom));
1311     SetBorderStyle(style);
1312 }
1313 
1314 // set inner border style
SetBorderStyle(const Vector4<BorderStyle> & style)1315 void RSNode::SetBorderStyle(const Vector4<BorderStyle>& style)
1316 {
1317     Vector4<uint32_t> styles(static_cast<uint32_t>(style.x_), static_cast<uint32_t>(style.y_),
1318                              static_cast<uint32_t>(style.z_), static_cast<uint32_t>(style.w_));
1319     SetProperty<RSBorderStyleModifier, RSProperty<Vector4<uint32_t>>>(RSModifierType::BORDER_STYLE, styles);
1320 }
1321 
1322 // set dash width for border
SetBorderDashWidth(const Vector4f & dashWidth)1323 void RSNode::SetBorderDashWidth(const Vector4f& dashWidth)
1324 {
1325     SetProperty<RSBorderDashWidthModifier, RSProperty<Vector4f>>(
1326         RSModifierType::BORDER_DASH_WIDTH, dashWidth);
1327 }
1328 
1329 // set dash gap for border
SetBorderDashGap(const Vector4f & dashGap)1330 void RSNode::SetBorderDashGap(const Vector4f& dashGap)
1331 {
1332     SetProperty<RSBorderDashGapModifier, RSProperty<Vector4f>>(
1333         RSModifierType::BORDER_DASH_GAP, dashGap);
1334 }
1335 
SetOuterBorderColor(const Vector4<Color> & color)1336 void RSNode::SetOuterBorderColor(const Vector4<Color>& color)
1337 {
1338     SetOutlineColor(color);
1339 }
1340 
SetOuterBorderWidth(const Vector4f & width)1341 void RSNode::SetOuterBorderWidth(const Vector4f& width)
1342 {
1343     SetOutlineWidth(width);
1344 }
1345 
SetOuterBorderStyle(const Vector4<BorderStyle> & style)1346 void RSNode::SetOuterBorderStyle(const Vector4<BorderStyle>& style)
1347 {
1348     SetOutlineStyle(style);
1349 }
1350 
SetOuterBorderRadius(const Vector4f & radius)1351 void RSNode::SetOuterBorderRadius(const Vector4f& radius)
1352 {
1353     SetOutlineRadius(radius);
1354 }
1355 
SetOutlineColor(const Vector4<Color> & color)1356 void RSNode::SetOutlineColor(const Vector4<Color>& color)
1357 {
1358     SetProperty<RSOutlineColorModifier, RSAnimatableProperty<Vector4<Color>>>(
1359         RSModifierType::OUTLINE_COLOR, color);
1360 }
1361 
SetOutlineWidth(const Vector4f & width)1362 void RSNode::SetOutlineWidth(const Vector4f& width)
1363 {
1364     SetProperty<RSOutlineWidthModifier, RSAnimatableProperty<Vector4f>>(
1365         RSModifierType::OUTLINE_WIDTH, width);
1366 }
1367 
SetOutlineStyle(const Vector4<BorderStyle> & style)1368 void RSNode::SetOutlineStyle(const Vector4<BorderStyle>& style)
1369 {
1370     Vector4<uint32_t> styles(static_cast<uint32_t>(style.x_), static_cast<uint32_t>(style.y_),
1371                              static_cast<uint32_t>(style.z_), static_cast<uint32_t>(style.w_));
1372     SetProperty<RSOutlineStyleModifier, RSProperty<Vector4<uint32_t>>>(
1373         RSModifierType::OUTLINE_STYLE, styles);
1374 }
1375 
SetOutlineDashWidth(const Vector4f & dashWidth)1376 void RSNode::SetOutlineDashWidth(const Vector4f& dashWidth)
1377 {
1378     SetProperty<RSOutlineDashWidthModifier, RSAnimatableProperty<Vector4f>>(
1379         RSModifierType::OUTLINE_DASH_WIDTH, dashWidth);
1380 }
1381 
SetOutlineDashGap(const Vector4f & dashGap)1382 void RSNode::SetOutlineDashGap(const Vector4f& dashGap)
1383 {
1384     SetProperty<RSOutlineDashGapModifier, RSAnimatableProperty<Vector4f>>(
1385         RSModifierType::OUTLINE_DASH_GAP, dashGap);
1386 }
1387 
SetOutlineRadius(const Vector4f & radius)1388 void RSNode::SetOutlineRadius(const Vector4f& radius)
1389 {
1390     SetProperty<RSOutlineRadiusModifier, RSAnimatableProperty<Vector4f>>(
1391         RSModifierType::OUTLINE_RADIUS, radius);
1392 }
1393 
SetUIBackgroundFilter(const OHOS::Rosen::Filter * backgroundFilter)1394 void RSNode::SetUIBackgroundFilter(const OHOS::Rosen::Filter* backgroundFilter)
1395 {
1396     if (backgroundFilter == nullptr) {
1397         ROSEN_LOGE("Failed to set backgroundFilter, backgroundFilter is null!");
1398         return;
1399     }
1400     // To do: generate composed filter here. Now we just set background blur in v1.0.
1401     auto filterParas = backgroundFilter->GetAllPara();
1402     for (const auto& filterPara : filterParas) {
1403         if (filterPara->GetParaType() == FilterPara::BLUR) {
1404             auto filterBlurPara = std::static_pointer_cast<FilterBlurPara>(filterPara);
1405             auto blurRadius = filterBlurPara->GetRadius();
1406             SetBackgroundBlurRadiusX(blurRadius);
1407             SetBackgroundBlurRadiusY(blurRadius);
1408         }
1409         if (filterPara->GetParaType() == FilterPara::WATER_RIPPLE) {
1410             auto waterRipplePara = std::static_pointer_cast<WaterRipplePara>(filterPara);
1411             auto waveCount = waterRipplePara->GetWaveCount();
1412             auto rippleCenterX = waterRipplePara->GetRippleCenterX();
1413             auto rippleCenterY = waterRipplePara->GetRippleCenterY();
1414             auto progress = waterRipplePara->GetProgress();
1415             auto rippleMode = waterRipplePara->GetRippleMode();
1416             RSWaterRipplePara params = {
1417                 waveCount,
1418                 rippleCenterX,
1419                 rippleCenterY,
1420                 rippleMode
1421             };
1422             SetWaterRippleParams(params, progress);
1423         }
1424     }
1425 }
1426 
SetUICompositingFilter(const OHOS::Rosen::Filter * compositingFilter)1427 void RSNode::SetUICompositingFilter(const OHOS::Rosen::Filter* compositingFilter)
1428 {
1429     if (compositingFilter == nullptr) {
1430         ROSEN_LOGE("Failed to set compositingFilter, compositingFilter is null!");
1431         return;
1432     }
1433     // To do: generate composed filter here. Now we just set compositing blur and pixelStretch in v1.0.
1434     auto filterParas = compositingFilter->GetAllPara();
1435     for (const auto& filterPara : filterParas) {
1436         if (filterPara->GetParaType() == FilterPara::BLUR) {
1437             auto filterBlurPara = std::static_pointer_cast<FilterBlurPara>(filterPara);
1438             auto blurRadius = filterBlurPara->GetRadius();
1439             SetForegroundBlurRadiusX(blurRadius);
1440             SetForegroundBlurRadiusY(blurRadius);
1441         }
1442         if (filterPara->GetParaType() == FilterPara::PIXEL_STRETCH) {
1443             auto pixelStretchPara = std::static_pointer_cast<PixelStretchPara>(filterPara);
1444             auto stretchPercent = pixelStretchPara->GetStretchPercent();
1445             SetPixelStretchPercent(stretchPercent, pixelStretchPara->GetTileMode());
1446         }
1447     }
1448 }
1449 
SetUIForegroundFilter(const OHOS::Rosen::Filter * foregroundFilter)1450 void RSNode::SetUIForegroundFilter(const OHOS::Rosen::Filter* foregroundFilter)
1451 {
1452     if (foregroundFilter == nullptr) {
1453         ROSEN_LOGE("Failed to set foregroundFilter, foregroundFilter is null!");
1454         return;
1455     }
1456     // To do: generate composed filter here. Now we just set foreground blur in v1.0.
1457     auto filterParas = foregroundFilter->GetAllPara();
1458     for (const auto& filterPara : filterParas) {
1459         if (filterPara->GetParaType() == FilterPara::BLUR) {
1460             auto filterBlurPara = std::static_pointer_cast<FilterBlurPara>(filterPara);
1461             auto blurRadius = filterBlurPara->GetRadius();
1462             SetForegroundEffectRadius(blurRadius);
1463         }
1464         if (filterPara->GetParaType() == FilterPara::FLY_OUT) {
1465             auto flyOutPara = std::static_pointer_cast<FlyOutPara>(filterPara);
1466             auto flyMode = flyOutPara->GetFlyMode();
1467             auto degree = flyOutPara->GetDegree();
1468             RSFlyOutPara rs_fly_out_param = {
1469                 flyMode,
1470             };
1471             SetFlyOutParams(rs_fly_out_param, degree);
1472         }
1473         if (filterPara->GetParaType() == FilterPara::DISTORT) {
1474             auto distortPara = std::static_pointer_cast<DistortPara>(filterPara);
1475             auto distortionK = distortPara->GetDistortionK();
1476             SetDistortionK(distortionK);
1477         }
1478     }
1479 }
1480 
SetVisualEffect(const VisualEffect * visualEffect)1481 void RSNode::SetVisualEffect(const VisualEffect* visualEffect)
1482 {
1483     if (visualEffect == nullptr) {
1484         ROSEN_LOGE("Failed to set visualEffect, visualEffect is null!");
1485         return;
1486     }
1487     // To do: generate composed visual effect here. Now we just set background brightness in v1.0.
1488     auto visualEffectParas = visualEffect->GetAllPara();
1489     for (const auto& visualEffectPara : visualEffectParas) {
1490         if (visualEffectPara->GetParaType() != VisualEffectPara::BACKGROUND_COLOR_EFFECT) {
1491             continue;
1492         }
1493         auto backgroundColorEffectPara = std::static_pointer_cast<BackgroundColorEffectPara>(visualEffectPara);
1494         auto blender = backgroundColorEffectPara->GetBlender();
1495         auto brightnessBlender = std::static_pointer_cast<BrightnessBlender>(blender);
1496         if (brightnessBlender == nullptr) {
1497             continue;
1498         }
1499         auto fraction = brightnessBlender->GetFraction();
1500         SetBgBrightnessFract(fraction);
1501         SetBgBrightnessParams({ brightnessBlender->GetLinearRate(), brightnessBlender->GetDegree(),
1502             brightnessBlender->GetCubicRate(), brightnessBlender->GetQuadRate(), brightnessBlender->GetSaturation(),
1503             { brightnessBlender->GetPositiveCoeff().data_[0], brightnessBlender->GetPositiveCoeff().data_[1],
1504                 brightnessBlender->GetPositiveCoeff().data_[2] },
1505             { brightnessBlender->GetNegativeCoeff().data_[0], brightnessBlender->GetNegativeCoeff().data_[1],
1506                 brightnessBlender->GetNegativeCoeff().data_[2] } });
1507     }
1508 }
1509 
SetBlender(const Blender * blender)1510 void RSNode::SetBlender(const Blender* blender)
1511 {
1512     if (blender == nullptr) {
1513         ROSEN_LOGE("RSNode::SetBlender: blender is null!");
1514         return;
1515     }
1516 
1517     if (Blender::BRIGHTNESS_BLENDER == blender->GetBlenderType()) {
1518         auto brightnessBlender = static_cast<const BrightnessBlender*>(blender);
1519         if (brightnessBlender != nullptr) {
1520             SetFgBrightnessFract(brightnessBlender->GetFraction());
1521             SetFgBrightnessParams({ brightnessBlender->GetLinearRate(), brightnessBlender->GetDegree(),
1522                 brightnessBlender->GetCubicRate(), brightnessBlender->GetQuadRate(), brightnessBlender->GetSaturation(),
1523                 { brightnessBlender->GetPositiveCoeff().x_, brightnessBlender->GetPositiveCoeff().y_,
1524                     brightnessBlender->GetPositiveCoeff().z_ },
1525                 { brightnessBlender->GetNegativeCoeff().x_, brightnessBlender->GetNegativeCoeff().y_,
1526                     brightnessBlender->GetNegativeCoeff().z_ } });
1527         }
1528     }
1529 }
1530 
SetForegroundEffectRadius(const float blurRadius)1531 void RSNode::SetForegroundEffectRadius(const float blurRadius)
1532 {
1533     SetProperty<RSForegroundEffectRadiusModifier, RSAnimatableProperty<float>>(
1534         RSModifierType::FOREGROUND_EFFECT_RADIUS, blurRadius);
1535 }
1536 
SetBackgroundFilter(const std::shared_ptr<RSFilter> & backgroundFilter)1537 void RSNode::SetBackgroundFilter(const std::shared_ptr<RSFilter>& backgroundFilter)
1538 {
1539     if (backgroundFilter == nullptr) {
1540         SetBackgroundBlurRadius(0.f);
1541         SetBackgroundBlurSaturation(1.f);
1542         SetBackgroundBlurBrightness(1.f);
1543         SetBackgroundBlurMaskColor(RSColor());
1544         SetBackgroundBlurColorMode(BLUR_COLOR_MODE::DEFAULT);
1545         SetBackgroundBlurRadiusX(0.f);
1546         SetBackgroundBlurRadiusY(0.f);
1547     } else if (backgroundFilter->GetFilterType() == RSFilter::MATERIAL) {
1548         auto materialFilter = std::static_pointer_cast<RSMaterialFilter>(backgroundFilter);
1549         float Radius = materialFilter->GetRadius();
1550         float Saturation = materialFilter->GetSaturation();
1551         float Brightness = materialFilter->GetBrightness();
1552         Color MaskColor = materialFilter->GetMaskColor();
1553         int ColorMode = materialFilter->GetColorMode();
1554         SetBackgroundBlurRadius(Radius);
1555         SetBackgroundBlurSaturation(Saturation);
1556         SetBackgroundBlurBrightness(Brightness);
1557         SetBackgroundBlurMaskColor(MaskColor);
1558         SetBackgroundBlurColorMode(ColorMode);
1559     } else if (backgroundFilter->GetFilterType() == RSFilter::BLUR) {
1560         auto blurFilter = std::static_pointer_cast<RSBlurFilter>(backgroundFilter);
1561         float blurRadiusX = blurFilter->GetBlurRadiusX();
1562         float blurRadiusY = blurFilter->GetBlurRadiusY();
1563         SetBackgroundBlurRadiusX(blurRadiusX);
1564         SetBackgroundBlurRadiusY(blurRadiusY);
1565     }
1566 }
1567 
SetFilter(const std::shared_ptr<RSFilter> & filter)1568 void RSNode::SetFilter(const std::shared_ptr<RSFilter>& filter)
1569 {
1570     if (filter == nullptr) {
1571         SetForegroundBlurRadius(0.f);
1572         SetForegroundBlurSaturation(1.f);
1573         SetForegroundBlurBrightness(1.f);
1574         SetForegroundBlurMaskColor(RSColor());
1575         SetForegroundBlurColorMode(BLUR_COLOR_MODE::DEFAULT);
1576         SetForegroundBlurRadiusX(0.f);
1577         SetForegroundBlurRadiusY(0.f);
1578     } else if (filter->GetFilterType() == RSFilter::MATERIAL) {
1579         auto materialFilter = std::static_pointer_cast<RSMaterialFilter>(filter);
1580         float Radius = materialFilter->GetRadius();
1581         float Saturation = materialFilter->GetSaturation();
1582         float Brightness = materialFilter->GetBrightness();
1583         Color MaskColor = materialFilter->GetMaskColor();
1584         int ColorMode = materialFilter->GetColorMode();
1585         SetForegroundBlurRadius(Radius);
1586         SetForegroundBlurSaturation(Saturation);
1587         SetForegroundBlurBrightness(Brightness);
1588         SetForegroundBlurMaskColor(MaskColor);
1589         SetForegroundBlurColorMode(ColorMode);
1590     } else if (filter->GetFilterType() == RSFilter::BLUR) {
1591         auto blurFilter = std::static_pointer_cast<RSBlurFilter>(filter);
1592         float blurRadiusX = blurFilter->GetBlurRadiusX();
1593         float blurRadiusY = blurFilter->GetBlurRadiusY();
1594         SetForegroundBlurRadiusX(blurRadiusX);
1595         SetForegroundBlurRadiusY(blurRadiusY);
1596     }
1597 }
1598 
SetLinearGradientBlurPara(const std::shared_ptr<RSLinearGradientBlurPara> & para)1599 void RSNode::SetLinearGradientBlurPara(const std::shared_ptr<RSLinearGradientBlurPara>& para)
1600 {
1601     SetProperty<RSLinearGradientBlurParaModifier, RSProperty<std::shared_ptr<RSLinearGradientBlurPara>>>(
1602         RSModifierType::LINEAR_GRADIENT_BLUR_PARA, para);
1603 }
1604 
SetMotionBlurPara(const float radius,const Vector2f & anchor)1605 void RSNode::SetMotionBlurPara(const float radius, const Vector2f& anchor)
1606 {
1607     Vector2f anchor1 = {anchor[0], anchor[1]};
1608     std::shared_ptr<MotionBlurParam> para = std::make_shared<MotionBlurParam>(radius, anchor1);
1609     SetProperty<RSMotionBlurParaModifier, RSProperty<std::shared_ptr<MotionBlurParam>>>(
1610         RSModifierType::MOTION_BLUR_PARA, para);
1611 }
1612 
SetDynamicLightUpRate(const float rate)1613 void RSNode::SetDynamicLightUpRate(const float rate)
1614 {
1615     SetProperty<RSDynamicLightUpRateModifier, RSAnimatableProperty<float>>(RSModifierType::DYNAMIC_LIGHT_UP_RATE, rate);
1616 }
1617 
SetDynamicLightUpDegree(const float lightUpDegree)1618 void RSNode::SetDynamicLightUpDegree(const float lightUpDegree)
1619 {
1620     SetProperty<RSDynamicLightUpDegreeModifier,
1621         RSAnimatableProperty<float>>(RSModifierType::DYNAMIC_LIGHT_UP_DEGREE, lightUpDegree);
1622 }
1623 
SetFgBrightnessParams(const RSDynamicBrightnessPara & params)1624 void RSNode::SetFgBrightnessParams(const RSDynamicBrightnessPara& params)
1625 {
1626     // Compatible with original interfaces
1627     SetFgBrightnessRates(params.rates_);
1628     SetFgBrightnessSaturation(params.saturation_);
1629     SetFgBrightnessPosCoeff(params.posCoeff_);
1630     SetFgBrightnessNegCoeff(params.negCoeff_);
1631 }
1632 
SetFgBrightnessRates(const Vector4f & rates)1633 void RSNode::SetFgBrightnessRates(const Vector4f& rates)
1634 {
1635     SetProperty<RSFgBrightnessRatesModifier,
1636         RSAnimatableProperty<Vector4f>>(RSModifierType::FG_BRIGHTNESS_RATES, rates);
1637 }
1638 
SetFgBrightnessSaturation(const float & saturation)1639 void RSNode::SetFgBrightnessSaturation(const float& saturation)
1640 {
1641     SetProperty<RSFgBrightnessSaturationModifier,
1642         RSAnimatableProperty<float>>(RSModifierType::FG_BRIGHTNESS_SATURATION, saturation);
1643 }
1644 
SetFgBrightnessPosCoeff(const Vector4f & coeff)1645 void RSNode::SetFgBrightnessPosCoeff(const Vector4f& coeff)
1646 {
1647     SetProperty<RSFgBrightnessPosCoeffModifier,
1648         RSAnimatableProperty<Vector4f>>(RSModifierType::FG_BRIGHTNESS_POSCOEFF, coeff);
1649 }
1650 
SetFgBrightnessNegCoeff(const Vector4f & coeff)1651 void RSNode::SetFgBrightnessNegCoeff(const Vector4f& coeff)
1652 {
1653     SetProperty<RSFgBrightnessNegCoeffModifier,
1654         RSAnimatableProperty<Vector4f>>(RSModifierType::FG_BRIGHTNESS_NEGCOEFF, coeff);
1655 }
1656 
SetFgBrightnessFract(const float & fract)1657 void RSNode::SetFgBrightnessFract(const float& fract)
1658 {
1659     SetProperty<RSFgBrightnessFractModifier,
1660         RSAnimatableProperty<float>>(RSModifierType::FG_BRIGHTNESS_FRACTION, fract);
1661 }
1662 
SetBgBrightnessParams(const RSDynamicBrightnessPara & params)1663 void RSNode::SetBgBrightnessParams(const RSDynamicBrightnessPara& params)
1664 {
1665     // Compatible with original interfaces
1666     SetBgBrightnessRates(params.rates_);
1667     SetBgBrightnessSaturation(params.saturation_);
1668     SetBgBrightnessPosCoeff(params.posCoeff_);
1669     SetBgBrightnessNegCoeff(params.negCoeff_);
1670 }
1671 
SetBgBrightnessRates(const Vector4f & rates)1672 void RSNode::SetBgBrightnessRates(const Vector4f& rates)
1673 {
1674     SetProperty<RSBgBrightnessRatesModifier,
1675         RSAnimatableProperty<Vector4f>>(RSModifierType::BG_BRIGHTNESS_RATES, rates);
1676 }
1677 
SetBgBrightnessSaturation(const float & saturation)1678 void RSNode::SetBgBrightnessSaturation(const float& saturation)
1679 {
1680     SetProperty<RSBgBrightnessSaturationModifier,
1681         RSAnimatableProperty<float>>(RSModifierType::BG_BRIGHTNESS_SATURATION, saturation);
1682 }
1683 
SetBgBrightnessPosCoeff(const Vector4f & coeff)1684 void RSNode::SetBgBrightnessPosCoeff(const Vector4f& coeff)
1685 {
1686     SetProperty<RSBgBrightnessPosCoeffModifier,
1687         RSAnimatableProperty<Vector4f>>(RSModifierType::BG_BRIGHTNESS_POSCOEFF, coeff);
1688 }
1689 
SetBgBrightnessNegCoeff(const Vector4f & coeff)1690 void RSNode::SetBgBrightnessNegCoeff(const Vector4f& coeff)
1691 {
1692     SetProperty<RSBgBrightnessNegCoeffModifier,
1693         RSAnimatableProperty<Vector4f>>(RSModifierType::BG_BRIGHTNESS_NEGCOEFF, coeff);
1694 }
1695 
SetBgBrightnessFract(const float & fract)1696 void RSNode::SetBgBrightnessFract(const float& fract)
1697 {
1698     SetProperty<RSBgBrightnessFractModifier,
1699         RSAnimatableProperty<float>>(RSModifierType::BG_BRIGHTNESS_FRACTION, fract);
1700 }
1701 
SetDynamicDimDegree(const float dimDegree)1702 void RSNode::SetDynamicDimDegree(const float dimDegree)
1703 {
1704     SetProperty<RSDynamicDimDegreeModifier,
1705         RSAnimatableProperty<float>>(RSModifierType::DYNAMIC_DIM_DEGREE, dimDegree);
1706 }
1707 
SetGreyCoef(const Vector2f greyCoef)1708 void RSNode::SetGreyCoef(const Vector2f greyCoef)
1709 {
1710     SetProperty<RSGreyCoefModifier, RSAnimatableProperty<Vector2f>>(RSModifierType::GREY_COEF, greyCoef);
1711 }
1712 
SetCompositingFilter(const std::shared_ptr<RSFilter> & compositingFilter)1713 void RSNode::SetCompositingFilter(const std::shared_ptr<RSFilter>& compositingFilter) {}
1714 
SetShadowColor(uint32_t colorValue)1715 void RSNode::SetShadowColor(uint32_t colorValue)
1716 {
1717     auto color = Color::FromArgbInt(colorValue);
1718     SetProperty<RSShadowColorModifier, RSAnimatableProperty<Color>>(RSModifierType::SHADOW_COLOR, color);
1719 }
1720 
SetShadowOffset(float offsetX,float offsetY)1721 void RSNode::SetShadowOffset(float offsetX, float offsetY)
1722 {
1723     SetShadowOffsetX(offsetX);
1724     SetShadowOffsetY(offsetY);
1725 }
1726 
SetShadowOffsetX(float offsetX)1727 void RSNode::SetShadowOffsetX(float offsetX)
1728 {
1729     SetProperty<RSShadowOffsetXModifier, RSAnimatableProperty<float>>(RSModifierType::SHADOW_OFFSET_X, offsetX);
1730 }
1731 
SetShadowOffsetY(float offsetY)1732 void RSNode::SetShadowOffsetY(float offsetY)
1733 {
1734     SetProperty<RSShadowOffsetYModifier, RSAnimatableProperty<float>>(RSModifierType::SHADOW_OFFSET_Y, offsetY);
1735 }
1736 
SetShadowAlpha(float alpha)1737 void RSNode::SetShadowAlpha(float alpha)
1738 {
1739     SetProperty<RSShadowAlphaModifier, RSAnimatableProperty<float>>(RSModifierType::SHADOW_ALPHA, alpha);
1740 }
1741 
SetShadowElevation(float elevation)1742 void RSNode::SetShadowElevation(float elevation)
1743 {
1744     SetProperty<RSShadowRadiusModifier, RSAnimatableProperty<float>>(RSModifierType::SHADOW_RADIUS, 0);
1745     SetProperty<RSShadowElevationModifier, RSAnimatableProperty<float>>(RSModifierType::SHADOW_ELEVATION, elevation);
1746 }
1747 
SetShadowRadius(float radius)1748 void RSNode::SetShadowRadius(float radius)
1749 {
1750     SetProperty<RSShadowElevationModifier, RSAnimatableProperty<float>>(RSModifierType::SHADOW_ELEVATION, 0);
1751     SetProperty<RSShadowRadiusModifier, RSAnimatableProperty<float>>(RSModifierType::SHADOW_RADIUS, radius);
1752 }
1753 
SetShadowPath(const std::shared_ptr<RSPath> & shadowPath)1754 void RSNode::SetShadowPath(const std::shared_ptr<RSPath>& shadowPath)
1755 {
1756     SetProperty<RSShadowPathModifier, RSProperty<std::shared_ptr<RSPath>>>(RSModifierType::SHADOW_PATH, shadowPath);
1757 }
1758 
SetShadowMask(bool shadowMask)1759 void RSNode::SetShadowMask(bool shadowMask)
1760 {
1761     SetProperty<RSShadowMaskModifier, RSProperty<bool>>(RSModifierType::SHADOW_MASK, shadowMask);
1762 }
1763 
SetShadowIsFilled(bool shadowIsFilled)1764 void RSNode::SetShadowIsFilled(bool shadowIsFilled)
1765 {
1766     SetProperty<RSShadowIsFilledModifier, RSProperty<bool>>(RSModifierType::SHADOW_IS_FILLED, shadowIsFilled);
1767 }
1768 
SetShadowColorStrategy(int shadowColorStrategy)1769 void RSNode::SetShadowColorStrategy(int shadowColorStrategy)
1770 {
1771     SetProperty<RSShadowColorStrategyModifier, RSProperty<int>>(
1772         RSModifierType::SHADOW_COLOR_STRATEGY, shadowColorStrategy);
1773 }
1774 
SetFrameGravity(Gravity gravity)1775 void RSNode::SetFrameGravity(Gravity gravity)
1776 {
1777     ROSEN_LOGD("RSNode::SetFrameGravity, gravity = %{public}d", gravity);
1778     SetProperty<RSFrameGravityModifier, RSProperty<Gravity>>(RSModifierType::FRAME_GRAVITY, gravity);
1779 }
1780 
SetClipRRect(const Vector4f & clipRect,const Vector4f & clipRadius)1781 void RSNode::SetClipRRect(const Vector4f& clipRect, const Vector4f& clipRadius)
1782 {
1783     SetClipRRect(std::make_shared<RRect>(clipRect, clipRadius));
1784 }
1785 
SetClipRRect(const std::shared_ptr<RRect> & rrect)1786 void RSNode::SetClipRRect(const std::shared_ptr<RRect>& rrect)
1787 {
1788     SetProperty<RSClipRRectModifier, RSAnimatableProperty<RRect>>(
1789         RSModifierType::CLIP_RRECT, rrect ? *rrect : RRect());
1790 }
1791 
SetClipBounds(const std::shared_ptr<RSPath> & path)1792 void RSNode::SetClipBounds(const std::shared_ptr<RSPath>& path)
1793 {
1794     SetProperty<RSClipBoundsModifier, RSProperty<std::shared_ptr<RSPath>>>(RSModifierType::CLIP_BOUNDS, path);
1795 }
1796 
SetClipToBounds(bool clipToBounds)1797 void RSNode::SetClipToBounds(bool clipToBounds)
1798 {
1799     SetProperty<RSClipToBoundsModifier, RSProperty<bool>>(RSModifierType::CLIP_TO_BOUNDS, clipToBounds);
1800 }
1801 
SetClipToFrame(bool clipToFrame)1802 void RSNode::SetClipToFrame(bool clipToFrame)
1803 {
1804     SetProperty<RSClipToFrameModifier, RSProperty<bool>>(RSModifierType::CLIP_TO_FRAME, clipToFrame);
1805 }
1806 
SetCustomClipToFrame(const Vector4f & clipRect)1807 void RSNode::SetCustomClipToFrame(const Vector4f& clipRect)
1808 {
1809     SetProperty<RSCustomClipToFrameModifier, RSAnimatableProperty<Vector4f>>(
1810         RSModifierType::CUSTOM_CLIP_TO_FRAME, clipRect);
1811 }
1812 
SetVisible(bool visible)1813 void RSNode::SetVisible(bool visible)
1814 {
1815     // kick off transition only if it's on tree(has valid parent) and visibility is changed.
1816     if (transitionEffect_ != nullptr && GetParent() != nullptr && visible != GetStagingProperties().GetVisible()) {
1817         NotifyTransition(transitionEffect_, visible);
1818     }
1819 
1820     SetProperty<RSVisibleModifier, RSProperty<bool>>(RSModifierType::VISIBLE, visible);
1821 }
1822 
SetMask(const std::shared_ptr<RSMask> & mask)1823 void RSNode::SetMask(const std::shared_ptr<RSMask>& mask)
1824 {
1825     SetProperty<RSMaskModifier, RSProperty<std::shared_ptr<RSMask>>>(RSModifierType::MASK, mask);
1826 }
1827 
SetUseEffect(bool useEffect)1828 void RSNode::SetUseEffect(bool useEffect)
1829 {
1830     SetProperty<RSUseEffectModifier, RSProperty<bool>>(RSModifierType::USE_EFFECT, useEffect);
1831 }
1832 
SetUseEffectType(UseEffectType useEffectType)1833 void RSNode::SetUseEffectType(UseEffectType useEffectType)
1834 {
1835     SetProperty<RSUseEffectTypeModifier, RSProperty<int>>(
1836         RSModifierType::USE_EFFECT_TYPE, static_cast<int>(useEffectType));
1837 }
1838 
SetUseShadowBatching(bool useShadowBatching)1839 void RSNode::SetUseShadowBatching(bool useShadowBatching)
1840 {
1841     SetProperty<RSUseShadowBatchingModifier, RSProperty<bool>>(RSModifierType::USE_SHADOW_BATCHING, useShadowBatching);
1842 }
1843 
SetColorBlendMode(RSColorBlendMode colorBlendMode)1844 void RSNode::SetColorBlendMode(RSColorBlendMode colorBlendMode)
1845 {
1846     SetProperty<RSColorBlendModeModifier, RSProperty<int>>(
1847         RSModifierType::COLOR_BLEND_MODE, static_cast<int>(colorBlendMode));
1848 }
1849 
SetColorBlendApplyType(RSColorBlendApplyType colorBlendApplyType)1850 void RSNode::SetColorBlendApplyType(RSColorBlendApplyType colorBlendApplyType)
1851 {
1852     SetProperty<RSColorBlendApplyTypeModifier, RSProperty<int>>(
1853         RSModifierType::COLOR_BLEND_APPLY_TYPE, static_cast<int>(colorBlendApplyType));
1854 }
1855 
SetPixelStretch(const Vector4f & stretchSize,Drawing::TileMode stretchTileMode)1856 void RSNode::SetPixelStretch(const Vector4f& stretchSize, Drawing::TileMode stretchTileMode)
1857 {
1858     SetProperty<RSPixelStretchModifier, RSAnimatableProperty<Vector4f>>(RSModifierType::PIXEL_STRETCH, stretchSize);
1859     SetProperty<RSPixelStretchTileModeModifier, RSProperty<int>>(
1860         RSModifierType::PIXEL_STRETCH_TILE_MODE, static_cast<int>(stretchTileMode));
1861 }
1862 
SetPixelStretchPercent(const Vector4f & stretchPercent,Drawing::TileMode stretchTileMode)1863 void RSNode::SetPixelStretchPercent(const Vector4f& stretchPercent, Drawing::TileMode stretchTileMode)
1864 {
1865     SetProperty<RSPixelStretchPercentModifier, RSAnimatableProperty<Vector4f>>(RSModifierType::PIXEL_STRETCH_PERCENT,
1866         stretchPercent);
1867     SetProperty<RSPixelStretchTileModeModifier, RSProperty<int>>(
1868         RSModifierType::PIXEL_STRETCH_TILE_MODE, static_cast<int>(stretchTileMode));
1869 }
1870 
SetWaterRippleParams(const RSWaterRipplePara & params,float progress)1871 void RSNode::SetWaterRippleParams(const RSWaterRipplePara& params, float progress)
1872 {
1873     SetProperty<RSWaterRippleParamsModifier,
1874         RSProperty<RSWaterRipplePara>>(RSModifierType::WATER_RIPPLE_PARAMS, params);
1875     SetProperty<RSWaterRippleProgressModifier,
1876         RSAnimatableProperty<float>>(RSModifierType::WATER_RIPPLE_PROGRESS, progress);
1877 }
1878 
SetFlyOutParams(const RSFlyOutPara & params,float degree)1879 void RSNode::SetFlyOutParams(const RSFlyOutPara& params, float degree)
1880 {
1881     SetProperty<RSFlyOutParamsModifier,
1882         RSProperty<RSFlyOutPara>>(RSModifierType::FLY_OUT_PARAMS, params);
1883     SetProperty<RSFlyOutDegreeModifier,
1884         RSAnimatableProperty<float>>(RSModifierType::FLY_OUT_DEGREE, degree);
1885 }
1886 
SetDistortionK(const float distortionK)1887 void RSNode::SetDistortionK(const float distortionK)
1888 {
1889     SetProperty<RSDistortionKModifier, RSAnimatableProperty<float>>(RSModifierType::DISTORTION_K, distortionK);
1890 }
1891 
SetFreeze(bool isFreeze)1892 void RSNode::SetFreeze(bool isFreeze)
1893 {
1894     ROSEN_LOGE("SetFreeze only support RSSurfaceNode and RSCanvasNode in uniRender");
1895 }
1896 
SetNodeName(const std::string & nodeName)1897 void RSNode::SetNodeName(const std::string& nodeName)
1898 {
1899     if (nodeName_ != nodeName) {
1900         nodeName_ = nodeName;
1901         std::unique_ptr<RSCommand> command = std::make_unique<RSSetNodeName>(GetId(), nodeName_);
1902         auto transactionProxy = RSTransactionProxy::GetInstance();
1903         if (transactionProxy != nullptr) {
1904             transactionProxy->AddCommand(command, IsRenderServiceNode());
1905         }
1906     }
1907 }
1908 
SetTakeSurfaceForUIFlag()1909 void RSNode::SetTakeSurfaceForUIFlag()
1910 {
1911     auto transactionProxy = RSTransactionProxy::GetInstance();
1912     if (transactionProxy != nullptr) {
1913         transactionProxy->FlushImplicitTransaction();
1914     }
1915 }
1916 
SetSpherizeDegree(float spherizeDegree)1917 void RSNode::SetSpherizeDegree(float spherizeDegree)
1918 {
1919     SetProperty<RSSpherizeModifier, RSAnimatableProperty<float>>(RSModifierType::SPHERIZE, spherizeDegree);
1920 }
1921 
SetAttractionEffect(float fraction,const Vector2f & destinationPoint)1922 void RSNode::SetAttractionEffect(float fraction, const Vector2f& destinationPoint)
1923 {
1924     SetAttractionEffectFraction(fraction);
1925     SetAttractionEffectDstPoint(destinationPoint);
1926 }
1927 
SetAttractionEffectFraction(float fraction)1928 void RSNode::SetAttractionEffectFraction(float fraction)
1929 {
1930     SetProperty<RSAttractionFractionModifier, RSAnimatableProperty<float>>(RSModifierType::ATTRACTION_FRACTION,
1931         fraction);
1932 }
1933 
SetAttractionEffectDstPoint(const Vector2f & destinationPoint)1934 void RSNode::SetAttractionEffectDstPoint(const Vector2f& destinationPoint)
1935 {
1936     SetProperty<RSAttractionDstPointModifier, RSAnimatableProperty<Vector2f>>(RSModifierType::ATTRACTION_DSTPOINT,
1937         destinationPoint);
1938 }
1939 
SetLightUpEffectDegree(float LightUpEffectDegree)1940 void RSNode::SetLightUpEffectDegree(float LightUpEffectDegree)
1941 {
1942     SetProperty<RSLightUpEffectModifier, RSAnimatableProperty<float>>(
1943         RSModifierType::LIGHT_UP_EFFECT, LightUpEffectDegree);
1944 }
1945 
NotifyTransition(const std::shared_ptr<const RSTransitionEffect> & effect,bool isTransitionIn)1946 void RSNode::NotifyTransition(const std::shared_ptr<const RSTransitionEffect>& effect, bool isTransitionIn)
1947 {
1948     // temporary fix for multithread issue in implicit animator
1949     UpdateImplicitAnimator();
1950     if (implicitAnimator_ == nullptr) {
1951         ROSEN_LOGE("Failed to notify transition, implicit animator is null!");
1952         return;
1953     }
1954 
1955     if (!implicitAnimator_->NeedImplicitAnimation()) {
1956         return;
1957     }
1958 
1959     auto& customEffects = isTransitionIn ? effect->customTransitionInEffects_ : effect->customTransitionOutEffects_;
1960     // temporary close the implicit animation
1961     ExecuteWithoutAnimation(
1962         [&customEffects] {
1963             for (auto& customEffect : customEffects) {
1964                 customEffect->Active();
1965             }
1966         },
1967         implicitAnimator_);
1968 
1969     implicitAnimator_->BeginImplicitTransition(effect, isTransitionIn);
1970     for (auto& customEffect : customEffects) {
1971         customEffect->Identity();
1972     }
1973     implicitAnimator_->CreateImplicitTransition(*this);
1974     implicitAnimator_->EndImplicitTransition();
1975 }
1976 
OnAddChildren()1977 void RSNode::OnAddChildren()
1978 {
1979     // kick off transition only if it's visible.
1980     if (transitionEffect_ != nullptr && GetStagingProperties().GetVisible()) {
1981         NotifyTransition(transitionEffect_, true);
1982     }
1983 }
1984 
OnRemoveChildren()1985 void RSNode::OnRemoveChildren()
1986 {
1987     // kick off transition only if it's visible.
1988     if (transitionEffect_ != nullptr && GetStagingProperties().GetVisible()) {
1989         NotifyTransition(transitionEffect_, false);
1990     }
1991 }
1992 
SetBackgroundBlurRadius(float radius)1993 void RSNode::SetBackgroundBlurRadius(float radius)
1994 {
1995     SetProperty<RSBackgroundBlurRadiusModifier, RSAnimatableProperty<float>>(
1996         RSModifierType::BACKGROUND_BLUR_RADIUS, radius);
1997 }
1998 
SetBackgroundBlurSaturation(float saturation)1999 void RSNode::SetBackgroundBlurSaturation(float saturation)
2000 {
2001     SetProperty<RSBackgroundBlurSaturationModifier, RSAnimatableProperty<float>>(
2002         RSModifierType::BACKGROUND_BLUR_SATURATION, saturation);
2003 }
2004 
SetBackgroundBlurBrightness(float brightness)2005 void RSNode::SetBackgroundBlurBrightness(float brightness)
2006 {
2007     SetProperty<RSBackgroundBlurBrightnessModifier, RSAnimatableProperty<float>>(
2008         RSModifierType::BACKGROUND_BLUR_BRIGHTNESS, brightness);
2009 }
2010 
SetBackgroundBlurMaskColor(Color maskColor)2011 void RSNode::SetBackgroundBlurMaskColor(Color maskColor)
2012 {
2013     SetProperty<RSBackgroundBlurMaskColorModifier, RSAnimatableProperty<Color>>(
2014         RSModifierType::BACKGROUND_BLUR_MASK_COLOR, maskColor);
2015 }
2016 
SetBackgroundBlurColorMode(int colorMode)2017 void RSNode::SetBackgroundBlurColorMode(int colorMode)
2018 {
2019     SetProperty<RSBackgroundBlurColorModeModifier, RSProperty<int>>(
2020         RSModifierType::BACKGROUND_BLUR_COLOR_MODE, colorMode);
2021 }
2022 
SetBackgroundBlurRadiusX(float blurRadiusX)2023 void RSNode::SetBackgroundBlurRadiusX(float blurRadiusX)
2024 {
2025     SetProperty<RSBackgroundBlurRadiusXModifier, RSAnimatableProperty<float>>(
2026         RSModifierType::BACKGROUND_BLUR_RADIUS_X, blurRadiusX);
2027 }
2028 
SetBackgroundBlurRadiusY(float blurRadiusY)2029 void RSNode::SetBackgroundBlurRadiusY(float blurRadiusY)
2030 {
2031     SetProperty<RSBackgroundBlurRadiusYModifier, RSAnimatableProperty<float>>(
2032         RSModifierType::BACKGROUND_BLUR_RADIUS_Y, blurRadiusY);
2033 }
2034 
SetForegroundBlurRadius(float radius)2035 void RSNode::SetForegroundBlurRadius(float radius)
2036 {
2037     SetProperty<RSForegroundBlurRadiusModifier, RSAnimatableProperty<float>>(
2038         RSModifierType::FOREGROUND_BLUR_RADIUS, radius);
2039 }
2040 
SetForegroundBlurSaturation(float saturation)2041 void RSNode::SetForegroundBlurSaturation(float saturation)
2042 {
2043     SetProperty<RSForegroundBlurSaturationModifier, RSAnimatableProperty<float>>(
2044         RSModifierType::FOREGROUND_BLUR_SATURATION, saturation);
2045 }
2046 
SetForegroundBlurBrightness(float brightness)2047 void RSNode::SetForegroundBlurBrightness(float brightness)
2048 {
2049     SetProperty<RSForegroundBlurBrightnessModifier, RSAnimatableProperty<float>>(
2050         RSModifierType::FOREGROUND_BLUR_BRIGHTNESS, brightness);
2051 }
2052 
SetForegroundBlurMaskColor(Color maskColor)2053 void RSNode::SetForegroundBlurMaskColor(Color maskColor)
2054 {
2055     SetProperty<RSForegroundBlurMaskColorModifier, RSAnimatableProperty<Color>>(
2056         RSModifierType::FOREGROUND_BLUR_MASK_COLOR, maskColor);
2057 }
2058 
SetForegroundBlurColorMode(int colorMode)2059 void RSNode::SetForegroundBlurColorMode(int colorMode)
2060 {
2061     SetProperty<RSForegroundBlurColorModeModifier, RSProperty<int>>(
2062         RSModifierType::FOREGROUND_BLUR_COLOR_MODE, colorMode);
2063 }
2064 
SetForegroundBlurRadiusX(float blurRadiusX)2065 void RSNode::SetForegroundBlurRadiusX(float blurRadiusX)
2066 {
2067     SetProperty<RSForegroundBlurRadiusXModifier, RSAnimatableProperty<float>>(
2068         RSModifierType::FOREGROUND_BLUR_RADIUS_X, blurRadiusX);
2069 }
2070 
SetForegroundBlurRadiusY(float blurRadiusY)2071 void RSNode::SetForegroundBlurRadiusY(float blurRadiusY)
2072 {
2073     SetProperty<RSForegroundBlurRadiusYModifier, RSAnimatableProperty<float>>(
2074         RSModifierType::FOREGROUND_BLUR_RADIUS_Y, blurRadiusY);
2075 }
2076 
AnimationCallback(AnimationId animationId,AnimationCallbackEvent event)2077 bool RSNode::AnimationCallback(AnimationId animationId, AnimationCallbackEvent event)
2078 {
2079     std::shared_ptr<RSAnimation> animation = nullptr;
2080     {
2081         std::unique_lock<std::recursive_mutex> lock(animationMutex_);
2082         auto animationItr = animations_.find(animationId);
2083         if (animationItr == animations_.end()) {
2084             ROSEN_LOGE("Failed to find animation[%{public}" PRIu64 "]!", animationId);
2085             return false;
2086         }
2087         animation = animationItr->second;
2088     }
2089 
2090     if (animation == nullptr) {
2091         ROSEN_LOGE("Failed to callback animation[%{public}" PRIu64 "], animation is null!", animationId);
2092         return false;
2093     }
2094     if (event == FINISHED) {
2095         RemoveAnimationInner(animation);
2096         animation->CallFinishCallback();
2097         return true;
2098     } else if (event == REPEAT_FINISHED) {
2099         animation->CallRepeatCallback();
2100         return true;
2101     } else if (event == LOGICALLY_FINISHED) {
2102         animation->CallLogicallyFinishCallback();
2103         return true;
2104     }
2105     ROSEN_LOGE("Failed to callback animation event[%{public}d], event is null!", event);
2106     return false;
2107 }
2108 
SetPaintOrder(bool drawContentLast)2109 void RSNode::SetPaintOrder(bool drawContentLast)
2110 {
2111     drawContentLast_ = drawContentLast;
2112 }
2113 
ClearAllModifiers()2114 void RSNode::ClearAllModifiers()
2115 {
2116     std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
2117     for (auto [id, modifier] : modifiers_) {
2118         if (modifier) {
2119             modifier->DetachFromNode();
2120         }
2121     }
2122     modifiers_.clear();
2123     propertyModifiers_.clear();
2124     modifiersTypeMap_.clear();
2125 }
2126 
AddModifier(const std::shared_ptr<RSModifier> modifier)2127 void RSNode::AddModifier(const std::shared_ptr<RSModifier> modifier)
2128 {
2129     {
2130         std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
2131         if (!modifier || modifiers_.count(modifier->GetPropertyId())) {
2132             return;
2133         }
2134         if (motionPathOption_ != nullptr && IsPathAnimatableModifier(modifier->GetModifierType())) {
2135             modifier->SetMotionPathOption(motionPathOption_);
2136         }
2137         auto rsnode = std::static_pointer_cast<RSNode>(shared_from_this());
2138         modifier->AttachToNode(rsnode);
2139         modifiers_.emplace(modifier->GetPropertyId(), modifier);
2140         modifiersTypeMap_.emplace((int16_t)modifier->GetModifierType(), modifier);
2141     }
2142     if (modifier->GetModifierType() == RSModifierType::NODE_MODIFIER) {
2143         return;
2144     }
2145     std::unique_ptr<RSCommand> command = std::make_unique<RSAddModifier>(GetId(), modifier->CreateRenderModifier());
2146     auto transactionProxy = RSTransactionProxy::GetInstance();
2147     if (transactionProxy != nullptr) {
2148         transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), GetId());
2149         if (NeedForcedSendToRemote()) {
2150             std::unique_ptr<RSCommand> cmdForRemote =
2151                 std::make_unique<RSAddModifier>(GetId(), modifier->CreateRenderModifier());
2152             transactionProxy->AddCommand(cmdForRemote, true, GetFollowType(), GetId());
2153         }
2154     }
2155 }
2156 
DoFlushModifier()2157 void RSNode::DoFlushModifier()
2158 {
2159     std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
2160     if (modifiers_.empty()) {
2161         return;
2162     }
2163     auto transactionProxy = RSTransactionProxy::GetInstance();
2164     if (transactionProxy == nullptr) {
2165         return;
2166     }
2167     std::unique_ptr<RSCommand> removeAllModifiersCommand = std::make_unique<RSRemoveAllModifiers>(GetId());
2168     transactionProxy->AddCommand(removeAllModifiersCommand, IsRenderServiceNode(), GetFollowType(), GetId());
2169     for (const auto& [_, modifier] : modifiers_) {
2170         std::unique_ptr<RSCommand> command = std::make_unique<RSAddModifier>(GetId(), modifier->CreateRenderModifier());
2171         transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), GetId());
2172     }
2173 }
2174 
RemoveModifier(const std::shared_ptr<RSModifier> modifier)2175 void RSNode::RemoveModifier(const std::shared_ptr<RSModifier> modifier)
2176 {
2177     {
2178         std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
2179         if (!modifier) {
2180             return;
2181         }
2182         auto iter = modifiers_.find(modifier->GetPropertyId());
2183         if (iter == modifiers_.end()) {
2184             return;
2185         }
2186         auto deleteType = modifier->GetModifierType();
2187         modifiers_.erase(iter);
2188         bool isExist = false;
2189         for (auto [id, value] : modifiers_) {
2190             if (value && value->GetModifierType() == deleteType) {
2191                 modifiersTypeMap_.emplace((int16_t)deleteType, value);
2192                 isExist = true;
2193                 break;
2194             }
2195         }
2196         if (!isExist) {
2197             modifiersTypeMap_.erase((int16_t)deleteType);
2198         }
2199         modifier->DetachFromNode();
2200     }
2201     std::unique_ptr<RSCommand> command = std::make_unique<RSRemoveModifier>(GetId(), modifier->GetPropertyId());
2202     auto transactionProxy = RSTransactionProxy::GetInstance();
2203     if (transactionProxy != nullptr) {
2204         transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), GetId());
2205         if (NeedForcedSendToRemote()) {
2206             std::unique_ptr<RSCommand> cmdForRemote =
2207                 std::make_unique<RSRemoveModifier>(GetId(), modifier->GetPropertyId());
2208             transactionProxy->AddCommand(cmdForRemote, true, GetFollowType(), GetId());
2209         }
2210     }
2211 }
2212 
GetModifier(const PropertyId & propertyId)2213 const std::shared_ptr<RSModifier> RSNode::GetModifier(const PropertyId& propertyId)
2214 {
2215     std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
2216     auto iter = modifiers_.find(propertyId);
2217     if (iter != modifiers_.end()) {
2218         return iter->second;
2219     }
2220 
2221     return {};
2222 }
2223 
UpdateModifierMotionPathOption()2224 void RSNode::UpdateModifierMotionPathOption()
2225 {
2226     std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
2227     for (auto& [type, modifier] : propertyModifiers_) {
2228         if (IsPathAnimatableModifier(type)) {
2229             modifier->SetMotionPathOption(motionPathOption_);
2230         }
2231     }
2232     for (auto& [id, modifier] : modifiers_) {
2233         if (IsPathAnimatableModifier(modifier->GetModifierType())) {
2234             modifier->SetMotionPathOption(motionPathOption_);
2235         }
2236     }
2237 }
2238 
UpdateImplicitAnimator()2239 void RSNode::UpdateImplicitAnimator()
2240 {
2241     auto tid = gettid();
2242     if (tid == implicitAnimatorTid_) {
2243         return;
2244     }
2245     implicitAnimatorTid_ = tid;
2246     implicitAnimator_ = RSImplicitAnimatorMap::Instance().GetAnimator(tid);
2247 }
2248 
GetModifierIds() const2249 std::vector<PropertyId> RSNode::GetModifierIds() const
2250 {
2251     std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
2252     std::vector<PropertyId> ids;
2253     for (const auto& [id, _] : modifiers_) {
2254         ids.push_back(id);
2255     }
2256     return ids;
2257 }
2258 
MarkAllExtendModifierDirty()2259 void RSNode::MarkAllExtendModifierDirty()
2260 {
2261     std::unique_lock<std::recursive_mutex> lock(propertyMutex_);
2262     if (extendModifierIsDirty_) {
2263         return;
2264     }
2265 
2266     extendModifierIsDirty_ = true;
2267     for (auto& [id, modifier] : modifiers_) {
2268         if (modifier->GetModifierType() < RSModifierType::CUSTOM) {
2269             continue;
2270         }
2271         modifier->SetDirty(true);
2272     }
2273 }
2274 
ResetExtendModifierDirty()2275 void RSNode::ResetExtendModifierDirty()
2276 {
2277     extendModifierIsDirty_ = false;
2278 }
2279 
SetIsCustomTextType(bool isCustomTextType)2280 void RSNode::SetIsCustomTextType(bool isCustomTextType)
2281 {
2282     isCustomTextType_ = isCustomTextType;
2283 }
2284 
GetIsCustomTextType()2285 bool RSNode::GetIsCustomTextType()
2286 {
2287     return isCustomTextType_;
2288 }
2289 
SetIsCustomTypeface(bool isCustomTypeface)2290 void RSNode::SetIsCustomTypeface(bool isCustomTypeface)
2291 {
2292     isCustomTypeface_ = isCustomTypeface;
2293 }
2294 
GetIsCustomTypeface()2295 bool RSNode::GetIsCustomTypeface()
2296 {
2297     return isCustomTypeface_;
2298 }
2299 
SetDrawRegion(std::shared_ptr<RectF> rect)2300 void RSNode::SetDrawRegion(std::shared_ptr<RectF> rect)
2301 {
2302     if (drawRegion_ != rect) {
2303         drawRegion_ = rect;
2304         std::unique_ptr<RSCommand> command = std::make_unique<RSSetDrawRegion>(GetId(), rect);
2305         auto transactionProxy = RSTransactionProxy::GetInstance();
2306         if (transactionProxy != nullptr) {
2307             transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), GetId());
2308         }
2309     }
2310 }
2311 
RegisterTransitionPair(NodeId inNodeId,NodeId outNodeId)2312 void RSNode::RegisterTransitionPair(NodeId inNodeId, NodeId outNodeId)
2313 {
2314     std::unique_ptr<RSCommand> command =
2315         std::make_unique<RSRegisterGeometryTransitionNodePair>(inNodeId, outNodeId);
2316     auto transactionProxy = RSTransactionProxy::GetInstance();
2317     if (transactionProxy != nullptr) {
2318         transactionProxy->AddCommand(command, true);
2319     }
2320 }
2321 
UnregisterTransitionPair(NodeId inNodeId,NodeId outNodeId)2322 void RSNode::UnregisterTransitionPair(NodeId inNodeId, NodeId outNodeId)
2323 {
2324     std::unique_ptr<RSCommand> command =
2325         std::make_unique<RSUnregisterGeometryTransitionNodePair>(inNodeId, outNodeId);
2326     auto transactionProxy = RSTransactionProxy::GetInstance();
2327     if (transactionProxy != nullptr) {
2328         transactionProxy->AddCommand(command, true);
2329     }
2330 }
2331 
MarkNodeGroup(bool isNodeGroup,bool isForced,bool includeProperty)2332 void RSNode::MarkNodeGroup(bool isNodeGroup, bool isForced, bool includeProperty)
2333 {
2334     if (isNodeGroup_ == isNodeGroup) {
2335         return;
2336     }
2337     isNodeGroup_ = isNodeGroup;
2338     std::unique_ptr<RSCommand> command = std::make_unique<RSMarkNodeGroup>(GetId(), isNodeGroup, isForced,
2339         includeProperty);
2340     auto transactionProxy = RSTransactionProxy::GetInstance();
2341     if (transactionProxy != nullptr) {
2342         transactionProxy->AddCommand(command, IsRenderServiceNode());
2343     }
2344 }
2345 
MarkNodeSingleFrameComposer(bool isNodeSingleFrameComposer)2346 void RSNode::MarkNodeSingleFrameComposer(bool isNodeSingleFrameComposer)
2347 {
2348     if (isNodeSingleFrameComposer_ != isNodeSingleFrameComposer) {
2349         isNodeSingleFrameComposer_ = isNodeSingleFrameComposer;
2350         std::unique_ptr<RSCommand> command =
2351             std::make_unique<RSMarkNodeSingleFrameComposer>(GetId(), isNodeSingleFrameComposer, GetRealPid());
2352         auto transactionProxy = RSTransactionProxy::GetInstance();
2353         if (transactionProxy != nullptr) {
2354             transactionProxy->AddCommand(command, IsRenderServiceNode());
2355         }
2356     }
2357 }
2358 
MarkSuggestOpincNode(bool isOpincNode,bool isNeedCalculate)2359 void RSNode::MarkSuggestOpincNode(bool isOpincNode, bool isNeedCalculate)
2360 {
2361     if (isSuggestOpincNode_ == isOpincNode) {
2362         return;
2363     }
2364     isSuggestOpincNode_ = isOpincNode;
2365     std::unique_ptr<RSCommand> command = std::make_unique<RSMarkSuggestOpincNode>(GetId(),
2366         isOpincNode, isNeedCalculate);
2367     auto transactionProxy = RSTransactionProxy::GetInstance();
2368     if (transactionProxy != nullptr) {
2369         transactionProxy->AddCommand(command, IsRenderServiceNode());
2370     }
2371 }
2372 
MarkUifirstNode(bool isUifirstNode)2373 void RSNode::MarkUifirstNode(bool isUifirstNode)
2374 {
2375     if (isUifirstNode_ == isUifirstNode) {
2376         return;
2377     }
2378     isUifirstNode_ = isUifirstNode;
2379     std::unique_ptr<RSCommand> command = std::make_unique<RSMarkUifirstNode>(GetId(), isUifirstNode);
2380     auto transactionProxy = RSTransactionProxy::GetInstance();
2381     if (transactionProxy != nullptr) {
2382         transactionProxy->AddCommand(command, IsRenderServiceNode());
2383     }
2384 }
2385 
MarkUifirstNode(bool isForceFlag,bool isUifirstEnable)2386 void RSNode::MarkUifirstNode(bool isForceFlag, bool isUifirstEnable)
2387 {
2388     if (isForceFlag == isForceFlag_ && isUifirstEnable_ == isUifirstEnable) {
2389         return;
2390     }
2391     isForceFlag_ = isForceFlag;
2392     isUifirstEnable_ = isUifirstEnable;
2393     std::unique_ptr<RSCommand> command = std::make_unique<RSForceUifirstNode>(GetId(), isForceFlag, isUifirstEnable);
2394     auto transactionProxy = RSTransactionProxy::GetInstance();
2395     if (transactionProxy != nullptr) {
2396         transactionProxy->AddCommand(command, IsRenderServiceNode());
2397     }
2398 }
2399 
SetGrayScale(float grayScale)2400 void RSNode::SetGrayScale(float grayScale)
2401 {
2402     SetProperty<RSGrayScaleModifier, RSAnimatableProperty<float>>(RSModifierType::GRAY_SCALE, grayScale);
2403 }
2404 
SetLightIntensity(float lightIntensity)2405 void RSNode::SetLightIntensity(float lightIntensity)
2406 {
2407     SetProperty<RSLightIntensityModifier, RSAnimatableProperty<float>>(RSModifierType::LIGHT_INTENSITY, lightIntensity);
2408 }
2409 
SetLightColor(uint32_t lightColorValue)2410 void RSNode::SetLightColor(uint32_t lightColorValue)
2411 {
2412     auto lightColor = Color::FromArgbInt(lightColorValue);
2413     SetProperty<RSLightColorModifier, RSAnimatableProperty<Color>>(RSModifierType::LIGHT_COLOR, lightColor);
2414 }
2415 
SetLightPosition(float positionX,float positionY,float positionZ)2416 void RSNode::SetLightPosition(float positionX, float positionY, float positionZ)
2417 {
2418     SetLightPosition(Vector4f(positionX, positionY, positionZ, 0.f));
2419 }
2420 
SetLightPosition(const Vector4f & lightPosition)2421 void RSNode::SetLightPosition(const Vector4f& lightPosition)
2422 {
2423     SetProperty<RSLightPositionModifier, RSAnimatableProperty<Vector4f>>(RSModifierType::LIGHT_POSITION, lightPosition);
2424 }
2425 
SetIlluminatedBorderWidth(float illuminatedBorderWidth)2426 void RSNode::SetIlluminatedBorderWidth(float illuminatedBorderWidth)
2427 {
2428     SetProperty<RSIlluminatedBorderWidthModifier, RSAnimatableProperty<float>>(
2429         RSModifierType::ILLUMINATED_BORDER_WIDTH, illuminatedBorderWidth);
2430 }
2431 
SetIlluminatedType(uint32_t illuminatedType)2432 void RSNode::SetIlluminatedType(uint32_t illuminatedType)
2433 {
2434     SetProperty<RSIlluminatedTypeModifier, RSProperty<int>>(
2435         RSModifierType::ILLUMINATED_TYPE, illuminatedType);
2436 }
2437 
SetBloom(float bloomIntensity)2438 void RSNode::SetBloom(float bloomIntensity)
2439 {
2440     SetProperty<RSBloomModifier, RSAnimatableProperty<float>>(RSModifierType::BLOOM, bloomIntensity);
2441 }
2442 
SetBrightness(float brightness)2443 void RSNode::SetBrightness(float brightness)
2444 {
2445     SetProperty<RSBrightnessModifier, RSAnimatableProperty<float>>(RSModifierType::BRIGHTNESS, brightness);
2446 }
2447 
SetContrast(float contrast)2448 void RSNode::SetContrast(float contrast)
2449 {
2450     SetProperty<RSContrastModifier, RSAnimatableProperty<float>>(RSModifierType::CONTRAST, contrast);
2451 }
2452 
SetSaturate(float saturate)2453 void RSNode::SetSaturate(float saturate)
2454 {
2455     SetProperty<RSSaturateModifier, RSAnimatableProperty<float>>(RSModifierType::SATURATE, saturate);
2456 }
2457 
SetSepia(float sepia)2458 void RSNode::SetSepia(float sepia)
2459 {
2460     SetProperty<RSSepiaModifier, RSAnimatableProperty<float>>(RSModifierType::SEPIA, sepia);
2461 }
2462 
SetInvert(float invert)2463 void RSNode::SetInvert(float invert)
2464 {
2465     SetProperty<RSInvertModifier, RSAnimatableProperty<float>>(RSModifierType::INVERT, invert);
2466 }
2467 
SetAiInvert(const Vector4f & aiInvert)2468 void RSNode::SetAiInvert(const Vector4f& aiInvert)
2469 {
2470     SetProperty<RSAiInvertModifier, RSAnimatableProperty<Vector4f>>(RSModifierType::AIINVERT, aiInvert);
2471 }
2472 
SetSystemBarEffect()2473 void RSNode::SetSystemBarEffect()
2474 {
2475     SetProperty<RSSystemBarEffectModifier, RSProperty<bool>>(RSModifierType::SYSTEMBAREFFECT, true);
2476 }
2477 
SetHueRotate(float hueRotate)2478 void RSNode::SetHueRotate(float hueRotate)
2479 {
2480     SetProperty<RSHueRotateModifier, RSAnimatableProperty<float>>(RSModifierType::HUE_ROTATE, hueRotate);
2481 }
2482 
SetColorBlend(uint32_t colorValue)2483 void RSNode::SetColorBlend(uint32_t colorValue)
2484 {
2485     auto colorBlend = Color::FromArgbInt(colorValue);
2486     SetProperty<RSColorBlendModifier, RSAnimatableProperty<Color>>(RSModifierType::COLOR_BLEND, colorBlend);
2487 }
2488 
CalcExpectedFrameRate(const std::string & scene,float speed)2489 int32_t RSNode::CalcExpectedFrameRate(const std::string& scene, float speed)
2490 {
2491     auto preferredFps = RSFrameRatePolicy::GetInstance()->GetPreferredFps(scene, speed);
2492     return preferredFps;
2493 }
2494 
SetOutOfParent(OutOfParentType outOfParent)2495 void RSNode::SetOutOfParent(OutOfParentType outOfParent)
2496 {
2497     if (outOfParent != outOfParent_) {
2498         outOfParent_ = outOfParent;
2499 
2500         std::unique_ptr<RSCommand> command = std::make_unique<RSSetOutOfParent>(GetId(), outOfParent);
2501         auto transactionProxy = RSTransactionProxy::GetInstance();
2502         if (transactionProxy != nullptr) {
2503             transactionProxy->AddCommand(command, IsRenderServiceNode());
2504         }
2505     }
2506 }
2507 
GenerateId()2508 NodeId RSNode::GenerateId()
2509 {
2510     static pid_t pid_ = GetRealPid();
2511     static std::atomic<uint32_t> currentId_ = 1; // surfaceNode is seted correctly during boot when currentId is 1
2512 
2513     auto currentId = currentId_.fetch_add(1, std::memory_order_relaxed);
2514     if (currentId == UINT32_MAX) {
2515         // [PLANNING]:process the overflow situations
2516         ROSEN_LOGE("Node Id overflow");
2517     }
2518 
2519     // concat two 32-bit numbers to one 64-bit number
2520     return ((NodeId)pid_ << 32) | currentId;
2521 }
2522 
InitUniRenderEnabled()2523 void RSNode::InitUniRenderEnabled()
2524 {
2525     static bool inited = false;
2526     if (!inited) {
2527         inited = true;
2528         g_isUniRenderEnabled = RSSystemProperties::GetUniRenderEnabled();
2529         ROSEN_LOGD("RSNode::InitUniRenderEnabled:%{public}d", g_isUniRenderEnabled);
2530     }
2531 }
2532 
2533 
2534 // RSNode::~RSNode()
2535 // {
2536 
2537 // }
2538 
IsUniRenderEnabled() const2539 bool RSNode::IsUniRenderEnabled() const
2540 {
2541     return g_isUniRenderEnabled;
2542 }
2543 
IsRenderServiceNode() const2544 bool RSNode::IsRenderServiceNode() const
2545 {
2546     return (g_isUniRenderEnabled || isRenderServiceNode_) && (!isTextureExportNode_);
2547 }
2548 
AddChild(SharedPtr child,int index)2549 void RSNode::AddChild(SharedPtr child, int index)
2550 {
2551     if (child == nullptr) {
2552         ROSEN_LOGE("RSNode::AddChild, child is nullptr");
2553         return;
2554     }
2555     if (child->parent_ == id_) {
2556         ROSEN_LOGD("RSNode::AddChild, child already exist");
2557         return;
2558     }
2559     if (child->GetType() == RSUINodeType::DISPLAY_NODE) {
2560         // Disallow to add display node as child.
2561         return;
2562     }
2563     NodeId childId = child->GetId();
2564     if (child->parent_ != 0 && !child->isTextureExportNode_) {
2565         child->RemoveFromTree();
2566     }
2567 
2568     if (index < 0 || index >= static_cast<int>(children_.size())) {
2569         children_.push_back(childId);
2570     } else {
2571         children_.insert(children_.begin() + index, childId);
2572     }
2573     child->SetParent(id_);
2574     if (isTextureExportNode_ != child->isTextureExportNode_) {
2575         child->SyncTextureExport(isTextureExportNode_);
2576     }
2577     child->OnAddChildren();
2578     child->MarkDirty(NodeDirtyType::APPEARANCE, true);
2579 
2580     auto transactionProxy = RSTransactionProxy::GetInstance();
2581     if (transactionProxy == nullptr) {
2582         return;
2583     }
2584     // construct command using child's GetHierarchyCommandNodeId(), not GetId()
2585     childId = child->GetHierarchyCommandNodeId();
2586     std::unique_ptr<RSCommand> command = std::make_unique<RSBaseNodeAddChild>(id_, childId, index);
2587     transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), id_);
2588     if (child->GetType() == RSUINodeType::SURFACE_NODE) {
2589         auto surfaceNode = RSBaseNode::ReinterpretCast<RSSurfaceNode>(child);
2590         ROSEN_LOGI("RSNode::AddChild, Id: %{public}" PRIu64 ", SurfaceNode:[Id: %{public}" PRIu64 ", name: %{public}s]",
2591             id_, childId, surfaceNode->GetName().c_str());
2592         RS_TRACE_NAME_FMT("RSNode::AddChild, Id: %" PRIu64 ", SurfaceNode:[Id: %" PRIu64 ", name: %s]",
2593             id_, childId, surfaceNode->GetName().c_str());
2594     }
2595 }
2596 
MoveChild(SharedPtr child,int index)2597 void RSNode::MoveChild(SharedPtr child, int index)
2598 {
2599     if (child == nullptr || child->parent_ != id_) {
2600         ROSEN_LOGD("RSNode::MoveChild, not valid child");
2601         return;
2602     }
2603     NodeId childId = child->GetId();
2604     auto itr = std::find(children_.begin(), children_.end(), childId);
2605     if (itr == children_.end()) {
2606         ROSEN_LOGD("RSNode::MoveChild, not child");
2607         return;
2608     }
2609     children_.erase(itr);
2610     if (index < 0 || index >= static_cast<int>(children_.size())) {
2611         children_.push_back(childId);
2612     } else {
2613         children_.insert(children_.begin() + index, childId);
2614     }
2615 
2616     auto transactionProxy = RSTransactionProxy::GetInstance();
2617     if (transactionProxy == nullptr) {
2618         return;
2619     }
2620     // construct command using child's GetHierarchyCommandNodeId(), not GetId()
2621     childId = child->GetHierarchyCommandNodeId();
2622     std::unique_ptr<RSCommand> command = std::make_unique<RSBaseNodeMoveChild>(id_, childId, index);
2623     transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), id_);
2624 }
2625 
RemoveChild(SharedPtr child)2626 void RSNode::RemoveChild(SharedPtr child)
2627 {
2628     if (child == nullptr || child->parent_ != id_) {
2629         ROSEN_LOGI("RSNode::RemoveChild, child is nullptr");
2630         return;
2631     }
2632     NodeId childId = child->GetId();
2633     RemoveChildById(childId);
2634     child->OnRemoveChildren();
2635     child->SetParent(0);
2636     child->MarkDirty(NodeDirtyType::APPEARANCE, true);
2637 
2638     auto transactionProxy = RSTransactionProxy::GetInstance();
2639     if (transactionProxy == nullptr) {
2640         return;
2641     }
2642     // construct command using child's GetHierarchyCommandNodeId(), not GetId()
2643     childId = child->GetHierarchyCommandNodeId();
2644     std::unique_ptr<RSCommand> command = std::make_unique<RSBaseNodeRemoveChild>(id_, childId);
2645     transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), id_);
2646     if (child->GetType() == RSUINodeType::SURFACE_NODE) {
2647         auto surfaceNode = RSBaseNode::ReinterpretCast<RSSurfaceNode>(child);
2648         ROSEN_LOGI("RSNode::RemoveChild, Id: %{public}" PRIu64 ", SurfaceNode:[Id: %{public}" PRIu64 ", "
2649             "name: %{public}s]", id_, childId, surfaceNode->GetName().c_str());
2650         RS_TRACE_NAME_FMT("RSNode::RemoveChild, Id: %" PRIu64 ", SurfaceNode:[Id: %" PRIu64 ", name: %s]",
2651             id_, childId, surfaceNode->GetName().c_str());
2652     }
2653 }
2654 
RemoveChildByNodeId(NodeId childId)2655 void RSNode::RemoveChildByNodeId(NodeId childId)
2656 {
2657     if (auto childPtr = RSNodeMap::Instance().GetNode(childId)) {
2658         RemoveChild(childPtr);
2659     } else {
2660         ROSEN_LOGE("RSNode::RemoveChildByNodeId, childId not found");
2661     }
2662 }
2663 
AddCrossParentChild(SharedPtr child,int index)2664 void RSNode::AddCrossParentChild(SharedPtr child, int index)
2665 {
2666     // AddCrossParentChild only used as: the child is under multiple parents(e.g. a window cross multi-screens),
2667     // so this child will not remove from the old parent.
2668     if (child == nullptr) {
2669         ROSEN_LOGE("RSNode::AddCrossScreenChild, child is nullptr");
2670         return;
2671     }
2672     if (!this->IsInstanceOf<RSDisplayNode>()) {
2673         ROSEN_LOGE("RSNode::AddCrossScreenChild, only displayNode support AddCrossScreenChild");
2674         return;
2675     }
2676     NodeId childId = child->GetId();
2677 
2678     if (index < 0 || index >= static_cast<int>(children_.size())) {
2679         children_.push_back(childId);
2680     } else {
2681         children_.insert(children_.begin() + index, childId);
2682     }
2683     child->SetParent(id_);
2684     child->OnAddChildren();
2685     child->MarkDirty(NodeDirtyType::APPEARANCE, true);
2686 
2687     auto transactionProxy = RSTransactionProxy::GetInstance();
2688     if (transactionProxy == nullptr) {
2689         return;
2690     }
2691     // construct command using child's GetHierarchyCommandNodeId(), not GetId()
2692     childId = child->GetHierarchyCommandNodeId();
2693     std::unique_ptr<RSCommand> command = std::make_unique<RSBaseNodeAddCrossParentChild>(id_, childId, index);
2694     transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), id_);
2695 }
2696 
RemoveCrossParentChild(SharedPtr child,NodeId newParentId)2697 void RSNode::RemoveCrossParentChild(SharedPtr child, NodeId newParentId)
2698 {
2699     // RemoveCrossParentChild only used as: the child is under multiple parents(e.g. a window cross multi-screens),
2700     // set the newParentId to rebuild the parent-child relationship.
2701     if (child == nullptr) {
2702         ROSEN_LOGI("RSNode::RemoveCrossScreenChild, child is nullptr");
2703         return;
2704     }
2705     if (!this->IsInstanceOf<RSDisplayNode>()) {
2706         ROSEN_LOGE("RSNode::RemoveCrossScreenChild, only displayNode support RemoveCrossScreenChild");
2707         return;
2708     }
2709     NodeId childId = child->GetId();
2710     RemoveChildById(childId);
2711     child->OnRemoveChildren();
2712     child->SetParent(newParentId);
2713     child->MarkDirty(NodeDirtyType::APPEARANCE, true);
2714 
2715     auto transactionProxy = RSTransactionProxy::GetInstance();
2716     if (transactionProxy == nullptr) {
2717         return;
2718     }
2719     // construct command using child's GetHierarchyCommandNodeId(), not GetId()
2720     childId = child->GetHierarchyCommandNodeId();
2721     std::unique_ptr<RSCommand> command = std::make_unique<RSBaseNodeRemoveCrossParentChild>(id_, childId, newParentId);
2722     transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), id_);
2723 }
2724 
RemoveChildById(NodeId childId)2725 void RSNode::RemoveChildById(NodeId childId)
2726 {
2727     auto itr = std::find(children_.begin(), children_.end(), childId);
2728     if (itr != children_.end()) {
2729         children_.erase(itr);
2730     }
2731 }
2732 
RemoveFromTree()2733 void RSNode::RemoveFromTree()
2734 {
2735     MarkDirty(NodeDirtyType::APPEARANCE, true);
2736     if (auto parentPtr = RSNodeMap::Instance().GetNode(parent_)) {
2737         parentPtr->RemoveChildById(GetId());
2738         OnRemoveChildren();
2739         SetParent(0);
2740     }
2741     // always send Remove-From-Tree command
2742     auto transactionProxy = RSTransactionProxy::GetInstance();
2743     if (transactionProxy == nullptr) {
2744         return;
2745     }
2746     // construct command using own GetHierarchyCommandNodeId(), not GetId()
2747     auto nodeId = GetHierarchyCommandNodeId();
2748     std::unique_ptr<RSCommand> command = std::make_unique<RSBaseNodeRemoveFromTree>(nodeId);
2749     transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), nodeId);
2750 }
2751 
ClearChildren()2752 void RSNode::ClearChildren()
2753 {
2754     for (auto child : children_) {
2755         if (auto childPtr = RSNodeMap::Instance().GetNode(child)) {
2756             childPtr->SetParent(0);
2757             childPtr->MarkDirty(NodeDirtyType::APPEARANCE, true);
2758         }
2759     }
2760     children_.clear();
2761 
2762     auto transactionProxy = RSTransactionProxy::GetInstance();
2763     if (transactionProxy == nullptr) {
2764         return;
2765     }
2766     // construct command using own GetHierarchyCommandNodeId(), not GetId()
2767     auto nodeId = GetHierarchyCommandNodeId();
2768     std::unique_ptr<RSCommand> command = std::make_unique<RSBaseNodeClearChild>(nodeId);
2769     transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), nodeId);
2770 }
2771 
SetExportTypeChangedCallback(ExportTypeChangedCallback callback)2772 void RSNode::SetExportTypeChangedCallback(ExportTypeChangedCallback callback)
2773 {
2774     exportTypeChangedCallback_ = callback;
2775 }
2776 
SetTextureExport(bool isTextureExportNode)2777 void RSNode::SetTextureExport(bool isTextureExportNode)
2778 {
2779     if (isTextureExportNode == isTextureExportNode_) {
2780         return;
2781     }
2782     isTextureExportNode_ = isTextureExportNode;
2783     if (!IsUniRenderEnabled()) {
2784         return;
2785     }
2786     if (exportTypeChangedCallback_) {
2787         exportTypeChangedCallback_(isTextureExportNode);
2788     }
2789     if ((isTextureExportNode_ && !hasCreateRenderNodeInRT_) ||
2790         (!isTextureExportNode_ && !hasCreateRenderNodeInRS_)) {
2791         CreateRenderNodeForTextureExportSwitch();
2792     }
2793     DoFlushModifier();
2794 }
2795 
SyncTextureExport(bool isTextureExportNode)2796 void RSNode::SyncTextureExport(bool isTextureExportNode)
2797 {
2798     if (isTextureExportNode == isTextureExportNode_) {
2799         return;
2800     }
2801     SetTextureExport(isTextureExportNode);
2802     for (uint32_t index = 0; index < children_.size(); index++) {
2803         if (auto childPtr = RSNodeMap::Instance().GetNode(children_[index])) {
2804             childPtr->SyncTextureExport(isTextureExportNode);
2805             if (auto transactionProxy = RSTransactionProxy::GetInstance()) {
2806                 std::unique_ptr<RSCommand> command =
2807                     std::make_unique<RSBaseNodeAddChild>(id_, childPtr->GetHierarchyCommandNodeId(), index);
2808                 transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), id_);
2809             }
2810         }
2811     }
2812 }
2813 
GetChildIdByIndex(int index) const2814 const std::optional<NodeId> RSNode::GetChildIdByIndex(int index) const
2815 {
2816     int childrenTotal = static_cast<int>(children_.size());
2817     if (childrenTotal <= 0 || index < -1 || index >= childrenTotal) {
2818         return std::nullopt;
2819     }
2820     if (index == -1) {
2821         index = childrenTotal - 1;
2822     }
2823     return children_.at(index);
2824 }
2825 
SetParent(NodeId parentId)2826 void RSNode::SetParent(NodeId parentId)
2827 {
2828     parent_ = parentId;
2829 }
2830 
GetParent()2831 RSNode::SharedPtr RSNode::GetParent()
2832 {
2833     return RSNodeMap::Instance().GetNode(parent_);
2834 }
2835 
DumpTree(int depth,std::string & out) const2836 void RSNode::DumpTree(int depth, std::string& out) const
2837 {
2838     for (int i = 0; i < depth; i++) {
2839         out += "  ";
2840     }
2841     out += "| ";
2842     Dump(out);
2843     for (auto childId : children_) {
2844         if (auto child = RSNodeMap::Instance().GetNode(childId)) {
2845             out += "\n";
2846             child->DumpTree(depth + 1, out);
2847         }
2848     }
2849 }
2850 
Dump(std::string & out) const2851 void RSNode::Dump(std::string& out) const
2852 {
2853     auto iter = RSUINodeTypeStrs.find(GetType());
2854     out += (iter != RSUINodeTypeStrs.end() ? iter->second : "RSNode");
2855     out += "[" + std::to_string(id_);
2856     out += "], parent[" + std::to_string(parent_);
2857     out += "], instanceId[" + std::to_string(instanceId_);
2858     if (auto node = ReinterpretCastTo<RSSurfaceNode>()) {
2859         out += "], name[" + node->GetName();
2860     } else if (!nodeName_.empty()) {
2861         out += "], nodeName[" + nodeName_;
2862     }
2863     out += "], frameNodeId[" + std::to_string(frameNodeId_);
2864     out += "], frameNodeTag[" + frameNodeTag_;
2865     out += "], extendModifierIsDirty[";
2866     out += extendModifierIsDirty_ ? "true" : "false";
2867     out += "], isNodeGroup[";
2868     out += isNodeGroup_ ? "true" : "false";
2869     out += "], isSingleFrameComposer[";
2870     out += isNodeSingleFrameComposer_ ? "true" : "false";
2871     out += "], isSuggestOpincNode[";
2872     out += isSuggestOpincNode_ ? "true" : "false";
2873     out += "], isUifirstNode[";
2874     out += isUifirstNode_ ? "true" : "false";
2875     out += "], drawRegion[";
2876     if (drawRegion_) {
2877         out += "x:" + std::to_string(drawRegion_->GetLeft());
2878         out += " y:" + std::to_string(drawRegion_->GetTop());
2879         out += " width:" + std::to_string(drawRegion_->GetWidth());
2880         out += " height:" + std::to_string(drawRegion_->GetHeight());
2881     } else {
2882         out += "null";
2883     }
2884     out += "], outOfParent[" + std::to_string(static_cast<int>(outOfParent_));
2885     out += "], animations[";
2886     for (const auto& [id, anim] : animations_) {
2887         out += "{id:" + std::to_string(id);
2888         out += " propId:" + std::to_string(anim->GetPropertyId());
2889         out += "} ";
2890     }
2891     if (!animations_.empty()) {
2892         out.pop_back();
2893     }
2894     out += "]";
2895 }
2896 
DumpNode(int depth) const2897 std::string RSNode::DumpNode(int depth) const
2898 {
2899     std::stringstream ss;
2900     auto it = RSUINodeTypeStrs.find(GetType());
2901     if (it == RSUINodeTypeStrs.end()) {
2902         return "";
2903     }
2904     ss << it->second << "[" << std::to_string(id_) << "] child[";
2905     for (auto child : children_) {
2906         ss << std::to_string(child) << " ";
2907     }
2908     ss << "]";
2909 
2910     if (!animations_.empty()) {
2911         ss << " animation:" << std::to_string(animations_.size());
2912     }
2913     ss << " " << GetStagingProperties().Dump();
2914     return ss.str();
2915 }
2916 
IsInstanceOf(RSUINodeType type) const2917 bool RSNode::IsInstanceOf(RSUINodeType type) const
2918 {
2919     auto targetType = static_cast<uint32_t>(type);
2920     auto instanceType = static_cast<uint32_t>(GetType());
2921     // use bitmask to check whether the instance is a subclass of the target type
2922     return (instanceType & targetType) == targetType;
2923 }
2924 
2925 template<typename T>
IsInstanceOf() const2926 bool RSNode::IsInstanceOf() const
2927 {
2928     return IsInstanceOf(T::Type);
2929 }
2930 
2931 // explicit instantiation with all render node types
2932 template bool RSNode::IsInstanceOf<RSDisplayNode>() const;
2933 template bool RSNode::IsInstanceOf<RSSurfaceNode>() const;
2934 template bool RSNode::IsInstanceOf<RSProxyNode>() const;
2935 template bool RSNode::IsInstanceOf<RSCanvasNode>() const;
2936 template bool RSNode::IsInstanceOf<RSRootNode>() const;
2937 template bool RSNode::IsInstanceOf<RSCanvasDrawingNode>() const;
2938 
SetInstanceId(int32_t instanceId)2939 void RSNode::SetInstanceId(int32_t instanceId)
2940 {
2941     instanceId_ = instanceId;
2942     RSNodeMap::MutableInstance().RegisterNodeInstanceId(id_, instanceId_);
2943 }
2944 
2945 } // namespace Rosen
2946 } // namespace OHOS
2947