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