diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.cpp index 1b133df5f2e43d3f62156b7c5cdcfe71782963d9..4f72ee5d0fc3b1b0b7b8c5260bbd66bf9ab04f3e 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.cpp @@ -2579,10 +2579,12 @@ ArkUINativeModuleValue CommonBridge::SetColorBlend(ArkUIRuntimeCallInfo *runtime Local secondArg = runtimeCallInfo->GetCallArgRef(NUM_1); auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value()); Color color; - if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) { + RefPtr colorBlendObj; + if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, colorBlendObj)) { GetArkUINodeModifiers()->getCommonModifier()->resetColorBlend(nativeNode); } else { - GetArkUINodeModifiers()->getCommonModifier()->setColorBlend(nativeNode, color.GetValue()); + auto cbColorRawPtr = AceType::RawPtr(colorBlendObj); + GetArkUINodeModifiers()->getCommonModifier()->setColorBlend(nativeNode, color.GetValue(), cbColorRawPtr); } return panda::JSValueRef::Undefined(vm); } diff --git a/frameworks/core/components_ng/base/view_abstract.cpp b/frameworks/core/components_ng/base/view_abstract.cpp index 265ab80d9eaf43b740bfa306a36585a26d7fee49..d59f46c3faf48bf8072f378c4c2420ddda4b9176 100644 --- a/frameworks/core/components_ng/base/view_abstract.cpp +++ b/frameworks/core/components_ng/base/view_abstract.cpp @@ -3724,6 +3724,29 @@ void ViewAbstract::SetColorBlend(FrameNode* frameNode, const Color& colorBlend) ACE_UPDATE_NODE_RENDER_CONTEXT(FrontColorBlend, colorBlend, frameNode); } +void ViewAbstract::SetColorBlend(FrameNode* frameNode, const Color& colorBlend, const RefPtr& resObj) +{ + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + auto &&updateFunc = [weak = AceType::WeakClaim(frameNode), colorBlend](const RefPtr &resObj) { + auto frameNode = weak.Upgrade(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + std::string colorBlendStr = pattern->GetResCacheMapByKey("colorBlend"); + Color colorBlendColor; + if (colorBlendStr.empty()) { + ResourceParseUtils::ParseResColor(resObj, colorBlendColor); + pattern->AddResCache("colorBlend", colorBlendColor.ColorToString()); + } else { + Color::ParseColorString(colorBlendStr, colorBlendColor); + } + ACE_UPDATE_NODE_RENDER_CONTEXT(FrontColorBlend, colorBlend, frameNode); + }; + updateFunc(resObj); + pattern->AddResObj("colorBlend", resObj, std::move(updateFunc)); +} + void ViewAbstract::CreateWithColorBlendResourceObj(const RefPtr& resObj) { auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); diff --git a/frameworks/core/components_ng/base/view_abstract.h b/frameworks/core/components_ng/base/view_abstract.h index bddb28e9272fee727369d9ac48d73a694092397b..d11f61adbd1d397c6a690680eaa669dd6893ce6a 100644 --- a/frameworks/core/components_ng/base/view_abstract.h +++ b/frameworks/core/components_ng/base/view_abstract.h @@ -606,6 +606,7 @@ public: static void SetSepia(FrameNode* frameNode, const Dimension& sepia); static void SetSaturate(FrameNode* frameNode, const Dimension& saturate); static void SetColorBlend(FrameNode* frameNode, const Color& colorBlend); + static void SetColorBlend(FrameNode* frameNode, const Color& colorBlend, const RefPtr& resObj); static void SetGrayScale(FrameNode* frameNode, const Dimension& grayScale); static void SetContrast(FrameNode* frameNode, const Dimension& contrast); static void SetBrightness(FrameNode* frameNode, const Dimension& brightness); diff --git a/frameworks/core/interfaces/arkoala/arkoala_api.h b/frameworks/core/interfaces/arkoala/arkoala_api.h index df160978717b6d378ba87eb6ecd2543666756888..18bab4318047802fb3b27aece56d3273deaee3fe 100644 --- a/frameworks/core/interfaces/arkoala/arkoala_api.h +++ b/frameworks/core/interfaces/arkoala/arkoala_api.h @@ -2016,7 +2016,7 @@ struct ArkUICommonModifier { void (*resetSepia)(ArkUINodeHandle node); void (*setSaturate)(ArkUINodeHandle node, ArkUI_Float32 saturate); void (*resetSaturate)(ArkUINodeHandle node); - void (*setColorBlend)(ArkUINodeHandle node, ArkUI_Uint32 color); + void (*setColorBlend)(ArkUINodeHandle node, ArkUI_Uint32 color, void* colorBlendRawPtr); void (*resetColorBlend)(ArkUINodeHandle node); void (*setGrayscale)(ArkUINodeHandle node, ArkUI_Float64 grayScale); void (*resetGrayscale)(ArkUINodeHandle node); diff --git a/frameworks/core/interfaces/cjui/cjui_api.h b/frameworks/core/interfaces/cjui/cjui_api.h index 4aabbe87139a2735f8d0902179c6421d7bf46d10..029000a59d8803d5c693468c33b4d4ceec15071d 100644 --- a/frameworks/core/interfaces/cjui/cjui_api.h +++ b/frameworks/core/interfaces/cjui/cjui_api.h @@ -72,7 +72,7 @@ struct CJUICommonModifier { void (*resetSepia)(ArkUINodeHandle node); void (*setSaturate)(ArkUINodeHandle node, ArkUI_Float32 saturate); void (*resetSaturate)(ArkUINodeHandle node); - void (*setColorBlend)(ArkUINodeHandle node, ArkUI_Uint32 color); + void (*setColorBlend)(ArkUINodeHandle node, ArkUI_Uint32 color, void* colorBlendRawPtr); void (*resetColorBlend)(ArkUINodeHandle node); void (*setGrayscale)(ArkUINodeHandle node, ArkUI_Float64 grayScale); void (*resetGrayscale)(ArkUINodeHandle node); diff --git a/frameworks/core/interfaces/native/node/node_common_modifier.cpp b/frameworks/core/interfaces/native/node/node_common_modifier.cpp index eadd9d3a89ec416cf558b979ba927a64e69123e8..2f1a04b55d583cd7d09a91bb09f4ea1e23b29195 100644 --- a/frameworks/core/interfaces/native/node/node_common_modifier.cpp +++ b/frameworks/core/interfaces/native/node/node_common_modifier.cpp @@ -1292,11 +1292,17 @@ void ResetSaturate(ArkUINodeHandle node) ViewAbstract::SetSaturate(frameNode, value); } -void SetColorBlend(ArkUINodeHandle node, uint32_t color) +void SetColorBlend(ArkUINodeHandle node, uint32_t color, void* colorBlendRawPtr) { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); - ViewAbstract::SetColorBlend(frameNode, Color(color)); + if (!SystemProperties::ConfigChangePerform() || !colorBlendRawPtr) { + ViewAbstract::SetColorBlend(frameNode, Color(color)); + } else { + auto* colorBlend = reinterpret_cast(colorBlendRawPtr); + auto colorBlendResObj = AceType::Claim(colorBlend); + ViewAbstract::SetColorBlend(frameNode, Color(color), colorBlendResObj); + } } void ResetColorBlend(ArkUINodeHandle node) diff --git a/interfaces/native/node/style_modifier.cpp b/interfaces/native/node/style_modifier.cpp index 3ebb615ff32d51449700980f67bb81d038bf525b..ffba234c0c9b4d1929a6c26aa86673085b7581b6 100644 --- a/interfaces/native/node/style_modifier.cpp +++ b/interfaces/native/node/style_modifier.cpp @@ -3887,7 +3887,7 @@ int32_t SetColorBlend(ArkUI_NodeHandle node, const ArkUI_AttributeItem* item) } auto* fullImpl = GetFullImpl(); fullImpl->getNodeModifiers()->getCommonModifier()->setColorBlend( - node->uiNodeHandle, item->value[NUM_0].u32); + node->uiNodeHandle, item->value[NUM_0].u32, nullptr); return ERROR_CODE_NO_ERROR; }