!14116 修复节点组模糊透明问题

Merge pull request !14116 from jason/master
This commit is contained in:
openharmony_ci 2024-08-22 04:53:12 +00:00 committed by Gitee
commit e621ea23e2
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
3 changed files with 8 additions and 2 deletions

View File

@ -35,6 +35,7 @@ namespace OHOS::Rosen::DrawableV2 {
RSRenderNodeDrawable::Registrar RSRenderNodeDrawable::instance_;
thread_local bool RSRenderNodeDrawable::drawBlurForCache_ = false;
thread_local bool RSRenderNodeDrawable::isOpDropped_ = true;
thread_local bool RSRenderNodeDrawable::isNeedOffScreenCache_ = false;
namespace {
constexpr int32_t DRAWING_CACHE_MAX_UPDATE_TIME = 3;
@ -170,10 +171,13 @@ void RSRenderNodeDrawable::GenerateCacheIfNeed(Drawing::Canvas& canvas, RSRender
auto canvasType = curCanvas->GetCacheType();
// set canvas type as OFFSCREEN to not draw filter/shadow/filter
curCanvas->SetCacheType(RSPaintFilterCanvas::CacheType::OFFSCREEN);
bool isNeedOffScreenCacheTemp = isNeedOffScreenCache_;
isNeedOffScreenCache_ = true;
RS_TRACE_NAME_FMT("UpdateCacheSurface with filter id:%" PRIu64 "", nodeId_);
RSRenderNodeDrawableAdapter* root = curDrawingCacheRoot_;
curDrawingCacheRoot_ = this;
UpdateCacheSurface(canvas, params);
isNeedOffScreenCache_ = isNeedOffScreenCacheTemp;
curCanvas->SetCacheType(canvasType);
curDrawingCacheRoot_ = root;
}
@ -229,7 +233,7 @@ void RSRenderNodeDrawable::CheckCacheTypeAndDraw(Drawing::Canvas& canvas, const
}
// RSPaintFilterCanvas::CacheType::OFFSCREEN case
if (curCanvas->GetCacheType() == RSPaintFilterCanvas::CacheType::OFFSCREEN) {
if (isNeedOffScreenCache_) {
if (HasFilterOrEffect() && params.GetForegroundFilterCache() == nullptr) {
// clip hole for filter/shadow
DrawBackgroundWithoutFilterAndEffect(canvas, params);

View File

@ -206,6 +206,7 @@ private:
return isOpincMarkCached_;
}
bool IsOpincNodeInScreenRect(RSRenderParams& params);
static thread_local bool isNeedOffScreenCache_;
};
} // namespace DrawableV2
} // namespace OHOS::Rosen

View File

@ -504,9 +504,10 @@ HWTEST_F(RSRenderNodeDrawableTest, CheckCacheTypeAndDrawTest, TestSize.Level1)
drawable->drawCmdIndex_.shadowIndex_ = 1;
drawable->CheckCacheTypeAndDraw(canvas, params);
ASSERT_TRUE(drawable->HasFilterOrEffect());
curCanvas->SetCacheType(RSPaintFilterCanvas::CacheType::OFFSCREEN);
RSRenderNodeDrawable::isNeedOffScreenCache_ = true;
params.foregroundFilterCache_ = std::make_shared<RSFilter>();
drawable->CheckCacheTypeAndDraw(canvas, params);
RSRenderNodeDrawable::isNeedOffScreenCache_ = false;
ASSERT_TRUE(params.GetForegroundFilterCache());
drawable->SetCacheType(DrawableCacheType::NONE);