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