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