From 42f3a217149d38a929bf726af9a04d9b30b2e4cd Mon Sep 17 00:00:00 2001 From: lice Date: Mon, 7 Jul 2025 11:43:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=B1=E6=B5=85=E8=89=B2&=E5=8F=8D=E8=89=B2?= =?UTF-8?q?=E8=83=BD=E5=8A=9B=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lice --- .../engine/jsi/nativeModule/arkts_utils.cpp | 15 +++++++++---- .../jsview/js_view_abstract.cpp | 15 +++++++++---- frameworks/core/common/color_inverter.cpp | 4 +++- .../resource/pattern_resource_manager.cpp | 1 + .../common/resource/resource_parse_utils.cpp | 18 ++++++++------- .../pattern_resource_manager_test.cpp | 22 ++++++++++++++++++- .../resource/resource_parse_utils_test.cpp | 9 +++++--- .../core/common/color_inverter_test.cpp | 20 ++++++++++++++++- 8 files changed, 82 insertions(+), 22 deletions(-) diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.cpp index fe2a2d2397c..dc9071c21d8 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.cpp @@ -124,10 +124,17 @@ void ArkTSUtils::CompleteResourceObjectFromColor(RefPtr& resObj, resObj = nullptr; return; } - auto colorMode = Container::CurrentColorMode(); bool hasDarkRes = CheckDarkResource(resObj); - if ((colorMode == ColorMode::DARK || nodeInfo.localColorMode == ColorMode::DARK) && - (!resObj || !hasDarkRes)) { + if (nodeInfo.localColorMode == ColorMode::DARK) { + if (!hasDarkRes) { + color = Color(invertFunc(color.GetValue())); + } + resObj = nullptr; + return; + } + auto colorMode = Container::CurrentColorMode(); + Color curColor = color; + if ((colorMode == ColorMode::DARK) && !hasDarkRes) { color = Color(invertFunc(color.GetValue())); } if (!resObj) { @@ -138,7 +145,7 @@ void ArkTSUtils::CompleteResourceObjectFromColor(RefPtr& resObj, resObj->SetNodeTag(nodeInfo.nodeTag); resObj->SetColorMode(colorMode); resObj->SetHasDarkRes(hasDarkRes); - resObj->SetColor(color); + resObj->SetColor((colorMode == ColorMode::DARK) ? curColor : color); } bool ArkTSUtils::ParseJsColor(const EcmaVM* vm, const Local& value, Color& result) diff --git a/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp b/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp index 904b414be64..1a39553c7ea 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp @@ -6985,10 +6985,17 @@ void JSViewAbstract::CompleteResourceObjectFromColor(RefPtr& res resObj = nullptr; return; } - - auto colorMode = Container::CurrentColorMode(); bool hasDarkRes = CheckDarkResource(resObj); - if ((colorMode == ColorMode::DARK || localColorMode == ColorMode::DARK) && (!resObj || !hasDarkRes)) { + if (localColorMode == ColorMode::DARK) { + if (!hasDarkRes) { + color = Color(invertFunc(color.GetValue())); + } + resObj = nullptr; + return; + } + auto colorMode = Container::CurrentColorMode(); + Color curColor = color; + if ((colorMode == ColorMode::DARK) && !hasDarkRes) { color = Color(invertFunc(color.GetValue())); } if (!resObj) { @@ -6999,7 +7006,7 @@ void JSViewAbstract::CompleteResourceObjectFromColor(RefPtr& res resObj->SetNodeTag(nodeTag); resObj->SetColorMode(colorMode); resObj->SetHasDarkRes(hasDarkRes); - resObj->SetColor(color); + resObj->SetColor(((colorMode == ColorMode::DARK) ? curColor : color)); } bool JSViewAbstract::ParseJsColor(const JSRef& jsValue, Color& result) diff --git a/frameworks/core/common/color_inverter.cpp b/frameworks/core/common/color_inverter.cpp index 2302ae22e43..42af9e6d67e 100644 --- a/frameworks/core/common/color_inverter.cpp +++ b/frameworks/core/common/color_inverter.cpp @@ -100,7 +100,9 @@ uint32_t ColorInverter::DefaultInverter(uint32_t color) { Color curColor = Color(color); uint8_t full = 255; - Color invertColor = Color::FromRGB(full - curColor.GetRed(), full - curColor.GetGreen(), full - curColor.GetBlue()); + auto curAlpha = curColor.GetAlpha(); + Color invertColor = Color::FromARGB(curAlpha, + full - curColor.GetRed(), full - curColor.GetGreen(), full - curColor.GetBlue()); return invertColor.GetValue(); } diff --git a/frameworks/core/common/resource/pattern_resource_manager.cpp b/frameworks/core/common/resource/pattern_resource_manager.cpp index 766ad3d56da..25832b2cc5f 100644 --- a/frameworks/core/common/resource/pattern_resource_manager.cpp +++ b/frameworks/core/common/resource/pattern_resource_manager.cpp @@ -30,6 +30,7 @@ void PatternResourceManager::AddResource( } if (resMap_.count(key) > 0) { resCacheMap_.clear(); + resKeyArray_.erase(std::remove(resKeyArray_.begin(), resKeyArray_.end(), key), resKeyArray_.end()); } resMap_[key] = { resObj, std::move(updateFunc) }; resKeyArray_.emplace_back(key); diff --git a/frameworks/core/common/resource/resource_parse_utils.cpp b/frameworks/core/common/resource/resource_parse_utils.cpp index 97c71e1d2f2..654a03917a8 100644 --- a/frameworks/core/common/resource/resource_parse_utils.cpp +++ b/frameworks/core/common/resource/resource_parse_utils.cpp @@ -356,12 +356,12 @@ bool ResourceParseUtils::ParseResFontFamilies(const RefPtr& resO void ResourceParseUtils::InvertColorWithResource(const RefPtr& resObj, Color& result, const ColorMode& colorMode) { - if (isReloading_ && !resObj->HasDarkResource() && (colorMode == ColorMode::DARK) && - (colorMode != resObj->GetColorMode()) && - (resObj->GetColorMode() != ColorMode::COLOR_MODE_UNDEFINED)) { + if (!isReloading_ || (resObj->GetColorMode() == ColorMode::COLOR_MODE_UNDEFINED)) { + return; + } + if ((colorMode == ColorMode::DARK) && !resObj->HasDarkResource()) { result = ColorInverter::Invert(result, resObj->GetInstanceId(), resObj->GetNodeTag()); } - resObj->SetColor(result); resObj->SetColorMode(colorMode); } @@ -383,12 +383,14 @@ bool ResourceParseUtils::ParseResColor(const RefPtr& resObj, Col auto colorMode = Container::CurrentColorMode(); if (!resObj->IsResource()) { - if (isReloading_ && (colorMode != resObj->GetColorMode() && - (resObj->GetColorMode() != ColorMode::COLOR_MODE_UNDEFINED))) { + if (resObj->GetColorMode() == ColorMode::COLOR_MODE_UNDEFINED) { + return false; + } + if (isReloading_ && (colorMode == ColorMode::DARK)) { result = ColorInverter::Invert(resObj->GetColor(), resObj->GetInstanceId(), resObj->GetNodeTag()); - resObj->SetColor(result); + } else { + result = resObj->GetColor(); } - result = resObj->GetColor(); resObj->SetColorMode(colorMode); return true; } diff --git a/test/unittest/core/common/resource/pattern_resource_manager_test.cpp b/test/unittest/core/common/resource/pattern_resource_manager_test.cpp index 8d6eb12c21a..b0ed3c016e2 100644 --- a/test/unittest/core/common/resource/pattern_resource_manager_test.cpp +++ b/test/unittest/core/common/resource/pattern_resource_manager_test.cpp @@ -81,7 +81,7 @@ HWTEST_F(PatternResourceManagerTest, PatternResourceManagerTest002, TestSize.Lev { /** * @tc.steps: step1. AddResource. - * @tc.expect: resMap_ size is 3 + * @tc.expect: resMap_ size is 1 */ auto manager = AceType::MakeRefPtr(); auto func = [](const RefPtr& resObj) { return; }; @@ -89,4 +89,24 @@ HWTEST_F(PatternResourceManagerTest, PatternResourceManagerTest002, TestSize.Lev manager->AddResource("key", resObj, func); EXPECT_FALSE(manager->Empty()); } + +/** + * @tc.name: PatternResourceManagerTest003 + * @tc.desc: Test PatternResourceManager. + * @tc.type: FUNC + */ +HWTEST_F(PatternResourceManagerTest, PatternResourceManagerTest003, TestSize.Level1) +{ + /** + * @tc.steps: step1. AddResource. + * @tc.steps: step2. AddResource as same key. + * @tc.expect: resMap_ size is 1 + */ + auto manager = AceType::MakeRefPtr(); + auto func = [](const RefPtr& resObj) { return; }; + RefPtr resObj = AceType::MakeRefPtr(); + manager->AddResource("key", resObj, func); + manager->AddResource("key", resObj, func); + EXPECT_EQ(manager->resKeyArray_.size(), 1); +} } // namespace OHOS::Ace diff --git a/test/unittest/core/common/resource/resource_parse_utils_test.cpp b/test/unittest/core/common/resource/resource_parse_utils_test.cpp index abde0a2e43d..71b4228ae22 100644 --- a/test/unittest/core/common/resource/resource_parse_utils_test.cpp +++ b/test/unittest/core/common/resource/resource_parse_utils_test.cpp @@ -181,6 +181,7 @@ HWTEST_F(ResourceParseUtilsTest, ResourceParseUtilsTest004, TestSize.Level1) Color color = Color::WHITE; resObj->SetColor(color); resObj->SetIsResource(false); + resObj->SetColorMode(ColorMode::LIGHT); EXPECT_TRUE(ResourceParseUtils::ParseResColor(resObj, color)); /** @@ -201,6 +202,7 @@ HWTEST_F(ResourceParseUtilsTest, ResourceParseUtilsTest004, TestSize.Level1) resObjParamsList, "com.example.test", "entry", 100000); resObjWithName->SetColor(color); resObjWithName->SetIsResource(false); + resObjWithName->SetColorMode(ColorMode::DARK); EXPECT_TRUE(ResourceParseUtils::ParseResColor(resObjWithName, color)); ResourceParseUtils::SetIsReloading(false); EXPECT_TRUE(ResourceParseUtils::ParseResColor(resObjWithName, color)); @@ -258,6 +260,7 @@ HWTEST_F(ResourceParseUtilsTest, ResourceParseUtilsTest005, TestSize.Level1) resObj->SetColor(color); resObj->SetIsResource(false); ResourceParseUtils::SetIsReloading(false); + resObj->SetColorMode(ColorMode::LIGHT); Color result; ResourceParseUtils::ParseResColor(resObj, result); EXPECT_EQ(color, result); @@ -272,7 +275,7 @@ HWTEST_F(ResourceParseUtilsTest, ResourceParseUtilsTest006, TestSize.Level1) { /** * @tc.steps: step1. ParseResColor with different colormode. - * @tc.expect: ParseResColor return True. + * @tc.expect: ParseResColor return True except colormode undefined. */ RefPtr resObj = AceType::MakeRefPtr(); Color color = Color::WHITE; @@ -280,10 +283,10 @@ HWTEST_F(ResourceParseUtilsTest, ResourceParseUtilsTest006, TestSize.Level1) resObj->SetIsResource(false); resObj->SetColorMode(ColorMode::COLOR_MODE_UNDEFINED); ResourceParseUtils::SetIsReloading(false); - EXPECT_TRUE(ResourceParseUtils::ParseResColor(resObj, color)); + EXPECT_FALSE(ResourceParseUtils::ParseResColor(resObj, color)); resObj->SetColorMode(ColorMode::DARK); EXPECT_TRUE(ResourceParseUtils::ParseResColor(resObj, color)); - resObj->SetColorMode(ColorMode::LIGHT); + ResourceParseUtils::SetIsReloading(true); EXPECT_TRUE(ResourceParseUtils::ParseResColor(resObj, color)); } } // namespace OHOS::Ace diff --git a/test/unittest/frameworks/core/common/color_inverter_test.cpp b/test/unittest/frameworks/core/common/color_inverter_test.cpp index f6d80bfe9b9..6e796e2c031 100644 --- a/test/unittest/frameworks/core/common/color_inverter_test.cpp +++ b/test/unittest/frameworks/core/common/color_inverter_test.cpp @@ -159,7 +159,8 @@ HWTEST_F(ColorInverterTest, ColorInverterTest005, TestSize.Level1) */ static const uint8_t fullColor = 255; Color full = Color::FromRGB(fullColor, fullColor, fullColor); - EXPECT_EQ(ColorInverter::DefaultInverter(0), full.GetValue()); + Color invertColor = Color::FromRGB(0, 0, 0); + EXPECT_EQ(ColorInverter::DefaultInverter(invertColor.GetValue()), full.GetValue()); } /** @@ -339,4 +340,21 @@ HWTEST_F(ColorInverterTest, ColorInverterTest011, TestSize.Level1) EXPECT_EQ(managerMapNew.size(), 1 + 1); } +/** + * @tc.name: ColorInverterTest0012 + * @tc.desc: ColorInverter::DefaultInverter + * @tc.type: FUNC + */ +HWTEST_F(ColorInverterTest, ColorInverterTest0012, TestSize.Level1) +{ + /** + * @tc.steps: step1. Call DefaultInverter With ARGB color + * @tc.expected: DefaultInverter Give Back Right Value + */ + static const uint8_t fullColor = 255; + static const uint8_t halfAlpha = 128; + Color full = Color::FromARGB(halfAlpha, fullColor, fullColor, fullColor); + Color invertColor = Color::FromARGB(halfAlpha, 0, 0, 0); + EXPECT_EQ(ColorInverter::DefaultInverter(full.GetValue()), invertColor.GetValue()); +} } // namespace OHOS::Ace -- Gitee