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_ext.h"
16 #include "text/font_types.h"
17 #include "text/text_blob_builder.h"
18 #include "text/font_mgr.h"
19 #include "text/font.h"
20 #include "recording/mem_allocator.h"
21 #include "text/font_style_set.h"
22 #include "text/rs_xform.h"
23 #include "utils/point.h"
24 #include "utils/rect.h"
25 #include "text/typeface.h"
26 #include "text/font_style.h"
27 #include <sstream>
28
29 namespace OHOS {
30 namespace Rosen {
31
DrawTextBlob(std::vector<std::string> & texts,std::shared_ptr<Drawing::TextBlob> textBlob,Drawing::Font & font1,TestPlaybackCanvas * playbackCanvas)32 static void DrawTextBlob(std::vector<std::string>& texts, std::shared_ptr<Drawing::TextBlob> textBlob,
33 Drawing::Font& font1, TestPlaybackCanvas* playbackCanvas)
34 {
35 int line = 200;
36 int interval1 = 100;
37 int interval2 = 200;
38 int interval3 = 300;
39 int interval4 = 400;
40
41 for (auto text : texts) {
42 std::shared_ptr<Drawing::TextBlob> textinfo = Drawing::TextBlob::MakeFromText(text.c_str(), text.size(), font1);
43 Drawing::Brush brush;
44 playbackCanvas->AttachBrush(brush);
45 playbackCanvas->DrawTextBlob(textBlob.get(), interval2, line);
46 playbackCanvas->DrawTextBlob(textinfo.get(), interval2, line + interval1);
47 playbackCanvas->DetachBrush();
48 Drawing::Pen pen;
49 playbackCanvas->AttachPen(pen);
50 playbackCanvas->DrawTextBlob(textBlob.get(), interval2, line + interval2);
51 playbackCanvas->DrawTextBlob(textBlob.get(), interval2, line + interval3);
52 playbackCanvas->DetachPen();
53 line += interval4;
54 }
55 }
56
57 // 用例 Font_Scene_Transform_0023
58 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 23)
59 {
60 // 1.创建typeface
61 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
62 // 2.组合typeface操作接口
63 typeface->SetHash(100);
64 std::string typefacestr = "GetHash = " + std::to_string(typeface->GetHash());;
65 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
66 auto font = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
67 font.SetSubpixel(false);
68 font.SetScaleX(1);
69 auto font1 = Drawing::Font(typeface, 50.f, font.GetScaleX(), 1.0f);
70 font1.SetSubpixel(font.IsSubpixel());
71
72 // 4.创建TextBlob
73 Drawing::TextBlobBuilder builder;
74 auto buffer = builder.AllocRunPos(font1, 20, nullptr);
75 for (int i = 0; i < 20; i++) {
76 buffer.glyphs[i] = font1.UnicharToGlyph(0x9088);
77 buffer.pos[i * 2] = 50.f * i;
78 buffer.pos[i * 2 + 1] = 0;
79 }
80 std::shared_ptr<Drawing::TextBlob> textBlob = builder.Make();
81
82 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
83 std::string text = "harmony_os";
84 std::vector<uint16_t> glyphid;
85 Drawing::TextBlob::GetDrawingGlyphIDforTextBlob(textBlob.get(), glyphid);
86 std::string text2 = "";
87 for (int row = 0; row < text.size() && row < glyphid.size(); row++) {
88 text2 += std::string(1, text[row]) + ":" + std::to_string(glyphid[row]);
89 }
90
91 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
92 std::vector<std::string> texts = {typefacestr, text2};
93
94 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
95 Drawing::Path path;
96 path.AddOval({100, 100, 356, 356});
97 playbackCanvas_->ClipPath(path);
98
99 //8.调用Scale,Rotate,ConcatMatrix
100 playbackCanvas_->Rotate(45, 50, 50);
101 playbackCanvas_->Translate(400, 600);
102
103 //9.最终绘制
104 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
105 }
106
107 // 用例 Font_Scene_Transform_0024
108 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 24)
109 {
110 // 1.创建typeface
111 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
112 // 2.组合typeface操作接口
113 std::string str = "CPAL";
114 reverse(str.begin(), str.end());
115 uint32_t tagid = *(reinterpret_cast<uint32_t*>(const_cast<char*>(str.c_str())));
116 std::string typefacestr = "GetTableSize = " + std::to_string(typeface->GetTableSize(tagid));
117 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
118 auto font1 = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
119 font1.SetSubpixel(false);
120 std::string text0 = "DDGR ddgr 鸿蒙 !@#¥%^&*; : , 。";
121 Drawing::Rect bounds;
122 auto scalar = font1.MeasureText(text0.c_str(), text0.length(), Drawing::TextEncoding::UTF32, &bounds);
123 std::string text4 = "MeasureTextWidths = " + std::to_string(scalar);
124
125 // 4.创建TextBlob
126 Drawing::TextBlobBuilder builder;
127 auto buffer = builder.AllocRunPos(font1, 20, nullptr);
128 for (int i = 0; i < 20; i++) {
129 buffer.glyphs[i] = font1.UnicharToGlyph(0x9088);
130 buffer.pos[i * 2] = 50.f * i;
131 buffer.pos[i * 2 + 1] = 0;
132 }
133 std::shared_ptr<Drawing::TextBlob> textBlob = builder.Make();
134
135 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
136 std::string textinfo1 = "Deserialize @Hello World";
137 Drawing::TextBlob::Context* Ctx = new (std::nothrow) Drawing::TextBlob::Context(typeface, false);
138 auto data2 = textBlob->Serialize(Ctx);
139 std::shared_ptr<Drawing::TextBlob> infoTextBlob2 =
140 Drawing::TextBlob::Deserialize(data2->GetData(), data2->GetSize(), Ctx);
141
142 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
143 std::vector<std::string> texts = {typefacestr, text4};
144
145 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
146 auto rect1 = Drawing::RectI(0, 0, 1000, 1000);
147 playbackCanvas_->ClipIRect(rect1, Drawing::ClipOp::INTERSECT);
148
149 //8.调用Scale,Rotate,ConcatMatrix
150 Drawing::Matrix matrix;
151 playbackCanvas_->ConcatMatrix(matrix);
152 playbackCanvas_->Rotate(45, 50, 50);
153 playbackCanvas_->Translate(400, 600);
154
155 //9.最终绘制
156 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
157 }
158
159 // 用例 Font_Scene_Transform_0025
160 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 25)
161 {
162 // 1.创建typeface
163 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
164 // 2.组合typeface操作接口
165 std::string typefacestr = "GetUniqueID = " + std::to_string(typeface->GetUniqueID());
166 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
167 auto font = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
168 font.SetSubpixel(false);
169 font.SetBaselineSnap(true);
170 auto font1 = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
171 font1.SetSubpixel(font.IsSubpixel());
172 font1.SetBaselineSnap(font.IsBaselineSnap());
173
174 // 4.创建TextBlob
175 Drawing::TextBlobBuilder builder;
176 auto buffer = builder.AllocRunRSXform(font1, 20);
177 for (int i = 0; i < 20; i++) {
178 buffer.glyphs[i] = font1.UnicharToGlyph(0x30);
179 buffer.pos[i * 4] = cos(i * 18);
180 buffer.pos[i * 4 + 1] = sin(18 * i);
181 buffer.pos[i * 4 + 2] = 100;
182 buffer.pos[i * 4 + 3] = 100;
183 }
184 std::shared_ptr<Drawing::TextBlob> textBlob = builder.Make();
185
186 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
187 Drawing::Paint paint;
188 paint.SetColor(0xFFFF0000);
189 float boundsx[] = {1, 2, 3};
190 int intercepts = textBlob->GetIntercepts(boundsx, nullptr, &paint);
191 std::string text2 = "intercepts = " + std::to_string(intercepts);
192
193 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
194 std::vector<std::string> texts = {typefacestr, text2};
195
196 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
197 Drawing::Region region;
198 region.SetRect(Drawing::RectI(100, 100, 500, 500));
199 playbackCanvas_->ClipRegion(region);
200
201 //8.调用Scale,Rotate,ConcatMatrix
202 playbackCanvas_->Translate(400, 600);
203
204 //9.最终绘制
205 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
206 }
207
208 // 用例 Font_Scene_Transform_0026
209 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 26)
210 {
211 // 1.创建typeface
212 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
213 // 2.组合typeface操作接口
214 auto data = typeface->Serialize();
215 uint32_t size = 10;
216 typeface->SetSize(size);
217 std::shared_ptr<Drawing::Typeface> typeface1 = Drawing::Typeface::Deserialize(data->GetData(), typeface->GetSize());
218 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
219 auto font = Drawing::Font(typeface1, 50.f, 1.0f, 1.0f);
220 font.SetSubpixel(false);
221 font.SetEmbolden(false);
222 auto font1 = Drawing::Font(typeface1, 50.f, 1.0f, 1.0f);
223 font1.SetSubpixel(font.IsSubpixel());
224 font1.SetEmbolden(font.IsEmbolden());
225
226 // 4.创建TextBlob
227 Drawing::TextBlobBuilder builder;
228 auto buffer = builder.AllocRunRSXform(font1, 20);
229 for (int i = 0; i < 20; i++) {
230 buffer.glyphs[i] = font1.UnicharToGlyph(0x30);
231 buffer.pos[i * 4] = cos(i * 18);
232 buffer.pos[i * 4 + 1] = sin(18 * i);
233 buffer.pos[i * 4 + 2] = 100;
234 buffer.pos[i * 4 + 3] = 100;
235 }
236 std::shared_ptr<Drawing::TextBlob> textBlob = builder.Make();
237
238 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
239 auto rect = textBlob->Bounds();
240 playbackCanvas_->DrawRect(*rect);
241
242 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
243 std::vector<std::string> texts = {};
244
245 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
246 auto rect1 = Drawing::RectI(0, 0, 1000, 1000);
247 playbackCanvas_->ClipIRect(rect1, Drawing::ClipOp::INTERSECT);
248
249 //8.调用Scale,Rotate,ConcatMatrix
250 Drawing::Matrix matrix;
251 playbackCanvas_->ConcatMatrix(matrix);
252 playbackCanvas_->Scale(0.5, 0.5);
253
254 //9.最终绘制
255 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
256 }
257
258 // 用例 Font_Scene_Transform_0027
259 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 27)
260 {
261 // 1.创建typeface
262 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
263 // 2.组合typeface操作接口
264 auto data = typeface->Serialize();
265 uint32_t size = 10;
266 typeface->SetSize(size);
267 std::shared_ptr<Drawing::Typeface> typeface1 = Drawing::Typeface::Deserialize(data->GetData(), typeface->GetSize());
268 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
269 auto font = Drawing::Font(typeface1, 50.f, 1.0f, 1.0f);
270 font.SetSubpixel(false);
271 font.SetSkewX(1.0f);
272 auto font1 = Drawing::Font(typeface1, 50.f, font.GetSkewX(), 1.0f);
273 font1.SetSubpixel(font.IsSubpixel());
274
275 // 4.创建TextBlob
276 Drawing::TextBlobBuilder builder;
277 auto buffer = builder.AllocRunRSXform(font1, 20);
278 for (int i = 0; i < 20; i++) {
279 buffer.glyphs[i] = font1.UnicharToGlyph(0x30);
280 buffer.pos[i * 4] = cos(i * 18);
281 buffer.pos[i * 4 + 1] = sin(18 * i);
282 buffer.pos[i * 4 + 2] = 100;
283 buffer.pos[i * 4 + 3] = 100;
284 }
285 std::shared_ptr<Drawing::TextBlob> textBlob = builder.Make();
286
287 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
288 std::string text = "harmony_os";
289 std::vector<uint16_t> glyphid;
290 Drawing::TextBlob::GetDrawingGlyphIDforTextBlob(textBlob.get(), glyphid);
291 playbackCanvas_->Translate(200, 200);
292 for (int row = 0; row < text.size() && row < glyphid.size(); row++) {
293 auto path = Drawing::TextBlob::GetDrawingPathforTextBlob(glyphid[row], textBlob.get());
294 playbackCanvas_->DrawPath(path);
295 playbackCanvas_->Translate(0, 100);
296 }
297
298 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
299 std::vector<std::string> texts = {};
300
301 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
302 auto rrect = Drawing::RoundRect(Drawing::Rect(0, 0, 1000, 1000), 52, 52);
303 playbackCanvas_->ClipRoundRect(rrect);
304
305 //8.调用Scale,Rotate,ConcatMatrix
306 playbackCanvas_->Scale(0.5, 0.5);
307 playbackCanvas_->Translate(400, 600);
308
309 //9.最终绘制
310 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
311 }
312
313 // 用例 Font_Scene_Transform_0029
314 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 29)
315 {
316 // 1.创建typeface
317 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
318 // 2.组合typeface操作接口
319 std::string typefacestr = "GetUnitsPerEm = " + std::to_string(typeface->GetUnitsPerEm());
320 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
321 auto font = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
322 font.SetSubpixel(false);
323 font.SetForceAutoHinting(false);
324 auto font1 = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
325 font1.SetSubpixel(font.IsSubpixel());
326 font1.SetForceAutoHinting(font.IsForceAutoHinting());
327
328 // 4.创建TextBlob
329 std::string textInfo = "";
330 std::shared_ptr<Drawing::TextBlob> textBlob = Drawing::TextBlob::MakeFromText(
331 textInfo.c_str(), textInfo.size(), font1, Drawing::TextEncoding::UTF8);
332
333 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
334 std::vector<Drawing::Point> points;
335 Drawing::TextBlob::GetDrawingPointsForTextBlob(textBlob.get(), points);
336 std::string text2 = "";
337 for (int i = 0; i < points.size(); i++) {
338 text2 += std::to_string(i) + "-- X:" + std::to_string(points[i].GetX())
339 + "Y:" + std::to_string(points[i].GetY());
340 }
341
342 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
343 std::vector<std::string> texts = {typefacestr, text2};
344
345 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
346
347 //8.调用Scale,Rotate,ConcatMatrix
348
349 //9.最终绘制
350 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
351 }
352
353 // 用例 Font_Scene_Transform_0030
354 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 30)
355 {
356 // 1.创建typeface
357 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
358 // 2.组合typeface操作接口
359 auto familyNamex = typeface->GetFamilyName();
360 std::string typefacestr = "GetFamilyName = " + familyNamex;
361 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
362 auto font = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
363 font.SetSubpixel(false);
364 font.SetLinearMetrics(false);
365 auto font1 = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
366 font1.SetSubpixel(font.IsSubpixel());
367 font1.SetLinearMetrics(font.IsLinearMetrics());
368
369 // 4.创建TextBlob
370 std::string textInfo = "";
371 std::shared_ptr<Drawing::TextBlob> textBlob = Drawing::TextBlob::MakeFromText(
372 textInfo.c_str(), textInfo.size(), font1, Drawing::TextEncoding::UTF8);
373
374 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
375 std::vector<Drawing::Point> points;
376 Drawing::TextBlob::GetDrawingPointsForTextBlob(textBlob.get(), points);
377 std::string text2 = "";
378 for (int i = 0; i < points.size(); i++) {
379 text2 += std::to_string(i) + "-- X:" + std::to_string(points[i].GetX())
380 + "Y:" + std::to_string(points[i].GetY());
381 }
382
383 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
384 std::vector<std::string> texts = {typefacestr, text2};
385
386 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
387 Drawing::Region region;
388 region.SetRect(Drawing::RectI(100, 100, 500, 500));
389 playbackCanvas_->ClipRegion(region);
390
391 //8.调用Scale,Rotate,ConcatMatrix
392 Drawing::Matrix matrix;
393 playbackCanvas_->ConcatMatrix(matrix);
394 playbackCanvas_->Rotate(45, 50, 50);
395 playbackCanvas_->Scale(0.5, 0.5);
396
397 //9.最终绘制
398 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
399 }
400
401 // 用例 Font_Scene_Transform_0031
402 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 31)
403 {
404 // 1.创建typeface
405 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
406 // 2.组合typeface操作接口
407 std::string str = "CPAL";
408 reverse(str.begin(), str.end());
409 uint32_t tagid = *(reinterpret_cast<uint32_t*>(const_cast<char*>(str.c_str())));
410 std::string typefacestr = "GetTableSize = " + std::to_string(typeface->GetTableSize(tagid));
411 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
412 auto font1 = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
413 font1.SetSubpixel(false);
414 std::string text0 = "DDGR ddgr 鸿蒙 !@#¥%^&*; : , 。";
415 int glyphCount = font1.CountText(text0.c_str(), text0.length(), Drawing::TextEncoding::UTF16);
416 uint16_t glyphs[glyphCount - 1];
417 int count = font1.TextToGlyphs(text0.c_str(), text0.length(), Drawing::TextEncoding::UTF16, glyphs, glyphCount + 1);
418 std::string text4 = "TextToGlyphs = " + std::to_string(count);
419
420 // 4.创建TextBlob
421 std::string textInfo = "";
422 std::shared_ptr<Drawing::TextBlob> textBlob = Drawing::TextBlob::MakeFromText(
423 textInfo.c_str(), textInfo.size(), font1, Drawing::TextEncoding::UTF8);
424
425 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
426 std::string text = "harmony_os";
427 std::vector<uint16_t> glyphid;
428 Drawing::TextBlob::GetDrawingGlyphIDforTextBlob(textBlob.get(), glyphid);
429 std::string text2 = "";
430 for (int row = 0; row < text.size() && row < glyphid.size(); row++) {
431 text2 += std::string(1, text[row]) + ":" + std::to_string(glyphid[row]);
432 }
433
434 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
435 std::vector<std::string> texts = {typefacestr, text2, text4};
436
437 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
438 auto rect1 = Drawing::Rect(0, 0, 600, 600);
439 playbackCanvas_->ClipRect(rect1);
440
441 //8.调用Scale,Rotate,ConcatMatrix
442 Drawing::Matrix matrix;
443 playbackCanvas_->ConcatMatrix(matrix);
444 playbackCanvas_->Rotate(45, 50, 50);
445
446 //9.最终绘制
447 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
448 }
449
450 // 用例 Font_Scene_Transform_0032
451 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 32)
452 {
453 // 1.创建typeface
454 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
455 // 2.组合typeface操作接口
456 std::string typefacestr = "IsCustomTypeface = " + std::to_string(typeface->IsCustomTypeface());
457 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
458 auto font = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
459 font.SetSubpixel(false);
460 font.SetHinting(Drawing::FontHinting::NORMAL);
461 auto font1 = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
462 font1.SetSubpixel(font.IsSubpixel());
463 font1.SetHinting(font.GetHinting());
464
465 // 4.创建TextBlob
466 std::string textInfo = "harmony_os";
467 int cont = textInfo.size();
468 Drawing::Point p[cont];
469 for (int i = 0; i < cont; i++) {
470 p[i].SetX(-100 + 50 * i);
471 p[i].SetY(1000 - 50 * i);
472 }
473 std::shared_ptr<Drawing::TextBlob> textBlob = Drawing::TextBlob::MakeFromPosText(
474 textInfo.c_str(), 10, p, font1, Drawing::TextEncoding::UTF8);
475
476 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
477 std::string text = "harmony_os";
478 std::vector<uint16_t> glyphid;
479 Drawing::TextBlob::GetDrawingGlyphIDforTextBlob(textBlob.get(), glyphid);
480 std::string text2 = "";
481 for (int row = 0; row < text.size() && row < glyphid.size(); row++) {
482 text2 += std::string(1, text[row]) + ":" + std::to_string(glyphid[row]);
483 }
484
485 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
486 std::vector<std::string> texts = {typefacestr, text2};
487
488 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
489
490 //8.调用Scale,Rotate,ConcatMatrix
491 playbackCanvas_->Rotate(45, 50, 50);
492
493 //9.最终绘制
494 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
495 }
496
497 // 用例 Font_Scene_Transform_0034
498 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 34)
499 {
500 // 1.创建typeface
501 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
502 // 2.组合typeface操作接口
503 std::string str = "CPAL";
504 reverse(str.begin(), str.end());
505 uint32_t tagid = *(reinterpret_cast<uint32_t*>(const_cast<char*>(str.c_str())));
506 std::string typefacestr = "GetTableSize = " + std::to_string(typeface->GetTableSize(tagid));
507 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
508 auto font1 = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
509 font1.SetSubpixel(false);
510 std::string text0 = "DDGR ddgr 鸿蒙 !@#¥%^&*; : , 。";
511 Drawing::Rect bounds;
512 auto scalar = font1.MeasureText(text0.c_str(), text0.length(), Drawing::TextEncoding::UTF32, &bounds);
513 std::string text4 = "MeasureTextWidths = " + std::to_string(scalar);
514
515 // 4.创建TextBlob
516 std::string textInfo = "harmony_os";
517 int cont = textInfo.size();
518 Drawing::Point p[cont];
519 for (int i = 0; i < cont; i++) {
520 p[i].SetX(-100 + 50 * i);
521 p[i].SetY(1000 - 50 * i);
522 }
523 std::shared_ptr<Drawing::TextBlob> textBlob = Drawing::TextBlob::MakeFromPosText(
524 textInfo.c_str(), 10, p, font1, Drawing::TextEncoding::UTF8);
525
526 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
527 std::string text = "harmony_os";
528 std::vector<uint16_t> glyphid;
529 Drawing::TextBlob::GetDrawingGlyphIDforTextBlob(textBlob.get(), glyphid);
530 playbackCanvas_->Translate(200, 200);
531 for (int row = 0; row < text.size() && row < glyphid.size(); row++) {
532 auto path = Drawing::TextBlob::GetDrawingPathforTextBlob(glyphid[row], textBlob.get());
533 playbackCanvas_->DrawPath(path);
534 playbackCanvas_->Translate(0, 100);
535 }
536
537 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
538 std::vector<std::string> texts = {typefacestr, text4};
539
540 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
541 Drawing::Path path;
542 path.AddOval({100, 100, 356, 356});
543 playbackCanvas_->ClipPath(path);
544
545 //8.调用Scale,Rotate,ConcatMatrix
546 Drawing::Matrix matrix;
547 playbackCanvas_->ConcatMatrix(matrix);
548 playbackCanvas_->Translate(400, 600);
549
550 //9.最终绘制
551 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
552 }
553
554 // 用例 Font_Scene_Transform_0035
555 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 35)
556 {
557 // 1.创建typeface
558 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
559 // 2.组合typeface操作接口
560 std::string typefacestr = "GetUnitsPerEm = " + std::to_string(typeface->GetUnitsPerEm());
561 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
562 auto font = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
563 font.SetSubpixel(false);
564 font.SetEmbeddedBitmaps(true);
565 auto font1 = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
566 font1.SetSubpixel(font.IsSubpixel());
567 font1.SetEmbeddedBitmaps(font.IsEmbeddedBitmaps());
568
569 // 4.创建TextBlob
570 std::string textInfo = "harmony_os";
571 std::shared_ptr<Drawing::TextBlob> textBlob = Drawing::TextBlob::MakeFromString(
572 textInfo.c_str(), font1, Drawing::TextEncoding::UTF8);
573
574 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
575 Drawing::Paint paint;
576 paint.SetColor(0xFFFF0000);
577 float boundsx[] = {1, 2, 3};
578 int intercepts = textBlob->GetIntercepts(boundsx, nullptr, &paint);
579 std::string text2 = "intercepts = " + std::to_string(intercepts);
580
581 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
582 std::vector<std::string> texts = {typefacestr, text2};
583
584 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
585 auto rrect = Drawing::RoundRect(Drawing::Rect(0, 0, 1000, 1000), 52, 52);
586 playbackCanvas_->ClipRoundRect(rrect);
587
588 //8.调用Scale,Rotate,ConcatMatrix
589 Drawing::Matrix matrix;
590 playbackCanvas_->ConcatMatrix(matrix);
591
592 //9.最终绘制
593 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
594 }
595
596 // 用例 Font_Scene_Transform_0036
597 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 36)
598 {
599 // 1.创建typeface
600 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
601 // 2.组合typeface操作接口
602 std::string str = "CPAL";
603 reverse(str.begin(), str.end());
604 uint32_t tagid = *(reinterpret_cast<uint32_t*>(const_cast<char*>(str.c_str())));
605 std::string typefacestr = "GetTableSize = " + std::to_string(typeface->GetTableSize(tagid));
606 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
607 auto font1 = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
608 font1.SetSubpixel(false);
609 std::string text0 = "DDGR ddgr 鸿蒙 !@#¥%^&*; : , 。";
610 int glyphCount = font1.CountText(text0.c_str(), text0.length(), Drawing::TextEncoding::UTF8);
611 float widths[glyphCount];
612 uint16_t glyphs[glyphCount];
613 font1.TextToGlyphs(text0.c_str(), text0.length(), Drawing::TextEncoding::UTF8, glyphs, glyphCount);
614 font1.GetWidths(glyphs, glyphCount, widths);
615 std::string text4 = "Getwidths = " + std::to_string(widths[0]);
616
617 // 4.创建TextBlob
618 std::string textInfo = "harmony_os";
619 std::shared_ptr<Drawing::TextBlob> textBlob = Drawing::TextBlob::MakeFromString(
620 textInfo.c_str(), font1, Drawing::TextEncoding::UTF8);
621
622 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
623 std::string textinfo1 = "Deserialize @Hello World";
624 Drawing::TextBlob::Context* Ctx = new (std::nothrow) Drawing::TextBlob::Context(typeface, false);
625 auto data2 = textBlob->Serialize(Ctx);
626 std::shared_ptr<Drawing::TextBlob> infoTextBlob2 =
627 Drawing::TextBlob::Deserialize(data2->GetData(), data2->GetSize(), Ctx);
628
629 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
630 std::vector<std::string> texts = {typefacestr, text4};
631
632 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
633 auto rect1 = Drawing::Rect(0, 0, 600, 600);
634 playbackCanvas_->ClipRect(rect1);
635
636 //8.调用Scale,Rotate,ConcatMatrix
637 Drawing::Matrix matrix;
638 playbackCanvas_->ConcatMatrix(matrix);
639 playbackCanvas_->Scale(0.5, 0.5);
640 playbackCanvas_->Translate(400, 600);
641
642 //9.最终绘制
643 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
644 }
645
646 // 用例 Font_Scene_Transform_0037
647 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 37)
648 {
649 // 1.创建typeface
650 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
651 // 2.组合typeface操作接口
652 std::string typefacestr = "GetUniqueID = " + std::to_string(typeface->GetUniqueID());
653 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
654 auto font1 = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
655 font1.SetSubpixel(false);
656 std::string text0 = "DDGR ddgr 鸿蒙 !@#¥%^&*; : , 。";
657 auto SpaceLine = font1.MeasureSingleCharacter(0x44);
658 std::string text4 = "Recommended spacing between lines = " + std::to_string(SpaceLine);
659
660 // 4.创建TextBlob
661 std::string textInfo = "harmony_os";
662 std::shared_ptr<Drawing::TextBlob> textBlob = Drawing::TextBlob::MakeFromString(
663 textInfo.c_str(), font1, Drawing::TextEncoding::UTF8);
664
665 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
666 Drawing::Paint paint;
667 paint.SetColor(0xFFFF0000);
668 float boundsx[] = {1, 2, 3};
669 int intercepts = textBlob->GetIntercepts(boundsx, nullptr, &paint);
670 std::string text2 = "intercepts = " + std::to_string(intercepts);
671
672 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
673 std::vector<std::string> texts = {typefacestr, text2, text4};
674
675 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
676 auto rrect = Drawing::RoundRect(Drawing::Rect(0, 0, 1000, 1000), 52, 52);
677 playbackCanvas_->ClipRoundRect(rrect);
678
679 //8.调用Scale,Rotate,ConcatMatrix
680 playbackCanvas_->Rotate(45, 50, 50);
681 playbackCanvas_->Scale(0.5, 0.5);
682
683 //9.最终绘制
684 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
685 }
686
687 // 用例 Font_Scene_Transform_0038
688 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 38)
689 {
690 // 1.创建typeface
691 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
692 // 2.组合typeface操作接口
693 typeface->SetHash(100);
694 std::string typefacestr = "GetHash = " + std::to_string(typeface->GetHash());;
695 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
696 auto font = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
697 font.SetSubpixel(false);
698 font.SetTypeface(typeface);
699 auto font1 = Drawing::Font(font.GetTypeface(), 50.f, 1.0f, 1.0f);
700 font1.SetSubpixel(font.IsSubpixel());
701
702 // 4.创建TextBlob
703 std::string textInfo = "1111111111111111111111111111111111";
704 int maxGlyphCount = font1.CountText(textInfo.c_str(), textInfo.size(), Drawing::TextEncoding::UTF8);
705 Drawing::RSXform xform[maxGlyphCount];
706 for (int i = 0; i < maxGlyphCount; ++i) {
707 xform[i].cos_ = cos(10 * i) + 0.1 * i;
708 xform[i].sin_ = sin(10 * i);
709 xform[i].tx_ = 40 * i + 100;;
710 xform[i].ty_ = 100;
711 }
712 std::shared_ptr<Drawing::TextBlob> textBlob = Drawing::TextBlob::MakeFromRSXform(
713 textInfo.c_str(), textInfo.size(), &xform[0], font1, Drawing::TextEncoding::UTF8);
714
715 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
716 auto rect = textBlob->Bounds();
717 playbackCanvas_->DrawRect(*rect);
718
719 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
720 std::vector<std::string> texts = {typefacestr};
721
722 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
723 auto rect1 = Drawing::Rect(0, 0, 600, 600);
724 playbackCanvas_->ClipRect(rect1);
725
726 //8.调用Scale,Rotate,ConcatMatrix
727 Drawing::Matrix matrix;
728 playbackCanvas_->ConcatMatrix(matrix);
729
730 //9.最终绘制
731 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
732 }
733
734 // 用例 Font_Scene_Transform_0039
735 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 39)
736 {
737 // 1.创建typeface
738 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
739 // 2.组合typeface操作接口
740 std::string s = "011c50";
741 int a;
742 std::stringstream ss;
743 ss<<std::hex<<s;
744 ss>>a;
745 uint32_t tagid = *(reinterpret_cast<uint32_t*>(const_cast<char*>(s.c_str())));
746 std::string typefacestr = "GetTableData = "
747 + std::to_string(typeface->GetTableData(tagid, a, typeface->GetTableSize(tagid), nullptr));
748 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
749 auto font1 = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
750 font1.SetSubpixel(false);
751 std::string text0 = "DDGR ddgr 鸿蒙 !@#¥%^&*; : , 。";
752 auto scalar = font1.UnicharToGlyph(0x44);
753 std::string text4 = "Glyphs = " + std::to_string(scalar);
754
755 // 4.创建TextBlob
756 std::string textInfo = "1111111111111111111111111111111111";
757 int maxGlyphCount = font1.CountText(textInfo.c_str(), textInfo.size(), Drawing::TextEncoding::UTF8);
758 Drawing::RSXform xform[maxGlyphCount];
759 for (int i = 0; i < maxGlyphCount; ++i) {
760 xform[i].cos_ = cos(10 * i) + 0.1 * i;
761 xform[i].sin_ = sin(10 * i);
762 xform[i].tx_ = 40 * i + 100;;
763 xform[i].ty_ = 100;
764 }
765 std::shared_ptr<Drawing::TextBlob> textBlob = Drawing::TextBlob::MakeFromRSXform(
766 textInfo.c_str(), textInfo.size(), &xform[0], font1, Drawing::TextEncoding::UTF8);
767
768 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
769 std::string name1 = "HMOS Color Emoji";
770 std::string textInfo1 = "";
771 std::shared_ptr<Drawing::TextBlob> textBlob1 = Drawing::TextBlob::MakeFromText(textInfo1.c_str(),
772 textInfo1.size(), font1, Drawing::TextEncoding::UTF8);
773 if (textBlob1->IsEmoji()) {
774 playbackCanvas_->DrawBackground(0xFF0000FF);
775 } else {
776 playbackCanvas_->DrawBackground(0xFFFF0000);
777 }
778
779 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
780 std::vector<std::string> texts = {typefacestr, text4};
781
782 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
783
784 //8.调用Scale,Rotate,ConcatMatrix
785 playbackCanvas_->Rotate(45, 50, 50);
786 playbackCanvas_->Scale(0.5, 0.5);
787 playbackCanvas_->Translate(400, 600);
788
789 //9.最终绘制
790 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
791 }
792
793 // 用例 Font_Scene_Transform_0040
794 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 40)
795 {
796 // 1.创建typeface
797 auto typeface = Drawing::Typeface::MakeFromFile("/system/fonts/SanJiMengMengCaiSeJianTi-2.ttf");
798 // 2.组合typeface操作接口
799 std::string s = "011c50";
800 int a;
801 std::stringstream ss;
802 ss<<std::hex<<s;
803 ss>>a;
804 uint32_t tagid = *(reinterpret_cast<uint32_t*>(const_cast<char*>(s.c_str())));
805 std::string typefacestr = "GetTableData = "
806 + std::to_string(typeface->GetTableData(tagid, a, typeface->GetTableSize(tagid), nullptr));
807 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
808 auto font1 = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
809 font1.SetSubpixel(false);
810 std::string text0 = "DDGR ddgr 鸿蒙 !@#¥%^&*; : , 。";
811 auto glyphsCount = font1.CountText(text0.c_str(), text0.length(), Drawing::TextEncoding::GLYPH_ID);
812 std::string text4 = "glyphsCount = " + std::to_string(glyphsCount);
813
814 // 4.创建TextBlob
815 std::string textInfo = "1111111111111111111111111111111111";
816 int maxGlyphCount = font1.CountText(textInfo.c_str(), textInfo.size(), Drawing::TextEncoding::UTF8);
817 Drawing::RSXform xform[maxGlyphCount];
818 for (int i = 0; i < maxGlyphCount; ++i) {
819 xform[i].cos_ = cos(10 * i) + 0.1 * i;
820 xform[i].sin_ = sin(10 * i);
821 xform[i].tx_ = 40 * i + 100;;
822 xform[i].ty_ = 100;
823 }
824 std::shared_ptr<Drawing::TextBlob> textBlob = Drawing::TextBlob::MakeFromRSXform(
825 textInfo.c_str(), textInfo.size(), &xform[0], font1, Drawing::TextEncoding::UTF8);
826
827 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
828 std::vector<Drawing::Point> points;
829 Drawing::TextBlob::GetDrawingPointsForTextBlob(textBlob.get(), points);
830 std::string text2 = "";
831 for (int i = 0; i < points.size(); i++) {
832 text2 += std::to_string(i) + "-- X:" + std::to_string(points[i].GetX())
833 + "Y:" + std::to_string(points[i].GetY());
834 }
835
836 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
837 std::vector<std::string> texts = {typefacestr, text2, text4};
838
839 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
840 Drawing::Region region;
841 region.SetRect(Drawing::RectI(100, 100, 500, 500));
842 playbackCanvas_->ClipRegion(region);
843
844 //8.调用Scale,Rotate,ConcatMatrix
845 playbackCanvas_->Scale(0.5, 0.5);
846 playbackCanvas_->Translate(400, 600);
847
848 //9.最终绘制
849 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
850 }
851
852 // 用例 Font_Scene_Transform_0042
853 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 42)
854 {
855 // 1.创建typeface
856 char data1[10] = {0};
857 auto stream = std::make_unique<Drawing::MemoryStream>(data1, 10);
858 std::shared_ptr<Drawing::Typeface> typeface = Drawing::Typeface::MakeFromStream(std::move(stream));
859 // 2.组合typeface操作接口
860 auto familyNamex = typeface->GetFamilyName();
861 std::string typefacestr = "GetFamilyName = " + familyNamex;
862 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
863 auto font = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
864 font.SetSubpixel(false);
865 font.SetScaleX(1);
866 auto font1 = Drawing::Font(typeface, 50.f, font.GetScaleX(), 1.0f);
867 font1.SetSubpixel(font.IsSubpixel());
868
869 // 4.创建TextBlob
870 Drawing::TextBlobBuilder builder;
871 auto buffer = builder.AllocRunPos(font1, 20, nullptr);
872 for (int i = 0; i < 20; i++) {
873 buffer.glyphs[i] = font1.UnicharToGlyph(0x9088);
874 buffer.pos[i * 2] = 50.f * i;
875 buffer.pos[i * 2 + 1] = 0;
876 }
877 std::shared_ptr<Drawing::TextBlob> textBlob = builder.Make();
878
879 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
880 Drawing::Paint paint;
881 paint.SetColor(0xFFFF0000);
882 float boundsx[] = {1, 2, 3};
883 int intercepts = textBlob->GetIntercepts(boundsx, nullptr, &paint);
884 std::string text2 = "intercepts = " + std::to_string(intercepts);
885
886 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
887 std::vector<std::string> texts = {typefacestr, text2};
888
889 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
890 Drawing::Region region;
891 region.SetRect(Drawing::RectI(100, 100, 500, 500));
892 playbackCanvas_->ClipRegion(region);
893
894 //8.调用Scale,Rotate,ConcatMatrix
895 Drawing::Matrix matrix;
896 playbackCanvas_->ConcatMatrix(matrix);
897 playbackCanvas_->Scale(0.5, 0.5);
898
899 //9.最终绘制
900 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
901 }
902
903 // 用例 Font_Scene_Transform_0043
904 DEF_DTK(Font_Scene_Transform_2, TestLevel::L2, 43)
905 {
906 // 1.创建typeface
907 char data1[10] = {0};
908 auto stream = std::make_unique<Drawing::MemoryStream>(data1, 10);
909 std::shared_ptr<Drawing::Typeface> typeface = Drawing::Typeface::MakeFromStream(std::move(stream));
910 // 2.组合typeface操作接口
911 std::string typefacestr = "GetItalic = " + std::to_string(typeface->GetItalic());
912 // 3.组合Font类接口,如果是操作类有返回值的接口,获取接口返回值加入vector容器
913 auto font1 = Drawing::Font(typeface, 50.f, 1.0f, 1.0f);
914 font1.SetSubpixel(false);
915 std::string text0 = "DDGR ddgr 鸿蒙 !@#¥%^&*; : , 。";
916 int glyphCount = font1.CountText(text0.c_str(), text0.length(), Drawing::TextEncoding::UTF16);
917 uint16_t glyphs[glyphCount - 1];
918 int count = font1.TextToGlyphs(text0.c_str(), text0.length(), Drawing::TextEncoding::UTF16, glyphs, glyphCount + 1);
919 std::string text4 = "TextToGlyphs = " + std::to_string(count);
920
921 // 4.创建TextBlob
922 Drawing::TextBlobBuilder builder;
923 auto buffer = builder.AllocRunPos(font1, 20, nullptr);
924 for (int i = 0; i < 20; i++) {
925 buffer.glyphs[i] = font1.UnicharToGlyph(0x9088);
926 buffer.pos[i * 2] = 50.f * i;
927 buffer.pos[i * 2 + 1] = 0;
928 }
929 std::shared_ptr<Drawing::TextBlob> textBlob = builder.Make();
930
931 // 5.组合textBlob类接口,如果有返回值则获取上一步创建的textBlob返回值打印
932 Drawing::Paint paint;
933 paint.SetColor(0xFFFF0000);
934 float boundsx[] = {1, 2, 3};
935 int intercepts = textBlob->GetIntercepts(boundsx, nullptr, &paint);
936 std::string text2 = "intercepts = " + std::to_string(intercepts);
937
938 //6. 得到需要绘制的所有返回值text,全部适应固定的textBlob构造方式打印
939 std::vector<std::string> texts = {typefacestr, text2, text4};
940
941 //7.调用ClipIRect截取(0,0,1000,1000)区域(缺省,默认INTERSECT、不抗锯齿)
942
943 //8.调用Scale,Rotate,ConcatMatrix
944 Drawing::Matrix matrix;
945 playbackCanvas_->ConcatMatrix(matrix);
946 playbackCanvas_->Rotate(45, 50, 50);
947 playbackCanvas_->Scale(0.5, 0.5);
948 playbackCanvas_->Translate(400, 600);
949
950 //9.最终绘制
951 DrawTextBlob(texts, textBlob, font1, playbackCanvas_);
952 }
953
954 }
955 }
956