From 28fc928afd34d9366f6cac7e30da74a01516d506 Mon Sep 17 00:00:00 2001 From: xu Date: Tue, 15 Nov 2022 16:12:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=8B=E7=BC=A9=E6=95=B0=E6=8D=AE=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xu --- .../core/components/image/rosen_render_image.cpp | 6 +++--- .../adapter/flutter_image_provider.cpp | 6 +++++- .../render/adapter/rosen_render_context.cpp | 6 +++--- .../render/adapter/skia_canvas_image.cpp | 13 +++++-------- .../render/adapter/skia_canvas_image.h | 10 ++++++++++ frameworks/core/image/image_source_info.cpp | 11 +++++++++-- frameworks/core/image/image_source_info.h | 3 ++- 7 files changed, 37 insertions(+), 18 deletions(-) diff --git a/frameworks/core/components/image/rosen_render_image.cpp b/frameworks/core/components/image/rosen_render_image.cpp index 73ce404ca2a..75fd5f1f812 100644 --- a/frameworks/core/components/image/rosen_render_image.cpp +++ b/frameworks/core/components/image/rosen_render_image.cpp @@ -775,9 +775,9 @@ void RosenRenderImage::CanvasDrawImageRect( auto recordingCanvas = static_cast(canvas); if (GetAdaptiveFrameRectFlag()) { recordingCanvas->translate(imageRenderPosition_.GetX() * -1, imageRenderPosition_.GetY() * -1); - Rosen::RsImageInfo rsImageInfo(fitNum, repeatNum, radii_, scale_); - recordingCanvas->DrawImageWithParm(image_->image(), image_->compressData(), - image_->compressWidth(), image_->compressHeight(), rsImageInfo, paint); + Rosen::RsImageInfo rsImageInfo(fitNum, repeatNum, radii_, scale_, + 0, image_->compressWidth(), image_->compressHeight()); + recordingCanvas->DrawImageWithParm(image_->image(), image_->compressData(), rsImageInfo, paint); image_->setCompress(nullptr, 0, 0); return; } diff --git a/frameworks/core/components_ng/image_provider/adapter/flutter_image_provider.cpp b/frameworks/core/components_ng/image_provider/adapter/flutter_image_provider.cpp index 0462dc71c13..e6bfb67d007 100644 --- a/frameworks/core/components_ng/image_provider/adapter/flutter_image_provider.cpp +++ b/frameworks/core/components_ng/image_provider/adapter/flutter_image_provider.cpp @@ -251,11 +251,14 @@ void ImageProvider::UploadImageToGPUForRender(const RefPtr& canvasI int32_t dstWidth = static_cast(resizeTarget.Width() + 0.5); int32_t dstHeight = static_cast(resizeTarget.Height() + 0.5); - auto skdata = SkData::MakeWithCopy(data->GetData(), data->GetSize()); + auto skiaImageData = DynamicCast(data); + CHECK_NULL_VOID(skiaImageData); + auto skdata = skiaImageData->GetSkData(); auto stripped = ImageCompressor::StripFileHeader(skdata); LOGI("use astc cache %{public}s %{public}d×%{public}d", key.c_str(), dstWidth, dstHeight); skiaCanvasImage->SetCompressData(stripped, dstWidth, dstHeight); + skiaCanvasImage->ReplaceSkImage({ nullptr, flutterRenderTaskHolder->unrefQueue }); callback(skiaCanvasImage); return; } @@ -294,6 +297,7 @@ void ImageProvider::UploadImageToGPUForRender(const RefPtr& canvasI if (compressData) { // replace skImage of [CanvasImage] with [rasterizedImage] skiaCanvasImage->SetCompressData(compressData, width, height); + skiaCanvasImage->ReplaceSkImage({ nullptr, flutterRenderTaskHolder->unrefQueue }); } else { skiaCanvasImage->ReplaceSkImage({ rasterizedImage, flutterRenderTaskHolder->unrefQueue }); } 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 4bf503b0685..125b2405173 100644 --- a/frameworks/core/components_ng/render/adapter/rosen_render_context.cpp +++ b/frameworks/core/components_ng/render/adapter/rosen_render_context.cpp @@ -284,11 +284,11 @@ void RosenRenderContext::PaintBackground() auto skiaCanvasImage = DynamicCast(bgLoadingCtx_->GetCanvasImage()); CHECK_NULL_VOID(skiaCanvasImage); auto skImage = skiaCanvasImage->GetCanvasImage(); - CHECK_NULL_VOID(skImage); - // use compress data to draw bg image - skiaCanvasImage->SetCompressData(nullptr, 0, 0); auto rosenImage = std::make_shared(); rosenImage->SetImage(skImage); + auto compressData = skiaCanvasImage->GetCompressData(); + rosenImage->SetCompressData(compressData, skiaCanvasImage->GetUniqueID(), + skiaCanvasImage->GetCompressWidth(), skiaCanvasImage->GetCompressHeight()); rosenImage->SetImageRepeat(static_cast(GetBackgroundImageRepeat().value_or(ImageRepeat::NOREPEAT))); rsNode_->SetBgImage(rosenImage); diff --git a/frameworks/core/components_ng/render/adapter/skia_canvas_image.cpp b/frameworks/core/components_ng/render/adapter/skia_canvas_image.cpp index ade97be98b5..7e8010ce85b 100644 --- a/frameworks/core/components_ng/render/adapter/skia_canvas_image.cpp +++ b/frameworks/core/components_ng/render/adapter/skia_canvas_image.cpp @@ -181,16 +181,13 @@ void SkiaCanvasImage::DrawToRSCanvas(RSCanvas& canvas, const RSRect& srcRect, co (int)(imagePaintConfig_->imageFit_), (int)(imagePaintConfig_->imageRepeat_), radii, - 1.0 + 1.0, + GetUniqueID(), + GetCompressWidth(), + GetCompressHeight() ); - int w = GetCompressWidth(); - int h = GetCompressHeight(); auto data = GetCompressData(); - recordingCanvas->DrawImageWithParm(image, std::move(data), w, h, rsImageInfo, paint); - if (data) { - // should only clear image after sending draw command. - ReplaceSkImage({ nullptr, nullptr }); - } + recordingCanvas->DrawImageWithParm(image, std::move(data), rsImageInfo, paint); #else canvas.DrawImageRect(rsImage, srcRect, dstRect, options); #endif diff --git a/frameworks/core/components_ng/render/adapter/skia_canvas_image.h b/frameworks/core/components_ng/render/adapter/skia_canvas_image.h index 63a2e017ad7..e08f3b6a168 100644 --- a/frameworks/core/components_ng/render/adapter/skia_canvas_image.h +++ b/frameworks/core/components_ng/render/adapter/skia_canvas_image.h @@ -61,6 +61,8 @@ public: #ifndef NG_BUILD if (image_) { image_->setCompress(data, w, h); + auto skimage = image_->image(); + uniqueId_ = skimage ? skimage->uniqueID() : 0; } #endif } @@ -79,6 +81,13 @@ public: if (image_) { return image_->compressHeight(); } +#endif + return 0; + } + virtual uint32_t GetUniqueID() const + { +#ifndef NG_BUILD + return uniqueId_; #endif return 0; } @@ -96,6 +105,7 @@ public: private: // TODO: should not deps on flutter. #ifndef NG_BUILD + uint32_t uniqueId_; fml::RefPtr image_; #endif }; diff --git a/frameworks/core/image/image_source_info.cpp b/frameworks/core/image/image_source_info.cpp index 573e723fed1..abf6f582edf 100644 --- a/frameworks/core/image/image_source_info.cpp +++ b/frameworks/core/image/image_source_info.cpp @@ -128,8 +128,7 @@ ImageSourceInfo::ImageSourceInfo(const std::string& imageSrc, Dimension width, D if (count > 1) { LOGW("multi image source set, only one will be load."); } - auto name = src_ + AceApplicationInfo::GetInstance().GetAbilityName(); - cacheKey_ = std::to_string(std::hash {}(name)) + std::to_string(static_cast(resourceId_)); + GenerateCacheKey(); } SrcType ImageSourceInfo::ResolveSrcType() const @@ -146,6 +145,12 @@ SrcType ImageSourceInfo::ResolveSrcType() const return SrcType::UNSUPPORTED; } +void ImageSourceInfo::GenerateCacheKey() +{ + auto name = src_ + AceApplicationInfo::GetInstance().GetAbilityName(); + cacheKey_ = std::to_string(std::hash {}(name)) + std::to_string(static_cast(resourceId_)); +} + void ImageSourceInfo::SetFillColor(const Color& color) { fillColor_.emplace(color.GetValue()); @@ -175,6 +180,7 @@ void ImageSourceInfo::SetSrc(const std::string& src, std::optional fillCo isSvg_ = IsSVGSource(src_, resourceId_); fillColor_ = fillColor; pixmap_ = nullptr; + GenerateCacheKey(); } const std::string& ImageSourceInfo::GetSrc() const @@ -190,6 +196,7 @@ void ImageSourceInfo::SetResourceId(InternalResource::ResourceId id, std::option isSvg_ = IsSVGSource(src_, resourceId_); fillColor_ = fillColor; pixmap_ = nullptr; + GenerateCacheKey(); } InternalResource::ResourceId ImageSourceInfo::GetResourceId() const diff --git a/frameworks/core/image/image_source_info.h b/frameworks/core/image/image_source_info.h index 75c3a3e14c1..cfb7270fb01 100644 --- a/frameworks/core/image/image_source_info.h +++ b/frameworks/core/image/image_source_info.h @@ -74,6 +74,7 @@ public: private: SrcType ResolveSrcType() const; + void GenerateCacheKey(); std::string src_; std::string cacheKey_; @@ -93,4 +94,4 @@ private: } // namespace OHOS::Ace -#endif // FOUNDATION_ACE_FRAMEWORKS_CORE_IMAGE_ACE_IMAGE_SOURCE_INFO_H \ No newline at end of file +#endif // FOUNDATION_ACE_FRAMEWORKS_CORE_IMAGE_ACE_IMAGE_SOURCE_INFO_H -- Gitee