1 /*
2 * Copyright (c) 2025 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
16 #include <native_drawing/drawing_image.h>
17 #include <native_drawing/drawing_text_typography.h>
18 #include <native_drawing/drawing_rect.h>
19 #include <native_drawing/drawing_point.h>
20 #include <native_drawing/drawing_region.h>
21 #include <native_drawing/drawing_round_rect.h>
22 #include <native_drawing/drawing_sampling_options.h>
23 #include <native_drawing/drawing_pixel_map.h>
24 #include <native_drawing/drawing_text_blob.h>
25 #include <native_drawing/drawing_shader_effect.h>
26 #include <native_drawing/drawing_gpu_context.h>
27 #include <native_drawing/drawing_surface.h>
28 #include <native_drawing/drawing_path_effect.h>
29 #include <native_drawing/drawing_color_filter.h>
30 #include <native_drawing/drawing_filter.h>
31 #include <native_drawing/drawing_image_filter.h>
32 #include <native_drawing/drawing_mask_filter.h>
33 #include <native_drawing/drawing_matrix.h>
34 #include "sample_graphics.h"
35 #include "common/log_common.h"
36
DrawCreateCanvas(OH_Drawing_Canvas * canvas)37 void SampleGraphics::DrawCreateCanvas(OH_Drawing_Canvas *canvas)
38 {
39 OH_Drawing_Bitmap* bitmap = OH_Drawing_BitmapCreate();
40 OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
41 uint64_t width = width_ / 2;
42 uint64_t height = height_ / 2;
43 OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
44 // 创建一个canvas对象
45 OH_Drawing_Canvas* newCanvas = OH_Drawing_CanvasCreate();
46 // 将画布与bitmap绑定,画布画的内容会输出到绑定的bitmap内存中
47 OH_Drawing_CanvasBind(newCanvas, bitmap);
48 // 使用红色清除画布内容
49 OH_Drawing_CanvasClear(newCanvas, OH_Drawing_ColorSetArgb(rgbaHalf_, rgbaMax_, rgbaMin_, rgbaMin_));
50 // 获取画布宽高
51 SAMPLE_LOGI("Canvas-->width=%{public}d,height=%{public}d", OH_Drawing_CanvasGetWidth(newCanvas),
52 OH_Drawing_CanvasGetHeight(newCanvas));
53 OH_Drawing_CanvasDrawBitmap(canvas, bitmap, 0, 0);
54 OH_Drawing_CanvasDestroy(newCanvas);
55 OH_Drawing_BitmapDestroy(bitmap);
56 }
57
DrawCanvasConcatMatrix(OH_Drawing_Canvas * canvas)58 void SampleGraphics::DrawCanvasConcatMatrix(OH_Drawing_Canvas *canvas)
59 {
60 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
61 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
62 OH_Drawing_PenSetWidth(pen, value10_);
63 OH_Drawing_CanvasAttachPen(canvas, pen);
64 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value600_, value500_);
65 // 绘制原始矩形
66 OH_Drawing_CanvasDrawRect(canvas, rect);
67 OH_Drawing_Matrix *matrix1 = OH_Drawing_MatrixCreateTranslation(value300_, value300_);
68 // 对画布进行矩阵操作
69 OH_Drawing_CanvasConcatMatrix(canvas, matrix1);
70 // 绘制变换后的矩形
71 OH_Drawing_CanvasDrawRect(canvas, rect);
72 OH_Drawing_Matrix *matrix2 = OH_Drawing_MatrixCreate();
73 OH_Drawing_CanvasGetTotalMatrix(canvas, matrix2);
74 SAMPLE_LOGI("Canvas-->MatrixIsEqual=%{public}d", OH_Drawing_MatrixIsEqual(matrix1, matrix2) ? 1 : 0);
75 OH_Drawing_CanvasDetachBrush(canvas);
76 OH_Drawing_RectDestroy(rect);
77 OH_Drawing_MatrixDestroy(matrix1);
78 OH_Drawing_MatrixDestroy(matrix2);
79 OH_Drawing_PenDestroy(pen);
80 }
81
DrawClipOperation(OH_Drawing_Canvas * canvas)82 void SampleGraphics::DrawClipOperation(OH_Drawing_Canvas *canvas)
83 {
84 OH_Drawing_Brush *brush = OH_Drawing_BrushCreate();
85 OH_Drawing_BrushSetColor(brush, 0xff0000ff);
86 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value200_, value200_, value1000_, value1000_);
87 // 裁剪矩形区域
88 OH_Drawing_CanvasClipRect(canvas, rect, OH_Drawing_CanvasClipOp::INTERSECT, true);
89 OH_Drawing_Rect* rect2 = OH_Drawing_RectCreate(0, 0, 0, 0);
90 OH_Drawing_CanvasGetLocalClipBounds(canvas, rect2);
91 SAMPLE_LOGI("Canvas-->ClipBounds:top=%{public}f,left=%{public}f,right=%{public}f,bottom=%{public}f",
92 OH_Drawing_RectGetTop(rect2), OH_Drawing_RectGetLeft(rect2), OH_Drawing_RectGetRight(rect2),
93 OH_Drawing_RectGetBottom(rect2));
94 OH_Drawing_Path *path = OH_Drawing_PathCreate();
95 OH_Drawing_PathAddCircle(path, value200_, value200_, value400_, PATH_DIRECTION_CCW);
96 // 裁剪圆形区域
97 OH_Drawing_CanvasClipPath(canvas, path, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
98 // 绘制背景
99 OH_Drawing_CanvasDrawBackground(canvas, brush);
100 OH_Drawing_BrushDestroy(brush);
101 OH_Drawing_PathDestroy(path);
102 OH_Drawing_RectDestroy(rect);
103 OH_Drawing_RectDestroy(rect2);
104 }
105
CanvasSaveOperation(OH_Drawing_Canvas * canvas)106 void SampleGraphics::CanvasSaveOperation(OH_Drawing_Canvas *canvas)
107 {
108 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
109 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
110 OH_Drawing_PenSetWidth(pen, value10_);
111 OH_Drawing_CanvasAttachPen(canvas, pen);
112 // 保存当前画布状态
113 OH_Drawing_CanvasSave(canvas);
114 // 平移
115 OH_Drawing_CanvasTranslate(canvas, 0.f, value200_);
116 // 保存当前画布状态
117 OH_Drawing_CanvasSave(canvas);
118 // 获取画布状态数量
119 SAMPLE_LOGI("Canvas-->saveCount=%{public}d", OH_Drawing_CanvasGetSaveCount(canvas));
120 // 放大
121 OH_Drawing_CanvasScale(canvas, 2.f, 2.f);
122 OH_Drawing_Point* point = OH_Drawing_PointCreate(value300_, value300_);
123 // 绘制圆形(经过放大和移动)
124 OH_Drawing_CanvasDrawCircle(canvas, point, value100_);
125 // 恢复操作
126 OH_Drawing_CanvasRestore(canvas);
127 // 绘制圆形(仅经过移动)
128 OH_Drawing_CanvasDrawCircle(canvas, point, value100_);
129 // 恢复操作至最初状态
130 OH_Drawing_CanvasRestoreToCount(canvas, 0);
131 // 绘制圆形(原始状态)
132 OH_Drawing_CanvasDrawCircle(canvas, point, value100_);
133 OH_Drawing_CanvasDetachPen(canvas);
134 OH_Drawing_PenDestroy(pen);
135 OH_Drawing_PointDestroy(point);
136 }
137
CanvasSaveLayerOperation(OH_Drawing_Canvas * canvas)138 void SampleGraphics::CanvasSaveLayerOperation(OH_Drawing_Canvas *canvas)
139 {
140 OH_Drawing_Brush* brush1 = OH_Drawing_BrushCreate();
141 OH_Drawing_BrushSetColor(brush1, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
142 OH_Drawing_CanvasAttachBrush(canvas, brush1);
143 OH_Drawing_Brush* brush2 = OH_Drawing_BrushCreate();
144 // 创建图像滤波器实现模糊效果
145 OH_Drawing_ImageFilter *imageFilter =
146 OH_Drawing_ImageFilterCreateBlur(value30_, value30_, OH_Drawing_TileMode::CLAMP, nullptr);
147 OH_Drawing_Filter *filter = OH_Drawing_FilterCreate();
148 OH_Drawing_FilterSetImageFilter(filter, imageFilter);
149 OH_Drawing_BrushSetFilter(brush2, filter);
150 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0.f, 0.f, width_, height_);
151 // 保存当前画布状态
152 OH_Drawing_CanvasSaveLayer(canvas, rect, brush2);
153 OH_Drawing_Point* point1 = OH_Drawing_PointCreate(value300_, value300_);
154 // 绘制圆形(经过模糊操作)
155 OH_Drawing_CanvasDrawCircle(canvas, point1, value100_);
156 // 恢复操作
157 OH_Drawing_CanvasRestore(canvas);
158 OH_Drawing_Point* point2 = OH_Drawing_PointCreate(value300_, value700_);
159 // 绘制圆形
160 OH_Drawing_CanvasDrawCircle(canvas, point2, value100_);
161 OH_Drawing_CanvasDetachBrush(canvas);
162 // 释放对象
163 OH_Drawing_ImageFilterDestroy(imageFilter);
164 OH_Drawing_BrushDestroy(brush1);
165 OH_Drawing_BrushDestroy(brush2);
166 OH_Drawing_PointDestroy(point1);
167 OH_Drawing_PointDestroy(point2);
168 OH_Drawing_RectDestroy(rect);
169 }
170
DrawRegion(OH_Drawing_Canvas * canvas)171 void SampleGraphics::DrawRegion(OH_Drawing_Canvas *canvas)
172 {
173 OH_Drawing_Brush* brush = OH_Drawing_BrushCreate();
174 OH_Drawing_BrushSetColor(brush, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
175 OH_Drawing_CanvasAttachBrush(canvas, brush);
176 // 矩形区域1
177 OH_Drawing_Region *region1 = OH_Drawing_RegionCreate();
178 OH_Drawing_Rect *rect1 = OH_Drawing_RectCreate(value100_, value100_, value600_, value600_);
179 OH_Drawing_RegionSetRect(region1, rect1);
180 // 矩形区域2
181 OH_Drawing_Region *region2 = OH_Drawing_RegionCreate();
182 OH_Drawing_Rect *rect2 = OH_Drawing_RectCreate(value300_, value300_, value900_, value900_);
183 OH_Drawing_RegionSetRect(region2, rect2);
184 // 两个矩形区域组合
185 OH_Drawing_RegionOp(region1, region2, OH_Drawing_RegionOpMode::REGION_OP_MODE_XOR);
186 OH_Drawing_CanvasDrawRegion(canvas, region1);
187 OH_Drawing_CanvasDetachBrush(canvas);
188 // 销毁各类对象
189 OH_Drawing_BrushDestroy(brush);
190 OH_Drawing_RegionDestroy(region1);
191 OH_Drawing_RegionDestroy(region2);
192 OH_Drawing_RectDestroy(rect1);
193 OH_Drawing_RectDestroy(rect2);
194 }
195