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
69 OH_Drawing_PointDestroy(startPt);
70 OH_Drawing_PointDestroy(endPt);
71 }
72
73 /*
74 * @tc.name: OH_Drawing_ShaderEffectCreateRadialGradient
75 * @tc.desc: Test OH_Drawing_ShaderEffectCreateRadialGradient
76 * @tc.type: FUNC
77 */
78 HWTEST_F(NativeDrawingShaderEffectTest, OH_Drawing_ShaderEffectCreateRadialGradient001, TestSize.Level1)
79 {
80 OH_Drawing_ShaderEffect* effect =
81 OH_Drawing_ShaderEffectCreateRadialGradient(nullptr, 1, nullptr, nullptr, 1, OH_Drawing_TileMode::CLAMP);
82 ASSERT_TRUE(effect == nullptr);
83 uint32_t gColors[] = { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFF000000 };
84 float_t gPos[] = { 0.25f, 0.75f };
85 float radius = 200;
86 float x = 200;
87 float y = 200;
88 OH_Drawing_Point* centerPt = OH_Drawing_PointCreate(x, y);
89 OH_Drawing_ShaderEffect* effect1 =
90 OH_Drawing_ShaderEffectCreateRadialGradient(centerPt, radius, gColors, gPos, 1, OH_Drawing_TileMode::REPEAT);
91 ASSERT_TRUE(effect1 != nullptr);
92 OH_Drawing_ShaderEffectCreateRadialGradient(nullptr, radius, gColors, gPos, 1, OH_Drawing_TileMode::REPEAT);
93 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
94 OH_Drawing_ShaderEffectCreateRadialGradient(centerPt, radius, nullptr, gPos, 1, OH_Drawing_TileMode::REPEAT);
95 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
96 }
97
98 /*
99 * @tc.name: OH_Drawing_ShaderEffectCreateImageShader
100 * @tc.desc: Test OH_Drawing_ShaderEffectCreateImageShader
101 * @tc.type: FUNC
102 */
103 HWTEST_F(NativeDrawingShaderEffectTest, OH_Drawing_ShaderEffectCreateImageShader, TestSize.Level1)
104 {
105 OH_Drawing_Image* image = OH_Drawing_ImageCreate();
106 ASSERT_TRUE(image != nullptr);
107 OH_Drawing_SamplingOptions* options = OH_Drawing_SamplingOptionsCreate(FILTER_MODE_LINEAR, MIPMAP_MODE_LINEAR);
108 ASSERT_TRUE(options != nullptr);
109 OH_Drawing_Matrix* matrix = nullptr;
110 OH_Drawing_ShaderEffect* effect = OH_Drawing_ShaderEffectCreateImageShader(image, CLAMP, CLAMP, options, matrix);
111 ASSERT_TRUE(effect != nullptr);
112 OH_Drawing_ShaderEffectCreateImageShader(nullptr, CLAMP, CLAMP, options, matrix);
113 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
114 OH_Drawing_ShaderEffectCreateImageShader(image, CLAMP, CLAMP, nullptr, matrix);
115 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
116 }
117
118 /*
119 * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateLinearGradientWithLocalMatrix001
120 * @tc.desc: test for creates an <b>OH_Drawing_ShaderEffect</b> that generates a linear gradient between
121 * the two specified points.
122 * @tc.type: FUNC
123 * @tc.require: AR000GTO5R
124 */
125 HWTEST_F(NativeDrawingShaderEffectTest,
126 NativeDrawingShaderEffectTest_ShaderEffectCreateLinearGradientWithLocalMatrix001, TestSize.Level1)
127 {
128 float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
129 OH_Drawing_Point2D start = {0, 0};
130 OH_Drawing_Point2D end = {100.f, 0}; // 100.f: end point's x
131 EXPECT_EQ(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
132 &start, &end, nullptr, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
133
134 uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
135 EXPECT_EQ(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
136 &start, nullptr, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
137 EXPECT_NE(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
138 &start, &end, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
139 }
140
141 /*
142 * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateRadialGradientWithLocalMatrix002
143 * @tc.desc: test for creates an <b>OH_Drawing_ShaderEffect</b> that generates a linear gradient between
144 * the two specified points.
145 * @tc.type: FUNC
146 * @tc.require: AR000GTO5R
147 */
148 HWTEST_F(NativeDrawingShaderEffectTest,
149 NativeDrawingShaderEffectTest_ShaderEffectCreateRadialGradientWithLocalMatrix002, TestSize.Level1)
150 {
151 float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
152 float radius = 5.0; // 5.0f: gradient color radius
153 OH_Drawing_Point2D start = {100.f, 0}; // 100.f: start point's x
154 EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
155 &start, radius, nullptr, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
156
157 uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
158 EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
159 nullptr, radius, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
160 EXPECT_NE(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
161 &start, radius, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
162 }
163
164 /*
165 * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateTwoPointConicalGradient003
166 * @tc.desc: test for greates an <b>OH_Drawing_ShaderEffect</b> that generates a conical gradient given two circles.
167 * @tc.type: FUNC
168 * @tc.require: AR000GTO5R
169 */
170 HWTEST_F(NativeDrawingShaderEffectTest, NativeDrawingShaderEffectTest_ShaderEffectCreateTwoPointConicalGradient003,
171 TestSize.Level1)
172 {
173 OH_Drawing_Point2D startPt = {0, 0};
174 OH_Drawing_Point2D endPt = {100.f, 0}; // 100.f: end point's x
175 uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
176 float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
177 float startRadius = 5.0f, endRadius = 10.0f; // 5.0f: gradient color radius, 10.0f: gradient color radius
178 EXPECT_EQ(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, nullptr, endRadius, colors,
179 pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
180 EXPECT_EQ(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, &endPt, endRadius, nullptr,
181 pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
182 EXPECT_NE(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, &endPt, endRadius, colors,
183 pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
184 }
185
186 /*
187 * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateColorShader004
188 * @tc.desc: test for creates an <b>OH_Drawing_ShaderEffect</b> that generates a shader with single color.
189 * @tc.type: FUNC
190 * @tc.require: AR000GTO5R
191 */
192 HWTEST_F(NativeDrawingShaderEffectTest, NativeDrawingShaderEffectTest_ShaderEffectCreateColorShader004,
193 TestSize.Level1)
194 {
195 const uint32_t color = 0xFFFF0000;
196 OH_Drawing_ShaderEffect * colorShaderEffect = OH_Drawing_ShaderEffectCreateColorShader(color);
197 EXPECT_NE(colorShaderEffect, nullptr);
198 OH_Drawing_ShaderEffectDestroy(colorShaderEffect);
199 }
200 } // namespace Drawing
201 } // namespace Rosen
202 } // namespace OHOS