diff --git a/include/ge_color_gradient_shader_filter.h b/include/ge_color_gradient_shader_filter.h index 6d36124f79cfbd353dd7f3102b0528510d5a7a78..3772c1c15e1a5ed7295c403ff4e14242f640befc 100644 --- a/include/ge_color_gradient_shader_filter.h +++ b/include/ge_color_gradient_shader_filter.h @@ -42,6 +42,7 @@ public: std::string GetDescription(); private: + std::shared_ptr PreProcessColorGradientBuilder(float geoWidth, float geoHeight); std::vector colors_; std::vector positions_; std::vector strengths_; diff --git a/include/ge_shader_filter.h b/include/ge_shader_filter.h index 83179bc6c5a1426e9d0871d8dc168f3408c5970c..1bb3914e40a15468ccac1071ef893f17a30c1a43 100644 --- a/include/ge_shader_filter.h +++ b/include/ge_shader_filter.h @@ -18,6 +18,7 @@ #include "draw/canvas.h" #include "image/image.h" +#include "ge_shader_filter_params.h" namespace OHOS { namespace Rosen { @@ -35,8 +36,14 @@ public: return hash_; } + void SetShaderFilterCanvasinfo(const Drawing::CanvasInfo& canvasInfo) + { + canvasInfo_ = canvasInfo; + } + protected: uint32_t hash_ = 0; + Drawing::CanvasInfo canvasInfo_; }; } // namespace Rosen } // namespace OHOS diff --git a/include/ge_shader_filter_params.h b/include/ge_shader_filter_params.h index 2585883c30a3cc5d301ce9edc7ad5dee7cb22c55..dfb82248375198bf502fd94dbd49aeec06958897 100644 --- a/include/ge_shader_filter_params.h +++ b/include/ge_shader_filter_params.h @@ -28,6 +28,14 @@ namespace OHOS { namespace Rosen { namespace Drawing { +struct CanvasInfo { + float geoWidth_ = 0.0f; + float geoHeight_ = 0.0f; + float tranX_ = 0.0f; + float tranY_ = 0.0f; + Drawing::Matrix mat_; +}; + constexpr char GE_FILTER_AI_BAR[] = "AIBAR"; constexpr char GE_FILTER_AI_BAR_LOW[] = "AIBAR_LOW"; constexpr char GE_FILTER_AI_BAR_HIGH[] = "AIBAR_HIGH"; diff --git a/include/ge_visual_effect.h b/include/ge_visual_effect.h index 514e836ebcfb2aca21faeb2b89764ae03d1172b1..d1bdd59097f3c18e5fea8f6f2637344efd05c7ae 100644 --- a/include/ge_visual_effect.h +++ b/include/ge_visual_effect.h @@ -39,7 +39,8 @@ class GEVisualEffectImpl; class GE_EXPORT GEVisualEffect { public: - GEVisualEffect(const std::string& name, DrawingPaintType type = DrawingPaintType::BRUSH); + GEVisualEffect(const std::string& name, DrawingPaintType type = DrawingPaintType::BRUSH, + const std::optional& canvasInfo = std::nullopt); ~GEVisualEffect(); void SetParam(const std::string& tag, int32_t param); @@ -73,10 +74,16 @@ public: return visualEffectImpl_; } + const Drawing::CanvasInfo GetCanvasInfo() const + { + return canvasInfo_; + } + private: std::string visualEffectName_; DrawingPaintType type_; std::shared_ptr visualEffectImpl_; + Drawing::CanvasInfo canvasInfo_; }; } // namespace Drawing diff --git a/src/ge_color_gradient_shader_filter.cpp b/src/ge_color_gradient_shader_filter.cpp index aeae007c1c4c36ee1a8404bf47ca0ed6ca87d95d..e291a9947a9fd94787281d5c2acf6669530c742b 100644 --- a/src/ge_color_gradient_shader_filter.cpp +++ b/src/ge_color_gradient_shader_filter.cpp @@ -51,41 +51,30 @@ std::shared_ptr GEColorGradientShaderFilter::ProcessImage(Drawin float strength[ARRAY_SIZE] = {0.0}; // 0.0 default if (!CheckInParams(color, position, strength, ARRAY_SIZE)) { return image; } - Drawing::Matrix matrix; + Drawing::Matrix matrix = canvasInfo_.mat_; + matrix.PostTranslate(-canvasInfo_.tranX_, -canvasInfo_.tranY_); + Drawing::Matrix invertMatrix; + matrix.Invert(invertMatrix); auto srcImageShader = Drawing::ShaderEffect::CreateImageShader(*image, Drawing::TileMode::CLAMP, - Drawing::TileMode::CLAMP, Drawing::SamplingOptions(Drawing::FilterMode::LINEAR), matrix); + Drawing::TileMode::CLAMP, Drawing::SamplingOptions(Drawing::FilterMode::LINEAR), invertMatrix); if (srcImageShader == nullptr) { LOGE("GEColorGradientShaderFilter::ProcessImage srcImageShader is null"); return image; } - std::shared_ptr builder = nullptr; - if (mask_) { - builder = MakeMaskColorGradientBuilder(); - if (builder == nullptr) { - LOGE("GEColorGradientShaderFilter::ProcessImage mask builder error\n"); - return image; - } - auto maskImageShader = mask_->GenerateDrawingShader(image->GetWidth(), image->GetHeight()); - if (!maskImageShader) { - LOGE("GEColorGradientShaderFilter::ProcessImage maskImageShader is null"); - return image; - } - builder->SetChild("maskImageShader", maskImageShader); - } else { - builder = MakeColorGradientBuilder(); - if (builder == nullptr) { - LOGE("GEColorGradientShaderFilter::ProcessImage builder error\n"); - return image; - } + std::shared_ptr builder = + PreProcessColorGradientBuilder(canvasInfo_.geoWidth_, canvasInfo_.geoHeight_); + if (!builder) { + LOGE("GEColorGradientShaderFilter::ProcessImage mask builder error\n"); + return image; } builder->SetChild("srcImageShader", srcImageShader); - builder->SetUniform("iResolution", image->GetWidth(), image->GetHeight()); + builder->SetUniform("iResolution", canvasInfo_.geoWidth_, canvasInfo_.geoHeight_); builder->SetUniform("color", color, ARRAY_SIZE * COLOR_CHANNEL); builder->SetUniform("position", position, ARRAY_SIZE * POSITION_CHANNEL); builder->SetUniform("strength", strength, ARRAY_SIZE); - auto resultImage = builder->MakeImage(canvas.GetGPUContext().get(), nullptr, image->GetImageInfo(), false); + auto resultImage = builder->MakeImage(canvas.GetGPUContext().get(), &(matrix), image->GetImageInfo(), false); if (resultImage == nullptr) { LOGE("GEColorGradientShaderFilter::ProcessImage resultImage is null"); return image; @@ -228,5 +217,31 @@ std::string GEColorGradientShaderFilter::GetDescription() return "GEColorGradientShaderFilter"; } +std::shared_ptr GEColorGradientShaderFilter::PreProcessColorGradientBuilder( + float geoWidth, float geoHeight) +{ + std::shared_ptr builder = nullptr; + if (mask_) { + builder = MakeMaskColorGradientBuilder(); + if (!builder) { + LOGE("GEColorGradientShaderFilter::PreProcessColorGradientBuilder mask builder error\n"); + return nullptr; + } + auto maskImageShader = mask_->GenerateDrawingShader(geoWidth, geoHeight); + if (!maskImageShader) { + LOGE("GEColorGradientShaderFilter::PreProcessColorGradientBuilder maskImageShader is null"); + return nullptr; + } + builder->SetChild("maskImageShader", maskImageShader); + } else { + builder = MakeColorGradientBuilder(); + if (!builder) { + LOGE("GEColorGradientShaderFilter::PreProcessColorGradientBuilder builder error\n"); + return nullptr; + } + } + return builder; +} + } // namespace Rosen } // namespace OHOS \ No newline at end of file diff --git a/src/ge_displacement_distort_shader_filter.cpp b/src/ge_displacement_distort_shader_filter.cpp index fe18cea64e57371f1b7b944a6c2ea7d23edbd063..aa942ae422961e95114bb44e8d51f3fdf6856856 100644 --- a/src/ge_displacement_distort_shader_filter.cpp +++ b/src/ge_displacement_distort_shader_filter.cpp @@ -34,38 +34,42 @@ std::shared_ptr GEDisplacementDistortFilter::ProcessImage(Drawin return nullptr; } - Drawing::Matrix matrix; + Drawing::Matrix matrix = canvasInfo_.mat_; + matrix.PostTranslate(-canvasInfo_.tranX_, -canvasInfo_.tranY_); + Drawing::Matrix invertMatrix; + matrix.Invert(invertMatrix); auto shader = Drawing::ShaderEffect::CreateImageShader(*image, Drawing::TileMode::CLAMP, - Drawing::TileMode::CLAMP, Drawing::SamplingOptions(Drawing::FilterMode::LINEAR), matrix); + Drawing::TileMode::CLAMP, Drawing::SamplingOptions(Drawing::FilterMode::LINEAR), invertMatrix); auto imageInfo = image->GetImageInfo(); float height = imageInfo.GetHeight(); float width = imageInfo.GetWidth(); if (height < 1e-6 || width < 1e-6 || params_.mask_ == nullptr) { - return nullptr; + return image; } - auto maskEffectShader = params_.mask_->GenerateDrawingShaderHasNormal(width, height); + auto maskEffectShader = + params_.mask_->GenerateDrawingShaderHasNormal(canvasInfo_.geoWidth_, canvasInfo_.geoHeight_); if (!maskEffectShader) { LOGE("GEDisplacementDistortFilter::ProcessImage maskEffectShader generate failed"); - return nullptr; + return image; } auto displacementDistortShader = GetDisplacementDistortEffect(); if (!displacementDistortShader) { LOGE("GEDisplacementDistortFilter::ProcessImage g_displacementdistortShader init failed"); - return nullptr; + return image; } Drawing::RuntimeShaderBuilder builder(displacementDistortShader); builder.SetChild("image", shader); builder.SetChild("maskEffect", maskEffectShader); - builder.SetUniform("iResolution", width, height); + builder.SetUniform("iResolution", canvasInfo_.geoWidth_, canvasInfo_.geoHeight_); builder.SetUniform("factor", params_.factor_.first, params_.factor_.second); - auto invertedImage = builder.MakeImage(canvas.GetGPUContext().get(), nullptr, imageInfo, false); + auto invertedImage = builder.MakeImage(canvas.GetGPUContext().get(), &(matrix), imageInfo, false); if (!invertedImage) { LOGE("GEDisplacementDistortFilter::ProcessImage make image failed"); - return nullptr; + return image; } return invertedImage; } diff --git a/src/ge_render.cpp b/src/ge_render.cpp index 1842b18024f1aa8db43fec54f7a2d4909a3cf80d..1d05b9aab760a70f59bbb4672a94b9d852cec7ed 100644 --- a/src/ge_render.cpp +++ b/src/ge_render.cpp @@ -213,6 +213,9 @@ std::vector> GERender::GenerateShaderFilter( default: break; } + if (shaderFilter) { + shaderFilter->SetShaderFilterCanvasinfo(vef->GetCanvasInfo()); + } shaderFilters.push_back(shaderFilter); } return shaderFilters; diff --git a/src/ge_sound_wave_filter.cpp b/src/ge_sound_wave_filter.cpp index 0cc3981727707f8189076f97935c44f00ced99fa..b623f842ea676dafd70da985ce6e709283a76976 100644 --- a/src/ge_sound_wave_filter.cpp +++ b/src/ge_sound_wave_filter.cpp @@ -45,19 +45,22 @@ std::shared_ptr GESoundWaveFilter::ProcessImage(Drawing::Canvas& return nullptr; } - Drawing::Matrix matrix; + Drawing::Matrix matrix = canvasInfo_.mat_; + matrix.PostTranslate(-canvasInfo_.tranX_, -canvasInfo_.tranY_); + Drawing::Matrix invertMatrix; + matrix.Invert(invertMatrix); auto shader = Drawing::ShaderEffect::CreateImageShader(*image, Drawing::TileMode::CLAMP, - Drawing::TileMode::CLAMP, Drawing::SamplingOptions(Drawing::FilterMode::LINEAR), matrix); + Drawing::TileMode::CLAMP, Drawing::SamplingOptions(Drawing::FilterMode::LINEAR), invertMatrix); auto imageInfo = image->GetImageInfo(); float height = imageInfo.GetHeight(); float width = imageInfo.GetWidth(); if (height < 1e-6 || width < 1e-6) { - return nullptr; + return image; } auto soundWaveShader = GetSoundWaveEffect(); if (soundWaveShader == nullptr) { LOGE("GESoundWaveFilter::ProcessImage g_SoundWaveEffect init failed"); - return nullptr; + return image; } CheckSoundWaveParams(); @@ -67,7 +70,7 @@ std::shared_ptr GESoundWaveFilter::ProcessImage(Drawing::Canvas& Drawing::RuntimeShaderBuilder builder(soundWaveShader); builder.SetChild("image", shader); - builder.SetUniform("iResolution", width, height); + builder.SetUniform("iResolution", canvasInfo_.geoWidth_, canvasInfo_.geoHeight_); builder.SetUniform("colorA", colorA, COLOR_CHANNEL); builder.SetUniform("colorB", colorB, COLOR_CHANNEL); builder.SetUniform("colorC", colorC, COLOR_CHANNEL); @@ -79,10 +82,10 @@ std::shared_ptr GESoundWaveFilter::ProcessImage(Drawing::Canvas& builder.SetUniform("shockWaveProgressB", shockWaveProgressB_); builder.SetUniform("shockWaveTotalAlpha", shockWaveTotalAlpha_); - auto invertedImage = builder.MakeImage(canvas.GetGPUContext().get(), nullptr, imageInfo, false); + auto invertedImage = builder.MakeImage(canvas.GetGPUContext().get(), &(matrix), imageInfo, false); if (invertedImage == nullptr) { LOGE("GESoundWaveFilter::ProcessImage make image failed"); - return nullptr; + return image; } return invertedImage; } diff --git a/src/ge_visual_effect.cpp b/src/ge_visual_effect.cpp index 9fa3687dfcfe988639cdfe802da68eb64325fd89..7fe90c9c4fe4eebaeea6df4f87c784081984d764 100644 --- a/src/ge_visual_effect.cpp +++ b/src/ge_visual_effect.cpp @@ -22,9 +22,16 @@ namespace OHOS { namespace Rosen { namespace Drawing { -GEVisualEffect::GEVisualEffect(const std::string& name, DrawingPaintType type) +GEVisualEffect::GEVisualEffect( + const std::string& name, DrawingPaintType type, const std::optional& canvasInfo) : visualEffectName_(name), type_(type), visualEffectImpl_(std::make_unique(name)) -{} +{ + if (canvasInfo) { + canvasInfo_ = canvasInfo.value(); + } else { + canvasInfo_ = Drawing::CanvasInfo(); + } +} GEVisualEffect::~GEVisualEffect() {} diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index b9bdd3c0371724ce8f7823026fbf7aaddabdbadf..a476de80873600f6110da0fd7ae79e2a4394761a 100644 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -125,6 +125,7 @@ ohos_unittest("GraphicsEffectTest") { "ge_pixel_map_shader_mask_test.cpp", "ge_render_test.cpp", "ge_ripple_shader_mask_test.cpp", + "ge_shader_filter_test.cpp", "ge_sound_wave_filter_test.cpp", "ge_system_properties_test.cpp", "ge_visual_effect_container_test.cpp", diff --git a/test/unittest/ge_color_gradient_shader_filter_test.cpp b/test/unittest/ge_color_gradient_shader_filter_test.cpp index 76c1b11642048496bde317aa1dda2ac21cb9f477..5e13a2d5ba1cdc5d80e3fdf149cd3ffa51d44c2a 100644 --- a/test/unittest/ge_color_gradient_shader_filter_test.cpp +++ b/test/unittest/ge_color_gradient_shader_filter_test.cpp @@ -162,5 +162,28 @@ HWTEST_F(GEColorGradientShaderFilterTest, CheckInParams_001, TestSize.Level0) GTEST_LOG_(INFO) << "GEColorGradientShaderFilterTest CheckInParams_001 end"; } + +/** + * @tc.name: PreProcessColorGradientBuilder_001 + * @tc.desc: Verify the PreProcessColorGradientBuilder + * @tc.type: FUNC + */ +HWTEST_F(GEColorGradientShaderFilterTest, PreProcessColorGradientBuilder_001, TestSize.Level0) +{ + GTEST_LOG_(INFO) << "GEColorGradientShaderFilterTest PreProcessColorGradientBuilder_001 start"; + + // 1.0, 0.0, 0.0, 1.0 is the color rgba params + std::vector colors = { 1.0f, 0.0f, 0.0f, 1.0f }; + std::vector poitions = { 1.0f, 1.0f }; // 1.0, 1.0 is poition xy params + std::vector strengths = { 0.5f }; // 0.5 is strength params + float geoWidth = 100; + float geoHeight = 100; + Drawing::GEColorGradientShaderFilterParams params { colors, poitions, strengths, nullptr }; + auto filter = std::make_unique(params); + EXPECT_NE(filter->PreProcessColorGradientBuilder(geoWidth, geoHeight), nullptr); + + GTEST_LOG_(INFO) << "GEColorGradientShaderFilterTest PreProcessColorGradientBuilder_001 end"; +} + } // namespace Rosen } // namespace OHOS diff --git a/test/unittest/ge_render_test.cpp b/test/unittest/ge_render_test.cpp index 4ba90595cd0b881ca45fac688028f27d4f8fd99f..6639ee687d6caa66a0766998d6c47620d8302e24 100644 --- a/test/unittest/ge_render_test.cpp +++ b/test/unittest/ge_render_test.cpp @@ -350,14 +350,14 @@ HWTEST_F(GERenderTest, GenerateShaderFilter_008, TestSize.Level1) { GTEST_LOG_(INFO) << "GERenderTest GenerateShaderFilter_008 start"; - auto visualEffect = std::make_shared(""); + auto visualEffect = std::make_shared(Drawing::GE_FILTER_DISPLACEMENT_DISTORT); std::pair factor = {1.0f, 1.0f}; visualEffect->SetParam(Drawing::GE_FILTER_DISPLACEMENT_DISTORT_FACTOR, factor); // 1 blur directon Drawing::GEVisualEffectContainer veContainer; veContainer.AddToChainedFilter(visualEffect); auto geRender = std::make_shared(); auto shaderFilters = geRender->GenerateShaderFilter(veContainer); - EXPECT_EQ(shaderFilters[0], nullptr); + EXPECT_NE(shaderFilters[0], nullptr); GTEST_LOG_(INFO) << "GERenderTest GenerateShaderFilter_008 end"; } diff --git a/test/unittest/ge_shader_filter_test.cpp b/test/unittest/ge_shader_filter_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7d2392d640a706cc2b6755d18c76b4352c2066ce --- /dev/null +++ b/test/unittest/ge_shader_filter_test.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "ge_color_gradient_shader_filter.h" +#include "ge_shader_filter.h" + +#include "draw/color.h" +#include "image/bitmap.h" + +using namespace testing; +using namespace testing::ext; + +namespace OHOS { +namespace Rosen { + +class GEShaderFilterTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp() override; + void TearDown() override; + std::shared_ptr MakeImage(Drawing::Canvas& canvas); + + static inline Drawing::Canvas canvas_; + std::shared_ptr image_ { nullptr }; + + // 1.0f, 1.0f, 2.0f, 2.0f is left top right bottom + Drawing::Rect src_ { 1.0f, 1.0f, 2.0f, 2.0f }; + Drawing::Rect dst_ { 1.0f, 1.0f, 2.0f, 2.0f }; +}; + +void GEShaderFilterTest::SetUpTestCase(void) {} +void GEShaderFilterTest::TearDownTestCase(void) {} + +void GEShaderFilterTest::SetUp() +{ + canvas_.Restore(); + + Drawing::Bitmap bmp; + Drawing::BitmapFormat format { Drawing::COLORTYPE_RGBA_8888, Drawing::ALPHATYPE_PREMUL }; + bmp.Build(50, 50, format); // 50, 50 bitmap size + bmp.ClearWithColor(Drawing::Color::COLOR_BLUE); + image_ = bmp.MakeImage(); +} + +void GEShaderFilterTest::TearDown() {} + +/** + * @tc.name: SetShaderFilterCanvasinfo_001 + * @tc.desc: Verify the SetShaderFilterCanvasinfo + * @tc.type: FUNC + */ +HWTEST_F(GEShaderFilterTest, SetShaderFilterCanvasinfo_001, TestSize.Level0) +{ + GTEST_LOG_(INFO) << "GEShaderFilterTest SetShaderFilterCanvasinfo_001 start"; + Drawing::CanvasInfo canvasInfo = {100.0f, 100.0f, 0.0f, 0.0f, Drawing::Matrix()}; + + // 1.0, 0.0, 0.0, 1.0 is the color rgba params + std::vector colors = { 1.0f, 0.0f, 0.0f, 1.0f }; + std::vector poitions = { 1.0f, 1.0f }; // 1.0, 1.0 is poition xy params + std::vector strengths = { 0.5f }; // 0.5 is strength params + Drawing::GEColorGradientShaderFilterParams params { colors, poitions, strengths, nullptr }; + auto filter = std::make_unique(params); + + EXPECT_NE(filter->canvasInfo_.geoHeight_, canvasInfo.geoHeight_); + filter->SetShaderFilterCanvasinfo(canvasInfo); + EXPECT_EQ(filter->canvasInfo_.geoHeight_, canvasInfo.geoHeight_); + + GTEST_LOG_(INFO) << "GEShaderFilterTest SetShaderFilterCanvasinfo_001 end"; +} + +} // namespace Rosen +} // namespace OHOS \ No newline at end of file diff --git a/test/unittest/ge_sound_wave_filter_test.cpp b/test/unittest/ge_sound_wave_filter_test.cpp index 1ce1c89514a03cae0aa345334ac9361c79fad4d9..9c78e9427edc4a9e0e961e92e4f23ea74ef05db0 100644 --- a/test/unittest/ge_sound_wave_filter_test.cpp +++ b/test/unittest/ge_sound_wave_filter_test.cpp @@ -94,7 +94,7 @@ HWTEST_F(GESoundWaveFilterTest, ProcessImage002, TestSize.Level1) Drawing::GESoundWaveFilterParams geSoundWaveFilterParams; std::unique_ptr geSoundWaveFilter = std::make_unique(geSoundWaveFilterParams); - EXPECT_EQ(geSoundWaveFilter->ProcessImage(canvas_, image, src_, dst_), nullptr); + EXPECT_EQ(geSoundWaveFilter->ProcessImage(canvas_, image, src_, dst_), image); GTEST_LOG_(INFO) << "GESoundWaveFilterTest ProcessImage002 end"; } @@ -118,7 +118,7 @@ HWTEST_F(GESoundWaveFilterTest, ProcessImage003, TestSize.Level1) Drawing::GESoundWaveFilterParams geSoundWaveFilterParams; std::unique_ptr geSoundWaveFilter = std::make_unique(geSoundWaveFilterParams); - EXPECT_EQ(geSoundWaveFilter->ProcessImage(canvas_, image, src_, dst_), nullptr); + EXPECT_EQ(geSoundWaveFilter->ProcessImage(canvas_, image, src_, dst_), image); GTEST_LOG_(INFO) << "GESoundWaveFilterTest ProcessImage003 end"; } @@ -135,7 +135,7 @@ HWTEST_F(GESoundWaveFilterTest, ProcessImage004, TestSize.Level1) Drawing::GESoundWaveFilterParams geSoundWaveFilterParams; std::unique_ptr geSoundWaveFilter = std::make_unique(geSoundWaveFilterParams); - EXPECT_EQ(geSoundWaveFilter->ProcessImage(canvas_, image_, src_, dst_), nullptr); + EXPECT_EQ(geSoundWaveFilter->ProcessImage(canvas_, image_, src_, dst_), image_); GTEST_LOG_(INFO) << "GESoundWaveFilterTest ProcessImage004 end"; } diff --git a/test/unittest/ge_visual_effect_test.cpp b/test/unittest/ge_visual_effect_test.cpp index f661f32216e7d943cff68248729edd737348252f..880ab9c1cc77b96db094ff58730119ca73eb168f 100644 --- a/test/unittest/ge_visual_effect_test.cpp +++ b/test/unittest/ge_visual_effect_test.cpp @@ -190,6 +190,29 @@ HWTEST_F(GEVisualEffectTest, SetParam_007, TestSize.Level1) GTEST_LOG_(INFO) << "GEVisualEffectTest SetParam_007 end"; } + +/** + * @tc.name: GetCanvasInfo_001 + * @tc.desc: Verify the GetCanvasInfo + * @tc.type: FUNC + */ +HWTEST_F(GEVisualEffectTest, GetCanvasInfo_001, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "GEVisualEffectTest GetCanvasInfo_001 start"; + + auto visualEffect1 = std::make_shared(GE_FILTER_KAWASE_BLUR); + Drawing::CanvasInfo canvasInfo1 = visualEffect1->GetCanvasInfo(); + EXPECT_EQ(canvasInfo1.geoWidth_, 0.0f); + + Drawing::CanvasInfo canvasInfo2 = {100.0f, 100.0f, 0.0f, 0.0f, Drawing::Matrix()}; + auto visualEffect2 = + std::make_shared(GE_FILTER_KAWASE_BLUR, Drawing::DrawingPaintType::BRUSH, canvasInfo2); + Drawing::CanvasInfo canvasInfo3 = visualEffect2->GetCanvasInfo(); + EXPECT_EQ(canvasInfo3.geoWidth_, canvasInfo2.geoWidth_); + + GTEST_LOG_(INFO) << "GEVisualEffectTest GetCanvasInfo_001 end"; +} + } // namespace Drawing } // namespace Rosen } // namespace OHOS