From 3211547a0648a9f7ffdafabd7ea5cfc16bcb97c5 Mon Sep 17 00:00:00 2001 From: hw_wyx Date: Mon, 11 Aug 2025 14:47:14 +0800 Subject: [PATCH] refineSvgCache Signed-off-by: hw_wyx Change-Id: Id7dc41716528644dfdfdd620de402a8843bd2d43 --- .../image_provider/image_loading_context.cpp | 8 ++--- .../image_provider/image_loading_context.h | 3 +- .../image_provider/image_provider.cpp | 15 ++++++---- .../image_provider/image_provider.h | 5 ++-- .../pattern/image/image_pattern.cpp | 6 ++-- .../pattern/image/image_pattern.h | 1 + .../mock_image_loading_context.cpp | 7 +++-- .../pattern/image/image_pattern_test_ng.cpp | 30 +++++++++++++++++++ 8 files changed, 58 insertions(+), 17 deletions(-) diff --git a/frameworks/core/components_ng/image_provider/image_loading_context.cpp b/frameworks/core/components_ng/image_provider/image_loading_context.cpp index 77046d8b3d7..86993fc73e3 100644 --- a/frameworks/core/components_ng/image_provider/image_loading_context.cpp +++ b/frameworks/core/components_ng/image_provider/image_loading_context.cpp @@ -30,10 +30,10 @@ namespace OHOS::Ace::NG { -ImageLoadingContext::ImageLoadingContext( - const ImageSourceInfo& src, LoadNotifier&& loadNotifier, bool syncLoad, const ImageDfxConfig& imageDfxConfig) +ImageLoadingContext::ImageLoadingContext(const ImageSourceInfo& src, LoadNotifier&& loadNotifier, bool syncLoad, + bool isSceneBoardWindow, const ImageDfxConfig& imageDfxConfig) : src_(src), notifiers_(std::move(loadNotifier)), containerId_(Container::CurrentId()), syncLoad_(syncLoad), - imageDfxConfig_(imageDfxConfig) + isSceneBoardWindow_(isSceneBoardWindow), imageDfxConfig_(imageDfxConfig) { stateManager_ = MakeRefPtr(WeakClaim(this)); src_.SetImageDfxConfig(imageDfxConfig_); @@ -139,7 +139,7 @@ void ImageLoadingContext::OnDataLoading() } src_.SetContainerId(containerId_); src_.SetImageDfxConfig(GetImageDfxConfig()); - ImageProvider::CreateImageObject(src_, WeakClaim(this), syncLoad_); + ImageProvider::CreateImageObject(src_, WeakClaim(this), syncLoad_, isSceneBoardWindow_); } bool ImageLoadingContext::Downloadable() diff --git a/frameworks/core/components_ng/image_provider/image_loading_context.h b/frameworks/core/components_ng/image_provider/image_loading_context.h index 15ecb86a973..2ec86bc4a46 100644 --- a/frameworks/core/components_ng/image_provider/image_loading_context.h +++ b/frameworks/core/components_ng/image_provider/image_loading_context.h @@ -39,7 +39,7 @@ class ACE_FORCE_EXPORT ImageLoadingContext : public AceType { public: // Create an empty ImageObject and initialize state machine when the constructor is called ImageLoadingContext(const ImageSourceInfo& src, LoadNotifier&& loadNotifier, bool syncLoad = false, - const ImageDfxConfig& imageDfxConfig = {}); + bool isSceneBoardWindow = false, const ImageDfxConfig& imageDfxConfig = {}); ~ImageLoadingContext() override; // return true if calling MakeCanvasImage is necessary @@ -209,6 +209,7 @@ private: PixelFormat photoDecodeFormat_ = PixelFormat::UNKNOWN; bool autoResize_ = true; bool syncLoad_ = false; + bool isSceneBoardWindow_ = false; AIImageQuality imageQuality_ = AIImageQuality::NONE; diff --git a/frameworks/core/components_ng/image_provider/image_provider.cpp b/frameworks/core/components_ng/image_provider/image_provider.cpp index cb8167669a5..fd0b9cf55ba 100644 --- a/frameworks/core/components_ng/image_provider/image_provider.cpp +++ b/frameworks/core/components_ng/image_provider/image_provider.cpp @@ -167,7 +167,7 @@ void ImageProvider::SuccessCallback( } } -void ImageProvider::CreateImageObjHelper(const ImageSourceInfo& src, bool sync) +void ImageProvider::CreateImageObjHelper(const ImageSourceInfo& src, bool sync, bool isSceneBoardWindow) { const ImageDfxConfig& imageDfxConfig = src.GetImageDfxConfig(); ACE_SCOPED_TRACE("CreateImageObj %s", imageDfxConfig.ToStringWithSrc().c_str()); @@ -202,7 +202,10 @@ void ImageProvider::CreateImageObjHelper(const ImageSourceInfo& src, bool sync) // ImageObject cache is only for saving image size info, clear data to save memory cloneImageObj->ClearData(); - CacheImageObject(cloneImageObj); + // Only skip caching when the image is SVG and it's SceneBorder + if (!src.IsSvg() || !isSceneBoardWindow) { + CacheImageObject(cloneImageObj); + } auto ctxs = EndTask(src.GetTaskKey()); @@ -393,7 +396,8 @@ void ImageProvider::DownLoadImage(const UriDownLoadConfig& downLoadConfig) NetworkImageLoader::DownloadImage(std::move(downloadCallback), downLoadConfig.src.GetSrc(), downLoadConfig.sync); } -void ImageProvider::CreateImageObject(const ImageSourceInfo& src, const WeakPtr& ctxWp, bool sync) +void ImageProvider::CreateImageObject( + const ImageSourceInfo& src, const WeakPtr& ctxWp, bool sync, bool isSceneBoardWindow) { if (src.GetSrcType() == SrcType::NETWORK && SystemProperties::GetDownloadByNetworkEnabled()) { auto ctx = ctxWp.Upgrade(); @@ -426,7 +430,7 @@ void ImageProvider::CreateImageObject(const ImageSourceInfo& src, const WeakPtr< return; } if (sync) { - CreateImageObjHelper(src, true); + CreateImageObjHelper(src, true, isSceneBoardWindow); } else { if (!taskMtx_.try_lock_for(std::chrono::milliseconds(MAX_WAITING_TIME_FOR_TASKS))) { TAG_LOGW(AceLogTag::ACE_IMAGE, "Lock timeout in createObj."); @@ -436,7 +440,8 @@ void ImageProvider::CreateImageObject(const ImageSourceInfo& src, const WeakPtr< std::scoped_lock lock(std::adopt_lock, taskMtx_); // wrap with [CancelableCallback] and record in [tasks_] map CancelableCallback task; - task.Reset([src] { ImageProvider::CreateImageObjHelper(src); }); + task.Reset( + [src, isSceneBoardWindow] { ImageProvider::CreateImageObjHelper(src, false, isSceneBoardWindow); }); tasks_[src.GetTaskKey()].bgTask_ = task; auto ctx = ctxWp.Upgrade(); CHECK_NULL_VOID(ctx); diff --git a/frameworks/core/components_ng/image_provider/image_provider.h b/frameworks/core/components_ng/image_provider/image_provider.h index 9f1b2a62ede..68446c13bd7 100644 --- a/frameworks/core/components_ng/image_provider/image_provider.h +++ b/frameworks/core/components_ng/image_provider/image_provider.h @@ -86,7 +86,8 @@ public: * @param ctxWp ImageLoadingContext that initiates the task, to be stored in the map * @param sync if true, run task synchronously */ - static void CreateImageObject(const ImageSourceInfo& src, const WeakPtr& ctxWp, bool sync); + static void CreateImageObject( + const ImageSourceInfo& src, const WeakPtr& ctxWp, bool sync, bool isSceneBoardWindow); /** Decode image data and make CanvasImage from ImageObject. * @@ -138,7 +139,7 @@ private: static RefPtr QueryThumbnailCache(const ImageSourceInfo& src); // helper function to create image object from ImageSourceInfo - static void CreateImageObjHelper(const ImageSourceInfo& src, bool sync = false); + static void CreateImageObjHelper(const ImageSourceInfo& src, bool sync = false, bool isSceneBoardWindow = false); static void DownLoadSuccessCallback( const RefPtr& imageObj, const std::string& key, bool sync = false, int32_t containerId = 0); diff --git a/frameworks/core/components_ng/pattern/image/image_pattern.cpp b/frameworks/core/components_ng/pattern/image/image_pattern.cpp index 60e50c66f88..add6ba9833c 100644 --- a/frameworks/core/components_ng/pattern/image/image_pattern.cpp +++ b/frameworks/core/components_ng/pattern/image/image_pattern.cpp @@ -897,7 +897,8 @@ void ImagePattern::LoadImage(const ImageSourceInfo& src, bool needLayout) imageDfxConfig_ = CreateImageDfxConfig(src); - loadingCtx_ = AceType::MakeRefPtr(src, std::move(loadNotifier), syncLoad_, imageDfxConfig_); + loadingCtx_ = AceType::MakeRefPtr( + src, std::move(loadNotifier), syncLoad_, isSceneBoardWindow_, imageDfxConfig_); if (SystemProperties::GetDebugEnabled()) { TAG_LOGI(AceLogTag::ACE_IMAGE, "load image, %{private}s", imageDfxConfig_.ToStringWithSrc().c_str()); @@ -924,7 +925,7 @@ void ImagePattern::LoadAltImage(const ImageSourceInfo& altImageSourceInfo) altImageDfxConfig_ = CreateImageDfxConfig(altImageSourceInfo); altLoadingCtx_ = AceType::MakeRefPtr( - altImageSourceInfo, std::move(altLoadNotifier), false, altImageDfxConfig_); + altImageSourceInfo, std::move(altLoadNotifier), false, isSceneBoardWindow_, altImageDfxConfig_); altLoadingCtx_->LoadImageData(); } } @@ -2323,6 +2324,7 @@ void ImagePattern::InitDefaultValue() // If the default value is set to false, the SceneBoard memory increases. // Therefore the default value is different in the SceneBoard. if (container && container->IsSceneBoardWindow()) { + isSceneBoardWindow_ = true; autoResizeDefault_ = true; interpolationDefault_ = ImageInterpolation::NONE; } diff --git a/frameworks/core/components_ng/pattern/image/image_pattern.h b/frameworks/core/components_ng/pattern/image/image_pattern.h index eb423efb025..3f6da777bed 100644 --- a/frameworks/core/components_ng/pattern/image/image_pattern.h +++ b/frameworks/core/components_ng/pattern/image/image_pattern.h @@ -577,6 +577,7 @@ private: bool isImageReloadNeeded_ = false; bool isEnableAnalyzer_ = false; bool autoResizeDefault_ = true; + bool isSceneBoardWindow_ = false; bool isSensitive_ = false; ImageInterpolation interpolationDefault_ = ImageInterpolation::NONE; ImageRotateOrientation userOrientation_ = ImageRotateOrientation::UP; diff --git a/test/mock/core/image_provider/mock_image_loading_context.cpp b/test/mock/core/image_provider/mock_image_loading_context.cpp index de827134326..76c17401676 100644 --- a/test/mock/core/image_provider/mock_image_loading_context.cpp +++ b/test/mock/core/image_provider/mock_image_loading_context.cpp @@ -20,9 +20,10 @@ #include "core/components_ng/pattern/image/image_dfx.h" namespace OHOS::Ace::NG { -ImageLoadingContext::ImageLoadingContext( - const ImageSourceInfo& src, LoadNotifier&& loadNotifier, bool syncLoad, const ImageDfxConfig& imageDfxConfig) - : src_(src), notifiers_(loadNotifier), syncLoad_(syncLoad), imageDfxConfig_(imageDfxConfig) +ImageLoadingContext::ImageLoadingContext(const ImageSourceInfo& src, LoadNotifier&& loadNotifier, bool syncLoad, + bool isSceneBoardWindow, const ImageDfxConfig& imageDfxConfig) + : src_(src), notifiers_(std::move(loadNotifier)), syncLoad_(syncLoad), isSceneBoardWindow_(isSceneBoardWindow), + imageDfxConfig_(imageDfxConfig) {} ImageLoadingContext::~ImageLoadingContext() = default; diff --git a/test/unittest/core/pattern/image/image_pattern_test_ng.cpp b/test/unittest/core/pattern/image/image_pattern_test_ng.cpp index 0bf5ad32f17..3ce05f8c736 100644 --- a/test/unittest/core/pattern/image/image_pattern_test_ng.cpp +++ b/test/unittest/core/pattern/image/image_pattern_test_ng.cpp @@ -2829,4 +2829,34 @@ HWTEST_F(ImagePatternTestNg, ImageCreateTest001, TestSize.Level0) imagePattern->OnConfigurationUpdate(); EXPECT_FALSE(imagePattern->isFullyInitializedFromTheme_); } + +/** + * @tc.name: TestImageLoadingCtxCreate + * @tc.desc: Test Create imageLoadingCtx for ImagePattern. + * @tc.type: FUNC + */ +HWTEST_F(ImagePatternTestNg, TestImageLoadingCtxCreate, TestSize.Level0) +{ + /** + * @tc.steps: step1. create Image frameNode. + */ + auto loadingCtx1 = AceType::MakeRefPtr( + ImageSourceInfo(IMAGE_SRC_URL, IMAGE_SOURCEINFO_WIDTH, IMAGE_SOURCEINFO_HEIGHT), + LoadNotifier(nullptr, nullptr, nullptr), false, true); + ASSERT_NE(loadingCtx1, nullptr); + /** + * @tc.steps: step2. check isSceneBoardWindow_ value. + * @tc.expected: isSceneBoardWindow_ is true. + */ + EXPECT_TRUE(loadingCtx1->isSceneBoardWindow_); + auto loadingCtx2 = AceType::MakeRefPtr( + ImageSourceInfo(IMAGE_SRC_URL, IMAGE_SOURCEINFO_WIDTH, IMAGE_SOURCEINFO_HEIGHT), + LoadNotifier(nullptr, nullptr, nullptr), false, false); + ASSERT_NE(loadingCtx2, nullptr); + /** + * @tc.steps: step2. check isSceneBoardWindow_ value. + * @tc.expected: isSceneBoardWindow_ is false. + */ + EXPECT_FALSE(loadingCtx2->isSceneBoardWindow_); +} } // namespace OHOS::Ace::NG \ No newline at end of file -- Gitee