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