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 "filltypes.h"
16
17 #include <array>
18 #include <native_drawing/drawing_brush.h>
19 #include <native_drawing/drawing_color.h>
20 #include <native_drawing/drawing_font.h>
21 #include <native_drawing/drawing_matrix.h>
22 #include <native_drawing/drawing_path.h>
23 #include <native_drawing/drawing_pen.h>
24 #include <native_drawing/drawing_text_blob.h>
25
26 #include "test_common.h"
27
FillType()28 FillType::FillType()
29 {
30 bitmapWidth_ = 835; // 835 is bitmapWidth
31 bitmapHeight_ = 840; // 840 is bitmapHeight
32 fileName_ = "filltypes";
33 }
34
showPath(OH_Drawing_Canvas * canvas,DATA_PARAM param,OH_Drawing_Brush * brush)35 void FillType::showPath(OH_Drawing_Canvas* canvas, DATA_PARAM param, OH_Drawing_Brush* brush)
36 {
37 int x = param.x;
38 int y = param.y;
39 OH_Drawing_PathFillType ft = param.ft;
40 float scale = param.scale;
41
42 float right = 150; // 150 矩阵创建参数
43 float bottom = 150; // 150 矩阵创建参数
44 OH_Drawing_Rect* rectAngLe = OH_Drawing_RectCreate(0, 0, right, bottom); // 0, 0, 创建矩阵对象参数
45 OH_Drawing_CanvasSave(canvas);
46 OH_Drawing_CanvasTranslate(canvas, x, y);
47 OH_Drawing_CanvasClipRect(canvas, rectAngLe, OH_Drawing_CanvasClipOp::INTERSECT, false);
48 // 使用指定白色清空画布底色
49 OH_Drawing_CanvasClear(canvas, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0xFF, 0xFF));
50
51 OH_Drawing_PathSetFillType(path, ft);
52 // 其中这里平移画布的x=rectAngLe.left + rectAngLe.right.y=rectAngLe.top + rectAngLe.bottom
53 OH_Drawing_CanvasTranslate(canvas, right * 0.5, bottom * 0.5); // 0.5 0.5 平移到中点
54 OH_Drawing_CanvasScale(canvas, scale, scale);
55 OH_Drawing_CanvasTranslate(canvas, -(right * 0.5), -(bottom * 0.5)); // 0.5 0.5 平移到中点
56 // 上画布
57 OH_Drawing_CanvasAttachBrush(canvas, brush);
58 OH_Drawing_CanvasDrawPath(canvas, path);
59 OH_Drawing_CanvasDetachBrush(canvas);
60 OH_Drawing_CanvasRestore(canvas);
61 OH_Drawing_RectDestroy(rectAngLe);
62 }
63
64 // FillTypeGM::showFour 左上角、右上角、左下角、右下角四个为一组选择枚举类型进行变换
showFour(OH_Drawing_Canvas * canvas,float scale,OH_Drawing_Brush * brush)65 void FillType::showFour(OH_Drawing_Canvas* canvas, float scale, OH_Drawing_Brush* brush)
66 {
67 showPath(canvas, { 0, 0, OH_Drawing_PathFillType::PATH_FILL_TYPE_WINDING, scale }, brush); // 0, 0 showPath
68 showPath(canvas, { 200, 0, OH_Drawing_PathFillType::PATH_FILL_TYPE_EVEN_ODD, scale }, brush); // 200, 0 showPath
69 showPath(
70 canvas, { 0, 200, OH_Drawing_PathFillType::PATH_FILL_TYPE_INVERSE_WINDING, scale }, brush); // 0, 200 showPath
71 showPath(canvas, { 200, 200, OH_Drawing_PathFillType::PATH_FILL_TYPE_INVERSE_EVEN_ODD, scale },
72 brush); // 200, 200 showPath
73 }
74
OnTestFunction(OH_Drawing_Canvas * canvas)75 void FillType::OnTestFunction(OH_Drawing_Canvas* canvas)
76 {
77 // 创建画刷brush对象
78 OH_Drawing_Brush* brush = OH_Drawing_BrushCreate();
79 // 使用指定颜色设置清空画布底色:
80 // sk源代码色度是0xFFDDDDDD为RGB221图像出来0xFFD9D9D9灰度RGB217,测试功能代码设置xFFD9D9D9
81 OH_Drawing_CanvasClear(canvas, 0xFFDDDDDD);
82 // 创建矩形对象并将弧添加到路径中
83 float x = 50; // 50 矩阵创建参数
84 float y = 50; // 50 矩阵创建参数
85 float r = 45; // 45 矩阵创建参数
86 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(x - r, y - r, x + r, y + r);
87 x = 100; // 100 矩阵创建参数
88 y = 100; // 100 矩阵创建参数
89 r = 45; // 45矩阵创建参数
90 OH_Drawing_Rect* rects = OH_Drawing_RectCreate(x - r, y - r, x + r, y + r);
91 float startAngle = 0; // 0 PathAddArc参数
92 float sweepAngle = 360.0; // 360.0 PathAddArc参数
93 path = OH_Drawing_PathCreate();
94 OH_Drawing_PathAddArc(path, rect, startAngle, sweepAngle);
95 OH_Drawing_PathAddArc(path, rects, startAngle, sweepAngle);
96
97 OH_Drawing_CanvasTranslate(canvas, 20, 20); // 20,20 Indicates the distance to translate on x-axis、y-axis
98 const float scale = 1.25; // 1.25:左侧两个与右侧两个的图像放大缩小
99 OH_Drawing_BrushSetAntiAlias(brush, false);
100 showFour(canvas, 1.0, brush); // 1.0 scale
101 OH_Drawing_CanvasTranslate(canvas, 450, 0); // 450, 0 Translate参数
102 showFour(canvas, scale, brush);
103 OH_Drawing_BrushSetAntiAlias(brush, true);
104 OH_Drawing_CanvasTranslate(canvas, -450, 450); //-450, 450 Translate参数
105 showFour(canvas, 1.0, brush); // 1.0 scale
106 OH_Drawing_CanvasTranslate(canvas, 450, 0); // 450, 0 Translate参数
107 showFour(canvas, scale, brush);
108
109 OH_Drawing_RectDestroy(rect);
110 OH_Drawing_RectDestroy(rects);
111 OH_Drawing_CanvasDetachBrush(canvas);
112 OH_Drawing_BrushDestroy(brush);
113 OH_Drawing_PathDestroy(path);
114 path = nullptr;
115 }
116