• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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