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 "add_arc.h"
16 #include <native_drawing/drawing_color.h>
17 #include <native_drawing/drawing_brush.h>
18 #include <native_drawing/drawing_matrix.h>
19 #include <native_drawing/drawing_path.h>
20 #include <native_drawing/drawing_pen.h>
21 #include <native_drawing/drawing_round_rect.h>
22 #include <native_drawing/drawing_round_rect.h>
23 #include <native_drawing/drawing_shader_effect.h>
24 #include <native_drawing/drawing_point.h>
25 #include "test_common.h"
26 #include "common/log_common.h"
27 #include <cmath>
28 #include <unistd.h>
29 
30 
31 #define R 400
32 
33 #define FLOAT_PI 3.14159265f
34 
35 struct RECT {
36     float x;
37     float y;
38     float w;
39     float h;
InsetRECT40     void Inset(float dx, float dy)
41     {
42         x += dx;
43         y += dy;
44         w -= 2 * dx; // 2宽
45         h -= 2 * dy; // 2高
46     }
47 };
48 
49 
AddArcMeas()50 AddArcMeas::AddArcMeas()
51 {
52     // file gm/addarc.cpp
53     bitmapWidth_ = 2 * R + 40;  // 2 * R + 40宽度
54     bitmapHeight_ = 2 * R + 40; // 2 * R + 40高度
55     fileName_ = "addarc_meas";
56 }
57 
~AddArcMeas()58 AddArcMeas::~AddArcMeas() {}
59 
OnTestFunction(OH_Drawing_Canvas * canvas)60 void AddArcMeas::OnTestFunction(OH_Drawing_Canvas *canvas)
61 {
62     OH_Drawing_CanvasTranslate(canvas, R + 20, R + 20); // 20距离
63     OH_Drawing_Pen *pen = OH_Drawing_PenCreate();
64     OH_Drawing_PenSetAntiAlias(pen, true);
65 
66     OH_Drawing_Pen *measPen = OH_Drawing_PenCreate();
67     OH_Drawing_PenSetAntiAlias(measPen, true);
68     OH_Drawing_PenSetColor(measPen, 0xFFFF0000);
69 
70     OH_Drawing_Rect *oval = OH_Drawing_RectCreate(-R, -R, R, R);
71     OH_Drawing_CanvasAttachPen(canvas, pen);
72     OH_Drawing_CanvasDrawOval(canvas, oval);
73     OH_Drawing_CanvasDetachPen(canvas);
74 
75     for (float deg = 0; deg < 360; deg += 10) { // 360,10 cout
76         const float rad = (deg) * (FLOAT_PI / 180);
77         float rx = cosf(rad) * R;
78         float ry = sinf(rad) * R;
79         OH_Drawing_CanvasAttachPen(canvas, pen);
80         OH_Drawing_CanvasDrawLine(canvas, 0, 0, rx, ry);
81         OH_Drawing_CanvasDetachPen(canvas);
82 
83         if (deg != 0) {
84             OH_Drawing_CanvasAttachPen(canvas, measPen);
85             OH_Drawing_CanvasDrawLine(canvas, 0, 0, rx, ry);
86             OH_Drawing_CanvasDetachPen(canvas);
87         }
88     }
89     OH_Drawing_PenDestroy(pen);
90     OH_Drawing_PenDestroy(measPen);
91     OH_Drawing_RectDestroy(oval);
92     pen = nullptr;
93     measPen = nullptr;
94 }
95 
AddArc()96 AddArc::AddArc()
97 {
98     bitmapWidth_ = 1040;  // 1040宽度
99     bitmapHeight_ = 1040; // 1040高度
100     fileName_ = "addarc";
101 }
102 
~AddArc()103 AddArc::~AddArc() {}
104 
OnTestFunction(OH_Drawing_Canvas * canvas)105 void AddArc::OnTestFunction(OH_Drawing_Canvas *canvas)
106 {
107     OH_Drawing_CanvasTranslate(canvas, 20, 20); // 20距离
108     RECT rc = { 0, 0, 1000, 1000 };
109 
110     OH_Drawing_Pen *pen = OH_Drawing_PenCreate();
111     OH_Drawing_PenSetAntiAlias(pen, true);
112     OH_Drawing_PenSetWidth(pen, 15); // 15宽度
113 
114     const float inset = OH_Drawing_PenGetWidth(pen) + 4; // 4 cout
115     const float sweepAngle = 345;
116     TestRend rand;
117     float sign = 1;
118 
119     while (rc.w > OH_Drawing_PenGetWidth(pen) * 3) {                            // 3 cout
120         OH_Drawing_PenSetColor(pen, color_to_565(rand.nextU() | (0xFF << 24))); // 24颜色偏移
121         OH_Drawing_CanvasAttachPen(canvas, pen);
122         float startAngle = rand.nextUScalar1() * 360;
123 
124         float speed = sqrtf(16 / rc.w) * 0.5f;
125         OnAnimate();
126         startAngle += fRotate * 360 * speed * sign; // 360 cout
127         OH_Drawing_Path *path = OH_Drawing_PathCreate();
128         OH_Drawing_Rect *r = OH_Drawing_RectCreate(rc.x, rc.y, rc.x + rc.w, rc.y + rc.h);
129         OH_Drawing_PathAddArc(path, r, startAngle, sweepAngle);
130         OH_Drawing_CanvasDrawPath(canvas, path);
131         rc.Inset(inset, inset);
132         sign = -sign;
133         OH_Drawing_RectDestroy(r);
134         OH_Drawing_PathDestroy(path);
135     }
136     OH_Drawing_PenDestroy(pen);
137     pen = nullptr;
138 }
139 
OnAnimate()140 bool AddArc::OnAnimate()
141 {
142     // dm中这个函数通过onIdle调用,目前drawing测试框架还没有提供这个接口,因此画出的图形在缺口方向上和dm的不同
143     // 通过对源代码运行对这个值的打印,发现是0,经过运行结果对比,发现缺口方向是对的
144     fRotate = 0;
145     return true;
146 }