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