From 6d454759c74f19591f9e0d32c8cca35ff861f919 Mon Sep 17 00:00:00 2001 From: WangJiazhen Date: Mon, 20 May 2024 22:37:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DpixelMap=E7=BB=98=E5=88=B6?= =?UTF-8?q?=E5=AE=BD=E9=AB=98=E4=B8=8D=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: WangJiazhen --- .../custom_paint/canvas_paint_method.cpp | 27 ++++++++++++++++--- .../custom_paint/canvas_paint_method.h | 2 ++ .../custom_paint_paint_method.cpp | 12 ++++++--- .../custom_paint/custom_paint_paint_method.h | 2 ++ .../offscreen_canvas_paint_method.cpp | 15 +++++++++++ .../offscreen_canvas_paint_method.h | 2 ++ 6 files changed, 52 insertions(+), 8 deletions(-) diff --git a/frameworks/core/components_ng/pattern/custom_paint/canvas_paint_method.cpp b/frameworks/core/components_ng/pattern/custom_paint/canvas_paint_method.cpp index ca35a4cb85c..3ec5665a49b 100644 --- a/frameworks/core/components_ng/pattern/custom_paint/canvas_paint_method.cpp +++ b/frameworks/core/components_ng/pattern/custom_paint/canvas_paint_method.cpp @@ -193,7 +193,9 @@ void CanvasPaintMethod::DrawPixelMap(RefPtr pixelMap, const Ace::Canva InitPaintBlend(compositeOperationpBrush); RSRect rec = RSRect(0, 0, lastLayoutSize_.Width(), lastLayoutSize_.Height()); RSSaveLayerOps layerOps(&rec, &compositeOperationpBrush); - + if (state_.globalState.GetType() != CompositeOperation::SOURCE_OVER) { + rsCanvas_->SaveLayer(layerOps); + } if (state_.globalState.HasGlobalAlpha()) { imageBrush_.SetAlphaF(state_.globalState.GetAlpha()); } @@ -205,13 +207,13 @@ void CanvasPaintMethod::DrawPixelMap(RefPtr pixelMap, const Ace::Canva canvasImage.dx + canvasImage.dWidth, canvasImage.dy + canvasImage.dHeight); RSPath path; path.AddRect(rec); - PaintShadow(path, state_.shadow, rsCanvas, &imageBrush_, nullptr, &layerOps); + PaintImageShadow(path, state_.shadow, rsCanvas, &imageBrush_, nullptr, + (state_.globalState.GetType() != CompositeOperation::SOURCE_OVER) ? &layerOps : nullptr); } auto recordingCanvas = static_cast(rsCanvas); CHECK_NULL_VOID(recordingCanvas); const std::shared_ptr tempPixelMap = pixelMap->GetPixelMapSharedPtr(); CHECK_NULL_VOID(tempPixelMap); - rsCanvas_->SaveLayer(layerOps); switch (canvasImage.flag) { case 0: { RSRect srcRect = RSRect(0, 0, tempPixelMap->GetWidth(), tempPixelMap->GetHeight()); @@ -245,7 +247,9 @@ void CanvasPaintMethod::DrawPixelMap(RefPtr pixelMap, const Ace::Canva default: break; } - rsCanvas_->Restore(); + if (state_.globalState.GetType() != CompositeOperation::SOURCE_OVER) { + rsCanvas_->Restore(); + } #endif } @@ -738,6 +742,21 @@ void CanvasPaintMethod::PaintShadow(const RSPath& path, const Shadow& shadow, RS #endif } +void CanvasPaintMethod::PaintImageShadow(const RSPath& path, const Shadow& shadow, RSCanvas* canvas, + const RSBrush* brush, const RSPen* pen, RSSaveLayerOps* slo) +{ +#ifndef ACE_UNITTEST + CHECK_NULL_VOID(rsCanvas_); + if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TWELVE) && slo != nullptr) { + RosenDecorationPainter::PaintShadow(path, shadow, canvas, brush, pen); + rsCanvas_->Restore(); + rsCanvas_->SaveLayer(*slo); + } else { + RosenDecorationPainter::PaintShadow(path, shadow, canvas, brush, pen); + } +#endif +} + void CanvasPaintMethod::Path2DRect(const PathArgs& args) { double left = args.para1; diff --git a/frameworks/core/components_ng/pattern/custom_paint/canvas_paint_method.h b/frameworks/core/components_ng/pattern/custom_paint/canvas_paint_method.h index 835b1edf058..7e7a7e762f6 100644 --- a/frameworks/core/components_ng/pattern/custom_paint/canvas_paint_method.h +++ b/frameworks/core/components_ng/pattern/custom_paint/canvas_paint_method.h @@ -100,6 +100,8 @@ private: void UpdateTextStyleForeground(bool isStroke, RSTextStyle& txtStyle, bool hasShadow); void PaintShadow(const RSPath& path, const Shadow& shadow, RSCanvas* canvas, const RSBrush* brush = nullptr, const RSPen* pen = nullptr, RSSaveLayerOps* slo = nullptr) override; + void PaintImageShadow(const RSPath& path, const Shadow& shadow, RSCanvas* canvas, const RSBrush* brush = nullptr, + const RSPen* pen = nullptr, RSSaveLayerOps* slo = nullptr) override; void Path2DRect(const PathArgs& args) override; RSCanvas* GetRawPtrOfRSCanvas() override { diff --git a/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.cpp b/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.cpp index 3a9f0147d9d..081122002e3 100644 --- a/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.cpp +++ b/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.cpp @@ -568,6 +568,9 @@ void CustomPaintPaintMethod::DrawImageInternal( InitPaintBlend(compositeOperationpBrush); auto rect = RSRect(0, 0, lastLayoutSize_.Width(), lastLayoutSize_.Height()); RSSaveLayerOps slo(&rect, &compositeOperationpBrush); + if (state_.globalState.GetType() != CompositeOperation::SOURCE_OVER) { + rsCanvas_->SaveLayer(slo); + } InitImagePaint(nullptr, &imageBrush_, sampleOptions_); if (state_.globalState.HasGlobalAlpha()) { imageBrush_.SetAlphaF(state_.globalState.GetAlpha()); @@ -577,10 +580,9 @@ void CustomPaintPaintMethod::DrawImageInternal( canvasImage.dx, canvasImage.dy, canvasImage.dWidth + canvasImage.dx, canvasImage.dHeight + canvasImage.dy); RSPath path; path.AddRect(rsRect); - PaintShadow(path, state_.shadow, rsCanvas, &imageBrush_, nullptr, &slo); + PaintImageShadow(path, state_.shadow, rsCanvas, &imageBrush_, nullptr, + (state_.globalState.GetType() != CompositeOperation::SOURCE_OVER) ? &slo : nullptr); } - - rsCanvas_->SaveLayer(slo); rsCanvas->AttachBrush(imageBrush_); switch (canvasImage.flag) { case DrawImageType::THREE_PARAMS: @@ -605,7 +607,9 @@ void CustomPaintPaintMethod::DrawImageInternal( break; } rsCanvas->DetachBrush(); - rsCanvas_->Restore(); + if (state_.globalState.GetType() != CompositeOperation::SOURCE_OVER) { + rsCanvas_->Restore(); + } } void CustomPaintPaintMethod::DrawImage(const Ace::CanvasImage& canvasImage, double width, double height) diff --git a/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.h b/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.h index 9176a5856cc..588c3c75f5d 100644 --- a/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.h +++ b/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.h @@ -363,6 +363,8 @@ protected: virtual RSCanvas* GetRawPtrOfRSCanvas() = 0; virtual void PaintShadow(const RSPath& path, const Shadow& shadow, RSCanvas* canvas, const RSBrush* brush = nullptr, const RSPen* pen = nullptr, RSSaveLayerOps* slo = nullptr) = 0; + virtual void PaintImageShadow(const RSPath& path, const Shadow& shadow, RSCanvas* canvas, + const RSBrush* brush = nullptr, const RSPen* pen = nullptr, RSSaveLayerOps* slo = nullptr) = 0; double GetAlignOffset(TextAlign align, std::unique_ptr& paragraph); RSTextAlign GetEffectiveAlign(RSTextAlign align, RSTextDirection direction) const; #ifndef ACE_UNITTEST diff --git a/frameworks/core/components_ng/pattern/custom_paint/offscreen_canvas_paint_method.cpp b/frameworks/core/components_ng/pattern/custom_paint/offscreen_canvas_paint_method.cpp index 613decb3fc6..ba8778a0569 100644 --- a/frameworks/core/components_ng/pattern/custom_paint/offscreen_canvas_paint_method.cpp +++ b/frameworks/core/components_ng/pattern/custom_paint/offscreen_canvas_paint_method.cpp @@ -530,6 +530,21 @@ void OffscreenCanvasPaintMethod::PaintShadow(const RSPath& path, const Shadow& s #endif } +void OffscreenCanvasPaintMethod::PaintImageShadow(const RSPath& path, const Shadow& shadow, RSCanvas* canvas, + const RSBrush* brush, const RSPen* pen, RSSaveLayerOps* slo) +{ +#ifndef ACE_UNITTEST + CHECK_NULL_VOID(rsCanvas_); + if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TWELVE) && slo != nullptr) { + RosenDecorationPainter::PaintShadow(path, shadow, canvas, brush, pen); + rsCanvas_->Restore(); + rsCanvas_->SaveLayer(*slo); + } else { + RosenDecorationPainter::PaintShadow(path, shadow, canvas, brush, pen); + } +#endif +} + void OffscreenCanvasPaintMethod::Path2DRect(const PathArgs& args) { double left = args.para1; diff --git a/frameworks/core/components_ng/pattern/custom_paint/offscreen_canvas_paint_method.h b/frameworks/core/components_ng/pattern/custom_paint/offscreen_canvas_paint_method.h index 0d7eeea5788..121111e5dc0 100644 --- a/frameworks/core/components_ng/pattern/custom_paint/offscreen_canvas_paint_method.h +++ b/frameworks/core/components_ng/pattern/custom_paint/offscreen_canvas_paint_method.h @@ -70,6 +70,8 @@ private: void UpdateTextStyleForeground(bool isStroke, RSTextStyle& txtStyle, bool hasShadow); void PaintShadow(const RSPath& path, const Shadow& shadow, RSCanvas* canvas, const RSBrush* brush = nullptr, const RSPen* pen = nullptr, RSSaveLayerOps* slo = nullptr) override; + void PaintImageShadow(const RSPath& path, const Shadow& shadow, RSCanvas* canvas, + const RSBrush* brush = nullptr, const RSPen* pen = nullptr, RSSaveLayerOps* slo = nullptr) override; void Path2DRect(const PathArgs& args) override; RSCanvas* GetRawPtrOfRSCanvas() override { -- Gitee