1/*
2 * Copyright (c) 2022-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 "gtest/gtest.h"
17
18#include "drawing_bitmap.h"
19#include "drawing_types.h"
20
21using namespace testing;
22using namespace testing::ext;
23
24namespace OHOS {
25namespace Rosen {
26namespace Drawing {
27class NativeDrawingBitmapTest : public testing::Test {
28public:
29    static void SetUpTestCase();
30    static void TearDownTestCase();
31    void SetUp() override;
32    void TearDown() override;
33    protected:
34        OH_Drawing_Bitmap* bitmap_ = nullptr;
35};
36
37void NativeDrawingBitmapTest::SetUpTestCase() {}
38void NativeDrawingBitmapTest::TearDownTestCase() {}
39void NativeDrawingBitmapTest::SetUp()
40{
41    bitmap_ = OH_Drawing_BitmapCreate();
42    ASSERT_NE(bitmap_, nullptr);
43}
44
45void NativeDrawingBitmapTest::TearDown()
46{
47    if (bitmap_ != nullptr) {
48        OH_Drawing_BitmapDestroy(bitmap_);
49        bitmap_ = nullptr;
50    }
51}
52
53/*
54 * @tc.name: NativeDrawingBitmapTest_bitmapBuild001
55 * @tc.desc: test for drawing_bitmap build.
56 * @tc.size  : MediumTest
57 * @tc.type  : Function
58 * @tc.level : Level 1
59 */
60HWTEST_F(NativeDrawingBitmapTest, NativeDrawingBitmapTest_bitmapBuild001, TestSize.Level1)
61{
62    const unsigned int width = 500;
63    const unsigned int height = 500;
64    OH_Drawing_BitmapFormat bitmapFormat { COLOR_FORMAT_ALPHA_8, ALPHA_FORMAT_PREMUL };
65    OH_Drawing_BitmapBuild(bitmap_, width, height, &bitmapFormat);
66    EXPECT_EQ(width, OH_Drawing_BitmapGetWidth(bitmap_));
67    EXPECT_EQ(height, OH_Drawing_BitmapGetHeight(bitmap_));
68}
69
70/*
71 * @tc.name: NativeDrawingBitmapTest_bitmapBuild002
72 * @tc.desc: test for drawing_bitmap build.
73 * @tc.size  : MediumTest
74 * @tc.type  : Function
75 * @tc.level : Level 1
76 */
77HWTEST_F(NativeDrawingBitmapTest, NativeDrawingBitmapTest_bitmapBuild002, TestSize.Level1)
78{
79    const unsigned int width = 0;
80    const unsigned int height = 0;
81    OH_Drawing_BitmapFormat bitmapFormat { COLOR_FORMAT_RGB_565, ALPHA_FORMAT_OPAQUE };
82    OH_Drawing_BitmapBuild(bitmap_, width, height, &bitmapFormat);
83    EXPECT_EQ(width, OH_Drawing_BitmapGetWidth(bitmap_));
84    EXPECT_EQ(height, OH_Drawing_BitmapGetHeight(bitmap_));
85}
86
87/*
88 * @tc.name: NativeDrawingBitmapTest_bitmapBuild003
89 * @tc.desc: test for drawing_bitmap build.
90 * @tc.size  : MediumTest
91 * @tc.type  : Function
92 * @tc.level : Level 1
93 */
94HWTEST_F(NativeDrawingBitmapTest, NativeDrawingBitmapTest_bitmapBuild003, TestSize.Level1)
95{
96    const unsigned int width = 500;
97    const unsigned int height = 500;
98    OH_Drawing_BitmapFormat bitmapFormat { COLOR_FORMAT_ARGB_4444, ALPHA_FORMAT_UNPREMUL };
99    OH_Drawing_BitmapBuild(bitmap_, width, height, &bitmapFormat);
100    EXPECT_EQ(width, OH_Drawing_BitmapGetWidth(bitmap_));
101    EXPECT_EQ(height, OH_Drawing_BitmapGetHeight(bitmap_));
102    EXPECT_EQ(OH_Drawing_BitmapGetPixels(bitmap_) == nullptr, false);
103}
104
105/*
106 * @tc.name: NativeDrawingBitmapTest_bitmapBuild004
107 * @tc.desc: test for drawing_bitmap build.
108 * @tc.size  : MediumTest
109 * @tc.type  : Function
110 * @tc.level : Level 1
111 */
112HWTEST_F(NativeDrawingBitmapTest, NativeDrawingBitmapTest_bitmapBuild004, TestSize.Level1)
113{
114    const unsigned int width = 500;
115    const unsigned int height = 500;
116    OH_Drawing_BitmapFormat bitmapFormat { COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_UNPREMUL };
117    OH_Drawing_BitmapBuild(bitmap_, width, height, &bitmapFormat);
118    EXPECT_EQ(width, OH_Drawing_BitmapGetWidth(bitmap_));
119    EXPECT_EQ(height, OH_Drawing_BitmapGetHeight(bitmap_));
120}
121
122/*
123 * @tc.name: NativeDrawingBitmapTest_bitmapCreateFromPixels005
124 * @tc.desc: test for OH_Drawing_BitmapCreateFromPixels.
125 * @tc.size  : MediumTest
126 * @tc.type  : Function
127 * @tc.level : Level 1
128 */
129HWTEST_F(NativeDrawingBitmapTest, NativeDrawingBitmapTest_bitmapCreateFromPixels005, TestSize.Level1)
130{
131    OH_Drawing_Image_Info imageInfo;
132    OH_Drawing_Bitmap* bitmap = OH_Drawing_BitmapCreate();
133    EXPECT_NE(bitmap, nullptr);
134    OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
135    constexpr uint32_t width = 200;
136    constexpr uint32_t height = 200;
137    OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
138    void* pixels = OH_Drawing_BitmapGetPixels(bitmap);
139    EXPECT_NE(pixels, nullptr);
140    uint32_t rowBytes = width * height * 4;
141    bitmap_ = OH_Drawing_BitmapCreateFromPixels(&imageInfo, pixels, rowBytes);
142    EXPECT_NE(bitmap_, nullptr);
143    bitmap_ = OH_Drawing_BitmapCreateFromPixels(&imageInfo, pixels, 0);
144    EXPECT_EQ(bitmap_, nullptr);
145    bitmap_ = OH_Drawing_BitmapCreateFromPixels(&imageInfo, nullptr, 0);
146    EXPECT_EQ(bitmap_, nullptr);
147    bitmap_ = OH_Drawing_BitmapCreateFromPixels(nullptr, nullptr, 0);
148    EXPECT_EQ(bitmap_, nullptr);
149}
150/*
151 * @tc.name: NativeDrawingBitmapTest_bitmapGetImageInfo006
152 * @tc.desc: test for drawing_bitmapGetImageInfo.
153 * @tc.size  : MediumTest
154 * @tc.type  : Function
155 * @tc.level : Level 1
156 */
157HWTEST_F(NativeDrawingBitmapTest, NativeDrawingBitmapTest_bitmapGetImageInfo006, TestSize.Level1)
158{
159    const unsigned int width = 500;
160    const unsigned int height = 500;
161    OH_Drawing_BitmapFormat bitmapFormat { COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_UNPREMUL };
162    OH_Drawing_BitmapBuild(bitmap_, width, height, &bitmapFormat);
163    OH_Drawing_Image_Info* imageInfo = new OH_Drawing_Image_Info();
164    OH_Drawing_BitmapGetImageInfo(bitmap_, imageInfo);
165    EXPECT_EQ(width, imageInfo->width);
166    EXPECT_EQ(height, imageInfo->height);
167}
168
169/*
170 * @tc.name: NativeDrawingBitmapTest_BitmapReadPixels007
171 * @tc.desc: test for drawing_BitmapReadPixels.
172 * @tc.size  : MediumTest
173 * @tc.type  : Function
174 * @tc.level : Level 1
175 */
176HWTEST_F(NativeDrawingBitmapTest, NativeDrawingBitmapTest_BitmapReadPixels007, TestSize.Level1)
177{
178    const unsigned int width = 500;
179    const unsigned int height = 500;
180    OH_Drawing_BitmapFormat bitmapFormat {COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_UNPREMUL};
181    OH_Drawing_BitmapBuild(bitmap_, width, height, &bitmapFormat);
182    OH_Drawing_Image_Info imageInfo {width, height, COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_UNPREMUL};
183    void* pixels = new uint32_t[width * height];
184    bool res = OH_Drawing_BitmapReadPixels(nullptr, nullptr, nullptr, width * 4, 0, 0);
185    EXPECT_EQ(res, false);
186    res = OH_Drawing_BitmapReadPixels(nullptr, &imageInfo, pixels, width * 4, 0, 0);
187    EXPECT_EQ(res, false);
188    res = OH_Drawing_BitmapReadPixels(bitmap_, nullptr, pixels, width * 4, 0, 0);
189    EXPECT_EQ(res, false);
190    res = OH_Drawing_BitmapReadPixels(bitmap_, &imageInfo, nullptr, width * 4, 0, 0);
191    EXPECT_EQ(res, false);
192    res = OH_Drawing_BitmapReadPixels(bitmap_, &imageInfo, pixels, width * 4, 0, 0);
193    EXPECT_EQ(res, true);
194    if (pixels != nullptr) {
195        delete[] reinterpret_cast<uint32_t*>(pixels);
196        pixels = nullptr;
197    }
198}
199
200/*
201 * @tc.name: NativeDrawingBitmapTest_GetColorFormat008
202 * @tc.desc: test for drawing_BitmapGetColorFormat.
203 * @tc.size  : MediumTest
204 * @tc.type  : Function
205 * @tc.level : Level 1
206 */
207HWTEST_F(NativeDrawingBitmapTest, NativeDrawingBitmapTest_GetColorFormat008, TestSize.Level1)
208{
209    const unsigned int width = 500;
210    const unsigned int height = 500;
211    OH_Drawing_ColorFormat formats[] = {
212        COLOR_FORMAT_UNKNOWN,
213        COLOR_FORMAT_ALPHA_8,
214        COLOR_FORMAT_RGB_565,
215        COLOR_FORMAT_ARGB_4444,
216        COLOR_FORMAT_RGBA_8888,
217        COLOR_FORMAT_BGRA_8888
218    };
219
220    OH_Drawing_AlphaFormat alphaFormats[] = {
221        ALPHA_FORMAT_UNKNOWN,
222        ALPHA_FORMAT_OPAQUE,
223        ALPHA_FORMAT_PREMUL,
224        ALPHA_FORMAT_UNPREMUL
225    };
226    OH_Drawing_ColorFormat colorFormat_;
227    for (int i = 1; i < 6; i++) {
228        OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
229        OH_Drawing_BitmapFormat bitmapFormat = {formats[i], alphaFormats[2]};
230        OH_Drawing_BitmapBuild(bitmap, width, height, &bitmapFormat);
231        if (bitmap == nullptr) {
232            colorFormat_ = OH_Drawing_BitmapGetColorFormat(bitmap);
233            EXPECT_EQ(colorFormat_, formats[0]);
234        }
235        colorFormat_ = OH_Drawing_BitmapGetColorFormat(bitmap);
236        EXPECT_EQ(colorFormat_, formats[i]);
237    }
238}
239
240/*
241 * @tc.name: NativeDrawingBitmapTest_GetAlphaFormat009
242 * @tc.desc: test for drawing_BitmapGetAlphaFormat.
243 * @tc.size  : MediumTest
244 * @tc.type  : Function
245 * @tc.level : Level 1
246 */
247HWTEST_F(NativeDrawingBitmapTest, NativeDrawingBitmapTest_GetAlphaFormat009, TestSize.Level1)
248{
249    const unsigned int width = 500;
250    const unsigned int height = 500;
251    OH_Drawing_ColorFormat formats[] = {
252        COLOR_FORMAT_UNKNOWN,
253        COLOR_FORMAT_ALPHA_8,
254        COLOR_FORMAT_RGB_565,
255        COLOR_FORMAT_ARGB_4444,
256        COLOR_FORMAT_RGBA_8888,
257        COLOR_FORMAT_BGRA_8888
258    };
259
260    OH_Drawing_AlphaFormat alphaFormats[] = {
261        ALPHA_FORMAT_UNKNOWN,
262        ALPHA_FORMAT_OPAQUE,
263        ALPHA_FORMAT_PREMUL,
264        ALPHA_FORMAT_UNPREMUL
265    };
266    OH_Drawing_AlphaFormat alphaFormat_;
267    for (int i = 1; i < 4; i++) {
268        OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
269        OH_Drawing_BitmapFormat bitmapFormat = {formats[3], alphaFormats[i]};
270        OH_Drawing_BitmapBuild(bitmap, width, height, &bitmapFormat);
271        if (bitmap == nullptr) {
272            alphaFormat_ = OH_Drawing_BitmapGetAlphaFormat(bitmap);
273            EXPECT_EQ(alphaFormat_, alphaFormats[0]);
274        }
275        alphaFormat_ = OH_Drawing_BitmapGetAlphaFormat(bitmap);
276        EXPECT_EQ(alphaFormat_, alphaFormats[i]);
277    }
278}
279} // namespace Drawing
280} // namespace Rosen
281} // namespace OHOS