• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, Hardware
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "drawing_error_code.h"
17 #include "drawing_image.h"
18 #include "drawing_point.h"
19 #include "drawing_sampling_options.h"
20 #include "drawing_shader_effect.h"
21 #include "gtest/gtest.h"
22 
23 using namespace testing;
24 using namespace testing::ext;
25 
26 namespace OHOS {
27 namespace Rosen {
28 namespace Drawing {
29 class NativeDrawingShaderEffectTest : public testing::Test {
30 public:
31     static void SetUpTestCase();
32     static void TearDownTestCase();
33     void SetUp() override;
34     void TearDown() override;
35 };
36 
37 constexpr uint32_t POINT_NUM = 3;
38 
SetUpTestCase()39 void NativeDrawingShaderEffectTest::SetUpTestCase() {}
TearDownTestCase()40 void NativeDrawingShaderEffectTest::TearDownTestCase() {}
SetUp()41 void NativeDrawingShaderEffectTest::SetUp() {}
TearDown()42 void NativeDrawingShaderEffectTest::TearDown() {}
43 
44 constexpr uint32_t NUM_20 = 20;
45 constexpr uint32_t NUM_300 = 300;
46 
47 /*
48  * @tc.name: OH_Drawing_ShaderEffectCreateLinearGradient
49  * @tc.desc: Test OH_Drawing_ShaderEffectCreateLinearGradient
50  * @tc.type: FUNC
51  */
52 HWTEST_F(NativeDrawingShaderEffectTest, OH_Drawing_ShaderEffectCreateLinearGradient, TestSize.Level1)
53 {
54     OH_Drawing_Point* startPt = OH_Drawing_PointCreate(NUM_20, NUM_20);
55     OH_Drawing_Point* endPt = OH_Drawing_PointCreate(NUM_300, NUM_300);
56     uint32_t colors[] = { 0xFFFFFFFF };
57     float pos[] = { 0.0f, 1.0f };
58     OH_Drawing_ShaderEffect* effect =
59         OH_Drawing_ShaderEffectCreateLinearGradient(nullptr, nullptr, nullptr, nullptr, 1, OH_Drawing_TileMode::CLAMP);
60     ASSERT_TRUE(effect == nullptr);
61     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
62     OH_Drawing_ShaderEffectCreateLinearGradient(nullptr, endPt, colors, pos, 1, OH_Drawing_TileMode::CLAMP);
63     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
64     OH_Drawing_ShaderEffectCreateLinearGradient(startPt, nullptr, colors, pos, 1, OH_Drawing_TileMode::CLAMP);
65     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
66     OH_Drawing_ShaderEffectCreateLinearGradient(startPt, endPt, nullptr, pos, 1, OH_Drawing_TileMode::CLAMP);
67     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
68     OH_Drawing_ShaderEffect* effect2 = OH_Drawing_ShaderEffectCreateLinearGradient(startPt,
69         endPt, nullptr, pos, 1, static_cast<OH_Drawing_TileMode>(-1));
70     EXPECT_EQ(effect2, nullptr);
71     OH_Drawing_ShaderEffect* effect3 = OH_Drawing_ShaderEffectCreateLinearGradient(startPt,
72         endPt, nullptr, pos, 1, static_cast<OH_Drawing_TileMode>(99));
73     EXPECT_EQ(effect3, nullptr);
74     OH_Drawing_ShaderEffect* effect4 = OH_Drawing_ShaderEffectCreateLinearGradient(startPt,
75         endPt, colors, nullptr, 1, OH_Drawing_TileMode::CLAMP);
76     EXPECT_NE(effect4, nullptr);
77     OH_Drawing_ShaderEffectDestroy(effect4);
78     OH_Drawing_PointDestroy(startPt);
79     OH_Drawing_PointDestroy(endPt);
80 }
81 
82 /*
83  * @tc.name: OH_Drawing_ShaderEffectCreateRadialGradient
84  * @tc.desc: Test OH_Drawing_ShaderEffectCreateRadialGradient
85  * @tc.type: FUNC
86  */
87 HWTEST_F(NativeDrawingShaderEffectTest, OH_Drawing_ShaderEffectCreateRadialGradient001, TestSize.Level1)
88 {
89     OH_Drawing_ShaderEffect* effect =
90         OH_Drawing_ShaderEffectCreateRadialGradient(nullptr, 1, nullptr, nullptr, 1, OH_Drawing_TileMode::CLAMP);
91     ASSERT_TRUE(effect == nullptr);
92     uint32_t gColors[] = { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFF000000 };
93     float_t gPos[] = { 0.25f, 0.75f };
94     float radius = 200;
95     float x = 200;
96     float y = 200;
97     OH_Drawing_Point* centerPt = OH_Drawing_PointCreate(x, y);
98     OH_Drawing_ShaderEffect* effect1 =
99         OH_Drawing_ShaderEffectCreateRadialGradient(centerPt, radius, gColors, gPos, 1, OH_Drawing_TileMode::REPEAT);
100     ASSERT_TRUE(effect1 != nullptr);
101     OH_Drawing_ShaderEffectCreateRadialGradient(nullptr, radius, gColors, gPos, 1, OH_Drawing_TileMode::REPEAT);
102     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
103     OH_Drawing_ShaderEffectCreateRadialGradient(centerPt, radius, nullptr, gPos, 1, OH_Drawing_TileMode::REPEAT);
104     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
105     EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradient(centerPt, radius, gColors, gPos, 1,
106         static_cast<OH_Drawing_TileMode>(-1)), nullptr);
107     EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradient(centerPt, radius, gColors, gPos, 1,
108         static_cast<OH_Drawing_TileMode>(99)), nullptr);
109     OH_Drawing_ShaderEffect* effect2 = OH_Drawing_ShaderEffectCreateRadialGradient(centerPt,
110         radius, gColors, nullptr, 1, OH_Drawing_TileMode::REPEAT);
111     EXPECT_NE(effect2, nullptr);
112     OH_Drawing_ShaderEffectDestroy(effect1);
113     OH_Drawing_ShaderEffectDestroy(effect2);
114 }
115 
116 /*
117  * @tc.name: OH_Drawing_ShaderEffectCreateImageShader
118  * @tc.desc: Test OH_Drawing_ShaderEffectCreateImageShader
119  * @tc.type: FUNC
120  */
121 HWTEST_F(NativeDrawingShaderEffectTest, OH_Drawing_ShaderEffectCreateImageShader, TestSize.Level1)
122 {
123     OH_Drawing_Image* image = OH_Drawing_ImageCreate();
124     ASSERT_TRUE(image != nullptr);
125     OH_Drawing_SamplingOptions* options = OH_Drawing_SamplingOptionsCreate(FILTER_MODE_LINEAR, MIPMAP_MODE_LINEAR);
126     ASSERT_TRUE(options != nullptr);
127     OH_Drawing_Matrix* matrix = nullptr;
128     OH_Drawing_ShaderEffect* effect = OH_Drawing_ShaderEffectCreateImageShader(image, CLAMP, CLAMP, options, matrix);
129     ASSERT_TRUE(effect != nullptr);
130     OH_Drawing_ShaderEffectCreateImageShader(nullptr, CLAMP, CLAMP, options, matrix);
131     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
132     OH_Drawing_ShaderEffectCreateImageShader(image, CLAMP, CLAMP, nullptr, matrix);
133     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
134     EXPECT_EQ(OH_Drawing_ShaderEffectCreateImageShader(image, static_cast<OH_Drawing_TileMode>(-1),
135         CLAMP, options, matrix), nullptr);
136     EXPECT_EQ(OH_Drawing_ShaderEffectCreateImageShader(image, static_cast<OH_Drawing_TileMode>(99),
137         CLAMP, options, matrix), nullptr);
138     EXPECT_EQ(OH_Drawing_ShaderEffectCreateImageShader(image, CLAMP,
139         static_cast<OH_Drawing_TileMode>(-1), options, matrix), nullptr);
140     EXPECT_EQ(OH_Drawing_ShaderEffectCreateImageShader(image, CLAMP,
141         static_cast<OH_Drawing_TileMode>(99), options, matrix), nullptr);
142 }
143 
144 /*
145  * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateLinearGradientWithLocalMatrix001
146  * @tc.desc: test for creates an <b>OH_Drawing_ShaderEffect</b> that generates a linear gradient between
147  * the two specified points.
148  * @tc.type: FUNC
149  * @tc.require: AR000GTO5R
150  */
151 HWTEST_F(NativeDrawingShaderEffectTest,
152     NativeDrawingShaderEffectTest_ShaderEffectCreateLinearGradientWithLocalMatrix001, TestSize.Level1)
153 {
154     float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
155     OH_Drawing_Point2D start = {0, 0};
156     OH_Drawing_Point2D end = {100.f, 0}; // 100.f: end point's x
157     EXPECT_EQ(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
158         &start, &end, nullptr, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
159 
160     uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
161     EXPECT_EQ(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
162         &start, nullptr, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
163     EXPECT_EQ(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
164         nullptr, &end, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
165     EXPECT_EQ(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
166         &start, &end, colors, pos, POINT_NUM, static_cast<OH_Drawing_TileMode>(-1), nullptr), nullptr);
167     EXPECT_EQ(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
168         &start, &end, colors, pos, POINT_NUM, static_cast<OH_Drawing_TileMode>(99), nullptr), nullptr);
169     OH_Drawing_ShaderEffect* effect1 = OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
170         &start, &end, colors, nullptr, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr);
171     EXPECT_NE(effect1, nullptr);
172     OH_Drawing_ShaderEffect* effect2 = OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
173         &start, &end, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr);
174     EXPECT_NE(effect2, nullptr);
175     OH_Drawing_ShaderEffectDestroy(effect1);
176     OH_Drawing_ShaderEffectDestroy(effect2);
177 }
178 
179 /*
180  * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateRadialGradientWithLocalMatrix002
181  * @tc.desc: test for creates an <b>OH_Drawing_ShaderEffect</b> that generates a linear gradient between
182  * the two specified points.
183  * @tc.type: FUNC
184  * @tc.require: AR000GTO5R
185  */
186 HWTEST_F(NativeDrawingShaderEffectTest,
187     NativeDrawingShaderEffectTest_ShaderEffectCreateRadialGradientWithLocalMatrix002, TestSize.Level1)
188 {
189     float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
190     float radius = 5.0; // 5.0f: gradient color radius
191     OH_Drawing_Point2D start = {100.f, 0};  // 100.f: start point's x
192     EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
193         &start, radius, nullptr, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
194 
195     uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
196     EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
197         nullptr, radius, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
198     EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
199         &start, radius, colors, pos, POINT_NUM, static_cast<OH_Drawing_TileMode>(-1), nullptr), nullptr);
200     EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
201         &start, radius, colors, pos, POINT_NUM, static_cast<OH_Drawing_TileMode>(99), nullptr), nullptr);
202     EXPECT_NE(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
203         &start, radius, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
204     EXPECT_NE(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
205         &start, radius, colors, nullptr, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
206 }
207 
208 /*
209  * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateTwoPointConicalGradient003
210  * @tc.desc: test for greates an <b>OH_Drawing_ShaderEffect</b> that generates a conical gradient given two circles.
211  * @tc.type: FUNC
212  * @tc.require: AR000GTO5R
213  */
214 HWTEST_F(NativeDrawingShaderEffectTest, NativeDrawingShaderEffectTest_ShaderEffectCreateTwoPointConicalGradient003,
215     TestSize.Level1)
216 {
217     OH_Drawing_Point2D startPt = {0, 0};
218     OH_Drawing_Point2D endPt = {100.f, 0}; // 100.f: end point's x
219     uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
220     float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
221     float startRadius = 5.0f, endRadius = 10.0f; // 5.0f: gradient color radius, 10.0f: gradient color radius
222     EXPECT_EQ(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, nullptr, endRadius, colors,
223         pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
224     EXPECT_EQ(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(nullptr, startRadius, &endPt, endRadius, colors,
225         pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
226     EXPECT_EQ(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, &endPt, endRadius, nullptr,
227         pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
228     EXPECT_EQ(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, &endPt, endRadius, colors,
229         pos, POINT_NUM, static_cast<OH_Drawing_TileMode>(-1), nullptr), nullptr);
230     EXPECT_EQ(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, &endPt, endRadius, colors,
231         pos, POINT_NUM, static_cast<OH_Drawing_TileMode>(99), nullptr), nullptr);
232     EXPECT_NE(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, &endPt, endRadius, colors,
233         pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
234     EXPECT_NE(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, &endPt, endRadius, colors,
235         nullptr, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
236 }
237 
238 /*
239  * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateSweepGradient001
240  * @tc.desc:
241  * @tc.type: FUNC
242  * @tc.require: AR000GTO5R
243  */
244 HWTEST_F(NativeDrawingShaderEffectTest, NativeDrawingShaderEffectTest_ShaderEffectCreateSweepGradient001,
245     TestSize.Level1)
246 {
247     OH_Drawing_Point* startPt = OH_Drawing_PointCreate(0, 0);
248     uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
249     float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
250     EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradient(nullptr, colors, pos, POINT_NUM,
251         OH_Drawing_TileMode::CLAMP), nullptr);
252     EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradient(nullptr, nullptr, pos, POINT_NUM,
253         OH_Drawing_TileMode::CLAMP), nullptr);
254     EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradient(startPt, nullptr, pos, POINT_NUM,
255         OH_Drawing_TileMode::CLAMP), nullptr);
256     EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradient(startPt, colors, pos, POINT_NUM,
257         static_cast<OH_Drawing_TileMode>(-1)), nullptr);
258     EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradient(startPt, colors, pos, POINT_NUM,
259         static_cast<OH_Drawing_TileMode>(99)), nullptr);
260     EXPECT_NE(OH_Drawing_ShaderEffectCreateSweepGradient(startPt, colors, nullptr, POINT_NUM,
261         OH_Drawing_TileMode::CLAMP), nullptr);
262 }
263 
264 /*
265  * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateColorShader004
266  * @tc.desc: test for creates an <b>OH_Drawing_ShaderEffect</b> that generates a shader with single color.
267  * @tc.type: FUNC
268  * @tc.require: AR000GTO5R
269  */
270 HWTEST_F(NativeDrawingShaderEffectTest, NativeDrawingShaderEffectTest_ShaderEffectCreateColorShader004,
271     TestSize.Level1)
272 {
273     const uint32_t color = 0xFFFF0000;
274     OH_Drawing_ShaderEffect * colorShaderEffect = OH_Drawing_ShaderEffectCreateColorShader(color);
275     EXPECT_NE(colorShaderEffect, nullptr);
276     OH_Drawing_ShaderEffectDestroy(colorShaderEffect);
277 }
278 } // namespace Drawing
279 } // namespace Rosen
280 } // namespace OHOS