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, software
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 #include "drawbitmaprect.h"
16 #include <linux/cyclades.h>
17 #include <multimedia/image_framework/image_mdk_common.h>
18 #include <native_drawing/drawing_color.h>
19 #include <native_drawing/drawing_brush.h>
20 #include <native_drawing/drawing_color_filter.h>
21 #include <native_drawing/drawing_filter.h>
22 #include <native_drawing/drawing_image.h>
23 #include <native_drawing/drawing_mask_filter.h>
24 #include <native_drawing/drawing_matrix.h>
25 #include <native_drawing/drawing_path.h>
26 #include <native_drawing/drawing_pen.h>
27 #include <native_drawing/drawing_round_rect.h>
28 #include <native_drawing/drawing_round_rect.h>
29 #include <native_drawing/drawing_shader_effect.h>
30 #include <native_drawing/drawing_point.h>
31 #include <native_drawing/drawing_sampling_options.h>
32 #include <native_drawing/drawing_rect.h>
33 #include <native_drawing/drawing_shader_effect.h>
34 #include "test_common.h"
35 #include "common/log_common.h"
36 
DrawBitmapRect2()37 DrawBitmapRect2::DrawBitmapRect2()
38 {
39     bitmapWidth_ = 640;  // 640宽度
40     bitmapHeight_ = 480; // 480高度
41     fileName_ = "bitmaprect";
42 }
43 
~DrawBitmapRect2()44 DrawBitmapRect2::~DrawBitmapRect2() {}
45 
46 // OH_Drawing_Image *PrecondItions():创建了一个位图(bitmap),并在其上绘制了一个圆形,然后生成了一个图像(image)对象
PrecondItions()47 OH_Drawing_Image *PrecondItions()
48 {
49     DRAWING_LOGI("DrawBitmapRect2::PrecondItions start");
50     // 初始化位图对象
51     uint32_t w = 64;
52     uint32_t h = 64;
53     OH_Drawing_Bitmap *bm = OH_Drawing_BitmapCreate();
54     OH_Drawing_BitmapFormat format = { OH_Drawing_ColorFormat::COLOR_FORMAT_RGBA_8888,
55                                        OH_Drawing_AlphaFormat::ALPHA_FORMAT_PREMUL };
56     OH_Drawing_BitmapBuild(bm, w, h, &format);
57     OH_Drawing_Canvas *bitcanvas = OH_Drawing_CanvasCreate();
58     OH_Drawing_CanvasBind(bitcanvas, bm);
59     OH_Drawing_CanvasClear(bitcanvas, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0x00, 0x00));
60     // 创建一个画刷brush对象设置抗锯齿属性
61     OH_Drawing_Brush *brush = OH_Drawing_BrushCreate();
62     OH_Drawing_BrushSetAntiAlias(brush, true);
63     // 着色器
64     OH_Drawing_Point *startPt = OH_Drawing_PointCreate(0.f, 0.f);
65     OH_Drawing_Point *endPt = OH_Drawing_PointCreate(64.f, 64.f);
66     const uint32_t Color[] = {
67         0xFFFFFFFF,
68         0xFF0000FF,
69     };
70     OH_Drawing_ShaderEffect *shaderEffect =
71         OH_Drawing_ShaderEffectCreateLinearGradient(startPt, endPt, Color, nullptr, 2, OH_Drawing_TileMode::CLAMP);
72     OH_Drawing_BrushSetShaderEffect(brush, shaderEffect);
73     OH_Drawing_CanvasAttachBrush(bitcanvas, brush);
74     // 画圆形
75     OH_Drawing_Point *center = OH_Drawing_PointCreate(32.f, 32.f);
76     float radius = 32;
77     OH_Drawing_CanvasDrawCircle(bitcanvas, center, radius);
78     OH_Drawing_Image *image = OH_Drawing_ImageCreate();
79     OH_Drawing_ImageBuildFromBitmap(image, bm);
80     // 释放内存
81     OH_Drawing_BitmapDestroy(bm);
82     OH_Drawing_ShaderEffectDestroy(shaderEffect);
83     OH_Drawing_CanvasDetachBrush(bitcanvas);
84     OH_Drawing_BrushDestroy(brush);
85     OH_Drawing_CanvasDestroy(bitcanvas);
86     OH_Drawing_PointDestroy(startPt);
87     OH_Drawing_PointDestroy(endPt);
88     OH_Drawing_PointDestroy(center);
89     DRAWING_LOGI("DrawBitmapRect2::The prerequisite ends and returns the OH-Drawing-Image pointer");
90     return image;
91 }
92 
93 // 用例名: bitmaprect
94 // 测试OH_Drawing_CanvasDrawImageRectWithSrc迁移基于源码 gm\bitmaprect.cpp->dm\drawbitmaprect.cpp
OnTestFunction(OH_Drawing_Canvas * canvas)95 void DrawBitmapRect2::OnTestFunction(OH_Drawing_Canvas *canvas)
96 {
97     DRAWING_LOGI("DrawBitmapRect2::OnTestFunction start");
98     OH_Drawing_CanvasClear(canvas, 0xFFCCCCCC);
99 
100     // 其中OH_Drawing_CanvasDrawRect接口实现有问题并未用画笔画出而是用画刷,故这边多了画笔的操作
101     OH_Drawing_Pen *pen = OH_Drawing_PenCreate();
102     OH_Drawing_CanvasAttachPen(canvas, pen);
103 
104     // 创建矩形指针数组
105     OH_Drawing_Rect *arrayRect[4];
106     arrayRect[0] = OH_Drawing_RectCreate(0, 0, 32, 32);     // 0, 0, 32, 32指针数组
107     arrayRect[1] = OH_Drawing_RectCreate(0, 0, 80, 80);     // 0, 0, 80, 80指针数组
108     arrayRect[2] = OH_Drawing_RectCreate(32, 32, 96, 96);   // 32, 32, 96, 96指针数组
109     arrayRect[3] = OH_Drawing_RectCreate(-32, -32, 32, 32); // -32, -32, 32, 32指针数组
110     const size_t ARRAY_SIZE = sizeof(arrayRect) / sizeof(arrayRect[0]);
111     // 创建采样选项对象
112     OH_Drawing_SamplingOptions *option = OH_Drawing_SamplingOptionsCreate(OH_Drawing_FilterMode::FILTER_MODE_NEAREST,
113         OH_Drawing_MipmapMode::MIPMAP_MODE_NONE);
114     // 调用PrecondItions()内返回的(image)对象
115     auto image = PrecondItions();
116     // 开始创建矩形对象并平移
117     OH_Drawing_Rect *dstR = OH_Drawing_RectCreate(0, 200, 128, 380); // 200, 128, 380坐标
118     OH_Drawing_CanvasTranslate(canvas, 16, 40);                      // 16, 40平移距离
119     OH_Drawing_Rect *dst = OH_Drawing_RectCreate(0, 0, 64, 64);      // 64正方形
120     for (size_t i = 0; i < ARRAY_SIZE; ++i) {
121         OH_Drawing_Rect *srcR = arrayRect[i];
122         OH_Drawing_CanvasDrawImageRect(canvas, image, dst, option);
123         OH_Drawing_CanvasDrawImageRectWithSrc(canvas, image, srcR, dstR, option,
124             OH_Drawing_SrcRectConstraint::STRICT_SRC_RECT_CONSTRAINT);
125         // 画矩形
126         OH_Drawing_CanvasDrawRect(canvas, dstR);
127         OH_Drawing_CanvasDrawRect(canvas, srcR);
128         OH_Drawing_CanvasTranslate(canvas, 160, 0); // 160, 0平移距离
129     }
130     OH_Drawing_CanvasDetachPen(canvas);
131     // 释放内存
132     OH_Drawing_RectDestroy(arrayRect[0]);
133     OH_Drawing_RectDestroy(arrayRect[1]); // 1数组
134     OH_Drawing_RectDestroy(arrayRect[2]); // 2数组
135     OH_Drawing_RectDestroy(arrayRect[3]); // 3数组
136     OH_Drawing_SamplingOptionsDestroy(option);
137     OH_Drawing_RectDestroy(dst);
138     OH_Drawing_RectDestroy(dstR);
139     OH_Drawing_ImageDestroy(image);
140     // 释放画笔内存
141     OH_Drawing_PenDestroy(pen);
142     DRAWING_LOGI("DrawBitmapRect2::OnTestFunction end");
143 }
144