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