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_matrix.h"
19 #include "drawing_pixel_map.h"
20 #include "drawing_point.h"
21 #include "drawing_sampling_options.h"
22 #include "drawing_shader_effect.h"
23 #include "gtest/gtest.h"
24 #include "image/pixelmap_native.h"
25
26 #ifdef RS_ENABLE_VK
27 #include "platform/ohos/backend/rs_vulkan_context.h"
28 #endif
29
30 using namespace testing;
31 using namespace testing::ext;
32
33 namespace OHOS {
34 namespace Rosen {
35 namespace Drawing {
36 class NativeDrawingShaderEffectTest : public testing::Test {
37 public:
38 static void SetUpTestCase();
39 static void TearDownTestCase();
40 void SetUp() override;
41 void TearDown() override;
42 };
43
44 constexpr uint32_t POINT_NUM = 3;
45
SetUpTestCase()46 void NativeDrawingShaderEffectTest::SetUpTestCase()
47 {
48 #ifdef RS_ENABLE_VK
49 RsVulkanContext::SetRecyclable(false);
50 #endif
51 }
TearDownTestCase()52 void NativeDrawingShaderEffectTest::TearDownTestCase() {}
SetUp()53 void NativeDrawingShaderEffectTest::SetUp() {}
TearDown()54 void NativeDrawingShaderEffectTest::TearDown() {}
55
56 constexpr uint32_t NUM_20 = 20;
57 constexpr uint32_t NUM_300 = 300;
58
59 /*
60 * @tc.name: OH_Drawing_ShaderEffectCreateLinearGradient
61 * @tc.desc: Test OH_Drawing_ShaderEffectCreateLinearGradient
62 * @tc.type: FUNC
63 */
64 HWTEST_F(NativeDrawingShaderEffectTest, OH_Drawing_ShaderEffectCreateLinearGradient, TestSize.Level1)
65 {
66 OH_Drawing_Point* startPt = OH_Drawing_PointCreate(NUM_20, NUM_20);
67 OH_Drawing_Point* endPt = OH_Drawing_PointCreate(NUM_300, NUM_300);
68 uint32_t colors[] = { 0xFFFFFFFF };
69 float pos[] = { 0.0f, 1.0f };
70 OH_Drawing_ShaderEffect* effect =
71 OH_Drawing_ShaderEffectCreateLinearGradient(nullptr, nullptr, nullptr, nullptr, 1, OH_Drawing_TileMode::CLAMP);
72 ASSERT_TRUE(effect == nullptr);
73 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
74 OH_Drawing_ShaderEffectCreateLinearGradient(nullptr, endPt, colors, pos, 1, OH_Drawing_TileMode::CLAMP);
75 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
76 OH_Drawing_ShaderEffectCreateLinearGradient(startPt, nullptr, colors, pos, 1, OH_Drawing_TileMode::CLAMP);
77 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
78 OH_Drawing_ShaderEffectCreateLinearGradient(startPt, endPt, nullptr, pos, 1, OH_Drawing_TileMode::CLAMP);
79 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
80 OH_Drawing_ShaderEffect* effect2 = OH_Drawing_ShaderEffectCreateLinearGradient(startPt,
81 endPt, nullptr, pos, 1, static_cast<OH_Drawing_TileMode>(-1));
82 EXPECT_EQ(effect2, nullptr);
83 OH_Drawing_ShaderEffect* effect3 = OH_Drawing_ShaderEffectCreateLinearGradient(startPt,
84 endPt, nullptr, pos, 1, static_cast<OH_Drawing_TileMode>(99));
85 EXPECT_EQ(effect3, nullptr);
86 OH_Drawing_ShaderEffect* effect4 = OH_Drawing_ShaderEffectCreateLinearGradient(startPt,
87 endPt, colors, nullptr, 1, OH_Drawing_TileMode::CLAMP);
88 EXPECT_NE(effect4, nullptr);
89 OH_Drawing_ShaderEffectDestroy(effect4);
90 OH_Drawing_PointDestroy(startPt);
91 OH_Drawing_PointDestroy(endPt);
92 }
93
94 /*
95 * @tc.name: OH_Drawing_ShaderEffectCreateRadialGradient
96 * @tc.desc: Test OH_Drawing_ShaderEffectCreateRadialGradient
97 * @tc.type: FUNC
98 */
99 HWTEST_F(NativeDrawingShaderEffectTest, OH_Drawing_ShaderEffectCreateRadialGradient001, TestSize.Level1)
100 {
101 OH_Drawing_ShaderEffect* effect =
102 OH_Drawing_ShaderEffectCreateRadialGradient(nullptr, 1, nullptr, nullptr, 1, OH_Drawing_TileMode::CLAMP);
103 ASSERT_TRUE(effect == nullptr);
104 uint32_t gColors[] = { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFF000000 };
105 float_t gPos[] = { 0.25f, 0.75f };
106 float radius = 200;
107 float x = 200;
108 float y = 200;
109 OH_Drawing_Point* centerPt = OH_Drawing_PointCreate(x, y);
110 OH_Drawing_ShaderEffect* effect1 =
111 OH_Drawing_ShaderEffectCreateRadialGradient(centerPt, radius, gColors, gPos, 1, OH_Drawing_TileMode::REPEAT);
112 ASSERT_TRUE(effect1 != nullptr);
113 OH_Drawing_ShaderEffectCreateRadialGradient(nullptr, radius, gColors, gPos, 1, OH_Drawing_TileMode::REPEAT);
114 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
115 OH_Drawing_ShaderEffectCreateRadialGradient(centerPt, radius, nullptr, gPos, 1, OH_Drawing_TileMode::REPEAT);
116 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
117 EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradient(centerPt, radius, gColors, gPos, 1,
118 static_cast<OH_Drawing_TileMode>(-1)), nullptr);
119 EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradient(centerPt, radius, gColors, gPos, 1,
120 static_cast<OH_Drawing_TileMode>(99)), nullptr);
121 OH_Drawing_ShaderEffect* effect2 = OH_Drawing_ShaderEffectCreateRadialGradient(centerPt,
122 radius, gColors, nullptr, 1, OH_Drawing_TileMode::REPEAT);
123 EXPECT_NE(effect2, nullptr);
124 OH_Drawing_ShaderEffectDestroy(effect1);
125 OH_Drawing_ShaderEffectDestroy(effect2);
126 }
127
128 /*
129 * @tc.name: OH_Drawing_ShaderEffectCreateImageShader
130 * @tc.desc: Test OH_Drawing_ShaderEffectCreateImageShader
131 * @tc.type: FUNC
132 */
133 HWTEST_F(NativeDrawingShaderEffectTest, OH_Drawing_ShaderEffectCreateImageShader, TestSize.Level1)
134 {
135 OH_Drawing_Image* image = OH_Drawing_ImageCreate();
136 ASSERT_TRUE(image != nullptr);
137 OH_Drawing_SamplingOptions* options = OH_Drawing_SamplingOptionsCreate(FILTER_MODE_LINEAR, MIPMAP_MODE_LINEAR);
138 ASSERT_TRUE(options != nullptr);
139 OH_Drawing_Matrix* matrix = nullptr;
140 OH_Drawing_ShaderEffect* effect = OH_Drawing_ShaderEffectCreateImageShader(image, CLAMP, CLAMP, options, matrix);
141 ASSERT_TRUE(effect != nullptr);
142 OH_Drawing_ShaderEffectCreateImageShader(nullptr, CLAMP, CLAMP, options, matrix);
143 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
144 OH_Drawing_ShaderEffectCreateImageShader(image, CLAMP, CLAMP, nullptr, matrix);
145 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
146 EXPECT_EQ(OH_Drawing_ShaderEffectCreateImageShader(image, static_cast<OH_Drawing_TileMode>(-1),
147 CLAMP, options, matrix), nullptr);
148 EXPECT_EQ(OH_Drawing_ShaderEffectCreateImageShader(image, static_cast<OH_Drawing_TileMode>(99),
149 CLAMP, options, matrix), nullptr);
150 EXPECT_EQ(OH_Drawing_ShaderEffectCreateImageShader(image, CLAMP,
151 static_cast<OH_Drawing_TileMode>(-1), options, matrix), nullptr);
152 EXPECT_EQ(OH_Drawing_ShaderEffectCreateImageShader(image, CLAMP,
153 static_cast<OH_Drawing_TileMode>(99), options, matrix), nullptr);
154 }
155
156 /*
157 * @tc.name: OH_Drawing_ShaderEffectCreatePixelMapShader
158 * @tc.desc: Test OH_Drawing_ShaderEffectCreatePixelMapShader
159 * @tc.type: FUNC
160 */
161 HWTEST_F(NativeDrawingShaderEffectTest, OH_Drawing_ShaderEffectCreatePixelMapShader, TestSize.Level1)
162 {
163 OH_Pixelmap_InitializationOptions *options = nullptr;
164 OH_PixelmapNative *pixelMap = nullptr;
165 OH_PixelmapInitializationOptions_Create(&options);
166 // 4 means width
167 OH_PixelmapInitializationOptions_SetWidth(options, 4);
168 // 4 means height
169 OH_PixelmapInitializationOptions_SetHeight(options, 4);
170 // 3 means RGBA format
171 OH_PixelmapInitializationOptions_SetPixelFormat(options, 3);
172 // 2 means ALPHA_FORMAT_PREMUL format
173 OH_PixelmapInitializationOptions_SetAlphaType(options, 2);
174 // 255 means rgba data
175 uint8_t data[] = {
176 255, 255, 0, 255, 255, 255, 0, 255,
177 255, 255, 0, 255, 255, 255, 0, 255
178 };
179 // 16 means data length
180 size_t dataLength = 16;
181 OH_PixelmapNative_CreatePixelmap(data, dataLength, options, &pixelMap);
182 EXPECT_NE(pixelMap, nullptr);
183 OH_Drawing_PixelMap *drPixelMap = OH_Drawing_PixelMapGetFromOhPixelMapNative(pixelMap);
184 EXPECT_NE(drPixelMap, nullptr);
185 OH_Drawing_SamplingOptions* samplingOptions =
186 OH_Drawing_SamplingOptionsCreate(FILTER_MODE_LINEAR, MIPMAP_MODE_LINEAR);
187 ASSERT_TRUE(options != nullptr);
188 OH_Drawing_ShaderEffect* effect1 = OH_Drawing_ShaderEffectCreatePixelMapShader(
189 drPixelMap, CLAMP, CLAMP, samplingOptions, nullptr);
190 ASSERT_TRUE(effect1 != nullptr);
191 OH_Drawing_Matrix* matrix = OH_Drawing_MatrixCreate();
192 OH_Drawing_ShaderEffect* effect2 = OH_Drawing_ShaderEffectCreatePixelMapShader(
193 drPixelMap, CLAMP, CLAMP, samplingOptions, matrix);
194 ASSERT_TRUE(effect2 != nullptr);
195 EXPECT_EQ(OH_Drawing_ShaderEffectCreatePixelMapShader(nullptr, CLAMP, CLAMP, samplingOptions, matrix), nullptr);
196 EXPECT_EQ(OH_Drawing_ShaderEffectCreatePixelMapShader(drPixelMap, CLAMP, CLAMP, nullptr, matrix), nullptr);
197 EXPECT_EQ(OH_Drawing_ShaderEffectCreatePixelMapShader(drPixelMap, static_cast<OH_Drawing_TileMode>(-1),
198 CLAMP, samplingOptions, matrix), nullptr);
199 EXPECT_EQ(OH_Drawing_ShaderEffectCreatePixelMapShader(drPixelMap, static_cast<OH_Drawing_TileMode>(99),
200 CLAMP, samplingOptions, matrix), nullptr);
201 EXPECT_EQ(OH_Drawing_ShaderEffectCreatePixelMapShader(drPixelMap, CLAMP,
202 static_cast<OH_Drawing_TileMode>(-1), samplingOptions, matrix), nullptr);
203 EXPECT_EQ(OH_Drawing_ShaderEffectCreatePixelMapShader(drPixelMap, CLAMP,
204 static_cast<OH_Drawing_TileMode>(99), samplingOptions, matrix), nullptr);
205 OH_Drawing_PixelMapDissolve(drPixelMap);
206 OH_PixelmapNative_Release(pixelMap);
207 OH_PixelmapInitializationOptions_Release(options);
208 OH_Drawing_SamplingOptionsDestroy(samplingOptions);
209 OH_Drawing_MatrixDestroy(matrix);
210 OH_Drawing_ShaderEffectDestroy(effect1);
211 OH_Drawing_ShaderEffectDestroy(effect2);
212 }
213
214 /*
215 * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateLinearGradientWithLocalMatrix001
216 * @tc.desc: test for creates an <b>OH_Drawing_ShaderEffect</b> that generates a linear gradient between
217 * the two specified points.
218 * @tc.type: FUNC
219 * @tc.require: AR000GTO5R
220 */
221 HWTEST_F(NativeDrawingShaderEffectTest,
222 NativeDrawingShaderEffectTest_ShaderEffectCreateLinearGradientWithLocalMatrix001, TestSize.Level1)
223 {
224 float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
225 OH_Drawing_Point2D start = {0, 0};
226 OH_Drawing_Point2D end = {100.f, 0}; // 100.f: end point's x
227 EXPECT_EQ(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
228 &start, &end, nullptr, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
229
230 uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
231 EXPECT_EQ(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
232 &start, nullptr, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
233 EXPECT_EQ(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
234 nullptr, &end, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
235 EXPECT_EQ(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
236 &start, &end, colors, pos, POINT_NUM, static_cast<OH_Drawing_TileMode>(-1), nullptr), nullptr);
237 EXPECT_EQ(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
238 &start, &end, colors, pos, POINT_NUM, static_cast<OH_Drawing_TileMode>(99), nullptr), nullptr);
239 OH_Drawing_ShaderEffect* effect1 = OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
240 &start, &end, colors, nullptr, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr);
241 EXPECT_NE(effect1, nullptr);
242 OH_Drawing_ShaderEffect* effect2 = OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
243 &start, &end, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr);
244 EXPECT_NE(effect2, nullptr);
245 OH_Drawing_ShaderEffectDestroy(effect1);
246 OH_Drawing_ShaderEffectDestroy(effect2);
247 }
248
249 /*
250 * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateRadialGradientWithLocalMatrix002
251 * @tc.desc: test for creates an <b>OH_Drawing_ShaderEffect</b> that generates a linear gradient between
252 * the two specified points.
253 * @tc.type: FUNC
254 * @tc.require: AR000GTO5R
255 */
256 HWTEST_F(NativeDrawingShaderEffectTest,
257 NativeDrawingShaderEffectTest_ShaderEffectCreateRadialGradientWithLocalMatrix002, TestSize.Level1)
258 {
259 float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
260 float radius = 5.0; // 5.0f: gradient color radius
261 OH_Drawing_Point2D start = {100.f, 0}; // 100.f: start point's x
262 EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
263 &start, radius, nullptr, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
264
265 uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
266 EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
267 nullptr, radius, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
268 EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
269 &start, radius, colors, pos, POINT_NUM, static_cast<OH_Drawing_TileMode>(-1), nullptr), nullptr);
270 EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
271 &start, radius, colors, pos, POINT_NUM, static_cast<OH_Drawing_TileMode>(99), nullptr), nullptr);
272 EXPECT_NE(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
273 &start, radius, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
274 EXPECT_NE(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
275 &start, radius, colors, nullptr, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
276 }
277
278 /*
279 * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateTwoPointConicalGradient003
280 * @tc.desc: test for greates an <b>OH_Drawing_ShaderEffect</b> that generates a conical gradient given two circles.
281 * @tc.type: FUNC
282 * @tc.require: AR000GTO5R
283 */
284 HWTEST_F(NativeDrawingShaderEffectTest, NativeDrawingShaderEffectTest_ShaderEffectCreateTwoPointConicalGradient003,
285 TestSize.Level1)
286 {
287 OH_Drawing_Point2D startPt = {0, 0};
288 OH_Drawing_Point2D endPt = {100.f, 0}; // 100.f: end point's x
289 uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
290 float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
291 float startRadius = 5.0f, endRadius = 10.0f; // 5.0f: gradient color radius, 10.0f: gradient color radius
292 EXPECT_EQ(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, nullptr, endRadius, colors,
293 pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
294 EXPECT_EQ(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(nullptr, startRadius, &endPt, endRadius, colors,
295 pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
296 EXPECT_EQ(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, &endPt, endRadius, nullptr,
297 pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
298 EXPECT_EQ(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, &endPt, endRadius, colors,
299 pos, POINT_NUM, static_cast<OH_Drawing_TileMode>(-1), nullptr), nullptr);
300 EXPECT_EQ(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, &endPt, endRadius, colors,
301 pos, POINT_NUM, static_cast<OH_Drawing_TileMode>(99), nullptr), nullptr);
302 EXPECT_NE(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, &endPt, endRadius, colors,
303 pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
304 EXPECT_NE(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, &endPt, endRadius, colors,
305 nullptr, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
306 }
307
308 /*
309 * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateSweepGradient001
310 * @tc.desc:
311 * @tc.type: FUNC
312 * @tc.require: AR000GTO5R
313 */
314 HWTEST_F(NativeDrawingShaderEffectTest, NativeDrawingShaderEffectTest_ShaderEffectCreateSweepGradient001,
315 TestSize.Level1)
316 {
317 OH_Drawing_Point* startPt = OH_Drawing_PointCreate(0, 0);
318 uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
319 float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
320 EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradient(nullptr, colors, pos, POINT_NUM,
321 OH_Drawing_TileMode::CLAMP), nullptr);
322 EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradient(nullptr, nullptr, pos, POINT_NUM,
323 OH_Drawing_TileMode::CLAMP), nullptr);
324 EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradient(startPt, nullptr, pos, POINT_NUM,
325 OH_Drawing_TileMode::CLAMP), nullptr);
326 EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradient(startPt, colors, pos, POINT_NUM,
327 static_cast<OH_Drawing_TileMode>(-1)), nullptr);
328 EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradient(startPt, colors, pos, POINT_NUM,
329 static_cast<OH_Drawing_TileMode>(99)), nullptr);
330 EXPECT_NE(OH_Drawing_ShaderEffectCreateSweepGradient(startPt, colors, nullptr, POINT_NUM,
331 OH_Drawing_TileMode::CLAMP), nullptr);
332 }
333
334 HWTEST_F(NativeDrawingShaderEffectTest,
335 NativeDrawingShaderEffectTest_OH_Drawing_ShaderEffectCreateSweepGradientWithLocalMatrix001, TestSize.Level1)
336 {
337 OH_Drawing_Point* startPt = OH_Drawing_PointCreate(0, 0);
338 uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
339 float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
340 EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradientWithLocalMatrix(nullptr, colors, pos, POINT_NUM,
341 OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
342 EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradientWithLocalMatrix(nullptr, nullptr, pos, POINT_NUM,
343 OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
344 EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradientWithLocalMatrix(startPt, nullptr, pos, POINT_NUM,
345 OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
346 EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradientWithLocalMatrix(startPt, colors, pos, POINT_NUM,
347 static_cast<OH_Drawing_TileMode>(-1), nullptr), nullptr);
348 EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradientWithLocalMatrix(startPt, colors, pos, POINT_NUM,
349 static_cast<OH_Drawing_TileMode>(99), nullptr), nullptr);
350 EXPECT_NE(OH_Drawing_ShaderEffectCreateSweepGradientWithLocalMatrix(startPt, colors, nullptr, POINT_NUM,
351 OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
352 }
353
354 HWTEST_F(NativeDrawingShaderEffectTest,
355 NativeDrawingShaderEffectTest_OH_Drawing_ShaderEffectCreateSweepGradientWithLocalMatrix002, TestSize.Level1)
356 {
357 OH_Drawing_Point* startPt = OH_Drawing_PointCreate(0, 0);
358 uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
359 OH_Drawing_Matrix* matrix = OH_Drawing_MatrixCreate();
360 OH_Drawing_MatrixSetMatrix(
361 matrix,
362 1, 0, 0,
363 0, 3, 1,
364 0, 0, 4);
365 float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
366
367 EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradientWithLocalMatrix(nullptr, colors, pos, POINT_NUM,
368 OH_Drawing_TileMode::CLAMP, matrix), nullptr);
369 EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradientWithLocalMatrix(nullptr, nullptr, pos, POINT_NUM,
370 OH_Drawing_TileMode::CLAMP, matrix), nullptr);
371 EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradientWithLocalMatrix(startPt, nullptr, pos, POINT_NUM,
372 OH_Drawing_TileMode::CLAMP, matrix), nullptr);
373 EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradientWithLocalMatrix(startPt, colors, pos, POINT_NUM,
374 static_cast<OH_Drawing_TileMode>(-1), matrix), nullptr);
375 EXPECT_EQ(OH_Drawing_ShaderEffectCreateSweepGradientWithLocalMatrix(startPt, colors, pos, POINT_NUM,
376 static_cast<OH_Drawing_TileMode>(99), matrix), nullptr);
377 EXPECT_NE(OH_Drawing_ShaderEffectCreateSweepGradientWithLocalMatrix(startPt, colors, nullptr, POINT_NUM,
378 OH_Drawing_TileMode::CLAMP, matrix), nullptr);
379 }
380
381 /*
382 * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateColorShader004
383 * @tc.desc: test for creates an <b>OH_Drawing_ShaderEffect</b> that generates a shader with single color.
384 * @tc.type: FUNC
385 * @tc.require: AR000GTO5R
386 */
387 HWTEST_F(NativeDrawingShaderEffectTest, NativeDrawingShaderEffectTest_ShaderEffectCreateColorShader004,
388 TestSize.Level1)
389 {
390 const uint32_t color = 0xFFFF0000;
391 OH_Drawing_ShaderEffect * colorShaderEffect = OH_Drawing_ShaderEffectCreateColorShader(color);
392 EXPECT_NE(colorShaderEffect, nullptr);
393 OH_Drawing_ShaderEffectDestroy(colorShaderEffect);
394 }
395
396 /*
397 * @tc.name: OH_Drawing_ShaderEffectCreateCompose001
398 * @tc.desc: test for creates an <b>OH_Drawing_ShaderEffect</b> that generates a shader by two shaders.
399 * @tc.type: FUNC
400 * @tc.require: IAYWTV
401 */
402 HWTEST_F(NativeDrawingShaderEffectTest, OH_Drawing_ShaderEffectCreateCompose001, TestSize.Level1)
403 {
404 uint32_t gColors[] = { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFF000000 };
405 float_t gPos[] = { 0.25f, 0.75f }; // 0.25f: gradient color points, 0.75f: gradient color points
406 float radius = 200; // 200: gradient color radius
407 float x = 200; // 200: x coordinate
408 float y = 200; // 200: y coordinate
409 OH_Drawing_Point* centerPt = OH_Drawing_PointCreate(x, y);
410 OH_Drawing_ShaderEffect* srcEffect =
411 OH_Drawing_ShaderEffectCreateRadialGradient(centerPt, radius, gColors, gPos, 1, OH_Drawing_TileMode::REPEAT);
412 ASSERT_TRUE(srcEffect != nullptr);
413
414 x = 500; // 500: x coordinate
415 y = 500; // 500: y coordinate
416 OH_Drawing_Point* centerPtTwo = OH_Drawing_PointCreate(x, y);
417 OH_Drawing_ShaderEffect* dstEffect =
418 OH_Drawing_ShaderEffectCreateRadialGradient(centerPtTwo, radius, gColors, gPos, 1, OH_Drawing_TileMode::REPEAT);
419 ASSERT_TRUE(dstEffect != nullptr);
420
421 OH_Drawing_ShaderEffect* effect =
422 OH_Drawing_ShaderEffectCreateCompose(dstEffect, srcEffect, OH_Drawing_BlendMode::BLEND_MODE_SRC);
423 EXPECT_NE(effect, nullptr);
424
425 OH_Drawing_ShaderEffectDestroy(srcEffect);
426 OH_Drawing_ShaderEffectDestroy(dstEffect);
427 OH_Drawing_ShaderEffectDestroy(effect);
428 OH_Drawing_PointDestroy(centerPt);
429 OH_Drawing_PointDestroy(centerPtTwo);
430 }
431
432 /*
433 * @tc.name: OH_Drawing_ShaderEffectCreateCompose002
434 * @tc.desc: test for creates an <b>OH_Drawing_ShaderEffect</b> that generates a shader by two shaders.
435 * @tc.type: FUNC
436 * @tc.require: IAYWTV
437 */
438 HWTEST_F(NativeDrawingShaderEffectTest, OH_Drawing_ShaderEffectCreateCompose002, TestSize.Level1)
439 {
440 uint32_t gColors[] = { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFF000000 };
441 float_t gPos[] = { 0.25f, 0.75f }; // 0.25f: gradient color points, 0.75f: gradient color points
442 float radius = 200; // 200: gradient color radius
443 float x = 200; // 200: x coordinate
444 float y = 200; // 200: y coordinate
445 OH_Drawing_Point* centerPt = OH_Drawing_PointCreate(x, y);
446 OH_Drawing_ShaderEffect* srcEffect =
447 OH_Drawing_ShaderEffectCreateRadialGradient(centerPt, radius, gColors, gPos, 1, OH_Drawing_TileMode::REPEAT);
448 ASSERT_TRUE(srcEffect != nullptr);
449
450 x = 500; // 500: x coordinate
451 y = 500; // 500: y coordinate
452 OH_Drawing_Point* centerPtT = OH_Drawing_PointCreate(x, y);
453 OH_Drawing_ShaderEffect* dstEffect =
454 OH_Drawing_ShaderEffectCreateRadialGradient(centerPtT, radius, gColors, gPos, 1, OH_Drawing_TileMode::REPEAT);
455 ASSERT_TRUE(dstEffect != nullptr);
456
457 OH_Drawing_ShaderEffect* effect =
458 OH_Drawing_ShaderEffectCreateCompose(nullptr, srcEffect, OH_Drawing_BlendMode::BLEND_MODE_SRC);
459 EXPECT_EQ(effect, nullptr);
460
461 effect = OH_Drawing_ShaderEffectCreateCompose(dstEffect, nullptr, OH_Drawing_BlendMode::BLEND_MODE_SRC);
462 EXPECT_EQ(effect, nullptr);
463
464 OH_Drawing_ShaderEffectDestroy(srcEffect);
465 OH_Drawing_ShaderEffectDestroy(dstEffect);
466 OH_Drawing_PointDestroy(centerPt);
467 OH_Drawing_PointDestroy(centerPtT);
468 }
469 } // namespace Drawing
470 } // namespace Rosen
471 } // namespace OHOS