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 #include "dtk_test_utils.h"
16 #include "text/font.h"
17 #include "text/font_mgr.h"
18 #include "text/font_style.h"
19 #include "text/font_style_set.h"
20
21 namespace OHOS {
22 namespace Rosen {
23 static const float RECT_SIZE = 100.0f;
24 static const float RECT_ROUND_RADIUS = 3.0f;
25 static Drawing::Rect DRAW_RECT = Drawing::Rect(0, 0, RECT_SIZE, RECT_SIZE);
26 static Drawing::RectI DRAW_RECTI = Drawing::RectI(0, 0, RECT_SIZE, RECT_SIZE);
27 std::vector<std::function<void(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
28 Drawing::Image& image)>> TestUtils::gDrawFunctions = {
29 TestUtils::OnDrawPoint, TestUtils::OnDrawPoints, TestUtils::OnDrawLine, TestUtils::OnDrawRect,
30 TestUtils::OnDrawRegion, TestUtils::OnDrawOval, TestUtils::OnDrawRRect, TestUtils::OnDrawDRRect,
31 TestUtils::OnDrawCircle, TestUtils::OnDrawArc, TestUtils::OnDrawPath, TestUtils::OnDrawImageRect,
32 TestUtils::OnDrawImageNine, TestUtils::OnDrawImageLattice, TestUtils::OnDrawTextBlob, TestUtils::OnDrawVertices,
33 TestUtils::OnDrawAtlas, TestUtils::OnDrawPatch};
34
OnDrawPoint(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)35 void TestUtils::OnDrawPoint(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
36 Drawing::Image& image)
37 {
38 pen.SetWidth(RECT_SIZE / 2); // 2: half of rect size
39 playbackCanvas_->AttachPen(pen);
40 playbackCanvas_->DrawPoint(Drawing::Point(RECT_SIZE / 2, RECT_SIZE / 2)); // 2: rect center
41 playbackCanvas_->DetachPen();
42 }
43
OnDrawPoints(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)44 void TestUtils::OnDrawPoints(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
45 Drawing::Image& image)
46 {
47 Drawing::Point pts[2] = {Drawing::Point(25, 25), Drawing::Point(75, 75)};
48 playbackCanvas_->DrawPoints(Drawing::PointMode::LINES_POINTMODE, sizeof(pts) / sizeof(pts[0]), pts);
49 }
50
OnDrawLine(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)51 void TestUtils::OnDrawLine(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
52 Drawing::Image& image)
53 {
54 playbackCanvas_->DrawLine(Drawing::Point(10, 10), Drawing::Point(90, 90)); // 10: point pos, 90: point pos
55 }
56
OnDrawRect(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)57 void TestUtils::OnDrawRect(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
58 Drawing::Image& image)
59 {
60 playbackCanvas_->DrawRect(DRAW_RECT);
61 }
62
OnDrawRegion(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)63 void TestUtils::OnDrawRegion(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
64 Drawing::Image& image)
65 {
66 Drawing::Region region;
67 region.SetRect(DRAW_RECTI);
68 playbackCanvas_->DrawRegion(region);
69 }
70
OnDrawOval(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)71 void TestUtils::OnDrawOval(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
72 Drawing::Image& image)
73 {
74 playbackCanvas_->DrawOval(DRAW_RECT);
75 }
76
OnDrawRRect(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)77 void TestUtils::OnDrawRRect(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
78 Drawing::Image& image)
79 {
80 Drawing::RoundRect rrect = Drawing::RoundRect(DRAW_RECT, RECT_ROUND_RADIUS, RECT_ROUND_RADIUS);
81 playbackCanvas_->DrawRoundRect(rrect);
82 }
83
OnDrawDRRect(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)84 void TestUtils::OnDrawDRRect(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
85 Drawing::Image& image)
86 {
87 Drawing::RoundRect rrect = Drawing::RoundRect(DRAW_RECT, RECT_ROUND_RADIUS, RECT_ROUND_RADIUS);
88 Drawing::RoundRect rrect2 = Drawing::RoundRect(Drawing::Rect(20, 20, RECT_SIZE - 20, RECT_SIZE - 20),
89 RECT_ROUND_RADIUS, RECT_ROUND_RADIUS);
90 playbackCanvas_->DrawNestedRoundRect(rrect, rrect2);
91 }
92
OnDrawCircle(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)93 void TestUtils::OnDrawCircle(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
94 Drawing::Image& image)
95 {
96 playbackCanvas_->DrawCircle(Drawing::Point(RECT_SIZE / 2, RECT_SIZE / 2), RECT_SIZE / 2); // 2: half
97 }
98
OnDrawArc(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)99 void TestUtils::OnDrawArc(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
100 Drawing::Image& image)
101 {
102 playbackCanvas_->DrawArc(Drawing::Rect(15.0f, 15.0f, RECT_SIZE - 15.0f, RECT_SIZE - 15.0f), // 15.0: offset
103 0, 180); // 180: angle
104 }
105
OnDrawPath(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)106 void TestUtils::OnDrawPath(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
107 Drawing::Image& image)
108 {
109 pen.SetWidth(10.0f); // 10.0: pen width
110 Drawing::Path path;
111 path.MoveTo(0, 0);
112 path.LineTo(RECT_SIZE, RECT_SIZE);
113 playbackCanvas_->AttachPen(pen);
114 playbackCanvas_->DrawPath(path);
115 playbackCanvas_->DetachPen();
116 }
117
OnDrawImageRect(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)118 void TestUtils::OnDrawImageRect(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
119 Drawing::Image& image)
120 {
121 Drawing::SamplingOptions sampling = Drawing::SamplingOptions(
122 Drawing::FilterMode::NEAREST, Drawing::MipmapMode::NEAREST);
123 playbackCanvas_->DrawImageRect(image, DRAW_RECT, Drawing::Rect(5, 5, RECT_SIZE + 5, RECT_SIZE + 5), // 5: offset
124 sampling, Drawing::SrcRectConstraint::STRICT_SRC_RECT_CONSTRAINT);
125 }
126
OnDrawImageNine(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)127 void TestUtils::OnDrawImageNine(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
128 Drawing::Image& image)
129 {
130 playbackCanvas_->DrawImageNine(&image, Drawing::RectI(30, 30, 60, 60), // 30: TopLeft pos, 60: BottomRight pos
131 Drawing::Rect(0, 0, 90, 90), Drawing::FilterMode::LINEAR); // 90: BottomRight pos
132 }
133
OnDrawImageLattice(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)134 void TestUtils::OnDrawImageLattice(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
135 Drawing::Image& image)
136 {
137 Drawing::Lattice lattice;
138 playbackCanvas_->DrawImageLattice(&image, lattice, DRAW_RECT, Drawing::FilterMode::LINEAR);
139 }
140
OnDrawTextBlob(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)141 void TestUtils::OnDrawTextBlob(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
142 Drawing::Image& image)
143 {
144 std::shared_ptr<Drawing::FontMgr> fontMgr(Drawing::FontMgr::CreateDefaultFontMgr());
145 std::string name = "HarmonyOS-Sans";
146 std::shared_ptr<Drawing::FontStyleSet> fontStyleSet(fontMgr->MatchFamily(name.c_str()));
147 auto typeface = std::shared_ptr<Drawing::Typeface>(fontStyleSet->MatchStyle(
148 {Drawing::FontStyle::BOLD_WEIGHT, Drawing::FontStyle::NORMAL_WIDTH, Drawing::FontStyle::ITALIC_SLANT}));
149 auto font = Drawing::Font(typeface, 40.f, 1.0f, 0.f); // 40: font size
150 std::string text = "DDGR";
151 std::shared_ptr<Drawing::TextBlob> textBlob = Drawing::TextBlob::MakeFromText(text.c_str(), text.size(), font);
152 playbackCanvas_->DrawTextBlob(textBlob.get(), 0, 40); // 40: y position
153 }
154
OnDrawVertices(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)155 void TestUtils::OnDrawVertices(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
156 Drawing::Image& image)
157 {
158 Drawing::BuilderFlags flags = Drawing::BuilderFlags::HAS_COLORS_BUILDER_FLAG;
159 int indexCount = 0;
160 int vertCounts = 4;
161 Drawing::Vertices::Builder builder(Drawing::VertexMode::TRIANGLEFAN_VERTEXMODE,
162 vertCounts, indexCount, static_cast<uint32_t>(flags));
163
164 Drawing::Point points[] = {{0, 0}, {100, 0}, {40, 40}, {0, 100}};
165 Drawing::ColorQuad colors[] = {Drawing::Color::COLOR_RED, Drawing::Color::COLOR_BLUE,
166 Drawing::Color::COLOR_YELLOW, Drawing::Color::COLOR_CYAN};
167 if (memcpy_s(builder.Positions(), vertCounts * sizeof(Drawing::Point),
168 points, vertCounts * sizeof(Drawing::Point)) != EOK) {
169 return;
170 }
171 Drawing::Point* posPtr = builder.Positions();
172 for (int i = 0; i < vertCounts; i++) {
173 posPtr[i] += Drawing::Point(10, 10); // 10: point position
174 }
175 if (memcpy_s(builder.Colors(), vertCounts * sizeof(Drawing::ColorQuad),
176 colors, vertCounts * sizeof(Drawing::ColorQuad)) != EOK) {
177 return;
178 }
179 playbackCanvas_->DrawVertices(*builder.Detach(), Drawing::BlendMode::SRC);
180 }
181
OnDrawAtlas(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)182 void TestUtils::OnDrawAtlas(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
183 Drawing::Image& image)
184 {
185 brush.SetAntiAlias(true);
186 int count = 1;
187 Drawing::RSXform rsxform[] = {Drawing::RSXform::Make(2, 0, 0, 0)};
188 Drawing::Rect tex[] = {{0, 0, 50, 50}};
189 Drawing::ColorQuad colors[] = {0x7F55AA00};
190 playbackCanvas_->DrawAtlas(&image, rsxform, tex, colors, count, Drawing::BlendMode::SRC_IN,
191 Drawing::SamplingOptions(Drawing::FilterMode::NEAREST), nullptr);
192 }
193
OnDrawPatch(TestPlaybackCanvas * playbackCanvas_,Drawing::Pen & pen,Drawing::Brush & brush,Drawing::Image & image)194 void TestUtils::OnDrawPatch(TestPlaybackCanvas* playbackCanvas_, Drawing::Pen& pen, Drawing::Brush& brush,
195 Drawing::Image& image)
196 {
197 Drawing::Point cubics[12] = {{20, 20}, {40, 0}, {80, 40}, {100, 20},
198 {80, 40}, {120, 80}, {100, 100}, {80, 80},
199 {40, 120}, {20, 100}, {0, 80}, {40, 40}};
200 Drawing::ColorQuad colors[4] = {Drawing::Color::COLOR_BLUE, Drawing::Color::COLOR_YELLOW,
201 Drawing::Color::COLOR_GREEN, Drawing::Color::COLOR_RED };
202 Drawing::Point texCoords[4] = {{0, 0}, {100, 0}, {100, 100}, {0, 100}};
203 playbackCanvas_->DrawPatch(cubics, colors, texCoords, Drawing::BlendMode::PLUS);
204 }
205 } // namespace Rosen
206 } // namespace OHOS