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 }