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