• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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