From 38f9df15181cb9ba9eb199c4740ba756c9f2c604 Mon Sep 17 00:00:00 2001 From: Zhang Peng Date: Mon, 5 Sep 2022 11:52:27 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=9B=A0=E6=96=B9=E6=A1=88=E5=86=B2?= =?UTF-8?q?=E7=AA=81=EF=BC=8C=E9=83=A8=E5=88=86=E5=9B=9E=E9=80=80=20"rect?= =?UTF-8?q?=20=E8=AE=A1=E7=AE=97=E8=80=83=E8=99=91=E8=BD=AC=E5=9C=BA?= =?UTF-8?q?=E5=9C=BA=E6=99=AF"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 218b879008ee497dcb20b1c40ee340c80c99ba5e. Change-Id: Ieb94f01d93166a2bed207b911e5753f6c418dfb5 Signed-off-by: Zhang Peng --- .../core/pipeline/rs_uni_render_util.cpp | 13 ++++------ .../core/pipeline/rs_uni_render_util.h | 2 +- .../core/pipeline/rs_uni_render_visitor.cpp | 12 +++------ .../include/common/rs_obj_abs_geometry.h | 2 -- .../include/pipeline/rs_render_node.h | 3 +-- .../include/property/rs_properties.h | 6 ++--- .../src/common/rs_obj_abs_geometry.cpp | 25 ------------------- .../src/pipeline/rs_render_node.cpp | 5 ++-- .../src/property/rs_properties.cpp | 10 +++----- 9 files changed, 17 insertions(+), 61 deletions(-) diff --git a/rosen/modules/render_service/core/pipeline/rs_uni_render_util.cpp b/rosen/modules/render_service/core/pipeline/rs_uni_render_util.cpp index 03278711c0..6b9269717a 100644 --- a/rosen/modules/render_service/core/pipeline/rs_uni_render_util.cpp +++ b/rosen/modules/render_service/core/pipeline/rs_uni_render_util.cpp @@ -21,26 +21,24 @@ namespace OHOS { namespace Rosen { -bool RSUniRenderUtil::UpdateRenderNodeDstRect(RSRenderNode& node, const SkMatrix& matrix) +void RSUniRenderUtil::UpdateRenderNodeDstRect(RSRenderNode& node, const SkMatrix& matrix) { // [planning] use RSRenderNode::Update instead auto parentNode = node.GetParent().lock(); if (!parentNode) { RS_LOGE("RSUniRenderUtil::UpdateDstRect: fail to get parent dstRect."); - return false; + return; } auto rsParent = parentNode->ReinterpretCastTo(); - auto pareneProp = rsParent ? &(rsParent->GetRenderProperties()) : nullptr; + auto parentProp = rsParent ? &(rsParent->GetRenderProperties()) : nullptr; auto& property = node.GetMutableRenderProperties(); - auto transitionProperties = node.GetAnimationManager().GetTransitionProperties(); auto surfaceNode = node.ReinterpretCastTo(); auto isSurfaceView = surfaceNode && surfaceNode->GetSurfaceNodeType() == RSSurfaceNodeType::SELF_DRAWING_NODE; Vector2f offset(0.f, 0.f); if (isSurfaceView) { - offset = { pareneProp->GetFrameOffsetX(), pareneProp->GetFrameOffsetY() }; + offset = { parentProp->GetFrameOffsetX(), parentProp->GetFrameOffsetY() }; } - property.UpdateGeometry( - pareneProp, true, offset, transitionProperties); + property.UpdateGeometry(parentProp, true, offset); auto geoPtr = std::static_pointer_cast(property.GetBoundsGeometry()); if (geoPtr && node.IsInstanceOf()) { if (!isSurfaceView) { @@ -50,7 +48,6 @@ bool RSUniRenderUtil::UpdateRenderNodeDstRect(RSRenderNode& node, const SkMatrix RS_LOGD("RSUniRenderUtil::UpdateDstRect: nodeName: %s, dstRect[%s].", surfaceNode->GetName().c_str(), surfaceNode->GetDstRect().ToString().c_str()); } - return transitionProperties != nullptr; } void RSUniRenderUtil::MergeDirtyHistory(std::shared_ptr& node, int32_t bufferAge) diff --git a/rosen/modules/render_service/core/pipeline/rs_uni_render_util.h b/rosen/modules/render_service/core/pipeline/rs_uni_render_util.h index ff321348ab..05dd255f00 100644 --- a/rosen/modules/render_service/core/pipeline/rs_uni_render_util.h +++ b/rosen/modules/render_service/core/pipeline/rs_uni_render_util.h @@ -28,7 +28,7 @@ namespace OHOS { namespace Rosen { class RSUniRenderUtil { public: - static bool UpdateRenderNodeDstRect(RSRenderNode& node, const SkMatrix& matrix); + static void UpdateRenderNodeDstRect(RSRenderNode& node, const SkMatrix& matrix); // merge history dirty region of current display node and its child surfacenode(app windows) // for mirror display, call this function twice will introduce additional dirtyhistory in dirtymanager diff --git a/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp b/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp index bf0486426d..b1bc854b73 100644 --- a/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp +++ b/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp @@ -99,19 +99,17 @@ void RSUniRenderVisitor::PrepareSurfaceRenderNode(RSSurfaceRenderNode& node) if (node.IsAppWindow() || node.GetSurfaceNodeType() == RSSurfaceNodeType::STARTING_WINDOW_NODE) { curSurfaceDirtyManager_ = node.GetDirtyManager(); curSurfaceDirtyManager_->Clear(); - auto transitionProperties = node.GetAnimationManager().GetTransitionProperties(); if (auto parentNode = node.GetParent().lock()) { dirtyFlag_ = node.Update(*curSurfaceDirtyManager_, - &(parentNode->ReinterpretCastTo()->GetRenderProperties()), - dirtyFlag_, transitionProperties); + &(parentNode->ReinterpretCastTo()->GetRenderProperties()), dirtyFlag_); } else { - dirtyFlag_ = node.Update(*curSurfaceDirtyManager_, nullptr, dirtyFlag_, transitionProperties); + dirtyFlag_ = node.Update(*curSurfaceDirtyManager_, nullptr, dirtyFlag_); } geoPtr->ConcatMatrix(node.GetContextMatrix()); node.SetDstRect(geoPtr->GetAbsRect()); curDisplayNode_->UpdateSurfaceNodePos(node.GetId(), node.GetDstRect()); } else { - dirtyFlag_ |= RSUniRenderUtil::UpdateRenderNodeDstRect(node, node.GetContextMatrix()); + RSUniRenderUtil::UpdateRenderNodeDstRect(node, node.GetContextMatrix()); if (node.GetBuffer() != nullptr) { auto& surfaceHandler = static_cast(node); if (surfaceHandler.IsCurrentFrameBufferConsumed()) { @@ -121,9 +119,6 @@ void RSUniRenderVisitor::PrepareSurfaceRenderNode(RSSurfaceRenderNode& node) } parentSurfaceNodeMatrix_ = geoPtr->GetAbsMatrix(); - if (node.GetDstRectChanged()) { - dirtyFlag_ = true; - } PrepareBaseRenderNode(node); // restore flags parentSurfaceNodeMatrix_ = parentSurfaceNodeMatrix; @@ -341,7 +336,6 @@ void RSUniRenderVisitor::ProcessDisplayRenderNode(RSDisplayRenderNode& node) curDisplayDirtyManager_->SetSurfaceSize(screenInfo_.width, screenInfo_.height); CalcDirtyDisplayRegion(displayNodePtr); uint32_t bufferAge = renderFrame->GetBufferAge(); - RS_LOGD("RSUniRenderVisitor buffer age is %d", bufferAge); RSUniRenderUtil::MergeDirtyHistory(displayNodePtr, bufferAge); auto dirtyRegion = RSUniRenderUtil::MergeVisibleDirtyRegion(displayNodePtr); SetSurfaceGlobalDirtyRegion(displayNodePtr); diff --git a/rosen/modules/render_service_base/include/common/rs_obj_abs_geometry.h b/rosen/modules/render_service_base/include/common/rs_obj_abs_geometry.h index d13d783c40..7ade8c3ba4 100644 --- a/rosen/modules/render_service_base/include/common/rs_obj_abs_geometry.h +++ b/rosen/modules/render_service_base/include/common/rs_obj_abs_geometry.h @@ -33,8 +33,6 @@ public: ~RSObjAbsGeometry() override; void ConcatMatrix(const SkMatrix& matrix); void UpdateMatrix(const std::shared_ptr& parent, float offsetX, float offsetY); - void UpdateMatrix(const std::shared_ptr& parent, - Vector2f& offset, Vector3f& scale, Vector3f& tran); // Using by RenderService void UpdateByMatrixFromSelf(); diff --git a/rosen/modules/render_service_base/include/pipeline/rs_render_node.h b/rosen/modules/render_service_base/include/pipeline/rs_render_node.h index f685780a3e..16656f30b2 100644 --- a/rosen/modules/render_service_base/include/pipeline/rs_render_node.h +++ b/rosen/modules/render_service_base/include/pipeline/rs_render_node.h @@ -42,8 +42,7 @@ public: ~RSRenderNode() override; bool Animate(int64_t timestamp) override; - bool Update(RSDirtyRegionManager& dirtyManager, const RSProperties* parent, bool parentDirty, - const std::unique_ptr& transition = nullptr); + bool Update(RSDirtyRegionManager& dirtyManager, const RSProperties* parent, bool parentDirty); RSProperties& GetMutableRenderProperties(); const RSProperties& GetRenderProperties() const; diff --git a/rosen/modules/render_service_base/include/property/rs_properties.h b/rosen/modules/render_service_base/include/property/rs_properties.h index 0a383512ea..c467cf429a 100644 --- a/rosen/modules/render_service_base/include/property/rs_properties.h +++ b/rosen/modules/render_service_base/include/property/rs_properties.h @@ -21,14 +21,13 @@ #include "common/rs_matrix3.h" #include "common/rs_vector4.h" #include "property/rs_properties_def.h" -#include "property/rs_transition_properties.h" #include "render/rs_border.h" #include "render/rs_filter.h" #include "render/rs_image.h" +#include "render/rs_mask.h" #include "render/rs_path.h" #include "render/rs_shader.h" #include "render/rs_shadow.h" -#include "render/rs_mask.h" namespace OHOS { namespace Rosen { @@ -191,8 +190,7 @@ public: const std::shared_ptr& GetBoundsGeometry() const; const std::shared_ptr& GetFrameGeometry() const; - bool UpdateGeometry(const RSProperties* parent, bool dirtyFlag, Vector2f& offset, - const std::unique_ptr& transition = nullptr); + bool UpdateGeometry(const RSProperties* parent, bool dirtyFlag, Vector2f& offset); bool GetZorderChanged() const; void CleanZorderChanged(); diff --git a/rosen/modules/render_service_base/src/common/rs_obj_abs_geometry.cpp b/rosen/modules/render_service_base/src/common/rs_obj_abs_geometry.cpp index de546019d5..464eeb6d3c 100644 --- a/rosen/modules/render_service_base/src/common/rs_obj_abs_geometry.cpp +++ b/rosen/modules/render_service_base/src/common/rs_obj_abs_geometry.cpp @@ -60,31 +60,6 @@ void RSObjAbsGeometry::UpdateMatrix(const std::shared_ptr& par SetAbsRect(); } -void RSObjAbsGeometry::UpdateMatrix(const std::shared_ptr& parent, - Vector2f& offset, Vector3f& scale, Vector3f& tran) -{ - if (parent == nullptr) { - absMatrix_.reset(); - } else { - absMatrix_ = parent->absMatrix_; - absMatrix_.preTranslate(offset.x_, offset.y_); - } - matrix_.reset(); - if (!trans_ || (ROSEN_EQ(trans_->translateZ_, 0.f) && ROSEN_EQ(trans_->rotationX_, 0.f) && - ROSEN_EQ(trans_->rotationY_, 0.f) && trans_->quaternion_.IsIdentity())) { - UpdateAbsMatrix2D(); - } else { - UpdateAbsMatrix3D(); - } - absMatrix_.preConcat(matrix_); - auto tranMatrix = SkMatrix::MakeTrans(tran.x_, tran.y_); - tranMatrix.preTranslate(width_ / 2, height_ / 2); // 2 means half - tranMatrix.preScale(scale.x_, scale.y_); - tranMatrix.preTranslate(-width_ / 2, -height_ / 2); // 2 means half - absMatrix_.preConcat(tranMatrix); - SetAbsRect(); -} - void RSObjAbsGeometry::UpdateByMatrixFromSelf() { absMatrix_.reset(); diff --git a/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp b/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp index 9e7503b098..5814e9de3d 100644 --- a/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp +++ b/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp @@ -70,8 +70,7 @@ bool RSRenderNode::Animate(int64_t timestamp) return animationManager_.Animate(timestamp); } -bool RSRenderNode::Update(RSDirtyRegionManager& dirtyManager, const RSProperties* parent, bool parentDirty, - const std::unique_ptr& transition) +bool RSRenderNode::Update(RSDirtyRegionManager& dirtyManager, const RSProperties* parent, bool parentDirty) { // no need to update invisible nodes if (!renderProperties_.GetVisible() && !isLastVisible_) { @@ -80,7 +79,7 @@ bool RSRenderNode::Update(RSDirtyRegionManager& dirtyManager, const RSProperties // [planning] surfaceNode use frame instead Vector2f offset = (parent == nullptr || IsInstanceOf()) ? Vector2f { 0.f, 0.f } : Vector2f { parent->GetFrameOffsetX(), parent->GetFrameOffsetY() }; - bool dirty = renderProperties_.UpdateGeometry(parent, parentDirty, offset, transition); + bool dirty = renderProperties_.UpdateGeometry(parent, parentDirty, offset); isDirtyRegionUpdated_ = false; UpdateDirtyRegion(dirtyManager, dirty); isLastVisible_ = renderProperties_.GetVisible(); diff --git a/rosen/modules/render_service_base/src/property/rs_properties.cpp b/rosen/modules/render_service_base/src/property/rs_properties.cpp index 2e2a20923c..7164b2aa14 100644 --- a/rosen/modules/render_service_base/src/property/rs_properties.cpp +++ b/rosen/modules/render_service_base/src/property/rs_properties.cpp @@ -236,8 +236,7 @@ const std::shared_ptr& RSProperties::GetFrameGeometry() const return frameGeo_; } -bool RSProperties::UpdateGeometry(const RSProperties* parent, bool dirtyFlag, Vector2f& offset, - const std::unique_ptr& transition) +bool RSProperties::UpdateGeometry(const RSProperties* parent, bool dirtyFlag, Vector2f& offset) { if (boundsGeo_ == nullptr) { return false; @@ -250,11 +249,8 @@ bool RSProperties::UpdateGeometry(const RSProperties* parent, bool dirtyFlag, Ve auto boundsGeoPtr = std::static_pointer_cast(boundsGeo_); if (dirtyFlag || geoDirty_) { - auto parentGeo = parent == nullptr ? - nullptr : std::static_pointer_cast(parent->boundsGeo_); - Vector3f scale = transition == nullptr ? Vector3f { 1.f, 1.f, 1.f } : transition->GetScale(); - Vector3f tran = transition == nullptr ? Vector3f { 0.f, 0.f, 0.f } : transition->GetTranslate(); - boundsGeoPtr->UpdateMatrix(parentGeo, offset, scale, tran); + auto parentGeo = parent == nullptr ? nullptr : std::static_pointer_cast(parent->boundsGeo_); + boundsGeoPtr->UpdateMatrix(parentGeo, offset.x_, offset.y_); } #endif return dirtyFlag || geoDirty_; -- Gitee From c1a85f41abd8eb9d3cb8f3b3225050e23bbe41f7 Mon Sep 17 00:00:00 2001 From: Zhang Peng Date: Fri, 26 Aug 2022 16:26:52 +0800 Subject: [PATCH 2/6] refactor transition animation with modifier, remove RSTransitionProperties Signed-off-by: Zhang Peng Change-Id: I019b6bad97f6e8d53677d92ab938b516ed34918f --- .clang-format | 2 +- .../core/pipeline/rs_divided_render_util.cpp | 22 +---- .../core/pipeline/rs_render_engine.cpp | 14 ++- .../core/pipeline/rs_surface_capture_task.cpp | 8 +- .../core/pipeline/rs_uni_render_visitor.cpp | 4 - .../include/animation/rs_animation_manager.h | 10 +-- .../include/animation/rs_render_transition.h | 2 - .../animation/rs_render_transition_effect.h | 42 +++++---- .../include/pipeline/rs_render_node.h | 6 +- .../include/property/rs_properties_painter.h | 5 -- .../property/rs_transition_properties.h | 74 ---------------- .../src/animation/rs_animation_manager.cpp | 39 --------- .../src/animation/rs_render_transition.cpp | 35 +++++--- .../animation/rs_render_transition_effect.cpp | 87 +++++++++++++------ .../src/pipeline/rs_render_node.cpp | 32 ++++--- .../src/pipeline/rs_surface_render_node.cpp | 8 +- .../src/property/rs_properties_painter.cpp | 43 +++------ 17 files changed, 155 insertions(+), 278 deletions(-) delete mode 100644 rosen/modules/render_service_base/include/property/rs_transition_properties.h diff --git a/.clang-format b/.clang-format index e512a3de48..5f4ec48608 100644 --- a/.clang-format +++ b/.clang-format @@ -58,7 +58,7 @@ ForEachMacros: - BOOST_FOREACH IncludeBlocks: Regroup IncludeCategories: - - Regex: '^"(animation|backend|c|command|common|draw|drawing|effect|image|ipc_callbacks|overdraw|platform|pipeline|property|render|render_context|screen_manager|text|transaction|ui|utils|visitor)/' + - Regex: '^"(animation|backend|c|command|common|draw|drawing|effect|image|ipc_callbacks|modifier|overdraw|platform|pipeline|property|render|render_context|screen_manager|text|transaction|ui|utils|visitor)/' Priority: 3 - Regex: '<*>' Priority: 1 diff --git a/rosen/modules/render_service/core/pipeline/rs_divided_render_util.cpp b/rosen/modules/render_service/core/pipeline/rs_divided_render_util.cpp index e31cfc3d58..b3b2979fac 100644 --- a/rosen/modules/render_service/core/pipeline/rs_divided_render_util.cpp +++ b/rosen/modules/render_service/core/pipeline/rs_divided_render_util.cpp @@ -19,9 +19,7 @@ #include "common/rs_obj_abs_geometry.h" #include "platform/common/rs_log.h" #include "property/rs_properties_painter.h" -#include "property/rs_transition_properties.h" #include "render/rs_skia_filter.h" -#include "rs_trace.h" namespace OHOS { namespace Rosen { @@ -66,25 +64,7 @@ bool RSDividedRenderUtil::IsNeedClient(RSSurfaceRenderNode& node, const ComposeI RS_LOGD("RsDebug RSDividedRenderUtil::IsNeedClient enable composition client need shadow"); return true; } - auto transitionProperties = node.GetAnimationManager().GetTransitionProperties(); - if (!transitionProperties) { - return false; - } - SkMatrix matrix = transitionProperties->GetRotate(); - float value[9]; - matrix.get9(value); - if (SkMatrix::kMSkewX < 0 || SkMatrix::kMSkewX >= 9 || // 9 is the upper bound - SkMatrix::kMScaleX < 0 || SkMatrix::kMScaleX >= 9) { // 9 is the upper bound - RS_LOGE("RSDividedRenderUtil:: The value of kMSkewX or kMScaleX is illegal"); - return false; - } else { - float rAngle = -round(atan2(value[SkMatrix::kMSkewX], value[SkMatrix::kMScaleX]) * (180 / PI)); - bool isNeedClient = rAngle > 0; - if (isNeedClient) { - RS_LOGD("RsDebug RSDividedRenderUtil::IsNeedClient enable composition client need animation rotate"); - } - return isNeedClient; - } + return false; } bool RSDividedRenderUtil::IsForceClient() diff --git a/rosen/modules/render_service/core/pipeline/rs_render_engine.cpp b/rosen/modules/render_service/core/pipeline/rs_render_engine.cpp index 749c02cf55..c1362a4242 100644 --- a/rosen/modules/render_service/core/pipeline/rs_render_engine.cpp +++ b/rosen/modules/render_service/core/pipeline/rs_render_engine.cpp @@ -15,16 +15,16 @@ #include "rs_render_engine.h" +#include "rs_divided_render_util.h" +#include "rs_trace.h" +#include "string_utils.h" + #include "pipeline/rs_uni_render_judgement.h" #include "platform/common/rs_log.h" +#include "platform/common/rs_system_properties.h" #include "platform/ohos/backend/rs_surface_ohos_gl.h" #include "platform/ohos/backend/rs_surface_ohos_raster.h" -#include "platform/common/rs_system_properties.h" -#include "property/rs_transition_properties.h" #include "render/rs_skia_filter.h" -#include "rs_divided_render_util.h" -#include "rs_trace.h" -#include "string_utils.h" namespace OHOS { namespace Rosen { @@ -364,10 +364,6 @@ void RSRenderEngine::RSSurfaceNodeCommonPreProcess( { const auto& property = node.GetRenderProperties(); - // deal with animation. - const auto& transitionProperties = node.GetAnimationManager().GetTransitionProperties(); - RSPropertiesPainter::DrawTransitionProperties(transitionProperties, property, canvas); - // draw mask. RectF maskBounds(0, 0, params.dstRect.width(), params.dstRect.height()); RSPropertiesPainter::DrawMask( diff --git a/rosen/modules/render_service/core/pipeline/rs_surface_capture_task.cpp b/rosen/modules/render_service/core/pipeline/rs_surface_capture_task.cpp index 230fe6fbfa..0fdbdb533b 100644 --- a/rosen/modules/render_service/core/pipeline/rs_surface_capture_task.cpp +++ b/rosen/modules/render_service/core/pipeline/rs_surface_capture_task.cpp @@ -16,12 +16,13 @@ #include "pipeline/rs_surface_capture_task.h" #include -#include "rs_trace.h" -#include "common/rs_obj_abs_geometry.h" #include "include/core/SkCanvas.h" #include "include/core/SkMatrix.h" #include "include/core/SkRect.h" +#include "rs_trace.h" + +#include "common/rs_obj_abs_geometry.h" #include "pipeline/rs_base_render_node.h" #include "pipeline/rs_display_render_node.h" #include "pipeline/rs_divided_render_util.h" @@ -33,7 +34,6 @@ #include "pipeline/rs_uni_render_util.h" #include "platform/common/rs_log.h" #include "platform/drawing/rs_surface.h" -#include "property/rs_transition_properties.h" #include "render/rs_skia_filter.h" #include "screen_manager/rs_screen_manager.h" #include "screen_manager/rs_screen_mode_info.h" @@ -284,8 +284,6 @@ void RSSurfaceCaptureTask::RSSurfaceCaptureVisitor::CaptureSurfaceInDisplayWithU canvas_->save(); } - auto transitionProperties = node.GetAnimationManager().GetTransitionProperties(); - RSPropertiesPainter::DrawTransitionProperties(transitionProperties, property, *canvas_); boundsRect_ = SkRect::MakeWH(property.GetBoundsWidth(), property.GetBoundsHeight()); frameGravity_ = property.GetFrameGravity(); canvas_->clipRect(boundsRect_); diff --git a/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp b/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp index b1bc854b73..9e6ab64b0e 100644 --- a/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp +++ b/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp @@ -33,7 +33,6 @@ #include "pipeline/rs_uni_render_util.h" #include "platform/common/rs_log.h" #include "property/rs_properties_painter.h" -#include "property/rs_transition_properties.h" #include "render/rs_skia_filter.h" namespace OHOS { @@ -573,9 +572,6 @@ void RSUniRenderVisitor::ProcessSurfaceRenderNode(RSSurfaceRenderNode& node) canvas_->save(); } - auto transitionProperties = node.GetAnimationManager().GetTransitionProperties(); - RSPropertiesPainter::DrawTransitionProperties(transitionProperties, property, *canvas_); - const RectI dstRect = { canvas_->getTotalMatrix().getTranslateX(), canvas_->getTotalMatrix().getTranslateY(), property.GetBoundsWidth() * canvas_->getTotalMatrix().getScaleX(), diff --git a/rosen/modules/render_service_base/include/animation/rs_animation_manager.h b/rosen/modules/render_service_base/include/animation/rs_animation_manager.h index 0f28cac80b..160282d237 100644 --- a/rosen/modules/render_service_base/include/animation/rs_animation_manager.h +++ b/rosen/modules/render_service_base/include/animation/rs_animation_manager.h @@ -30,11 +30,9 @@ class RSPaintFilterCanvas; class RSProperties; class RSRenderAnimation; class RSRenderNode; -class RSTransitionProperties; class RSAnimationManager { public: - using TransitionCallback = std::function& transitionProperties)>; RSAnimationManager() = default; ~RSAnimationManager() = default; @@ -46,12 +44,6 @@ public: bool Animate(int64_t time); - // transition related - void RegisterTransition(AnimationId id, const TransitionCallback& transition, bool isTransitionIn); - void UnregisterTransition(AnimationId id); - std::unique_ptr GetTransitionProperties(); - bool HasDisappearingTransition() const; - // spring animation related void RegisterSpringAnimation(PropertyId propertyId, AnimationId animId); void UnregisterSpringAnimation(PropertyId propertyId, AnimationId animId); @@ -64,7 +56,7 @@ private: std::unordered_map> animations_; std::unordered_map animationNum_; - std::list> transition_; + uint32_t transitionNum_ = 0; std::unordered_map springAnimations_; friend class RSRenderNode; diff --git a/rosen/modules/render_service_base/include/animation/rs_render_transition.h b/rosen/modules/render_service_base/include/animation/rs_render_transition.h index ac9ad8a425..794d8f4d44 100644 --- a/rosen/modules/render_service_base/include/animation/rs_render_transition.h +++ b/rosen/modules/render_service_base/include/animation/rs_render_transition.h @@ -44,8 +44,6 @@ protected: void OnAttach() override; void OnDetach() override; - float currentFraction_ { 0.0f }; - std::vector> effects_; std::shared_ptr interpolator_ { RSInterpolator::DEFAULT }; diff --git a/rosen/modules/render_service_base/include/animation/rs_render_transition_effect.h b/rosen/modules/render_service_base/include/animation/rs_render_transition_effect.h index 31e99f7cdb..1434f587ef 100644 --- a/rosen/modules/render_service_base/include/animation/rs_render_transition_effect.h +++ b/rosen/modules/render_service_base/include/animation/rs_render_transition_effect.h @@ -23,14 +23,18 @@ #include #include "animation/rs_animation_common.h" -#include "common/rs_vector4.h" namespace OHOS { namespace Rosen { class RSCanvasRenderNode; class RSPaintFilterCanvas; class RSProperties; -class RSTransitionProperties; +class RSRenderModifier; +template +class RSRenderAnimatableProperty; +class Quaternion; +template +class Vector2; #ifdef ROSEN_OHOS class RSRenderTransitionEffect : public Parcelable { @@ -40,21 +44,23 @@ class RSRenderTransitionEffect { public: RSRenderTransitionEffect() = default; virtual ~RSRenderTransitionEffect() = default; - virtual void OnTransition(const std::unique_ptr& transitionProperties, float fraction) = 0; + virtual const std::shared_ptr& GetModifier() = 0; + virtual void UpdateFraction(float fraction) const = 0; #ifdef ROSEN_OHOS - virtual bool Marshalling(Parcel& parcel) const override = 0; + bool Marshalling(Parcel& parcel) const override = 0; static RSRenderTransitionEffect* Unmarshalling(Parcel& parcel); #endif - protected: + std::shared_ptr modifier_ {}; }; class RSTransitionFade : public RSRenderTransitionEffect { public: explicit RSTransitionFade(float alpha) : alpha_(alpha) {} - virtual ~RSTransitionFade() = default; - void OnTransition(const std::unique_ptr& transitionProperties, float fraction) override; + ~RSTransitionFade() override = default; + const std::shared_ptr& GetModifier() override; + void UpdateFraction(float fraction) const override; #ifdef ROSEN_OHOS bool Marshalling(Parcel& parcel) const override; @@ -62,16 +68,17 @@ public: #endif private: float alpha_; + std::shared_ptr> property_ {}; }; class RSTransitionScale : public RSRenderTransitionEffect { public: - RSTransitionScale() = default; explicit RSTransitionScale(float scaleX = 0.0f, float scaleY = 0.0f, float scaleZ = 0.0f) : scaleX_(scaleX), scaleY_(scaleY), scaleZ_(scaleZ) {} - virtual ~RSTransitionScale() = default; - void OnTransition(const std::unique_ptr& transitionProperties, float fraction) override; + ~RSTransitionScale() override = default; + const std::shared_ptr& GetModifier() override; + void UpdateFraction(float fraction) const override; #ifdef ROSEN_OHOS bool Marshalling(Parcel& parcel) const override; @@ -81,16 +88,17 @@ private: float scaleX_; float scaleY_; float scaleZ_; + std::shared_ptr>> property_ {}; }; class RSTransitionTranslate : public RSRenderTransitionEffect { public: - RSTransitionTranslate() = default; explicit RSTransitionTranslate(float translateX, float translateY, float translateZ) : translateX_(translateX), translateY_(translateY), translateZ_(translateZ) {} - virtual ~RSTransitionTranslate() = default; - void OnTransition(const std::unique_ptr& transitionProperties, float fraction) override; + ~RSTransitionTranslate() override = default; + const std::shared_ptr& GetModifier() override; + void UpdateFraction(float fraction) const override; #ifdef ROSEN_OHOS bool Marshalling(Parcel& parcel) const override; @@ -100,14 +108,15 @@ private: float translateX_; float translateY_; float translateZ_; + std::shared_ptr>> property_ {}; }; class RSTransitionRotate : public RSRenderTransitionEffect { public: - RSTransitionRotate() = default; explicit RSTransitionRotate(float dx, float dy, float dz, float angle) : dx_(dx), dy_(dy), dz_(dz), angle_(angle) {} - virtual ~RSTransitionRotate() = default; - void OnTransition(const std::unique_ptr& transitionProperties, float fraction) override; + ~RSTransitionRotate() override = default; + const std::shared_ptr& GetModifier() override; + void UpdateFraction(float fraction) const override; #ifdef ROSEN_OHOS bool Marshalling(Parcel& parcel) const override; @@ -118,6 +127,7 @@ private: float dy_; float dz_; float angle_; + std::shared_ptr> property_ {}; }; } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_base/include/pipeline/rs_render_node.h b/rosen/modules/render_service_base/include/pipeline/rs_render_node.h index 16656f30b2..cd15dc6405 100644 --- a/rosen/modules/render_service_base/include/pipeline/rs_render_node.h +++ b/rosen/modules/render_service_base/include/pipeline/rs_render_node.h @@ -64,7 +64,7 @@ public: bool HasDisappearingTransition(bool recursive) const override { - return animationManager_.HasDisappearingTransition() || RSBaseRenderNode::HasDisappearingTransition(recursive); + return (disappearingTransitionCount_ > 0) || RSBaseRenderNode::HasDisappearingTransition(recursive); } inline RectI GetOldDirty() const @@ -77,7 +77,8 @@ public: } void ClearModifiers(); - virtual void AddModifier(const std::shared_ptr modifier); + virtual void AddModifier(const std::shared_ptr& modifier); + void RemoveModifier(const std::shared_ptr& modifier); void RemoveModifier(const PropertyId& id); void ApplyModifiers(); std::shared_ptr GetModifier(const PropertyId& id); @@ -97,6 +98,7 @@ private: void UpdateOverlayerBounds(); bool isDirtyRegionUpdated_ = false; bool isLastVisible_ = false; + uint32_t disappearingTransitionCount_ = 0; RectI oldDirty_; RSProperties renderProperties_; RSAnimationManager animationManager_; diff --git a/rosen/modules/render_service_base/include/property/rs_properties_painter.h b/rosen/modules/render_service_base/include/property/rs_properties_painter.h index 8ffd6391fb..96caa0f1a3 100644 --- a/rosen/modules/render_service_base/include/property/rs_properties_painter.h +++ b/rosen/modules/render_service_base/include/property/rs_properties_painter.h @@ -23,7 +23,6 @@ namespace OHOS { namespace Rosen { class RSSkiaFilter; class RSPaintFilterCanvas; -class RSTransitionProperties; class RSPropertiesPainter { public: @@ -36,10 +35,6 @@ public: std::shared_ptr& filter, const std::unique_ptr& rect = nullptr, SkSurface* sKSurface = nullptr); static void DrawForegroundColor(const RSProperties& properties, SkCanvas& canvas); - static void DrawTransitionProperties(const std::unique_ptr& transitionProperties, - const RSProperties& properties, RSPaintFilterCanvas& canvas); - static void DrawTransitionProperties(const std::unique_ptr& transitionProperties, - const Vector2f& center, RSPaintFilterCanvas& canvas); static void DrawMask(const RSProperties& properties, SkCanvas& canvas); static void DrawMask(const RSProperties& properties, SkCanvas& canvas, SkRect maskBounds); static bool GetGravityMatrix(Gravity gravity, RectF rect, float w, float h, SkMatrix& mat); diff --git a/rosen/modules/render_service_base/include/property/rs_transition_properties.h b/rosen/modules/render_service_base/include/property/rs_transition_properties.h deleted file mode 100644 index cc5761609c..0000000000 --- a/rosen/modules/render_service_base/include/property/rs_transition_properties.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef RENDER_SERVICE_CLIENT_CORE_PROPERTY_RS_TRANSITION_PROPERTIES_H -#define RENDER_SERVICE_CLIENT_CORE_PROPERTY_RS_TRANSITION_PROPERTIES_H - -#include - -#include "common/rs_vector3.h" -#include "include/core/SkMatrix44.h" - -namespace OHOS { -namespace Rosen { -class RSTransitionProperties final { -public: - RSTransitionProperties() = default; - ~RSTransitionProperties() = default; - - void DoAlphaTransition(float alpha) - { - alpha_ *= alpha; - } - void DoTranslateTransition(const Vector3f& translate) - { - translate_ += translate; - } - void DoScaleTransition(const Vector3f& scale) - { - scale_ *= scale; - } - void DoRotateTransition(const SkMatrix44& rotateMatrix) - { - rotate_.preConcat(rotateMatrix); - } - - float GetAlpha() const - { - return alpha_; - } - Vector3f GetTranslate() const - { - return translate_; - } - Vector3f GetScale() const - { - return scale_; - } - SkMatrix44 GetRotate() const - { - return rotate_; - } - -private: - float alpha_ = 1.0f; - Vector3f translate_ = { 0.0f, 0.0f, 0.0f }; - Vector3f scale_ = { 1.0f, 1.0f, 1.0f }; - SkMatrix44 rotate_ = SkMatrix44::I(); -}; -} // namespace Rosen -} // namespace OHOS - -#endif // RENDER_SERVICE_CLIENT_CORE_PROPERTY_RS_TRANSITION_PROPERTIES_H diff --git a/rosen/modules/render_service_base/src/animation/rs_animation_manager.cpp b/rosen/modules/render_service_base/src/animation/rs_animation_manager.cpp index 087211a691..96bf2dafbc 100644 --- a/rosen/modules/render_service_base/src/animation/rs_animation_manager.cpp +++ b/rosen/modules/render_service_base/src/animation/rs_animation_manager.cpp @@ -25,7 +25,6 @@ #include "pipeline/rs_paint_filter_canvas.h" #include "pipeline/rs_render_node.h" #include "platform/common/rs_log.h" -#include "property/rs_transition_properties.h" namespace OHOS { namespace Rosen { @@ -46,7 +45,6 @@ void RSAnimationManager::ClearAnimation() { animations_.clear(); animationNum_.clear(); - transition_.clear(); springAnimations_.clear(); } @@ -135,43 +133,6 @@ void RSAnimationManager::OnAnimationFinished(const std::shared_ptrDetach(); } -void RSAnimationManager::RegisterTransition(AnimationId id, const TransitionCallback& transition, bool isTransitionIn) -{ - transition_.emplace_back(id, transition, isTransitionIn); -} - -void RSAnimationManager::UnregisterTransition(AnimationId id) -{ - if (transition_.empty()) { - ROSEN_LOGE("RSAnimationManager::ClearTransition, transition_ is empty"); - return; - } - transition_.remove_if([id](auto& transition) -> bool { return id == std::get(transition); }); -} - -std::unique_ptr RSAnimationManager::GetTransitionProperties() -{ - if (transition_.empty()) { - return nullptr; - } - auto transitionProperties = std::make_unique(); - for (auto& transition : transition_) { - auto& callback = std::get(transition); - if (callback != nullptr) { - callback(transitionProperties); - } - } - return transitionProperties; -} - -bool RSAnimationManager::HasDisappearingTransition() const -{ - return !transition_.empty() && std::any_of(transition_.begin(), transition_.end(), [](auto& transition) -> bool { - // return true if it has disappearing animation - return !std::get(transition); - }); -} - void RSAnimationManager::RegisterSpringAnimation(PropertyId propertyId, AnimationId animId) { springAnimations_[propertyId] = animId; diff --git a/rosen/modules/render_service_base/src/animation/rs_render_transition.cpp b/rosen/modules/render_service_base/src/animation/rs_render_transition.cpp index 9d7ffacace..22a32b7d94 100644 --- a/rosen/modules/render_service_base/src/animation/rs_render_transition.cpp +++ b/rosen/modules/render_service_base/src/animation/rs_render_transition.cpp @@ -85,9 +85,12 @@ bool RSRenderTransition::ParseParam(Parcel& parcel) #endif void RSRenderTransition::OnAnimate(float fraction) { - currentFraction_ = interpolator_->Interpolate(fraction); + float valueFraction = interpolator_->Interpolate(fraction); if (isTransitionIn_) { - currentFraction_ = 1 - currentFraction_; + valueFraction = 1 - valueFraction; + } + for (auto& effect : effects_) { + effect->UpdateFraction(valueFraction); } auto target = GetTarget(); if (target == nullptr) { @@ -104,18 +107,15 @@ void RSRenderTransition::OnAttach() ROSEN_LOGE("RSRenderTransition::OnAttach, target is nullptr"); return; } - if (effects_.empty()) { - ROSEN_LOGE("RSRenderTransition::OnAttach, effects is empty"); - return; + // create "transition" modifier and add it to target + for (auto& effect : effects_) { + target->AddModifier(effect->GetModifier()); + effect->UpdateFraction(isTransitionIn_ ? 1.0f : 0.0f); + } + // update number of disappearing transition animation + if (!isTransitionIn_) { + target->disappearingTransitionCount_++; } - target->GetAnimationManager().RegisterTransition( - GetAnimationId(), - [this](const std::unique_ptr& transitionProperties) -> void { - for (auto& effect : effects_) { - effect->OnTransition(transitionProperties, currentFraction_); - } - }, - isTransitionIn_); } void RSRenderTransition::OnDetach() @@ -125,7 +125,14 @@ void RSRenderTransition::OnDetach() ROSEN_LOGE("RSRenderTransition::OnDetach, target is nullptr"); return; } - target->GetAnimationManager().UnregisterTransition(GetAnimationId()); + // remove "transition" modifier from target + for (auto& effect : effects_) { + target->RemoveModifier(effect->GetModifier()); + } + // update number of disappearing transition animation + if (!isTransitionIn_) { + target->disappearingTransitionCount_--; + } } } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_base/src/animation/rs_render_transition_effect.cpp b/rosen/modules/render_service_base/src/animation/rs_render_transition_effect.cpp index e335533eac..c7ea0f6b94 100644 --- a/rosen/modules/render_service_base/src/animation/rs_render_transition_effect.cpp +++ b/rosen/modules/render_service_base/src/animation/rs_render_transition_effect.cpp @@ -17,8 +17,8 @@ #include "animation/rs_animation_common.h" #include "animation/rs_value_estimator.h" +#include "modifier/rs_render_modifier.h" #include "platform/common/rs_log.h" -#include "property/rs_transition_properties.h" #include "transaction/rs_marshalling_helper.h" namespace OHOS { @@ -127,50 +127,83 @@ RSRenderTransitionEffect* RSTransitionRotate::Unmarshalling(Parcel& parcel) } #endif -void RSTransitionFade::OnTransition(const std::unique_ptr& transitionProperties, float fraction) +const std::shared_ptr& RSTransitionFade::GetModifier() { -#ifdef ROSEN_OHOS + if (modifier_ == nullptr || property_ == nullptr) { + property_ = std::make_shared>(); + modifier_ = std::make_shared(property_); + } + return modifier_; +} + +void RSTransitionFade::UpdateFraction(float fraction) const +{ + if (property_ == nullptr) { + return; + } float startValue(1.0f); float endValue(alpha_); auto value = startValue * (1.0f - fraction) + endValue * fraction; + property_->Set(value); +} - transitionProperties->DoAlphaTransition(value); -#endif +const std::shared_ptr& RSTransitionScale::GetModifier() +{ + if (modifier_ == nullptr || property_ == nullptr) { + property_ = std::make_shared>(); + modifier_ = std::make_shared(property_); + } + return modifier_; } -void RSTransitionScale::OnTransition( - const std::unique_ptr& transitionProperties, float fraction) +void RSTransitionScale::UpdateFraction(float fraction) const { -#ifdef ROSEN_OHOS - Vector3f startValue(1.0f, 1.0f, 1.0f); - Vector3f endValue(scaleX_, scaleY_, scaleZ_); + if (property_ == nullptr) { + return; + } + Vector2f startValue(1.0f, 1.0f); + Vector2f endValue(scaleX_, scaleY_); auto value = startValue * (1.0f - fraction) + endValue * fraction; + property_->Set(value); +} - transitionProperties->DoScaleTransition(value); -#endif +const std::shared_ptr& RSTransitionTranslate::GetModifier() +{ + if (modifier_ == nullptr || property_ == nullptr) { + property_ = std::make_shared>(); + modifier_ = std::make_shared(property_); + } + return modifier_; } -void RSTransitionTranslate::OnTransition( - const std::unique_ptr& transitionProperties, float fraction) +void RSTransitionTranslate::UpdateFraction(float fraction) const { -#ifdef ROSEN_OHOS - Vector3f startValue(0.0f, 0.0f, 0.0f); - Vector3f endValue(translateX_, translateY_, translateZ_); + if (property_ == nullptr) { + return; + } + Vector2f startValue(0.0f, 0.0f); + Vector2f endValue(translateX_, translateY_); auto value = startValue * (1.0f - fraction) + endValue * fraction; - transitionProperties->DoTranslateTransition(value); -#endif + property_->Set(value); } -void RSTransitionRotate::OnTransition( - const std::unique_ptr& transitionProperties, float fraction) +const std::shared_ptr& RSTransitionRotate::GetModifier() { -#ifdef ROSEN_OHOS - auto angle = angle_ * fraction; - auto rotateMatrix = SkMatrix44::I(); - rotateMatrix.setRotateDegreesAbout(dx_, dy_, dz_, angle); + if (modifier_ == nullptr || property_ == nullptr) { + property_ = std::make_shared>(); + modifier_ = std::make_shared(property_); + } + return modifier_; +} - transitionProperties->DoRotateTransition(rotateMatrix); -#endif +void RSTransitionRotate::UpdateFraction(float fraction) const +{ + if (property_ == nullptr) { + return; + } + auto angle = angle_ * fraction; + Quaternion value(dx_, dy_, dz_, angle); + property_->Set(value); } } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp b/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp index 5814e9de3d..6fa401077f 100644 --- a/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp +++ b/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp @@ -25,7 +25,6 @@ #ifdef ROSEN_OHOS #include "pipeline/rs_paint_filter_canvas.h" #include "property/rs_properties_painter.h" -#include "property/rs_transition_properties.h" #endif namespace OHOS { @@ -164,8 +163,6 @@ void RSRenderNode::ProcessRenderBeforeChildren(RSPaintFilterCanvas& canvas) canvas.saveLayerAlpha(&rect, std::clamp(alpha, 0.f, 1.f) * UINT8_MAX); } } - auto transitionProperties = GetAnimationManager().GetTransitionProperties(); - RSPropertiesPainter::DrawTransitionProperties(transitionProperties, GetRenderProperties(), canvas); RSPropertiesPainter::DrawMask(GetRenderProperties(), canvas); #endif } @@ -185,7 +182,7 @@ void RSRenderNode::ClearModifiers() SetDirty(); } -void RSRenderNode::AddModifier(const std::shared_ptr modifier) +void RSRenderNode::AddModifier(const std::shared_ptr& modifier) { if (!modifier) { return; @@ -193,7 +190,7 @@ void RSRenderNode::AddModifier(const std::shared_ptr modifier) if (modifier->GetType() == RSModifierType::BOUNDS || modifier->GetType() == RSModifierType::FRAME) { AddGeometryModifier(modifier); } else if (modifier->GetType() < RSModifierType::CUSTOM) { - modifiers_.insert({ modifier->GetPropertyId(), modifier }); + modifiers_.emplace(modifier->GetPropertyId(), modifier); } else { drawCmdModifiers_[modifier->GetType()].emplace_back(modifier); } @@ -208,22 +205,21 @@ void RSRenderNode::AddGeometryModifier(const std::shared_ptr& if (boundsModifier_ == nullptr) { boundsModifier_ = modifier; } - modifiers_.insert({ modifier->GetPropertyId(), boundsModifier_ }); + modifiers_.emplace(modifier->GetPropertyId(), boundsModifier_); } if (modifier->GetType() == RSModifierType::FRAME) { if (frameModifier_ == nullptr) { frameModifier_ = modifier; } - modifiers_.insert({ modifier->GetPropertyId(), frameModifier_ }); + modifiers_.emplace(modifier->GetPropertyId(), frameModifier_); } } void RSRenderNode::RemoveModifier(const PropertyId& id) { - auto iter = modifiers_.find(id); - if (iter != modifiers_.end()) { - modifiers_.erase(iter); + bool success = modifiers_.erase(id); + if (success) { SetDirty(); return; } @@ -237,6 +233,22 @@ void RSRenderNode::RemoveModifier(const PropertyId& id) } } +void RSRenderNode::RemoveModifier(const std::shared_ptr& modifier) +{ + auto erasedElements = std::__libcpp_erase_if_container(modifiers_, [&modifier](const auto& iter) { + return iter.second == modifier; + }); + if (erasedElements > 0) { + SetDirty(); + return; + } + for (auto& [type, modifiers] : drawCmdModifiers_) { + modifiers.remove_if([&modifier](const auto& item) -> bool { + return item == modifier; + }); + } +} + void RSRenderNode::ApplyModifiers() { if (!RSBaseRenderNode::IsDirty()) { diff --git a/rosen/modules/render_service_base/src/pipeline/rs_surface_render_node.cpp b/rosen/modules/render_service_base/src/pipeline/rs_surface_render_node.cpp index 9ae9eea27d..400e014b14 100644 --- a/rosen/modules/render_service_base/src/pipeline/rs_surface_render_node.cpp +++ b/rosen/modules/render_service_base/src/pipeline/rs_surface_render_node.cpp @@ -24,12 +24,11 @@ #include "common/rs_rect.h" #include "common/rs_vector2.h" #include "common/rs_vector4.h" +#include "pipeline/rs_occlusion_config.h" #include "pipeline/rs_render_node.h" #include "pipeline/rs_root_render_node.h" -#include "pipeline/rs_occlusion_config.h" #include "platform/common/rs_log.h" #include "property/rs_properties_painter.h" -#include "property/rs_transition_properties.h" #include "transaction/rs_render_service_client.h" #include "visitor/rs_node_visitor.h" @@ -99,11 +98,6 @@ void RSSurfaceRenderNode::PrepareRenderBeforeChildren(RSPaintFilterCanvas& canva canvas.concat(matrix); } - // apply transition properties to canvas - auto transitionProperties = GetAnimationManager().GetTransitionProperties(); - Vector2f center(properties.GetBoundsWidth() * 0.5f, properties.GetBoundsHeight() * 0.5f); - RSPropertiesPainter::DrawTransitionProperties(transitionProperties, center, canvas); - // clip by bounds canvas.clipRect( SkRect::MakeWH(std::floor(properties.GetBoundsWidth()), std::floor(properties.GetBoundsHeight()))); diff --git a/rosen/modules/render_service_base/src/property/rs_properties_painter.cpp b/rosen/modules/render_service_base/src/property/rs_properties_painter.cpp index 68405c4f38..d775ce9f73 100644 --- a/rosen/modules/render_service_base/src/property/rs_properties_painter.cpp +++ b/rosen/modules/render_service_base/src/property/rs_properties_painter.cpp @@ -15,30 +15,30 @@ #include "property/rs_properties_painter.h" -#include "common/rs_obj_abs_geometry.h" #include "include/core/SkCanvas.h" #include "include/core/SkColorFilter.h" #include "include/core/SkMaskFilter.h" #include "include/core/SkPaint.h" #include "include/core/SkPoint3.h" #include "include/core/SkRRect.h" +#include "include/core/SkSurface.h" #include "include/effects/Sk1DPathEffect.h" #include "include/effects/SkDashPathEffect.h" #include "include/effects/SkLumaColorFilter.h" #include "include/utils/SkShadowUtils.h" + +#include "common/rs_obj_abs_geometry.h" #include "common/rs_vector2.h" #include "pipeline/rs_draw_cmd_list.h" #include "pipeline/rs_paint_filter_canvas.h" #include "pipeline/rs_root_render_node.h" #include "platform/common/rs_log.h" -#include "property/rs_transition_properties.h" #include "render/rs_blur_filter.h" #include "render/rs_image.h" +#include "render/rs_mask.h" #include "render/rs_path.h" #include "render/rs_shader.h" -#include "render/rs_mask.h" #include "render/rs_skia_filter.h" -#include "include/core/SkSurface.h" #include "render_context/render_context.h" namespace OHOS { @@ -56,10 +56,14 @@ SkRRect RSPropertiesPainter::RRect2SkRRect(const RRect& rr) { SkRect rect = SkRect::MakeXYWH(rr.rect_.left_, rr.rect_.top_, rr.rect_.width_, rr.rect_.height_); SkRRect rrect = SkRRect::MakeEmpty(); - SkVector vec[4]; - for (int i = 0; i < 4; i++) { + + // set radius for all 4 corner of RRect + constexpr uint32_t NUM_OF_CORNERS_IN_RECT = 4; + SkVector vec[NUM_OF_CORNERS_IN_RECT]; + for (uint32_t i = 0; i < NUM_OF_CORNERS_IN_RECT; i++) { vec[i].set(rr.radius_[i].x_, rr.radius_[i].y_); } + rrect.setRectRadii(rect, vec); return rrect; } @@ -308,33 +312,6 @@ void RSPropertiesPainter::DrawForegroundColor(const RSProperties& properties, Sk canvas.drawRRect(RRect2SkRRect(properties.GetRRect()), paint); } -void RSPropertiesPainter::DrawTransitionProperties(const std::unique_ptr& transitionProperties, - const RSProperties& properties, RSPaintFilterCanvas& canvas) -{ - DrawTransitionProperties(transitionProperties, properties.GetBoundsSize() * 0.5f, canvas); -} - -void RSPropertiesPainter::DrawTransitionProperties(const std::unique_ptr& transitionProperties, - const Vector2f& center, RSPaintFilterCanvas& canvas) -{ - if (transitionProperties == nullptr) { - return; - } - // alpha - canvas.MultiplyAlpha(transitionProperties->GetAlpha()); - - // translate, currently translateZ is not used - auto translate = transitionProperties->GetTranslate(); - canvas.translate(translate.x_, translate.y_); - - // scale and rotate about the center of node, currently scaleZ is not used - auto scale = transitionProperties->GetScale(); - canvas.translate(center.x_, center.y_); - canvas.scale(scale.x_, scale.y_); - canvas.concat(transitionProperties->GetRotate()); - canvas.translate(-center.x_, -center.y_); -} - void RSPropertiesPainter::DrawMask(const RSProperties& properties, SkCanvas& canvas, SkRect maskBounds) { std::shared_ptr mask = properties.GetMask(); -- Gitee From dc552fb60b7e91197eb211eb496255eae3e1a232 Mon Sep 17 00:00:00 2001 From: Zhang Peng Date: Tue, 30 Aug 2022 14:07:01 +0800 Subject: [PATCH 3/6] fix RSTransition bug and csec warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. transition modifier不使用propertyId索引 2. RSNode在ApplyModifier前先复位RSProperty, 所有Modifier增量设值, 修复部分属性初始化错误 3. 不是所有属性的叠加方式都是累加, 如有多个alpha, 应该相乘 4. 避免创建空转场效果 Signed-off-by: Zhang Peng Change-Id: I6e0112d0e5d6d6a60dd45579203163bc67503be3 --- .../core/pipeline/rs_divided_render_util.cpp | 5 + .../core/pipeline/rs_uni_render_visitor.cpp | 4 +- .../include/animation/rs_animation_manager.h | 1 - .../include/common/rs_vector2.h | 14 +- .../include/common/rs_vector4.h | 8 +- .../include/modifier/rs_modifiers_def.in | 60 +++---- .../include/modifier/rs_render_modifier.h | 49 +++--- .../include/pipeline/rs_canvas_render_node.h | 4 +- .../include/pipeline/rs_render_node.h | 11 +- .../include/property/rs_properties.h | 24 +-- .../animation/rs_render_spring_animation.cpp | 5 +- .../src/animation/rs_render_transition.cpp | 11 +- .../src/animation/rs_transition_effect.cpp | 33 ++-- .../src/modifier/rs_render_modifier.cpp | 75 +++++---- .../src/pipeline/rs_canvas_render_node.cpp | 6 +- .../src/pipeline/rs_render_node.cpp | 40 +++-- .../src/pipeline/rs_surface_render_node.cpp | 9 +- .../src/property/rs_properties.cpp | 21 ++- .../src/property/rs_properties_painter.cpp | 151 +++++++++--------- .../core/modifier/rs_modifier.h | 7 - .../core/modifier/rs_modifier_extractor.cpp | 8 +- .../core/modifier/rs_property_modifier.cpp | 3 +- .../render_service_client/core/ui/rs_node.cpp | 11 +- 23 files changed, 278 insertions(+), 282 deletions(-) diff --git a/rosen/modules/render_service/core/pipeline/rs_divided_render_util.cpp b/rosen/modules/render_service/core/pipeline/rs_divided_render_util.cpp index b3b2979fac..a1ead1499c 100644 --- a/rosen/modules/render_service/core/pipeline/rs_divided_render_util.cpp +++ b/rosen/modules/render_service/core/pipeline/rs_divided_render_util.cpp @@ -64,6 +64,11 @@ bool RSDividedRenderUtil::IsNeedClient(RSSurfaceRenderNode& node, const ComposeI RS_LOGD("RsDebug RSDividedRenderUtil::IsNeedClient enable composition client need shadow"); return true; } + if (property.GetRotation() != 0 || property.GetRotationX() != 0 || property.GetRotationY() != 0 || + property.GetQuaternion() != Quaternion()) { + RS_LOGD("RsDebug RSDividedRenderUtil::IsNeedClient enable composition client need rotation"); + return true; + } return false; } diff --git a/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp b/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp index 9e6ab64b0e..cbc62fdaf4 100644 --- a/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp +++ b/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp @@ -217,8 +217,8 @@ void RSUniRenderVisitor::DrawDirtyRegion() if (curSurfaceDirtyManager_->IsDebugRegionTypeEnable(DebugRegionType::CURRENT_WHOLE)) { dirtyRect = curSurfaceDirtyManager_->GetLatestDirtyRegion(); if (dirtyRect.width_ <= 0 || dirtyRect.height_ <= 0) { - ROSEN_LOGD("DrawDirtyRegion dirty rect is invalid. dirtyRect = [%d, %d, %d, %d]", - dirtyRect.left_, dirtyRect.top_, dirtyRect.width_, dirtyRect.height_); + ROSEN_LOGD("DrawDirtyRegion dirty rect is invalid. dirtyRect = [%d, %d, %d, %d]", dirtyRect.left_, + dirtyRect.top_, dirtyRect.width_, dirtyRect.height_); } else { ROSEN_LOGD("DrawDirtyRegion cur dirty rect"); // yellow diff --git a/rosen/modules/render_service_base/include/animation/rs_animation_manager.h b/rosen/modules/render_service_base/include/animation/rs_animation_manager.h index 160282d237..cbc4d296dc 100644 --- a/rosen/modules/render_service_base/include/animation/rs_animation_manager.h +++ b/rosen/modules/render_service_base/include/animation/rs_animation_manager.h @@ -56,7 +56,6 @@ private: std::unordered_map> animations_; std::unordered_map animationNum_; - uint32_t transitionNum_ = 0; std::unordered_map springAnimations_; friend class RSRenderNode; diff --git a/rosen/modules/render_service_base/include/common/rs_vector2.h b/rosen/modules/render_service_base/include/common/rs_vector2.h index 4f642c68ed..e50d401715 100644 --- a/rosen/modules/render_service_base/include/common/rs_vector2.h +++ b/rosen/modules/render_service_base/include/common/rs_vector2.h @@ -45,6 +45,7 @@ public: Vector2 operator+(const Vector2& other) const; Vector2 operator/(T scale) const; Vector2 operator*(T scale) const; + Vector2 operator*(const Vector2& other); Vector2& operator*=(const Vector2& other); Vector2& operator+=(const Vector2& other); Vector2& operator=(const Vector2& other); @@ -136,11 +137,7 @@ template Vector2 Vector2::operator+(const Vector2& other) const { Vector2 rAdd(*this); - T* rData = rAdd.data_; - const T* oData = other.data_; - rData[0] += oData[0]; - rData[1] += oData[1]; - return rAdd; + return rAdd += other; } template @@ -164,6 +161,13 @@ Vector2 Vector2::operator*(T scale) const return rMult; } +template +Vector2 Vector2::operator*(const Vector2& other) +{ + Vector2 rMult(*this); + return rMult *= other; +} + template Vector2& Vector2::operator*=(const Vector2& other) { diff --git a/rosen/modules/render_service_base/include/common/rs_vector4.h b/rosen/modules/render_service_base/include/common/rs_vector4.h index 354a83c992..f31139342f 100644 --- a/rosen/modules/render_service_base/include/common/rs_vector4.h +++ b/rosen/modules/render_service_base/include/common/rs_vector4.h @@ -343,13 +343,7 @@ template Vector4 Vector4::operator*(const Vector4& other) const { Vector4 rMult; - T* rData = rMult.data_; - const T* oData = other.data_; - rData[0] = data_[0] * oData[0]; - rData[1] = data_[1] * oData[1]; - rData[2] = data_[2] * oData[2]; - rData[3] = data_[3] * oData[3]; - return rMult; + return rMult *= other; } template diff --git a/rosen/modules/render_service_base/include/modifier/rs_modifiers_def.in b/rosen/modules/render_service_base/include/modifier/rs_modifiers_def.in index c96a9863de..01a7c67203 100644 --- a/rosen/modules/render_service_base/include/modifier/rs_modifiers_def.in +++ b/rosen/modules/render_service_base/include/modifier/rs_modifiers_def.in @@ -14,61 +14,61 @@ */ // Declare animatable and not-animatable modifiers -// agrs: (NAME, TYPE, MODIFIER_TYPE) +// agrs: (NAME, TYPE, MODIFIER_TYPE, DELTA_OP) -DECLARE_ANIMATABLE_MODIFIER(Bounds, Vector4f, BOUNDS, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(Bounds, Vector4f, BOUNDS, RSRenderAnimatableProperty, Replace) -DECLARE_ANIMATABLE_MODIFIER(Frame, Vector4f, FRAME, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(Frame, Vector4f, FRAME, RSRenderAnimatableProperty, Replace) -DECLARE_ANIMATABLE_MODIFIER(PositionZ, float, POSITION_Z, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(PositionZ, float, POSITION_Z, RSRenderAnimatableProperty, Add) -DECLARE_ANIMATABLE_MODIFIER(Pivot, Vector2f, PIVOT, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(Pivot, Vector2f, PIVOT, RSRenderAnimatableProperty, Replace) -DECLARE_ANIMATABLE_MODIFIER(Quaternion, Quaternion, QUATERNION, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(Quaternion, Quaternion, QUATERNION, RSRenderAnimatableProperty, Add) -DECLARE_ANIMATABLE_MODIFIER(Rotation, float, ROTATION, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(Rotation, float, ROTATION, RSRenderAnimatableProperty, Add) -DECLARE_ANIMATABLE_MODIFIER(RotationX, float, ROTATION_X, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(RotationX, float, ROTATION_X, RSRenderAnimatableProperty, Add) -DECLARE_ANIMATABLE_MODIFIER(RotationY, float, ROTATION_Y, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(RotationY, float, ROTATION_Y, RSRenderAnimatableProperty, Add) -DECLARE_ANIMATABLE_MODIFIER(Scale, Vector2f, SCALE, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(Scale, Vector2f, SCALE, RSRenderAnimatableProperty, Multiply) -DECLARE_ANIMATABLE_MODIFIER(Translate, Vector2f, TRANSLATE, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(Translate, Vector2f, TRANSLATE, RSRenderAnimatableProperty, Add) -DECLARE_ANIMATABLE_MODIFIER(TranslateZ, float, TRANSLATE_Z, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(TranslateZ, float, TRANSLATE_Z, RSRenderAnimatableProperty, Add) -DECLARE_ANIMATABLE_MODIFIER(CornerRadius, Vector4f, CORNER_RADIUS, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(CornerRadius, Vector4f, CORNER_RADIUS, RSRenderAnimatableProperty, Add) -DECLARE_ANIMATABLE_MODIFIER(Alpha, float, ALPHA, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(Alpha, float, ALPHA, RSRenderAnimatableProperty, Multiply) DECLARE_NOANIMATABLE_MODIFIER(AlphaOffscreen, bool, ALPHA_OFFSCREEN, RSRenderProperty) -DECLARE_ANIMATABLE_MODIFIER(ForegroundColor, Color, FOREGROUND_COLOR, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(ForegroundColor, Color, FOREGROUND_COLOR, RSRenderAnimatableProperty, Add) -DECLARE_ANIMATABLE_MODIFIER(BackgroundColor, Color, BACKGROUND_COLOR, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(BackgroundColor, Color, BACKGROUND_COLOR, RSRenderAnimatableProperty, Add) DECLARE_NOANIMATABLE_MODIFIER(BackgroundShader, std::shared_ptr, BACKGROUND_SHADER, RSRenderProperty) DECLARE_NOANIMATABLE_MODIFIER(BgImage, std::shared_ptr, BG_IMAGE, RSRenderProperty) -DECLARE_ANIMATABLE_MODIFIER(BgImageWidth, float, BG_IMAGE_WIDTH, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(BgImageWidth, float, BG_IMAGE_WIDTH, RSRenderAnimatableProperty, Add) -DECLARE_ANIMATABLE_MODIFIER(BgImageHeight, float, BG_IMAGE_HEIGHT, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(BgImageHeight, float, BG_IMAGE_HEIGHT, RSRenderAnimatableProperty, Add) -DECLARE_ANIMATABLE_MODIFIER(BgImagePositionX, float, BG_IMAGE_POSITION_X, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(BgImagePositionX, float, BG_IMAGE_POSITION_X, RSRenderAnimatableProperty, Add) -DECLARE_ANIMATABLE_MODIFIER(BgImagePositionY, float, BG_IMAGE_POSITION_Y, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(BgImagePositionY, float, BG_IMAGE_POSITION_Y, RSRenderAnimatableProperty, Add) -DECLARE_ANIMATABLE_MODIFIER(BorderColor, Vector4, BORDER_COLOR, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(BorderColor, Vector4, BORDER_COLOR, RSRenderAnimatableProperty, Replace) -DECLARE_ANIMATABLE_MODIFIER(BorderWidth, Vector4f, BORDER_WIDTH, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(BorderWidth, Vector4f, BORDER_WIDTH, RSRenderAnimatableProperty, Replace) DECLARE_NOANIMATABLE_MODIFIER(BorderStyle, Vector4, BORDER_STYLE, RSRenderProperty) -DECLARE_ANIMATABLE_MODIFIER(Filter, std::shared_ptr, FILTER, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(Filter, std::shared_ptr, FILTER, RSRenderAnimatableProperty, Add) -DECLARE_ANIMATABLE_MODIFIER(BackgroundFilter, std::shared_ptr, BACKGROUND_FILTER, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(BackgroundFilter, std::shared_ptr, BACKGROUND_FILTER, RSRenderAnimatableProperty, Add) DECLARE_NOANIMATABLE_MODIFIER(FrameGravity, Gravity, FRAME_GRAVITY, RSRenderProperty) @@ -80,17 +80,17 @@ DECLARE_NOANIMATABLE_MODIFIER(ClipToFrame, bool, CLIP_TO_FRAME, RSRenderProperty DECLARE_NOANIMATABLE_MODIFIER(Visible, bool, VISIBLE, RSRenderProperty) -DECLARE_ANIMATABLE_MODIFIER(ShadowColor, Color, SHADOW_COLOR, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(ShadowColor, Color, SHADOW_COLOR, RSRenderAnimatableProperty, Replace) -DECLARE_ANIMATABLE_MODIFIER(ShadowOffsetX, float, SHADOW_OFFSET_X, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(ShadowOffsetX, float, SHADOW_OFFSET_X, RSRenderAnimatableProperty, Replace) -DECLARE_ANIMATABLE_MODIFIER(ShadowOffsetY, float, SHADOW_OFFSET_Y, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(ShadowOffsetY, float, SHADOW_OFFSET_Y, RSRenderAnimatableProperty, Replace) -DECLARE_ANIMATABLE_MODIFIER(ShadowAlpha, float, SHADOW_ALPHA, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(ShadowAlpha, float, SHADOW_ALPHA, RSRenderAnimatableProperty, Replace) -DECLARE_ANIMATABLE_MODIFIER(ShadowElevation, float, SHADOW_ELEVATION, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(ShadowElevation, float, SHADOW_ELEVATION, RSRenderAnimatableProperty, Replace) -DECLARE_ANIMATABLE_MODIFIER(ShadowRadius, float, SHADOW_RADIUS, RSRenderAnimatableProperty) +DECLARE_ANIMATABLE_MODIFIER(ShadowRadius, float, SHADOW_RADIUS, RSRenderAnimatableProperty, Replace) DECLARE_NOANIMATABLE_MODIFIER(ShadowPath, std::shared_ptr, SHADOW_PATH, RSRenderProperty) diff --git a/rosen/modules/render_service_base/include/modifier/rs_render_modifier.h b/rosen/modules/render_service_base/include/modifier/rs_render_modifier.h index 9e7d5cc631..80d22bfdde 100644 --- a/rosen/modules/render_service_base/include/modifier/rs_render_modifier.h +++ b/rosen/modules/render_service_base/include/modifier/rs_render_modifier.h @@ -39,7 +39,7 @@ namespace Rosen { class RSProperties; class RSPaintFilterCanvas; -struct RSModifyContext { +struct RSModifierContext { RSProperties& property_; RSPaintFilterCanvas* canvas_ = nullptr; }; @@ -49,16 +49,15 @@ public: RSRenderModifier() = default; virtual ~RSRenderModifier() = default; - virtual void Apply(RSModifyContext& context) = 0; + virtual void Apply(RSModifierContext& context) = 0; virtual PropertyId GetPropertyId() = 0; virtual std::shared_ptr GetProperty() = 0; virtual RSModifierType GetType() = 0; - virtual void Update(const std::shared_ptr& newProp, bool isDelta) = 0; + virtual void Update(const std::shared_ptr& prop, bool isDelta) = 0; virtual bool Marshalling(Parcel& parcel) = 0; static RSRenderModifier* Unmarshalling(Parcel& parcel); - virtual void SetIsAdditive(bool isAdditive) = 0; }; class RSDrawCmdListRenderModifier : public RSRenderModifier { @@ -67,8 +66,8 @@ public: : property_(property ? property : std::make_shared>()) {} virtual ~RSDrawCmdListRenderModifier() = default; - void Apply(RSModifyContext& context) override; - void Update(const std::shared_ptr& newProp, bool isDelta) override; + void Apply(RSModifierContext& context) override; + void Update(const std::shared_ptr& prop, bool isDelta) override; bool Marshalling(Parcel& parcel) override; virtual PropertyId GetPropertyId() override @@ -81,7 +80,6 @@ public: return property_; } - void SetIsAdditive(bool isAdditive) override {} RSModifierType GetType() override { return drawStyle_; @@ -126,36 +124,31 @@ public: return property_; } - virtual void SetIsAdditive(bool isAdditive) override - { - isAdditive_ = isAdditive; - } - protected: std::shared_ptr property_; - bool isAdditive_ { false }; - bool isFirstSet_ { true }; - std::shared_ptr lastValue_ = std::make_shared(); friend class RSRenderPropertyAnimation; }; // declare RenderModifiers like RSBoundsRenderModifier -#define DECLARE_ANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, RENDER_PROPERTY) \ - class RS##MODIFIER_NAME##RenderModifier : public RSAnimatableRenderModifier> { \ - public: \ - RS##MODIFIER_NAME##RenderModifier(const std::shared_ptr>& property) \ - : RSAnimatableRenderModifier>(property) \ - {} \ - virtual ~RS##MODIFIER_NAME##RenderModifier() = default; \ - void Apply(RSModifyContext& context) override; \ - void Update(const std::shared_ptr& newProp, bool isDelta) override; \ - bool Marshalling(Parcel& parcel) override; \ - RSModifierType GetType() override { return RSModifierType::MODIFIER_TYPE; } \ +#define DECLARE_ANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, RENDER_PROPERTY, DELTA_OP) \ + class RS##MODIFIER_NAME##RenderModifier : public RSAnimatableRenderModifier> { \ + public: \ + RS##MODIFIER_NAME##RenderModifier(const std::shared_ptr>& property) \ + : RSAnimatableRenderModifier>(property) \ + {} \ + virtual ~RS##MODIFIER_NAME##RenderModifier() = default; \ + void Apply(RSModifierContext& context) override; \ + void Update(const std::shared_ptr& prop, bool isDelta) override; \ + bool Marshalling(Parcel& parcel) override; \ + RSModifierType GetType() override \ + { \ + return RSModifierType::MODIFIER_TYPE; \ + } \ }; -#define DECLARE_NOANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, RENDER_PROPERTY) \ - DECLARE_ANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, RENDER_PROPERTY) +#define DECLARE_NOANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, RENDER_PROPERTY) \ + DECLARE_ANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, RENDER_PROPERTY, Add) #include "modifier/rs_modifiers_def.in" diff --git a/rosen/modules/render_service_base/include/pipeline/rs_canvas_render_node.h b/rosen/modules/render_service_base/include/pipeline/rs_canvas_render_node.h index 5ef06309db..ce5158bd0a 100644 --- a/rosen/modules/render_service_base/include/pipeline/rs_canvas_render_node.h +++ b/rosen/modules/render_service_base/include/pipeline/rs_canvas_render_node.h @@ -25,7 +25,7 @@ namespace OHOS { namespace Rosen { class DrawCmdList; class RSPaintFilterCanvas; -struct RSModifyContext; +struct RSModifierContext; class RSCanvasRenderNode : public RSRenderNode { public: @@ -50,7 +50,7 @@ public: return RSRenderNodeType::CANVAS_NODE; } private: - void ApplyDrawCmdModifier(RSModifyContext& context, RSModifierType type); + void ApplyDrawCmdModifier(RSModifierContext& context, RSModifierType type); std::pair canvasNodeSaveCount_ = { 0, 0 }; diff --git a/rosen/modules/render_service_base/include/pipeline/rs_render_node.h b/rosen/modules/render_service_base/include/pipeline/rs_render_node.h index cd15dc6405..091ad00975 100644 --- a/rosen/modules/render_service_base/include/pipeline/rs_render_node.h +++ b/rosen/modules/render_service_base/include/pipeline/rs_render_node.h @@ -16,6 +16,7 @@ #define RENDER_SERVICE_CLIENT_CORE_PIPELINE_RS_RENDER_NODE_H #include +#include #include "animation/rs_animation_manager.h" #include "modifier/rs_render_modifier.h" @@ -77,9 +78,12 @@ public: } void ClearModifiers(); - virtual void AddModifier(const std::shared_ptr& modifier); - void RemoveModifier(const std::shared_ptr& modifier); + void AddModifier(const std::shared_ptr& modifier); void RemoveModifier(const PropertyId& id); + + void AddTransitionModifier(const std::shared_ptr& modifier); + void RemoveTransitionModifier(const std::shared_ptr& modifier); + void ApplyModifiers(); std::shared_ptr GetModifier(const PropertyId& id); @@ -102,7 +106,8 @@ private: RectI oldDirty_; RSProperties renderProperties_; RSAnimationManager animationManager_; - std::map> modifiers_; + std::unordered_map> modifiers_; + std::unordered_set> transitionModifiers_; // bounds and frame modifiers must be unique std::shared_ptr boundsModifier_; std::shared_ptr frameModifier_; diff --git a/rosen/modules/render_service_base/include/property/rs_properties.h b/rosen/modules/render_service_base/include/property/rs_properties.h index c467cf429a..0caa51f3f8 100644 --- a/rosen/modules/render_service_base/include/property/rs_properties.h +++ b/rosen/modules/render_service_base/include/property/rs_properties.h @@ -228,28 +228,28 @@ private: std::shared_ptr overlayRect_ = nullptr; float alpha_ = 1.f; - bool alphaOffscreen_ = true; - - std::unique_ptr sublayerTransform_ = nullptr; - std::unique_ptr decoration_ = nullptr; - std::unique_ptr cornerRadius_ = nullptr; - std::unique_ptr shadow_ = nullptr; + bool alphaOffscreen_ = false; std::shared_ptr boundsGeo_; std::shared_ptr frameGeo_; - std::shared_ptr border_ = nullptr; + std::shared_ptr backgroundFilter_ = nullptr; - std::shared_ptr filter_ = nullptr; + std::shared_ptr border_ = nullptr; std::shared_ptr clipPath_ = nullptr; + std::unique_ptr cornerRadius_ = nullptr; + std::unique_ptr decoration_ = nullptr; + std::shared_ptr filter_ = nullptr; std::shared_ptr mask_ = nullptr; + std::unique_ptr shadow_ = nullptr; + std::unique_ptr sublayerTransform_ = nullptr; - friend class RSPropertiesPainter; - friend class RSRenderNode; - friend class RSCanvasRenderNode; friend class RSCanvasNode; + friend class RSCanvasRenderNode; + friend class RSHardwareProcessor; + friend class RSPropertiesPainter; friend class RSPropertiesUtils; + friend class RSRenderNode; friend class RSRenderTransitionEffect; - friend class RSHardwareProcessor; }; } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_base/src/animation/rs_render_spring_animation.cpp b/rosen/modules/render_service_base/src/animation/rs_render_spring_animation.cpp index e53b4c034a..d93e8fae19 100644 --- a/rosen/modules/render_service_base/src/animation/rs_render_spring_animation.cpp +++ b/rosen/modules/render_service_base/src/animation/rs_render_spring_animation.cpp @@ -165,7 +165,7 @@ void RSRenderSpringAnimation::OnAnimateInner(float fraction) if (GetPropertyId() == 0) { return; } - // always record fraction from previous iterator, will be used to calculate velocity + // always record fraction from previous iteration, will be used to calculate velocity prevFraction_ = fraction; auto displacement = CalculateDisplacement( fraction * GetDuration() * MILLISECOND_TO_SECOND); @@ -175,6 +175,9 @@ void RSRenderSpringAnimation::OnAnimateInner(float fraction) std::tuple, std::shared_ptr> RSRenderSpringAnimation::GetSpringStatus() { + if (ROSEN_EQ(prevFraction_, 0.0f)) { + return { startValue_, initialVelocity_ }; + } auto displacement = CalculateDisplacement( prevFraction_ * GetDuration() * MILLISECOND_TO_SECOND); auto velocity = GetInstantaneousVelocity( diff --git a/rosen/modules/render_service_base/src/animation/rs_render_transition.cpp b/rosen/modules/render_service_base/src/animation/rs_render_transition.cpp index 22a32b7d94..d75aa8c2f7 100644 --- a/rosen/modules/render_service_base/src/animation/rs_render_transition.cpp +++ b/rosen/modules/render_service_base/src/animation/rs_render_transition.cpp @@ -92,12 +92,6 @@ void RSRenderTransition::OnAnimate(float fraction) for (auto& effect : effects_) { effect->UpdateFraction(valueFraction); } - auto target = GetTarget(); - if (target == nullptr) { - ROSEN_LOGE("RSRenderTransition::OnAnimate, target is nullptr"); - return; - } - target->SetDirty(); } void RSRenderTransition::OnAttach() @@ -109,8 +103,7 @@ void RSRenderTransition::OnAttach() } // create "transition" modifier and add it to target for (auto& effect : effects_) { - target->AddModifier(effect->GetModifier()); - effect->UpdateFraction(isTransitionIn_ ? 1.0f : 0.0f); + target->AddTransitionModifier(effect->GetModifier()); } // update number of disappearing transition animation if (!isTransitionIn_) { @@ -127,7 +120,7 @@ void RSRenderTransition::OnDetach() } // remove "transition" modifier from target for (auto& effect : effects_) { - target->RemoveModifier(effect->GetModifier()); + target->RemoveTransitionModifier(effect->GetModifier()); } // update number of disappearing transition animation if (!isTransitionIn_) { diff --git a/rosen/modules/render_service_base/src/animation/rs_transition_effect.cpp b/rosen/modules/render_service_base/src/animation/rs_transition_effect.cpp index 99ba028970..d5919f5e1c 100644 --- a/rosen/modules/render_service_base/src/animation/rs_transition_effect.cpp +++ b/rosen/modules/render_service_base/src/animation/rs_transition_effect.cpp @@ -33,33 +33,42 @@ std::shared_ptr RSTransitionEffect::Create() std::shared_ptr RSTransitionEffect::Opacity(float opacity) { - auto opacityEffect = std::make_shared(opacity); - transitionInEffects_.push_back(opacityEffect); - transitionOutEffects_.push_back(opacityEffect); + if (opacity != 1.0f) { + auto opacityEffect = std::make_shared(opacity); + transitionInEffects_.push_back(opacityEffect); + transitionOutEffects_.push_back(opacityEffect); + } return shared_from_this(); } std::shared_ptr RSTransitionEffect::Scale(const Vector3f& scale) { - auto scaleEffect = std::make_shared(scale.x_, scale.y_, scale.z_); - transitionInEffects_.push_back(scaleEffect); - transitionOutEffects_.push_back(scaleEffect); + if (scale.x_ != 1.0f || scale.y_ != 1.0f || scale.z_ != 1.0f) { + auto scaleEffect = std::make_shared(scale.x_, scale.y_, scale.z_); + transitionInEffects_.push_back(scaleEffect); + transitionOutEffects_.push_back(scaleEffect); + } return shared_from_this(); } std::shared_ptr RSTransitionEffect::Translate(const Vector3f& translate) { - auto translateEffect = std::make_shared(translate.x_, translate.y_, translate.z_); - transitionInEffects_.push_back(translateEffect); - transitionOutEffects_.push_back(translateEffect); + if (translate.x_ != 0.0f || translate.y_ != 0.0f || translate.z_ != 0.0f) { + auto translateEffect = std::make_shared(translate.x_, translate.y_, translate.z_); + transitionInEffects_.push_back(translateEffect); + transitionOutEffects_.push_back(translateEffect); + } return shared_from_this(); } std::shared_ptr RSTransitionEffect::Rotate(const Vector4f& axisAngle) { - auto rotateEffect = std::make_shared(axisAngle.x_, axisAngle.y_, axisAngle.z_, axisAngle.w_); - transitionInEffects_.push_back(rotateEffect); - transitionOutEffects_.push_back(rotateEffect); + if (axisAngle.w_ != 0.0f) { + auto rotateEffect = + std::make_shared(axisAngle.x_, axisAngle.y_, axisAngle.z_, axisAngle.w_); + transitionInEffects_.push_back(rotateEffect); + transitionOutEffects_.push_back(rotateEffect); + } return shared_from_this(); } diff --git a/rosen/modules/render_service_base/src/modifier/rs_render_modifier.cpp b/rosen/modules/render_service_base/src/modifier/rs_render_modifier.cpp index ac503a4154..cb001ecbfa 100644 --- a/rosen/modules/render_service_base/src/modifier/rs_render_modifier.cpp +++ b/rosen/modules/render_service_base/src/modifier/rs_render_modifier.cpp @@ -29,7 +29,7 @@ namespace Rosen { namespace { using ModifierUnmarshallingFunc = RSRenderModifier* (*)(Parcel& parcel); -#define DECLARE_ANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, RENDER_PROPERTY) \ +#define DECLARE_ANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, RENDER_PROPERTY, DELTA_OP) \ { RSModifierType::MODIFIER_TYPE, [](Parcel& parcel) -> RSRenderModifier* { \ std::shared_ptr> prop; \ if (!RSMarshallingHelper::Unmarshalling(parcel, prop)) { \ @@ -39,17 +39,12 @@ using ModifierUnmarshallingFunc = RSRenderModifier* (*)(Parcel& parcel); if (!modifier) { \ return nullptr; \ } \ - bool isAdditive = false; \ - if (!parcel.ReadBool(isAdditive)) { \ - return nullptr; \ - } \ - modifier->SetIsAdditive(isAdditive); \ return modifier; \ }, \ }, #define DECLARE_NOANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, RENDER_PROPERTY) \ - DECLARE_ANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, RENDER_PROPERTY) + DECLARE_ANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, RENDER_PROPERTY, ADD) static std::unordered_map funcLUT = { #include "modifier/rs_modifiers_def.in" @@ -84,7 +79,7 @@ static std::unordered_map funcLUT = { #undef DECLARE_NOANIMATABLE_MODIFIER } -void RSDrawCmdListRenderModifier::Apply(RSModifyContext& context) +void RSDrawCmdListRenderModifier::Apply(RSModifierContext& context) { if (context.canvas_) { auto cmds = property_->Get(); @@ -92,10 +87,10 @@ void RSDrawCmdListRenderModifier::Apply(RSModifyContext& context) } } -void RSDrawCmdListRenderModifier::Update(const std::shared_ptr& newProp, bool isDelta) +void RSDrawCmdListRenderModifier::Update(const std::shared_ptr& prop, bool isDelta) { - if (auto newProperty = std::static_pointer_cast>(newProp)) { - property_->Set(newProperty->Get()); + if (auto property = std::static_pointer_cast>(prop)) { + property_->Set(property->Get()); } } @@ -127,34 +122,38 @@ RSRenderModifier* RSRenderModifier::Unmarshalling(Parcel& parcel) return it->second(parcel); } -#define DECLARE_ANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, RENDER_PROPERTY) \ +namespace { +template +T Add(T a, T b) +{ + return a + b; +} +template +T Multiply(T a, T b) +{ + return a * b; +} +template +T Replace(T a, T b) +{ + return b; +} +} // namespace + +#define DECLARE_ANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, RENDER_PROPERTY, DELTA_OP) \ bool RS##MODIFIER_NAME##RenderModifier::Marshalling(Parcel& parcel) \ { \ return parcel.WriteInt16(static_cast(RSModifierType::MODIFIER_TYPE)) && \ - RSMarshallingHelper::Marshalling(parcel, property_) && parcel.WriteBool(isAdditive_); \ + RSMarshallingHelper::Marshalling(parcel, property_); \ } \ - void RS##MODIFIER_NAME##RenderModifier::Apply(RSModifyContext& context) \ + void RS##MODIFIER_NAME##RenderModifier::Apply(RSModifierContext& context) \ { \ - TYPE setValue; \ - if (isFirstSet_) { \ - setValue = context.property_.Get##MODIFIER_NAME() + property_->Get(); \ - isFirstSet_ = false; \ - } else { \ - setValue = context.property_.Get##MODIFIER_NAME() + property_->Get() - lastValue_->Get(); \ - } \ - setValue = isAdditive_ ? setValue : property_->Get(); \ - lastValue_->Set(property_->Get()); \ - context.property_.Set##MODIFIER_NAME(setValue); \ + context.property_.Set##MODIFIER_NAME(DELTA_OP(context.property_.Get##MODIFIER_NAME(), property_->Get())); \ } \ - void RS##MODIFIER_NAME##RenderModifier::Update( \ - const std::shared_ptr& newProp, bool isDelta) \ + void RS##MODIFIER_NAME##RenderModifier::Update(const std::shared_ptr& prop, bool isDelta) \ { \ - if (auto newProperty = std::static_pointer_cast>(newProp)) { \ - if (isDelta) { \ - property_->Set(property_->Get() + newProperty->Get()); \ - } else { \ - property_->Set(newProperty->Get()); \ - } \ + if (auto property = std::static_pointer_cast>(prop)) { \ + property_->Set(isDelta ? (property_->Get() + property->Get()) : property->Get()); \ } \ } @@ -162,18 +161,16 @@ RSRenderModifier* RSRenderModifier::Unmarshalling(Parcel& parcel) bool RS##MODIFIER_NAME##RenderModifier::Marshalling(Parcel& parcel) \ { \ return parcel.WriteInt16(static_cast(RSModifierType::MODIFIER_TYPE)) && \ - RSMarshallingHelper::Marshalling(parcel, property_) && parcel.WriteBool(isAdditive_); \ + RSMarshallingHelper::Marshalling(parcel, property_); \ } \ - void RS##MODIFIER_NAME##RenderModifier::Apply(RSModifyContext& context) \ + void RS##MODIFIER_NAME##RenderModifier::Apply(RSModifierContext& context) \ { \ context.property_.Set##MODIFIER_NAME(property_->Get()); \ } \ - \ - void RS##MODIFIER_NAME##RenderModifier::Update( \ - const std::shared_ptr& newProp, bool isDelta) \ + void RS##MODIFIER_NAME##RenderModifier::Update(const std::shared_ptr& prop, bool isDelta) \ { \ - if (auto newProperty = std::static_pointer_cast>(newProp)) { \ - property_->Set(newProperty->Get()); \ + if (auto property = std::static_pointer_cast>(prop)) { \ + property_->Set(property->Get()); \ } \ } diff --git a/rosen/modules/render_service_base/src/pipeline/rs_canvas_render_node.cpp b/rosen/modules/render_service_base/src/pipeline/rs_canvas_render_node.cpp index b3cf142e81..e4e1446c4f 100644 --- a/rosen/modules/render_service_base/src/pipeline/rs_canvas_render_node.cpp +++ b/rosen/modules/render_service_base/src/pipeline/rs_canvas_render_node.cpp @@ -85,7 +85,7 @@ void RSCanvasRenderNode::ProcessRenderBeforeChildren(RSPaintFilterCanvas& canvas if (GetRenderProperties().GetClipToFrame()) { RSPropertiesPainter::Clip(canvas, GetRenderProperties().GetFrameRect()); } - RSModifyContext context = { GetMutableRenderProperties(), &canvas }; + RSModifierContext context = { GetMutableRenderProperties(), &canvas }; ApplyDrawCmdModifier(context, RSModifierType::CONTENT_STYLE); #endif } @@ -93,7 +93,7 @@ void RSCanvasRenderNode::ProcessRenderBeforeChildren(RSPaintFilterCanvas& canvas void RSCanvasRenderNode::ProcessRenderAfterChildren(RSPaintFilterCanvas& canvas) { #ifdef ROSEN_OHOS - RSModifyContext context = { GetMutableRenderProperties(), &canvas }; + RSModifierContext context = { GetMutableRenderProperties(), &canvas }; ApplyDrawCmdModifier(context, RSModifierType::FOREGROUND_STYLE); canvas.RestoreCanvasAndAlpha(canvasNodeSaveCount_); @@ -114,7 +114,7 @@ void RSCanvasRenderNode::ProcessRenderAfterChildren(RSPaintFilterCanvas& canvas) #endif } -void RSCanvasRenderNode::ApplyDrawCmdModifier(RSModifyContext& context, RSModifierType type) +void RSCanvasRenderNode::ApplyDrawCmdModifier(RSModifierContext& context, RSModifierType type) { if (drawCmdModifiers_.count(type)) { for (auto& modifier : drawCmdModifiers_[type]) { diff --git a/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp b/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp index 6fa401077f..f3813909b8 100644 --- a/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp +++ b/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp @@ -179,6 +179,7 @@ void RSRenderNode::ClearModifiers() { modifiers_.clear(); drawCmdModifiers_.clear(); + transitionModifiers_.clear(); SetDirty(); } @@ -233,20 +234,20 @@ void RSRenderNode::RemoveModifier(const PropertyId& id) } } -void RSRenderNode::RemoveModifier(const std::shared_ptr& modifier) +void RSRenderNode::AddTransitionModifier(const std::shared_ptr& modifier) { - auto erasedElements = std::__libcpp_erase_if_container(modifiers_, [&modifier](const auto& iter) { - return iter.second == modifier; - }); - if (erasedElements > 0) { - SetDirty(); + if (!modifier) { return; } - for (auto& [type, modifiers] : drawCmdModifiers_) { - modifiers.remove_if([&modifier](const auto& item) -> bool { - return item == modifier; - }); - } + transitionModifiers_.emplace(modifier); + modifier->GetProperty()->Attach(shared_from_this()); + SetDirty(); +} + +void RSRenderNode::RemoveTransitionModifier(const std::shared_ptr& modifier) +{ + transitionModifiers_.erase(modifier); + SetDirty(); } void RSRenderNode::ApplyModifiers() @@ -254,10 +255,17 @@ void RSRenderNode::ApplyModifiers() if (!RSBaseRenderNode::IsDirty()) { return; } - RSModifyContext context = { GetMutableRenderProperties() }; - for (auto& [id, modify] : modifiers_) { - if (modify) { - modify->Apply(context); + RSModifierContext context = { GetMutableRenderProperties() }; + context.property_.Reset(); + for (auto& [id, modifier] : modifiers_) { + if (modifier) { + modifier->Apply(context); + } + } + + for (auto& modifier : transitionModifiers_) { + if (modifier) { + modifier->Apply(context); } } UpdateOverlayerBounds(); @@ -265,7 +273,7 @@ void RSRenderNode::ApplyModifiers() void RSRenderNode::UpdateOverlayerBounds() { - RSModifyContext context = { GetMutableRenderProperties() }; + RSModifierContext context = { GetMutableRenderProperties() }; auto iterator = drawCmdModifiers_.find(RSModifierType::OVERLAY_STYLE); if (iterator != drawCmdModifiers_.end()) { RectI joinRect = RectI(); diff --git a/rosen/modules/render_service_base/src/pipeline/rs_surface_render_node.cpp b/rosen/modules/render_service_base/src/pipeline/rs_surface_render_node.cpp index 400e014b14..5d8025fbfd 100644 --- a/rosen/modules/render_service_base/src/pipeline/rs_surface_render_node.cpp +++ b/rosen/modules/render_service_base/src/pipeline/rs_surface_render_node.cpp @@ -40,13 +40,11 @@ RSSurfaceRenderNode::RSSurfaceRenderNode(const RSSurfaceRenderNodeConfig& config name_(config.name), nodeType_(config.nodeType), dirtyManager_(std::make_shared()) -{ -} +{} RSSurfaceRenderNode::RSSurfaceRenderNode(NodeId id, std::weak_ptr context) : RSSurfaceRenderNode(RSSurfaceRenderNodeConfig{id, "SurfaceNode"}, context) -{ -} +{} RSSurfaceRenderNode::~RSSurfaceRenderNode() {} @@ -294,7 +292,7 @@ void RSSurfaceRenderNode::UpdateSurfaceDefaultSize(float width, float height) { if (consumer_ != nullptr) { consumer_->SetDefaultWidthAndHeight(width, height); - } + } } BlendType RSSurfaceRenderNode::GetBlendType() @@ -405,6 +403,5 @@ bool RSSurfaceRenderNode::NeedSetCallbackForRenderThreadRefresh() { return (callbackForRenderThreadRefresh_ == nullptr); } - } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_base/src/property/rs_properties.cpp b/rosen/modules/render_service_base/src/property/rs_properties.cpp index 7164b2aa14..74cdc8f8d7 100644 --- a/rosen/modules/render_service_base/src/property/rs_properties.cpp +++ b/rosen/modules/render_service_base/src/property/rs_properties.cpp @@ -930,22 +930,29 @@ bool RSProperties::NeedClip() const void RSProperties::Reset() { + alphaOffscreen_ = false; + isDirty_ = true; + hasBounds_ = false; isDirty_ = true; - boundsGeo_ = std::make_shared(); - frameGeo_ = std::make_shared(); visible_ = true; clipToBounds_ = false; clipToFrame_ = false; - clipPath_ = nullptr; + frameGravity_ = Gravity::DEFAULT; alpha_ = 1.f; - decoration_ = nullptr; - cornerRadius_ = nullptr; - shadow_ = nullptr; - border_ = nullptr; + + boundsGeo_ = std::make_shared(); + frameGeo_ = std::make_shared(); + backgroundFilter_ = nullptr; + border_ = nullptr; + clipPath_ = nullptr; + cornerRadius_ = nullptr; + decoration_ = nullptr; filter_ = nullptr; mask_ = nullptr; + shadow_ = nullptr; + sublayerTransform_ = nullptr; } void RSProperties::SetDirty() diff --git a/rosen/modules/render_service_base/src/property/rs_properties_painter.cpp b/rosen/modules/render_service_base/src/property/rs_properties_painter.cpp index d775ce9f73..c8c450b523 100644 --- a/rosen/modules/render_service_base/src/property/rs_properties_painter.cpp +++ b/rosen/modules/render_service_base/src/property/rs_properties_painter.cpp @@ -140,51 +140,51 @@ void RSPropertiesPainter::Clip(SkCanvas& canvas, RectF rect) void RSPropertiesPainter::DrawShadow(const RSProperties& properties, RSPaintFilterCanvas& canvas, const RRect* rrect) { - if (properties.shadow_ && properties.shadow_->IsValid()) { - SkAutoCanvasRestore acr(&canvas, true); - SkPath skPath; - if (properties.GetShadowPath() && !properties.GetShadowPath()->GetSkiaPath().isEmpty()) { - skPath = properties.GetShadowPath()->GetSkiaPath(); - canvas.clipPath(skPath, SkClipOp::kDifference, true); - } else if (properties.GetClipBounds()) { - skPath = properties.GetClipBounds()->GetSkiaPath(); - canvas.clipPath(skPath, SkClipOp::kDifference, true); + if (!properties.shadow_ || !properties.shadow_->IsValid()) { + return; + } + SkAutoCanvasRestore acr(&canvas, true); + SkPath skPath; + if (properties.GetShadowPath() && !properties.GetShadowPath()->GetSkiaPath().isEmpty()) { + skPath = properties.GetShadowPath()->GetSkiaPath(); + canvas.clipPath(skPath, SkClipOp::kDifference, true); + } else if (properties.GetClipBounds()) { + skPath = properties.GetClipBounds()->GetSkiaPath(); + canvas.clipPath(skPath, SkClipOp::kDifference, true); + } else { + if (rrect != nullptr) { + skPath.addRRect(RRect2SkRRect(*rrect)); + canvas.clipRRect(RRect2SkRRect(*rrect), SkClipOp::kDifference, true); } else { - if (rrect != nullptr) { - skPath.addRRect(RRect2SkRRect(*rrect)); - canvas.clipRRect(RRect2SkRRect(*rrect), SkClipOp::kDifference, true); - } else { - skPath.addRRect(RRect2SkRRect(properties.GetRRect())); - canvas.clipRRect(RRect2SkRRect(properties.GetRRect()), SkClipOp::kDifference, true); - } + skPath.addRRect(RRect2SkRRect(properties.GetRRect())); + canvas.clipRRect(RRect2SkRRect(properties.GetRRect()), SkClipOp::kDifference, true); } - skPath.offset(properties.GetShadowOffsetX(), properties.GetShadowOffsetY()); - Color spotColor = properties.GetShadowColor(); - if (properties.shadow_->GetHardwareAcceleration()) { - if (properties.GetShadowElevation() <= 0.f) { - return; - } - SkPoint3 planeParams = { 0.0f, 0.0f, properties.GetShadowElevation() }; - SkPoint3 lightPos = { canvas.getTotalMatrix().getTranslateX() + skPath.getBounds().centerX(), - canvas.getTotalMatrix().getTranslateY() + skPath.getBounds().centerY(), DEFAULT_LIGHT_HEIGHT }; - Color ambientColor = Color::FromArgbInt(DEFAULT_AMBIENT_COLOR); - ambientColor.MultiplyAlpha(canvas.GetAlpha()); - spotColor.MultiplyAlpha(canvas.GetAlpha()); - SkShadowUtils::DrawShadow(&canvas, skPath, planeParams, lightPos, DEFAULT_LIGHT_RADIUS, - ambientColor.AsArgbInt(), spotColor.AsArgbInt(), SkShadowFlags::kTransparentOccluder_ShadowFlag); - } else { - SkPaint paint; - paint.setColor(spotColor.AsArgbInt()); - paint.setAntiAlias(true); - paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, properties.GetShadowRadius())); - canvas.drawPath(skPath, paint); + } + skPath.offset(properties.GetShadowOffsetX(), properties.GetShadowOffsetY()); + Color spotColor = properties.GetShadowColor(); + if (properties.shadow_->GetHardwareAcceleration()) { + if (properties.GetShadowElevation() <= 0.f) { + return; } + SkPoint3 planeParams = { 0.0f, 0.0f, properties.GetShadowElevation() }; + SkPoint3 lightPos = { canvas.getTotalMatrix().getTranslateX() + skPath.getBounds().centerX(), + canvas.getTotalMatrix().getTranslateY() + skPath.getBounds().centerY(), DEFAULT_LIGHT_HEIGHT }; + Color ambientColor = Color::FromArgbInt(DEFAULT_AMBIENT_COLOR); + ambientColor.MultiplyAlpha(canvas.GetAlpha()); + spotColor.MultiplyAlpha(canvas.GetAlpha()); + SkShadowUtils::DrawShadow(&canvas, skPath, planeParams, lightPos, DEFAULT_LIGHT_RADIUS, + ambientColor.AsArgbInt(), spotColor.AsArgbInt(), SkShadowFlags::kTransparentOccluder_ShadowFlag); + } else { + SkPaint paint; + paint.setColor(spotColor.AsArgbInt()); + paint.setAntiAlias(true); + paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, properties.GetShadowRadius())); + canvas.drawPath(skPath, paint); } } void RSPropertiesPainter::DrawFilter(const RSProperties& properties, SkCanvas& canvas, - std::shared_ptr& filter, const std::unique_ptr& rect, - SkSurface* skSurface) + std::shared_ptr& filter, const std::unique_ptr& rect, SkSurface* skSurface) { if (rect != nullptr) { canvas.clipRect((*rect), true); @@ -246,50 +246,51 @@ void RSPropertiesPainter::DrawBackground(const RSProperties& properties, RSPaint canvas.restore(); } -void RSPropertiesPainter::DrawFrame( - const RSProperties& properties, RSPaintFilterCanvas& canvas, DrawCmdListPtr& cmds) +void RSPropertiesPainter::DrawFrame(const RSProperties& properties, RSPaintFilterCanvas& canvas, DrawCmdListPtr& cmds) { - if (cmds != nullptr) { - SkMatrix mat; - if (GetGravityMatrix( - properties.GetFrameGravity(), properties.GetFrameRect(), cmds->GetWidth(), cmds->GetHeight(), mat)) { - canvas.concat(mat); - } - auto frameRect = Rect2SkRect(properties.GetFrameRect()); - cmds->Playback(canvas, &frameRect); + if (cmds == nullptr) { + return; } + SkMatrix mat; + if (GetGravityMatrix( + properties.GetFrameGravity(), properties.GetFrameRect(), cmds->GetWidth(), cmds->GetHeight(), mat)) { + canvas.concat(mat); + } + auto frameRect = Rect2SkRect(properties.GetFrameRect()); + cmds->Playback(canvas, &frameRect); } void RSPropertiesPainter::DrawBorder(const RSProperties& properties, SkCanvas& canvas) { auto border = properties.GetBorder(); - if (border && border->HasBorder()) { - SkPaint paint; - paint.setAntiAlias(true); - if (properties.GetCornerRadius().IsZero() && border->ApplyFourLine(paint)) { - RectF rect = properties.GetBoundsRect(); - border->PaintFourLine(canvas, paint, rect); - } else if (border->ApplyFillStyle(paint)) { - canvas.drawDRRect(RRect2SkRRect(properties.GetRRect()), RRect2SkRRect(properties.GetInnerRRect()), paint); - } else if (border->ApplyPathStyle(paint)) { - auto borderWidth = border->GetWidth(); - RRect rrect = properties.GetRRect(); - rrect.rect_.width_ -= borderWidth; - rrect.rect_.height_ -= borderWidth; - rrect.rect_.Move(borderWidth / PARAM_DOUBLE, borderWidth / PARAM_DOUBLE); - SkPath borderPath; - borderPath.addRRect(RRect2SkRRect(rrect)); - canvas.drawPath(borderPath, paint); - } else { - SkAutoCanvasRestore acr(&canvas, true); - canvas.clipRRect(RRect2SkRRect(properties.GetInnerRRect()), SkClipOp::kDifference, true); - SkRRect rrect = RRect2SkRRect(properties.GetRRect()); - paint.setStyle(SkPaint::Style::kStroke_Style); - border->PaintTopPath(canvas, paint, rrect); - border->PaintRightPath(canvas, paint, rrect); - border->PaintBottomPath(canvas, paint, rrect); - border->PaintLeftPath(canvas, paint, rrect); - } + if (!border || !border->HasBorder()) { + return; + } + SkPaint paint; + paint.setAntiAlias(true); + if (properties.GetCornerRadius().IsZero() && border->ApplyFourLine(paint)) { + RectF rect = properties.GetBoundsRect(); + border->PaintFourLine(canvas, paint, rect); + } else if (border->ApplyFillStyle(paint)) { + canvas.drawDRRect(RRect2SkRRect(properties.GetRRect()), RRect2SkRRect(properties.GetInnerRRect()), paint); + } else if (border->ApplyPathStyle(paint)) { + auto borderWidth = border->GetWidth(); + RRect rrect = properties.GetRRect(); + rrect.rect_.width_ -= borderWidth; + rrect.rect_.height_ -= borderWidth; + rrect.rect_.Move(borderWidth / PARAM_DOUBLE, borderWidth / PARAM_DOUBLE); + SkPath borderPath; + borderPath.addRRect(RRect2SkRRect(rrect)); + canvas.drawPath(borderPath, paint); + } else { + SkAutoCanvasRestore acr(&canvas, true); + canvas.clipRRect(RRect2SkRRect(properties.GetInnerRRect()), SkClipOp::kDifference, true); + SkRRect rrect = RRect2SkRRect(properties.GetRRect()); + paint.setStyle(SkPaint::Style::kStroke_Style); + border->PaintTopPath(canvas, paint, rrect); + border->PaintRightPath(canvas, paint, rrect); + border->PaintBottomPath(canvas, paint, rrect); + border->PaintLeftPath(canvas, paint, rrect); } } diff --git a/rosen/modules/render_service_client/core/modifier/rs_modifier.h b/rosen/modules/render_service_client/core/modifier/rs_modifier.h index 23a9628a0e..740741bea7 100644 --- a/rosen/modules/render_service_client/core/modifier/rs_modifier.h +++ b/rosen/modules/render_service_client/core/modifier/rs_modifier.h @@ -49,7 +49,6 @@ protected: virtual void DetachFromNode() = 0; virtual void SetMotionPathOption(const std::shared_ptr& motionPathOption) = 0; - virtual void SetIsAdditive(bool isAdditive) = 0; virtual void UpdateToRender() = 0; virtual std::shared_ptr CreateRenderModifier() const = 0; @@ -109,15 +108,9 @@ protected: property_->motionPathOption_ = motionPathOption; } - void SetIsAdditive(bool isAdditive) override - { - isAdditive_ = isAdditive; - } - void UpdateToRender() override {} std::shared_ptr property_; - bool isAdditive_ { false }; friend class RSModifierExtractor; friend class RSNode; diff --git a/rosen/modules/render_service_client/core/modifier/rs_modifier_extractor.cpp b/rosen/modules/render_service_client/core/modifier/rs_modifier_extractor.cpp index b69d51e4eb..5cf51b58b5 100644 --- a/rosen/modules/render_service_client/core/modifier/rs_modifier_extractor.cpp +++ b/rosen/modules/render_service_client/core/modifier/rs_modifier_extractor.cpp @@ -40,11 +40,7 @@ RSModifierExtractor::RSModifierExtractor(NodeId id) : id_(id) {} for (auto& [_, modifier] : node->modifiers_) { \ if (modifier->GetModifierType() == RSModifierType::propertyType) { \ auto modifierPtr = std::static_pointer_cast>>(modifier); \ - if (modifierPtr->isAdditive_) { \ - value operator std::static_pointer_cast>(modifierPtr->GetProperty())->Get(); \ - } else { \ - value = std::static_pointer_cast>(modifierPtr->GetProperty())->Get(); \ - } \ + value operator std::static_pointer_cast>(modifierPtr->GetProperty())->Get(); \ } \ } \ return value; \ @@ -112,7 +108,7 @@ float RSModifierExtractor::GetAlpha() const bool RSModifierExtractor::GetAlphaOffscreen() const { - GET_PROPERTY_FROM_MODIFIERS(bool, ALPHA_OFFSCREEN, true, =); + GET_PROPERTY_FROM_MODIFIERS(bool, ALPHA_OFFSCREEN, false, =); } Vector4f RSModifierExtractor::GetCornerRadius() const diff --git a/rosen/modules/render_service_client/core/modifier/rs_property_modifier.cpp b/rosen/modules/render_service_client/core/modifier/rs_property_modifier.cpp index 2dede9dda2..e17deb8d87 100644 --- a/rosen/modules/render_service_client/core/modifier/rs_property_modifier.cpp +++ b/rosen/modules/render_service_client/core/modifier/rs_property_modifier.cpp @@ -20,7 +20,7 @@ namespace OHOS { namespace Rosen { -#define DECLARE_ANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, RENDER_PROPERTY) \ +#define DECLARE_ANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, RENDER_PROPERTY, DELTA_OP) \ RS##MODIFIER_NAME##Modifier::RS##MODIFIER_NAME##Modifier( \ const std::shared_ptr>& property) \ : RSModifier>(property, RSModifierType::MODIFIER_TYPE) \ @@ -34,7 +34,6 @@ namespace Rosen { auto renderProperty = \ std::make_shared>(property_->Get(), property_->GetId()); \ auto renderModifier = std::make_shared(renderProperty); \ - renderModifier->SetIsAdditive(isAdditive_); \ return renderModifier; \ } diff --git a/rosen/modules/render_service_client/core/ui/rs_node.cpp b/rosen/modules/render_service_client/core/ui/rs_node.cpp index 89e80bfbca..a4592b99be 100644 --- a/rosen/modules/render_service_client/core/ui/rs_node.cpp +++ b/rosen/modules/render_service_client/core/ui/rs_node.cpp @@ -232,11 +232,8 @@ const std::shared_ptr RSNode::GetMotionPathOption() const bool RSNode::HasPropertyAnimation(const PropertyId& id) { - // check if any animation matches the property bitmask - auto pred = [id](const auto& it) -> bool { - return it.second > 0 && (static_cast(it.first) & static_cast(id)); - }; - return std::any_of(animatingPropertyNum_.begin(), animatingPropertyNum_.end(), pred); + auto it = animatingPropertyNum_.find(id); + return it != animatingPropertyNum_.end() && it->second > 0; } #define SET_ANIMATABLE_MODIFIER(propertyName, T, value, propertyType, defaultValue) \ @@ -896,10 +893,6 @@ void RSNode::AddModifier(const std::shared_ptr& modifier) if (!modifier || modifiers_.count(modifier->GetPropertyId())) { return; } - auto iter = propertyModifiers_.find(modifier->GetModifierType()); - if (iter != propertyModifiers_.end()) { - modifier->SetIsAdditive(true); - } if (motionPathOption_ != nullptr && IsPathAnimatableModifier(modifier->GetModifierType())) { modifier->SetMotionPathOption(motionPathOption_); } -- Gitee From f533a7a89b85a9766b1c1895b2bdc516c4aef3af Mon Sep 17 00:00:00 2001 From: Zhang Peng Date: Wed, 31 Aug 2022 16:58:39 +0800 Subject: [PATCH 4/6] edit subject to review comments, skip ClearModifiers on node destroy Signed-off-by: Zhang Peng Change-Id: Ic23ad4313f762f0acabd3b759272ad16f9aa7393 --- .../animation/rs_render_transition_effect.h | 23 +++---- .../include/command/rs_node_command.h | 3 - .../include/modifier/rs_render_modifier.h | 4 +- .../include/pipeline/rs_render_node.h | 7 +-- .../include/property/rs_properties.h | 4 +- .../src/animation/rs_render_transition.cpp | 4 +- .../animation/rs_render_transition_effect.cpp | 62 ++++++++++++------- .../src/animation/rs_transition_effect.cpp | 42 ++++++++----- .../src/command/rs_node_command.cpp | 9 --- .../src/modifier/rs_render_modifier.cpp | 8 +-- .../src/pipeline/rs_render_node.cpp | 43 +++---------- .../src/property/rs_properties.cpp | 4 +- .../core/modifier/rs_extended_modifier.h | 6 +- .../render_service_client/core/ui/rs_node.cpp | 37 ----------- .../render_service_client/core/ui/rs_node.h | 2 +- 15 files changed, 99 insertions(+), 159 deletions(-) diff --git a/rosen/modules/render_service_base/include/animation/rs_render_transition_effect.h b/rosen/modules/render_service_base/include/animation/rs_render_transition_effect.h index 1434f587ef..632688c0e3 100644 --- a/rosen/modules/render_service_base/include/animation/rs_render_transition_effect.h +++ b/rosen/modules/render_service_base/include/animation/rs_render_transition_effect.h @@ -44,22 +44,22 @@ class RSRenderTransitionEffect { public: RSRenderTransitionEffect() = default; virtual ~RSRenderTransitionEffect() = default; - virtual const std::shared_ptr& GetModifier() = 0; + const std::shared_ptr& GetModifier(); virtual void UpdateFraction(float fraction) const = 0; #ifdef ROSEN_OHOS bool Marshalling(Parcel& parcel) const override = 0; static RSRenderTransitionEffect* Unmarshalling(Parcel& parcel); #endif -protected: - std::shared_ptr modifier_ {}; +private: + std::shared_ptr modifier_; + virtual const std::shared_ptr CreateModifier() = 0; }; class RSTransitionFade : public RSRenderTransitionEffect { public: explicit RSTransitionFade(float alpha) : alpha_(alpha) {} ~RSTransitionFade() override = default; - const std::shared_ptr& GetModifier() override; void UpdateFraction(float fraction) const override; #ifdef ROSEN_OHOS @@ -68,7 +68,8 @@ public: #endif private: float alpha_; - std::shared_ptr> property_ {}; + std::shared_ptr> property_; + const std::shared_ptr CreateModifier() override; }; class RSTransitionScale : public RSRenderTransitionEffect { @@ -77,7 +78,6 @@ public: : scaleX_(scaleX), scaleY_(scaleY), scaleZ_(scaleZ) {} ~RSTransitionScale() override = default; - const std::shared_ptr& GetModifier() override; void UpdateFraction(float fraction) const override; #ifdef ROSEN_OHOS @@ -88,7 +88,8 @@ private: float scaleX_; float scaleY_; float scaleZ_; - std::shared_ptr>> property_ {}; + std::shared_ptr>> property_; + const std::shared_ptr CreateModifier() override; }; class RSTransitionTranslate : public RSRenderTransitionEffect { @@ -97,7 +98,6 @@ public: : translateX_(translateX), translateY_(translateY), translateZ_(translateZ) {} ~RSTransitionTranslate() override = default; - const std::shared_ptr& GetModifier() override; void UpdateFraction(float fraction) const override; #ifdef ROSEN_OHOS @@ -108,14 +108,14 @@ private: float translateX_; float translateY_; float translateZ_; - std::shared_ptr>> property_ {}; + std::shared_ptr>> property_; + const std::shared_ptr CreateModifier() override; }; class RSTransitionRotate : public RSRenderTransitionEffect { public: explicit RSTransitionRotate(float dx, float dy, float dz, float angle) : dx_(dx), dy_(dy), dz_(dz), angle_(angle) {} ~RSTransitionRotate() override = default; - const std::shared_ptr& GetModifier() override; void UpdateFraction(float fraction) const override; #ifdef ROSEN_OHOS @@ -127,7 +127,8 @@ private: float dy_; float dz_; float angle_; - std::shared_ptr> property_ {}; + std::shared_ptr> property_; + const std::shared_ptr CreateModifier() override; }; } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_base/include/command/rs_node_command.h b/rosen/modules/render_service_base/include/command/rs_node_command.h index 9fbc5d7fa8..9aaea4f60e 100644 --- a/rosen/modules/render_service_base/include/command/rs_node_command.h +++ b/rosen/modules/render_service_base/include/command/rs_node_command.h @@ -24,7 +24,6 @@ namespace OHOS { namespace Rosen { enum RSNodeCommandType : uint16_t { - CLEAR_MODIFIER, ADD_MODIFIER, REMOVE_MODIFIER, @@ -49,7 +48,6 @@ enum RSNodeCommandType : uint16_t { class RSNodeCommandHelper { public: - static void ClearModifiers(RSContext& context, NodeId nodeId); static void AddModifier(RSContext& context, NodeId nodeId, const std::shared_ptr& modifier); static void RemoveModifier(RSContext& context, NodeId nodeId, PropertyId propertyId); @@ -69,7 +67,6 @@ public: } }; -ADD_COMMAND(RSClearModifiers, ARG(RS_NODE, CLEAR_MODIFIER, RSNodeCommandHelper::ClearModifiers, NodeId)) ADD_COMMAND(RSAddModifier, ARG(RS_NODE, ADD_MODIFIER, RSNodeCommandHelper::AddModifier, NodeId, std::shared_ptr)) ADD_COMMAND(RSRemoveModifier, diff --git a/rosen/modules/render_service_base/include/modifier/rs_render_modifier.h b/rosen/modules/render_service_base/include/modifier/rs_render_modifier.h index 80d22bfdde..447da3e4ff 100644 --- a/rosen/modules/render_service_base/include/modifier/rs_render_modifier.h +++ b/rosen/modules/render_service_base/include/modifier/rs_render_modifier.h @@ -89,12 +89,12 @@ public: drawStyle_ = type; } - void SetOverlayerBounds(std::shared_ptr rect) + void SetOverlayBounds(std::shared_ptr rect) { overlayRect_ = rect; } - std::shared_ptr GetOverlayerBounds() const + std::shared_ptr GetOverlayBounds() const { return overlayRect_; } diff --git a/rosen/modules/render_service_base/include/pipeline/rs_render_node.h b/rosen/modules/render_service_base/include/pipeline/rs_render_node.h index 091ad00975..d5a39af219 100644 --- a/rosen/modules/render_service_base/include/pipeline/rs_render_node.h +++ b/rosen/modules/render_service_base/include/pipeline/rs_render_node.h @@ -76,14 +76,9 @@ public: { return isDirtyRegionUpdated_; } - - void ClearModifiers(); void AddModifier(const std::shared_ptr& modifier); void RemoveModifier(const PropertyId& id); - void AddTransitionModifier(const std::shared_ptr& modifier); - void RemoveTransitionModifier(const std::shared_ptr& modifier); - void ApplyModifiers(); std::shared_ptr GetModifier(const PropertyId& id); @@ -99,7 +94,7 @@ protected: private: void FallbackAnimationsToRoot(); - void UpdateOverlayerBounds(); + void UpdateOverlayBounds(); bool isDirtyRegionUpdated_ = false; bool isLastVisible_ = false; uint32_t disappearingTransitionCount_ = 0; diff --git a/rosen/modules/render_service_base/include/property/rs_properties.h b/rosen/modules/render_service_base/include/property/rs_properties.h index 0caa51f3f8..199d40c407 100644 --- a/rosen/modules/render_service_base/include/property/rs_properties.h +++ b/rosen/modules/render_service_base/include/property/rs_properties.h @@ -170,8 +170,8 @@ public: void SetFrameGravity(Gravity gravity); Gravity GetFrameGravity() const; - void SetOverlayerBounds(std::shared_ptr rect); - std::shared_ptr GetOverlayerBounds() const; + void SetOverlayBounds(std::shared_ptr rect); + std::shared_ptr GetOverlayBounds() const; void SetClipBounds(std::shared_ptr path); std::shared_ptr GetClipBounds() const; diff --git a/rosen/modules/render_service_base/src/animation/rs_render_transition.cpp b/rosen/modules/render_service_base/src/animation/rs_render_transition.cpp index d75aa8c2f7..1736763254 100644 --- a/rosen/modules/render_service_base/src/animation/rs_render_transition.cpp +++ b/rosen/modules/render_service_base/src/animation/rs_render_transition.cpp @@ -103,7 +103,7 @@ void RSRenderTransition::OnAttach() } // create "transition" modifier and add it to target for (auto& effect : effects_) { - target->AddTransitionModifier(effect->GetModifier()); + target->AddModifier(effect->GetModifier()); } // update number of disappearing transition animation if (!isTransitionIn_) { @@ -120,7 +120,7 @@ void RSRenderTransition::OnDetach() } // remove "transition" modifier from target for (auto& effect : effects_) { - target->RemoveTransitionModifier(effect->GetModifier()); + target->RemoveModifier(effect->GetModifier()->GetPropertyId()); } // update number of disappearing transition animation if (!isTransitionIn_) { diff --git a/rosen/modules/render_service_base/src/animation/rs_render_transition_effect.cpp b/rosen/modules/render_service_base/src/animation/rs_render_transition_effect.cpp index c7ea0f6b94..001c3d0e36 100644 --- a/rosen/modules/render_service_base/src/animation/rs_render_transition_effect.cpp +++ b/rosen/modules/render_service_base/src/animation/rs_render_transition_effect.cpp @@ -32,7 +32,23 @@ enum RSTransitionEffectType : uint16_t { ROTATE, UNDEFINED, }; +constexpr int PID_SHIFT = 32; + +PropertyId GenerateTransitionPropertyId() +{ + // manually set pid to -1 to avoid conflict with other process (note: valid pid is smaller than 2^22) + static pid_t pid_ = -1; + static std::atomic currentId_ = 1; + + ++currentId_; + if (currentId_ == UINT32_MAX) { + // [PLANNING]:process the overflow situations + ROSEN_LOGE("Property Id overflow"); + } + + return ((PropertyId)pid_ << PID_SHIFT) | currentId_; } +} // namespace RSRenderTransitionEffect* RSRenderTransitionEffect::Unmarshalling(Parcel& parcel) { @@ -55,6 +71,14 @@ RSRenderTransitionEffect* RSRenderTransitionEffect::Unmarshalling(Parcel& parcel } } +const std::shared_ptr& RSRenderTransitionEffect::GetModifier() +{ + if (modifier_ == nullptr) { + modifier_ = CreateModifier(); + } + return modifier_; +} + bool RSTransitionFade::Marshalling(Parcel& parcel) const { return parcel.WriteUint16(RSTransitionEffectType::FADE) && parcel.WriteFloat(alpha_); @@ -127,13 +151,10 @@ RSRenderTransitionEffect* RSTransitionRotate::Unmarshalling(Parcel& parcel) } #endif -const std::shared_ptr& RSTransitionFade::GetModifier() +const std::shared_ptr RSTransitionFade::CreateModifier() { - if (modifier_ == nullptr || property_ == nullptr) { - property_ = std::make_shared>(); - modifier_ = std::make_shared(property_); - } - return modifier_; + property_ = std::make_shared>(0, GenerateTransitionPropertyId()); + return std::make_shared(property_); } void RSTransitionFade::UpdateFraction(float fraction) const @@ -147,13 +168,11 @@ void RSTransitionFade::UpdateFraction(float fraction) const property_->Set(value); } -const std::shared_ptr& RSTransitionScale::GetModifier() +const std::shared_ptr RSTransitionScale::CreateModifier() { - if (modifier_ == nullptr || property_ == nullptr) { - property_ = std::make_shared>(); - modifier_ = std::make_shared(property_); - } - return modifier_; + property_ = + std::make_shared>(Vector2f { 0, 0 }, GenerateTransitionPropertyId()); + return std::make_shared(property_); } void RSTransitionScale::UpdateFraction(float fraction) const @@ -167,13 +186,11 @@ void RSTransitionScale::UpdateFraction(float fraction) const property_->Set(value); } -const std::shared_ptr& RSTransitionTranslate::GetModifier() +const std::shared_ptr RSTransitionTranslate::CreateModifier() { - if (modifier_ == nullptr || property_ == nullptr) { - property_ = std::make_shared>(); - modifier_ = std::make_shared(property_); - } - return modifier_; + property_ = + std::make_shared>(Vector2f { 0, 0 }, GenerateTransitionPropertyId()); + return std::make_shared(property_); } void RSTransitionTranslate::UpdateFraction(float fraction) const @@ -187,13 +204,10 @@ void RSTransitionTranslate::UpdateFraction(float fraction) const property_->Set(value); } -const std::shared_ptr& RSTransitionRotate::GetModifier() +const std::shared_ptr RSTransitionRotate::CreateModifier() { - if (modifier_ == nullptr || property_ == nullptr) { - property_ = std::make_shared>(); - modifier_ = std::make_shared(property_); - } - return modifier_; + property_ = std::make_shared>(Quaternion {}, GenerateTransitionPropertyId()); + return std::make_shared(property_); } void RSTransitionRotate::UpdateFraction(float fraction) const diff --git a/rosen/modules/render_service_base/src/animation/rs_transition_effect.cpp b/rosen/modules/render_service_base/src/animation/rs_transition_effect.cpp index d5919f5e1c..f48b986ab4 100644 --- a/rosen/modules/render_service_base/src/animation/rs_transition_effect.cpp +++ b/rosen/modules/render_service_base/src/animation/rs_transition_effect.cpp @@ -16,6 +16,7 @@ #include "animation/rs_transition_effect.h" #include "animation/rs_render_transition_effect.h" +#include "platform/common/rs_log.h" namespace OHOS { namespace Rosen { @@ -33,42 +34,49 @@ std::shared_ptr RSTransitionEffect::Create() std::shared_ptr RSTransitionEffect::Opacity(float opacity) { - if (opacity != 1.0f) { - auto opacityEffect = std::make_shared(opacity); - transitionInEffects_.push_back(opacityEffect); - transitionOutEffects_.push_back(opacityEffect); + if (opacity == 1.0f) { + ROSEN_LOGI("RSTransitionEffect::Opacity: Skip empty transition effect"); + return shared_from_this(); } + auto opacityEffect = std::make_shared(opacity); + transitionInEffects_.push_back(opacityEffect); + transitionOutEffects_.push_back(opacityEffect); return shared_from_this(); } std::shared_ptr RSTransitionEffect::Scale(const Vector3f& scale) { - if (scale.x_ != 1.0f || scale.y_ != 1.0f || scale.z_ != 1.0f) { - auto scaleEffect = std::make_shared(scale.x_, scale.y_, scale.z_); - transitionInEffects_.push_back(scaleEffect); - transitionOutEffects_.push_back(scaleEffect); + if (scale.x_ == 1.0f && scale.y_ == 1.0f && scale.z_ == 1.0f) { + ROSEN_LOGI("RSTransitionEffect::Scale: Skip empty transition effect"); + return shared_from_this(); } + auto scaleEffect = std::make_shared(scale.x_, scale.y_, scale.z_); + transitionInEffects_.push_back(scaleEffect); + transitionOutEffects_.push_back(scaleEffect); return shared_from_this(); } std::shared_ptr RSTransitionEffect::Translate(const Vector3f& translate) { - if (translate.x_ != 0.0f || translate.y_ != 0.0f || translate.z_ != 0.0f) { - auto translateEffect = std::make_shared(translate.x_, translate.y_, translate.z_); - transitionInEffects_.push_back(translateEffect); - transitionOutEffects_.push_back(translateEffect); + if (translate.x_ == 0.0f && translate.y_ == 0.0f && translate.z_ == 0.0f) { + ROSEN_LOGI("RSTransitionEffect::Translate: Skip empty transition effect"); + return shared_from_this(); } + auto translateEffect = std::make_shared(translate.x_, translate.y_, translate.z_); + transitionInEffects_.push_back(translateEffect); + transitionOutEffects_.push_back(translateEffect); return shared_from_this(); } std::shared_ptr RSTransitionEffect::Rotate(const Vector4f& axisAngle) { - if (axisAngle.w_ != 0.0f) { - auto rotateEffect = - std::make_shared(axisAngle.x_, axisAngle.y_, axisAngle.z_, axisAngle.w_); - transitionInEffects_.push_back(rotateEffect); - transitionOutEffects_.push_back(rotateEffect); + if (axisAngle.w_ == 0.0f) { + ROSEN_LOGI("RSTransitionEffect::Rotate: Skip empty transition effect"); + return shared_from_this(); } + auto rotateEffect = std::make_shared(axisAngle.x_, axisAngle.y_, axisAngle.z_, axisAngle.w_); + transitionInEffects_.push_back(rotateEffect); + transitionOutEffects_.push_back(rotateEffect); return shared_from_this(); } diff --git a/rosen/modules/render_service_base/src/command/rs_node_command.cpp b/rosen/modules/render_service_base/src/command/rs_node_command.cpp index 111eec1fad..2858b036df 100644 --- a/rosen/modules/render_service_base/src/command/rs_node_command.cpp +++ b/rosen/modules/render_service_base/src/command/rs_node_command.cpp @@ -17,15 +17,6 @@ namespace OHOS { namespace Rosen { -void RSNodeCommandHelper::ClearModifiers(RSContext& context, NodeId nodeId) -{ - auto& nodeMap = context.GetNodeMap(); - auto node = nodeMap.GetRenderNode(nodeId); - if (node) { - node->ClearModifiers(); - } -} - void RSNodeCommandHelper::AddModifier(RSContext& context, NodeId nodeId, const std::shared_ptr& modifier) { diff --git a/rosen/modules/render_service_base/src/modifier/rs_render_modifier.cpp b/rosen/modules/render_service_base/src/modifier/rs_render_modifier.cpp index cb001ecbfa..844c1e79f5 100644 --- a/rosen/modules/render_service_base/src/modifier/rs_render_modifier.cpp +++ b/rosen/modules/render_service_base/src/modifier/rs_render_modifier.cpp @@ -51,14 +51,14 @@ static std::unordered_map funcLUT = { { RSModifierType::EXTENDED, [](Parcel& parcel) -> RSRenderModifier* { std::shared_ptr>> prop; int16_t type; - bool hasOverlayerBounds = false; + bool hasOverlayBounds = false; if (!RSMarshallingHelper::Unmarshalling(parcel, prop) || !parcel.ReadInt16(type) || - !parcel.ReadBool(hasOverlayerBounds)) { + !parcel.ReadBool(hasOverlayBounds)) { return nullptr; } RSDrawCmdListRenderModifier* modifier = new RSDrawCmdListRenderModifier(prop); modifier->SetType(static_cast(type)); - if (hasOverlayerBounds) { + if (hasOverlayBounds) { // OVERLAY_STYLE int32_t left; int32_t top; @@ -68,7 +68,7 @@ static std::unordered_map funcLUT = { parcel.ReadInt32(width) && parcel.ReadInt32(height))) { return nullptr; } - modifier->SetOverlayerBounds(std::make_shared(left, top, width, height)); + modifier->SetOverlayBounds(std::make_shared(left, top, width, height)); } return modifier; }, diff --git a/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp b/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp index f3813909b8..466147fd03 100644 --- a/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp +++ b/rosen/modules/render_service_base/src/pipeline/rs_render_node.cpp @@ -175,14 +175,6 @@ void RSRenderNode::ProcessRenderAfterChildren(RSPaintFilterCanvas& canvas) #endif } -void RSRenderNode::ClearModifiers() -{ - modifiers_.clear(); - drawCmdModifiers_.clear(); - transitionModifiers_.clear(); - SetDirty(); -} - void RSRenderNode::AddModifier(const std::shared_ptr& modifier) { if (!modifier) { @@ -229,27 +221,11 @@ void RSRenderNode::RemoveModifier(const PropertyId& id) return modifier ? modifier->GetPropertyId() == id : true; }); if (type == RSModifierType::OVERLAY_STYLE) { - UpdateOverlayerBounds(); + UpdateOverlayBounds(); } } } -void RSRenderNode::AddTransitionModifier(const std::shared_ptr& modifier) -{ - if (!modifier) { - return; - } - transitionModifiers_.emplace(modifier); - modifier->GetProperty()->Attach(shared_from_this()); - SetDirty(); -} - -void RSRenderNode::RemoveTransitionModifier(const std::shared_ptr& modifier) -{ - transitionModifiers_.erase(modifier); - SetDirty(); -} - void RSRenderNode::ApplyModifiers() { if (!RSBaseRenderNode::IsDirty()) { @@ -263,15 +239,10 @@ void RSRenderNode::ApplyModifiers() } } - for (auto& modifier : transitionModifiers_) { - if (modifier) { - modifier->Apply(context); - } - } - UpdateOverlayerBounds(); + UpdateOverlayBounds(); } -void RSRenderNode::UpdateOverlayerBounds() +void RSRenderNode::UpdateOverlayBounds() { RSModifierContext context = { GetMutableRenderProperties() }; auto iterator = drawCmdModifiers_.find(RSModifierType::OVERLAY_STYLE); @@ -279,12 +250,12 @@ void RSRenderNode::UpdateOverlayerBounds() RectI joinRect = RectI(); for (auto& overlayModifier : iterator->second) { auto drawCmdModifier = std::static_pointer_cast(overlayModifier); - if (drawCmdModifier != nullptr && drawCmdModifier->GetOverlayerBounds() != nullptr && - !drawCmdModifier->GetOverlayerBounds()->IsEmpty()) { - joinRect = joinRect.JoinRect(*drawCmdModifier->GetOverlayerBounds()); + if (drawCmdModifier != nullptr && drawCmdModifier->GetOverlayBounds() != nullptr && + !drawCmdModifier->GetOverlayBounds()->IsEmpty()) { + joinRect = joinRect.JoinRect(*drawCmdModifier->GetOverlayBounds()); } } - context.property_.SetOverlayerBounds(std::make_shared(joinRect)); + context.property_.SetOverlayBounds(std::make_shared(joinRect)); } } diff --git a/rosen/modules/render_service_base/src/property/rs_properties.cpp b/rosen/modules/render_service_base/src/property/rs_properties.cpp index 74cdc8f8d7..b9a39b38d9 100644 --- a/rosen/modules/render_service_base/src/property/rs_properties.cpp +++ b/rosen/modules/render_service_base/src/property/rs_properties.cpp @@ -815,12 +815,12 @@ Gravity RSProperties::GetFrameGravity() const return frameGravity_; } -void RSProperties::SetOverlayerBounds(std::shared_ptr rect) +void RSProperties::SetOverlayBounds(std::shared_ptr rect) { overlayRect_ = rect; } -std::shared_ptr RSProperties::GetOverlayerBounds() const +std::shared_ptr RSProperties::GetOverlayBounds() const { return overlayRect_; } diff --git a/rosen/modules/render_service_client/core/modifier/rs_extended_modifier.h b/rosen/modules/render_service_client/core/modifier/rs_extended_modifier.h index 3fad15d2b5..b1bef6d744 100644 --- a/rosen/modules/render_service_client/core/modifier/rs_extended_modifier.h +++ b/rosen/modules/render_service_client/core/modifier/rs_extended_modifier.h @@ -115,12 +115,12 @@ public: return RSModifierType::OVERLAY_STYLE; } - void SetOverlayerBounds(std::shared_ptr rect) + void SetOverlayBounds(std::shared_ptr rect) { overlayRect_ = rect; } - std::shared_ptr GetOverlayerBounds() const + std::shared_ptr GetOverlayBounds() const { return overlayRect_; } @@ -130,7 +130,7 @@ public: auto renderModifier = RSExtendedModifier::CreateRenderModifier(); auto drawCmdModifier = std::static_pointer_cast(renderModifier); if (drawCmdModifier != nullptr && drawCmdModifier->GetType() == RSModifierType::OVERLAY_STYLE) { - drawCmdModifier->SetOverlayerBounds(overlayRect_); + drawCmdModifier->SetOverlayBounds(overlayRect_); } return renderModifier; } diff --git a/rosen/modules/render_service_client/core/ui/rs_node.cpp b/rosen/modules/render_service_client/core/ui/rs_node.cpp index a4592b99be..415c3c2d01 100644 --- a/rosen/modules/render_service_client/core/ui/rs_node.cpp +++ b/rosen/modules/render_service_client/core/ui/rs_node.cpp @@ -840,29 +840,6 @@ void RSNode::SetPaintOrder(bool drawContentLast) drawContentLast_ = drawContentLast; } -void RSNode::ClearModifiers() -{ - for (auto& [id, modifier] : modifiers_) { - modifier->DetachFromNode(); - std::unique_ptr command = std::make_unique(GetId(), modifier->GetPropertyId()); - auto transactionProxy = RSTransactionProxy::GetInstance(); - if (transactionProxy != nullptr) { - transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), GetId()); - if (NeedForcedSendToRemote()) { - std::unique_ptr cmdForRemote = - std::make_unique(GetId(), modifier->GetPropertyId()); - transactionProxy->AddCommand(cmdForRemote, true, GetFollowType(), GetId()); - } - if (NeedSendExtraCommand()) { - std::unique_ptr extraCommand = - std::make_unique(GetId(), modifier->GetPropertyId()); - transactionProxy->AddCommand(extraCommand, !IsRenderServiceNode(), GetFollowType(), GetId()); - } - } - } - modifiers_.clear(); -} - void RSNode::ClearAllModifiers() { if (animationManager_ == nullptr) { @@ -872,20 +849,6 @@ void RSNode::ClearAllModifiers() modifier->DetachFromNode(); animationManager_->RemoveProperty(id); } - modifiers_.clear(); - std::unique_ptr command = std::make_unique(GetId()); - auto transactionProxy = RSTransactionProxy::GetInstance(); - if (transactionProxy != nullptr) { - transactionProxy->AddCommand(command, IsRenderServiceNode(), GetFollowType(), GetId()); - if (NeedForcedSendToRemote()) { - std::unique_ptr cmdForRemote = std::make_unique(GetId()); - transactionProxy->AddCommand(cmdForRemote, true, GetFollowType(), GetId()); - } - if (NeedSendExtraCommand()) { - std::unique_ptr extraCommand = std::make_unique(GetId()); - transactionProxy->AddCommand(extraCommand, !IsRenderServiceNode(), GetFollowType(), GetId()); - } - } } void RSNode::AddModifier(const std::shared_ptr& modifier) diff --git a/rosen/modules/render_service_client/core/ui/rs_node.h b/rosen/modules/render_service_client/core/ui/rs_node.h index 16a755b504..dea7b32362 100644 --- a/rosen/modules/render_service_client/core/ui/rs_node.h +++ b/rosen/modules/render_service_client/core/ui/rs_node.h @@ -171,7 +171,7 @@ public: transitionEffect_ = effect; } - void ClearModifiers(); + // Planning: refactor RSUIAnimationManager and remove this method void ClearAllModifiers(); void AddModifier(const std::shared_ptr& modifier); void RemoveModifier(const std::shared_ptr& modifier); -- Gitee From 50c177f4170707726064e85d6e988da41300dc12 Mon Sep 17 00:00:00 2001 From: Zhang Peng Date: Thu, 1 Sep 2022 10:54:43 +0800 Subject: [PATCH 5/6] misc bug fix for shadow SmokeTest Signed-off-by: Zhang Peng Change-Id: I9a9290c78059357e9b2ba399c323f42316d59c09 --- .../include/pipeline/rs_render_node.h | 5 ++--- .../include/property/rs_properties.h | 2 +- .../render_service_base/include/render/rs_shadow.h | 6 +++--- .../src/animation/rs_render_transition_effect.cpp | 4 ++-- .../src/property/rs_properties.cpp | 2 +- .../core/modifier/rs_modifier_extractor.cpp | 12 ++++++------ .../render_service_client/core/ui/rs_node.cpp | 2 +- 7 files changed, 16 insertions(+), 17 deletions(-) diff --git a/rosen/modules/render_service_base/include/pipeline/rs_render_node.h b/rosen/modules/render_service_base/include/pipeline/rs_render_node.h index d5a39af219..e18580d498 100644 --- a/rosen/modules/render_service_base/include/pipeline/rs_render_node.h +++ b/rosen/modules/render_service_base/include/pipeline/rs_render_node.h @@ -88,7 +88,7 @@ protected: bool IsDirty() const override; void AddGeometryModifier(const std::shared_ptr& modifier); std::pair renderNodeSaveCount_ = { 0, 0 }; - std::unordered_map>> drawCmdModifiers_; + std::map>> drawCmdModifiers_; // if true, it means currently it's in partial render mode and this node is intersect with dirtyRegion bool isRenderUpdateIgnored_ = false; @@ -101,8 +101,7 @@ private: RectI oldDirty_; RSProperties renderProperties_; RSAnimationManager animationManager_; - std::unordered_map> modifiers_; - std::unordered_set> transitionModifiers_; + std::map> modifiers_; // bounds and frame modifiers must be unique std::shared_ptr boundsModifier_; std::shared_ptr frameModifier_; diff --git a/rosen/modules/render_service_base/include/property/rs_properties.h b/rosen/modules/render_service_base/include/property/rs_properties.h index 199d40c407..560e9ca6ad 100644 --- a/rosen/modules/render_service_base/include/property/rs_properties.h +++ b/rosen/modules/render_service_base/include/property/rs_properties.h @@ -228,7 +228,7 @@ private: std::shared_ptr overlayRect_ = nullptr; float alpha_ = 1.f; - bool alphaOffscreen_ = false; + bool alphaOffscreen_ = true; std::shared_ptr boundsGeo_; std::shared_ptr frameGeo_; diff --git a/rosen/modules/render_service_base/include/render/rs_shadow.h b/rosen/modules/render_service_base/include/render/rs_shadow.h index ba1f14b19d..5eaf7c9d5b 100644 --- a/rosen/modules/render_service_base/include/render/rs_shadow.h +++ b/rosen/modules/render_service_base/include/render/rs_shadow.h @@ -28,10 +28,10 @@ const float DEFAULT_LIGHT_POSITION_Y = 0.0f; const float DEFAULT_LIGHT_HEIGHT = 600.0f; const float DEFAULT_LIGHT_RADIUS = 800.0f; const float DEFAULT_SHADOW_OFFSET_X = 0.f; -const float DEFAULT_SHADOW_OFFSET_Y = -3.f; -const float DEFAULT_SHADOW_RADIUS = 3.f; +const float DEFAULT_SHADOW_OFFSET_Y = 0.f; +const float DEFAULT_SHADOW_RADIUS = 0.f; const uint32_t DEFAULT_AMBIENT_COLOR = 0x0A000000; -const uint32_t DEFAULT_SPOT_COLOR = 0x31808080; +const uint32_t DEFAULT_SPOT_COLOR = 0x00000000; class RSShadow { public: diff --git a/rosen/modules/render_service_base/src/animation/rs_render_transition_effect.cpp b/rosen/modules/render_service_base/src/animation/rs_render_transition_effect.cpp index 001c3d0e36..92d93b3c65 100644 --- a/rosen/modules/render_service_base/src/animation/rs_render_transition_effect.cpp +++ b/rosen/modules/render_service_base/src/animation/rs_render_transition_effect.cpp @@ -36,8 +36,8 @@ constexpr int PID_SHIFT = 32; PropertyId GenerateTransitionPropertyId() { - // manually set pid to -1 to avoid conflict with other process (note: valid pid is smaller than 2^22) - static pid_t pid_ = -1; + // manually set pid to INT_MAX to avoid conflict with other process (note: valid pid is smaller than 2^22) + static pid_t pid_ = INT_MAX; static std::atomic currentId_ = 1; ++currentId_; diff --git a/rosen/modules/render_service_base/src/property/rs_properties.cpp b/rosen/modules/render_service_base/src/property/rs_properties.cpp index b9a39b38d9..008c1121ed 100644 --- a/rosen/modules/render_service_base/src/property/rs_properties.cpp +++ b/rosen/modules/render_service_base/src/property/rs_properties.cpp @@ -789,7 +789,7 @@ float RSProperties::GetShadowElevation() const float RSProperties::GetShadowRadius() const { - return shadow_ ? shadow_->GetRadius() : 0.f; + return shadow_ ? shadow_->GetRadius() : DEFAULT_SHADOW_RADIUS; } std::shared_ptr RSProperties::GetShadowPath() const diff --git a/rosen/modules/render_service_client/core/modifier/rs_modifier_extractor.cpp b/rosen/modules/render_service_client/core/modifier/rs_modifier_extractor.cpp index 5cf51b58b5..4af25e26a0 100644 --- a/rosen/modules/render_service_client/core/modifier/rs_modifier_extractor.cpp +++ b/rosen/modules/render_service_client/core/modifier/rs_modifier_extractor.cpp @@ -108,7 +108,7 @@ float RSModifierExtractor::GetAlpha() const bool RSModifierExtractor::GetAlphaOffscreen() const { - GET_PROPERTY_FROM_MODIFIERS(bool, ALPHA_OFFSCREEN, false, =); + GET_PROPERTY_FROM_MODIFIERS(bool, ALPHA_OFFSCREEN, true, =); } Vector4f RSModifierExtractor::GetCornerRadius() const @@ -194,27 +194,27 @@ Color RSModifierExtractor::GetShadowColor() const float RSModifierExtractor::GetShadowOffsetX() const { - GET_PROPERTY_FROM_MODIFIERS(float, SHADOW_OFFSET_X, DEFAULT_SHADOW_OFFSET_X, +=); + GET_PROPERTY_FROM_MODIFIERS(float, SHADOW_OFFSET_X, DEFAULT_SHADOW_OFFSET_X, =); } float RSModifierExtractor::GetShadowOffsetY() const { - GET_PROPERTY_FROM_MODIFIERS(float, SHADOW_OFFSET_Y, DEFAULT_SHADOW_OFFSET_Y, +=); + GET_PROPERTY_FROM_MODIFIERS(float, SHADOW_OFFSET_Y, DEFAULT_SHADOW_OFFSET_Y, =); } float RSModifierExtractor::GetShadowAlpha() const { - GET_PROPERTY_FROM_MODIFIERS(float, SHADOW_ALPHA, 0.f, *=); + GET_PROPERTY_FROM_MODIFIERS(float, SHADOW_ALPHA, 0.f, =); } float RSModifierExtractor::GetShadowElevation() const { - GET_PROPERTY_FROM_MODIFIERS(float, SHADOW_ELEVATION, 0.f, +=); + GET_PROPERTY_FROM_MODIFIERS(float, SHADOW_ELEVATION, 0.f, =); } float RSModifierExtractor::GetShadowRadius() const { - GET_PROPERTY_FROM_MODIFIERS(float, SHADOW_RADIUS, 0.f, +=); + GET_PROPERTY_FROM_MODIFIERS(float, SHADOW_RADIUS, DEFAULT_SHADOW_RADIUS, =); } std::shared_ptr RSModifierExtractor::GetShadowPath() const diff --git a/rosen/modules/render_service_client/core/ui/rs_node.cpp b/rosen/modules/render_service_client/core/ui/rs_node.cpp index 415c3c2d01..74a9db03c0 100644 --- a/rosen/modules/render_service_client/core/ui/rs_node.cpp +++ b/rosen/modules/render_service_client/core/ui/rs_node.cpp @@ -747,7 +747,7 @@ void RSNode::SetShadowElevation(float elevation) void RSNode::SetShadowRadius(float radius) { - SET_ANIMATABLE_MODIFIER(ShadowRadius, float, radius, SHADOW_RADIUS, 0.f); + SET_ANIMATABLE_MODIFIER(ShadowRadius, float, radius, SHADOW_RADIUS, DEFAULT_SHADOW_RADIUS); } void RSNode::SetShadowPath(const std::shared_ptr& shadowPath) -- Gitee From 00a98c163e087a6754ee8b745577621b09a6e73e Mon Sep 17 00:00:00 2001 From: Zhang Peng Date: Tue, 6 Sep 2022 09:42:02 +0800 Subject: [PATCH 6/6] misc fix: 1. remove modifiers on RSProxyNode destroy 2. Reset Matrix Signed-off-by: Zhang Peng Change-Id: I3bfeec27f52ce3aa36f0e904cabd8def9bc4a2ec --- .../rs_window_animation_utils.cpp | 2 +- .../include/command/rs_proxy_node_command.h | 12 +- .../include/pipeline/rs_proxy_render_node.h | 2 +- .../transaction/rs_marshalling_helper.h | 29 ++++- .../src/command/rs_proxy_node_command.cpp | 16 ++- .../src/pipeline/rs_proxy_render_node.cpp | 5 +- .../src/transaction/rs_marshalling_helper.cpp | 118 +++++++----------- .../core/ui/rs_base_node.h | 4 + .../render_service_client/core/ui/rs_node.cpp | 9 ++ .../render_service_client/core/ui/rs_node.h | 10 +- .../core/ui/rs_proxy_node.cpp | 15 ++- .../core/ui/rs_proxy_node.h | 2 +- .../unittest/ui/rs_modifier_test.cpp | 1 - 13 files changed, 123 insertions(+), 102 deletions(-) diff --git a/interfaces/kits/napi/graphic/animation/window_animation_manager/rs_window_animation_utils.cpp b/interfaces/kits/napi/graphic/animation/window_animation_manager/rs_window_animation_utils.cpp index cb55cf2763..f6a11369fc 100644 --- a/interfaces/kits/napi/graphic/animation/window_animation_manager/rs_window_animation_utils.cpp +++ b/interfaces/kits/napi/graphic/animation/window_animation_manager/rs_window_animation_utils.cpp @@ -53,7 +53,7 @@ NativeValue* RSWindowAnimationUtils::CreateJsWindowAnimationTarget(NativeEngine& object->SetNativePointer(&(target->surfaceNode_), finalizeCallback, target.GetRefPtr()); if (auto proxyNode = RSBaseNode::ReinterpretCast(target->surfaceNode_)) { // force proxy node to flush correct context alpha on next visit - proxyNode->ResetContextAlpha(); + proxyNode->ResetContextVariableCache(); } object->SetProperty("bundleName", CreateJsValue(engine, target->bundleName_)); diff --git a/rosen/modules/render_service_base/include/command/rs_proxy_node_command.h b/rosen/modules/render_service_base/include/command/rs_proxy_node_command.h index 269deed03c..98f98aca83 100644 --- a/rosen/modules/render_service_base/include/command/rs_proxy_node_command.h +++ b/rosen/modules/render_service_base/include/command/rs_proxy_node_command.h @@ -23,18 +23,22 @@ namespace Rosen { enum RSProxyNodeCommandType : uint16_t { PROXY_NODE_CREATE, - PROXY_NODE_RESET_CONTEXT_ALPHA, + PROXY_NODE_RESET_CONTEXT_VARIABLE_CACHE, + REMOVE_MODIFIERS, }; class ProxyNodeCommandHelper { public: static void Create(RSContext& context, NodeId id, NodeId target); - static void ResetContextAlpha(RSContext& context, NodeId id); + static void ResetContextVariableCache(RSContext& context, NodeId id); + static void RemoveModifiers(RSContext& context, NodeId nodeId, std::vector propertyId); }; ADD_COMMAND(RSProxyNodeCreate, ARG(PROXY_NODE, PROXY_NODE_CREATE, ProxyNodeCommandHelper::Create, NodeId, NodeId)) -ADD_COMMAND(RSProxyNodeResetContextAlpha, - ARG(PROXY_NODE, PROXY_NODE_RESET_CONTEXT_ALPHA, ProxyNodeCommandHelper::ResetContextAlpha, NodeId)) +ADD_COMMAND(RSProxyNodeResetContextVariableCache, + ARG(PROXY_NODE, PROXY_NODE_RESET_CONTEXT_VARIABLE_CACHE, ProxyNodeCommandHelper::ResetContextVariableCache, NodeId)) +ADD_COMMAND(RSProxyNodeRemoveModifiers, + ARG(RS_NODE, REMOVE_MODIFIERS, ProxyNodeCommandHelper::RemoveModifiers, NodeId, std::vector)) } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_base/include/pipeline/rs_proxy_render_node.h b/rosen/modules/render_service_base/include/pipeline/rs_proxy_render_node.h index f8e439640a..7449989274 100644 --- a/rosen/modules/render_service_base/include/pipeline/rs_proxy_render_node.h +++ b/rosen/modules/render_service_base/include/pipeline/rs_proxy_render_node.h @@ -46,7 +46,7 @@ public: void SetContextAlpha(float alpha); void SetContextClipRegion(SkRect clipRegion); - void ResetContextAlpha(); + void ResetContextVariableCache(); private: std::weak_ptr target_; diff --git a/rosen/modules/render_service_base/include/transaction/rs_marshalling_helper.h b/rosen/modules/render_service_base/include/transaction/rs_marshalling_helper.h index c50703600c..a3fd52b5fb 100644 --- a/rosen/modules/render_service_base/include/transaction/rs_marshalling_helper.h +++ b/rosen/modules/render_service_base/include/transaction/rs_marshalling_helper.h @@ -64,7 +64,7 @@ class RSRenderAnimatableProperty; class RSMarshallingHelper { public: - static bool WriteToParcel(Parcel &parcel, const void* data, size_t size); + static bool WriteToParcel(Parcel& parcel, const void* data, size_t size); static const void* ReadFromParcel(Parcel& parcel, size_t size); static bool SkipFromParcel(Parcel& parcel, size_t size); @@ -176,9 +176,30 @@ public: // reloaded marshalling & unmarshalling function for std::vector template - static bool Marshalling(Parcel& parcel, const std::vector& val); + static bool Marshalling(Parcel& parcel, const std::vector& val) + { + bool success = parcel.WriteUint32(val.size()); + for (const auto& item : val) { + success = success && Marshalling(parcel, item); + } + return success; + } template - static bool Unmarshalling(Parcel& parcel, std::vector& val); + static bool Unmarshalling(Parcel& parcel, std::vector& val) + { + uint32_t size = 0; + if (!Unmarshalling(parcel, size)) { + return false; + } + val.resize(size); + for (uint32_t i = 0; i < size; ++i) { + // in-place unmarshalling + if (!Unmarshalling(parcel, val[i])) { + return false; + } + } + return true; + } template static bool Marshalling(Parcel& parcel, const T& first, const Args&... args) @@ -195,7 +216,7 @@ private: static sk_sp SerializeTypeface(SkTypeface* tf, void* ctx); static sk_sp DeserializeTypeface(const void* data, size_t length, void* ctx); static constexpr size_t MAX_DATA_SIZE = 128 * 1024 * 1024; // 128M - static constexpr size_t MIN_DATA_SIZE = 8 * 1024; // 8k + static constexpr size_t MIN_DATA_SIZE = 8 * 1024; // 8k }; } // namespace Rosen diff --git a/rosen/modules/render_service_base/src/command/rs_proxy_node_command.cpp b/rosen/modules/render_service_base/src/command/rs_proxy_node_command.cpp index db71083f4f..b30ae73081 100644 --- a/rosen/modules/render_service_base/src/command/rs_proxy_node_command.cpp +++ b/rosen/modules/render_service_base/src/command/rs_proxy_node_command.cpp @@ -29,10 +29,22 @@ void ProxyNodeCommandHelper::Create(RSContext& context, NodeId id, NodeId target context.GetMutableNodeMap().RegisterRenderNode(node); } -void ProxyNodeCommandHelper::ResetContextAlpha(RSContext& context, NodeId id) +void ProxyNodeCommandHelper::ResetContextVariableCache(RSContext& context, NodeId id) { if (auto node = context.GetNodeMap().GetRenderNode(id)) { - node->ResetContextAlpha(); + node->ResetContextVariableCache(); + } +} + +void ProxyNodeCommandHelper::RemoveModifiers(RSContext& context, NodeId nodeId, std::vector propertyIds) +{ + auto& nodeMap = context.GetNodeMap(); + auto node = nodeMap.GetRenderNode(nodeId); + if (node == nullptr) { + return; + } + for (auto propertyId : propertyIds) { + node->RemoveModifier(propertyId); } } } // namespace Rosen diff --git a/rosen/modules/render_service_base/src/pipeline/rs_proxy_render_node.cpp b/rosen/modules/render_service_base/src/pipeline/rs_proxy_render_node.cpp index 69e38d2625..7810273b1c 100644 --- a/rosen/modules/render_service_base/src/pipeline/rs_proxy_render_node.cpp +++ b/rosen/modules/render_service_base/src/pipeline/rs_proxy_render_node.cpp @@ -93,10 +93,11 @@ void RSProxyRenderNode::SetContextClipRegion(SkRect clipRegion) SendCommandFromRT(command, GetId()); } -void RSProxyRenderNode::ResetContextAlpha() +void RSProxyRenderNode::ResetContextVariableCache() { - // reset context alpha, makes sure next call to SetContextAlpha will set the correct value + // reset context variable cache, make sure next visit will flush correct context variables. contextAlpha_ = -1.0f; + contextMatrix_ = SkMatrix::InvalidMatrix(); } } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_base/src/transaction/rs_marshalling_helper.cpp b/rosen/modules/render_service_base/src/transaction/rs_marshalling_helper.cpp index 5605160666..12b5c711c1 100644 --- a/rosen/modules/render_service_base/src/transaction/rs_marshalling_helper.cpp +++ b/rosen/modules/render_service_base/src/transaction/rs_marshalling_helper.cpp @@ -30,6 +30,7 @@ #include "include/core/SkTextBlob.h" #include "include/core/SkTypeface.h" #include "include/core/SkVertices.h" +#include "pixel_map.h" #include "securec.h" #include "src/core/SkAutoMalloc.h" #include "src/core/SkPaintPriv.h" @@ -46,17 +47,16 @@ #include "common/rs_common_def.h" #include "common/rs_matrix3.h" #include "common/rs_vector4.h" +#include "modifier/rs_render_modifier.h" #include "pipeline/rs_draw_cmd_list.h" -#include "pixel_map.h" #include "platform/common/rs_log.h" #include "render/rs_blur_filter.h" #include "render/rs_filter.h" +#include "render/rs_image.h" #include "render/rs_material_filter.h" #include "render/rs_path.h" #include "render/rs_shader.h" -#include "render/rs_image.h" #include "transaction/rs_ashmem_helper.h" -#include "modifier/rs_render_modifier.h" #ifdef ROSEN_OHOS namespace OHOS { @@ -328,8 +328,8 @@ bool RSMarshallingHelper::Unmarshalling(Parcel& parcel, sk_sp& val) } SkImageInfo imageInfo = SkImageInfo::Make(width, height, colorType, alphaType, colorSpace); - auto skData = pixmapSize < MIN_DATA_SIZE ? SkData::MakeWithCopy(addr, pixmapSize) : - SkData::MakeFromMalloc(addr, pixmapSize); + auto skData = pixmapSize < MIN_DATA_SIZE ? SkData::MakeWithCopy(addr, pixmapSize) + : SkData::MakeFromMalloc(addr, pixmapSize); val = SkImage::MakeRasterData(imageInfo, skData, rb); return val != nullptr; } @@ -727,15 +727,15 @@ MARSHALLING_AND_UNMARSHALLING(RSRenderTransitionEffect) MARSHALLING_AND_UNMARSHALLING(DrawCmdList) #undef MARSHALLING_AND_UNMARSHALLING -#define MARSHALLING_AND_UNMARSHALLING(TEMPLATE) \ - bool RSMarshallingHelper::Marshalling(Parcel& parcel, const std::shared_ptr