diff --git a/frameworks/core/components_ng/render/adapter/rosen_render_context.cpp b/frameworks/core/components_ng/render/adapter/rosen_render_context.cpp index 1cef90ed1abe0473a32f57033b4a23aab3f86601..55d0807279292e7458c189769b95c79235f04e92 100755 --- a/frameworks/core/components_ng/render/adapter/rosen_render_context.cpp +++ b/frameworks/core/components_ng/render/adapter/rosen_render_context.cpp @@ -1293,6 +1293,72 @@ void RosenRenderContext::OnLightUpEffectUpdate(double radio) RequestNextFrame(); } +std::map RosenRenderContext::splitParticleConfig(const std::string& config) +{ + std::map result; + + // 定义需要分割的关键字 + std::vector keys = { + "emitter", "colorOption", "opacityOption", + "scaleOption", "velocityOption", "accelerationOption", "spinOption" + }; + + // 定义每个关键字的前缀(包含冒号和空格) + std::vector keyPrefixes = { + "emitter: ", "colorOption: ", "opacityOption: ", + "scaleOption: ", "velocityOption: ", "accelerationOption: ", "spinOption: " + }; + + size_t currentPos = 0; + size_t configLength = config.length(); + + // 遍历所有关键字 + for (size_t i = 0; i < keys.size(); i++) { + const std::string& key = keys[i]; + const std::string& prefix = keyPrefixes[i]; + + // 查找当前关键字的起始位置 + size_t keyStart = config.find(prefix, currentPos); + if (keyStart == std::string::npos) { + // 关键字不存在,存入空字符串 + result[key] = ""; + continue; + } + + // 计算内容的起始位置(跳过前缀和方括号) + keyStart += prefix.length(); + if (keyStart + 1 < configLength && config[keyStart] == '[') { + keyStart++; // 跳过 '[' + } + + // 查找下一个关键字的位置或字符串末尾 + size_t nextKeyStart = std::string::npos; + if (i < keys.size() - 1) { + nextKeyStart = config.find(keyPrefixes[i + 1], keyStart); + } + + // 确定内容的结束位置 + size_t keyEnd = (nextKeyStart != std::string::npos) ? nextKeyStart : configLength; + + // 处理内容末尾的方括号 + if (keyEnd > keyStart + 1 && config[keyEnd - 1] == ']') { + keyEnd--; // 跳过 ']' + } + + // 提取内容并存储 + if (keyEnd > keyStart) { + result[key] = config.substr(keyStart, keyEnd - keyStart); + } else { + result[key] = ""; + } + + // 更新当前位置 + currentPos = keyEnd; + } + + return result; +} + void RosenRenderContext::OnParticleOptionArrayUpdate(const std::list& optionList) { CHECK_NULL_VOID(rsNode_); @@ -1319,6 +1385,7 @@ void RosenRenderContext::OnParticleOptionArrayUpdate(const std::listparticleAnimationPlaying_ = false; }; rsNode_->SetParticleParams(particleParams, finishCallback); + optionList_ = optionList; RequestNextFrame(); } @@ -6234,6 +6301,42 @@ void RosenRenderContext::DumpInfo() std::string("transitionCnt:").append(std::to_string(disappearingTransitionCount_)) ); } + + LOGI("zhh DumpInfo 2"); + for (auto option : optionList_) { + std::string str = option.ToString(); + LOGI("zhh DumpInfo -- %{public}s", str.c_str()); + auto parts = splitParticleConfig(str); + LOGI("zhh --- %{public}s", parts["emitter"].c_str()); + LOGI("zhh --- %{public}s", parts["colorOption"].c_str()); + LOGI("zhh --- %{public}s", parts["opacityOption"].c_str()); + LOGI("zhh --- %{public}s", parts["scaleOption"].c_str()); + LOGI("zhh --- %{public}s", parts["velocityOption"].c_str()); + LOGI("zhh --- %{public}s", parts["accelerationOption"].c_str()); + LOGI("zhh --- %{public}s", parts["spinOption"].c_str()); + DumpLog::GetInstance().AddDesc( + std::string("emitter:").append(parts[0]) + ); + DumpLog::GetInstance().AddDesc( + std::string("colorOption:").append(parts[1]) + ); + DumpLog::GetInstance().AddDesc( + std::string("opacityOption:").append(parts[2]) + ); + DumpLog::GetInstance().AddDesc( + std::string("scaleOption:").append(parts[3]) + ); + DumpLog::GetInstance().AddDesc( + std::string("velocityOption:").append(parts[4]) + ); + DumpLog::GetInstance().AddDesc( + std::string("accelerationOption:").append(parts[5]) + ); + DumpLog::GetInstance().AddDesc( + std::string("spinOption:").append(parts[6]) + ); + } + LOGI("zhh DumpInfo 3"); } void RosenRenderContext::DumpAdvanceInfo() diff --git a/frameworks/core/components_ng/render/adapter/rosen_render_context.h b/frameworks/core/components_ng/render/adapter/rosen_render_context.h index fed348e1634515332f96a2b036cd146a2faf1102..c9fca3141029d7686c6eb0bed524bda3c5eed76d 100755 --- a/frameworks/core/components_ng/render/adapter/rosen_render_context.h +++ b/frameworks/core/components_ng/render/adapter/rosen_render_context.h @@ -533,7 +533,7 @@ public: std::vector GetRenderNodePropertyValue(AnimationPropertyType property) override; void SyncRSPropertyToRenderContext(AnimationPropertyType property) override; void RemoveFromTree() override; - + std::map splitParticleConfig(const std::string& config); protected: void OnBackgroundImageUpdate(const ImageSourceInfo& src) override; void OnBackgroundImageRepeatUpdate(const ImageRepeat& imageRepeat) override; @@ -918,6 +918,7 @@ protected: private: void ModifyCustomBackground(); + std::list optionList_; }; } // namespace OHOS::Ace::NG