1cb93a386Sopenharmony_ci// Copyright 2019 Google LLC.
2cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h"
3cb93a386Sopenharmony_ci#include "include/core/SkColorFilter.h"
4cb93a386Sopenharmony_ci#include "include/core/SkColorPriv.h"
5cb93a386Sopenharmony_ci#include "include/core/SkFontMgr.h"
6cb93a386Sopenharmony_ci#include "include/core/SkGraphics.h"
7cb93a386Sopenharmony_ci#include "include/core/SkPath.h"
8cb93a386Sopenharmony_ci#include "include/core/SkRegion.h"
9cb93a386Sopenharmony_ci#include "include/core/SkShader.h"
10cb93a386Sopenharmony_ci#include "include/core/SkStream.h"
11cb93a386Sopenharmony_ci#include "include/core/SkTextBlob.h"
12cb93a386Sopenharmony_ci#include "include/core/SkTime.h"
13cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h"
14cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h"
15cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h"
16cb93a386Sopenharmony_ci#include "modules/skparagraph/include/Paragraph.h"
17cb93a386Sopenharmony_ci#include "modules/skparagraph/include/TypefaceFontProvider.h"
18cb93a386Sopenharmony_ci#include "modules/skparagraph/src/ParagraphBuilderImpl.h"
19cb93a386Sopenharmony_ci#include "modules/skparagraph/src/ParagraphImpl.h"
20cb93a386Sopenharmony_ci#include "modules/skparagraph/src/TextLine.h"
21cb93a386Sopenharmony_ci#include "modules/skparagraph/utils/TestFontCollection.h"
22cb93a386Sopenharmony_ci#include "samplecode/Sample.h"
23cb93a386Sopenharmony_ci#include "src/core/SkOSFile.h"
24cb93a386Sopenharmony_ci#include "src/shaders/SkColorShader.h"
25cb93a386Sopenharmony_ci#include "src/utils/SkOSPath.h"
26cb93a386Sopenharmony_ci#include "src/utils/SkUTF.h"
27cb93a386Sopenharmony_ci#include "tools/Resources.h"
28cb93a386Sopenharmony_ci#include "tools/flags/CommandLineFlags.h"
29cb93a386Sopenharmony_ci
30cb93a386Sopenharmony_cistatic DEFINE_bool(verboseParagraph, false, "paragraph samples very verbose.");
31cb93a386Sopenharmony_ci
32cb93a386Sopenharmony_ciusing namespace skia::textlayout;
33cb93a386Sopenharmony_cinamespace {
34cb93a386Sopenharmony_ci
35cb93a386Sopenharmony_ciclass ParagraphView_Base : public Sample {
36cb93a386Sopenharmony_ciprotected:
37cb93a386Sopenharmony_ci    sk_sp<TestFontCollection> getFontCollection() {
38cb93a386Sopenharmony_ci        // If we reset font collection we need to reset paragraph cache
39cb93a386Sopenharmony_ci        static sk_sp<TestFontCollection> fFC = nullptr;
40cb93a386Sopenharmony_ci        if (fFC == nullptr) {
41cb93a386Sopenharmony_ci            fFC = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), false, true);
42cb93a386Sopenharmony_ci        }
43cb93a386Sopenharmony_ci        return fFC;
44cb93a386Sopenharmony_ci    }
45cb93a386Sopenharmony_ci
46cb93a386Sopenharmony_ci    bool isVerbose() {
47cb93a386Sopenharmony_ci        return FLAGS_verboseParagraph;
48cb93a386Sopenharmony_ci    }
49cb93a386Sopenharmony_ci};
50cb93a386Sopenharmony_ci
51cb93a386Sopenharmony_cisk_sp<SkShader> setgrad(const SkRect& r, SkColor c0, SkColor c1) {
52cb93a386Sopenharmony_ci    SkColor colors[] = {c0, c1};
53cb93a386Sopenharmony_ci    SkPoint pts[] = {{r.fLeft, r.fTop}, {r.fRight, r.fTop}};
54cb93a386Sopenharmony_ci    return SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkTileMode::kClamp);
55cb93a386Sopenharmony_ci}
56cb93a386Sopenharmony_ci/*
57cb93a386Sopenharmony_civoid writeHtml(const char* name, Paragraph* paragraph) {
58cb93a386Sopenharmony_ci        SkString tmpDir = skiatest::GetTmpDir();
59cb93a386Sopenharmony_ci        if (!tmpDir.isEmpty()) {
60cb93a386Sopenharmony_ci            SkString path = SkOSPath::Join(tmpDir.c_str(), name);
61cb93a386Sopenharmony_ci            SkFILEWStream file(path.c_str());
62cb93a386Sopenharmony_ci            file.write(nullptr, 0);
63cb93a386Sopenharmony_ci        }
64cb93a386Sopenharmony_ci}
65cb93a386Sopenharmony_ci*/
66cb93a386Sopenharmony_ci
67cb93a386Sopenharmony_ciclass ParagraphView1 : public ParagraphView_Base {
68cb93a386Sopenharmony_ciprotected:
69cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph1"); }
70cb93a386Sopenharmony_ci
71cb93a386Sopenharmony_ci    void drawTest(SkCanvas* canvas, SkScalar w, SkScalar h, SkColor fg, SkColor bg) {
72cb93a386Sopenharmony_ci        const std::vector<
73cb93a386Sopenharmony_ci            std::tuple<std::string, bool, bool, int, SkColor, SkColor, bool, TextDecorationStyle>>
74cb93a386Sopenharmony_ci            gParagraph = {{"monospace", true, false, 14, SK_ColorWHITE, SK_ColorRED, true,
75cb93a386Sopenharmony_ci                           TextDecorationStyle::kDashed},
76cb93a386Sopenharmony_ci                          {"Assyrian", false, false, 20, SK_ColorWHITE, SK_ColorBLUE, false,
77cb93a386Sopenharmony_ci                           TextDecorationStyle::kDotted},
78cb93a386Sopenharmony_ci                          {"serif", true, true, 10, SK_ColorWHITE, SK_ColorRED, true,
79cb93a386Sopenharmony_ci                           TextDecorationStyle::kDouble},
80cb93a386Sopenharmony_ci                          {"Arial", false, true, 16, SK_ColorGRAY, SK_ColorGREEN, true,
81cb93a386Sopenharmony_ci                           TextDecorationStyle::kSolid},
82cb93a386Sopenharmony_ci                          {"sans-serif", false, false, 8, SK_ColorWHITE, SK_ColorRED, false,
83cb93a386Sopenharmony_ci                           TextDecorationStyle::kWavy}};
84cb93a386Sopenharmony_ci        SkAutoCanvasRestore acr(canvas, true);
85cb93a386Sopenharmony_ci
86cb93a386Sopenharmony_ci        canvas->clipRect(SkRect::MakeWH(w, h));
87cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
88cb93a386Sopenharmony_ci
89cb93a386Sopenharmony_ci        SkScalar margin = 20;
90cb93a386Sopenharmony_ci
91cb93a386Sopenharmony_ci        SkPaint paint;
92cb93a386Sopenharmony_ci        paint.setAntiAlias(true);
93cb93a386Sopenharmony_ci        paint.setColor(fg);
94cb93a386Sopenharmony_ci
95cb93a386Sopenharmony_ci        SkPaint blue;
96cb93a386Sopenharmony_ci        blue.setColor(SK_ColorBLUE);
97cb93a386Sopenharmony_ci
98cb93a386Sopenharmony_ci        TextStyle defaultStyle;
99cb93a386Sopenharmony_ci        defaultStyle.setBackgroundColor(blue);
100cb93a386Sopenharmony_ci        defaultStyle.setForegroundColor(paint);
101cb93a386Sopenharmony_ci        ParagraphStyle paraStyle;
102cb93a386Sopenharmony_ci
103cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
104cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
105cb93a386Sopenharmony_ci        for (auto i = 1; i < 5; ++i) {
106cb93a386Sopenharmony_ci            defaultStyle.setFontSize(24 * i);
107cb93a386Sopenharmony_ci            paraStyle.setTextStyle(defaultStyle);
108cb93a386Sopenharmony_ci            ParagraphBuilderImpl builder(paraStyle, fontCollection);
109cb93a386Sopenharmony_ci            std::string name = "Paragraph: " + std::to_string(24 * i);
110cb93a386Sopenharmony_ci            builder.addText(name.c_str(), name.length());
111cb93a386Sopenharmony_ci            for (auto para : gParagraph) {
112cb93a386Sopenharmony_ci                TextStyle style;
113cb93a386Sopenharmony_ci                style.setFontFamilies({SkString(std::get<0>(para).c_str())});
114cb93a386Sopenharmony_ci                SkFontStyle fontStyle(std::get<1>(para) ? SkFontStyle::Weight::kBold_Weight
115cb93a386Sopenharmony_ci                                                        : SkFontStyle::Weight::kNormal_Weight,
116cb93a386Sopenharmony_ci                                      SkFontStyle::Width::kNormal_Width,
117cb93a386Sopenharmony_ci                                      std::get<2>(para) ? SkFontStyle::Slant::kItalic_Slant
118cb93a386Sopenharmony_ci                                                        : SkFontStyle::Slant::kUpright_Slant);
119cb93a386Sopenharmony_ci                style.setFontStyle(fontStyle);
120cb93a386Sopenharmony_ci                style.setFontSize(std::get<3>(para) * i);
121cb93a386Sopenharmony_ci                SkPaint background;
122cb93a386Sopenharmony_ci                background.setColor(std::get<4>(para));
123cb93a386Sopenharmony_ci                style.setBackgroundColor(background);
124cb93a386Sopenharmony_ci                SkPaint foreground;
125cb93a386Sopenharmony_ci                foreground.setColor(std::get<5>(para));
126cb93a386Sopenharmony_ci                foreground.setAntiAlias(true);
127cb93a386Sopenharmony_ci                style.setForegroundColor(foreground);
128cb93a386Sopenharmony_ci                if (std::get<6>(para)) {
129cb93a386Sopenharmony_ci                    style.addShadow(TextShadow(SK_ColorBLACK, SkPoint::Make(5, 5), 2));
130cb93a386Sopenharmony_ci                }
131cb93a386Sopenharmony_ci
132cb93a386Sopenharmony_ci                auto decoration = (i % 4);
133cb93a386Sopenharmony_ci                if (decoration == 3) {
134cb93a386Sopenharmony_ci                    decoration = 4;
135cb93a386Sopenharmony_ci                }
136cb93a386Sopenharmony_ci
137cb93a386Sopenharmony_ci                bool test = (TextDecoration)decoration != TextDecoration::kNoDecoration;
138cb93a386Sopenharmony_ci                std::string deco = std::to_string((int)decoration);
139cb93a386Sopenharmony_ci                if (test) {
140cb93a386Sopenharmony_ci                    style.setDecoration((TextDecoration)decoration);
141cb93a386Sopenharmony_ci                    style.setDecorationStyle(std::get<7>(para));
142cb93a386Sopenharmony_ci                    style.setDecorationColor(std::get<5>(para));
143cb93a386Sopenharmony_ci                }
144cb93a386Sopenharmony_ci                builder.pushStyle(style);
145cb93a386Sopenharmony_ci                name = " " + std::get<0>(para) + " " +
146cb93a386Sopenharmony_ci                       (std::get<1>(para) ? ", bold" : "") +
147cb93a386Sopenharmony_ci                       (std::get<2>(para) ? ", italic" : "") + " " +
148cb93a386Sopenharmony_ci                       std::to_string(std::get<3>(para) * i) +
149cb93a386Sopenharmony_ci                       (std::get<4>(para) != bg ? ", background" : "") +
150cb93a386Sopenharmony_ci                       (std::get<5>(para) != fg ? ", foreground" : "") +
151cb93a386Sopenharmony_ci                       (std::get<6>(para) ? ", shadow" : "") +
152cb93a386Sopenharmony_ci                       (test ? ", decorations " + deco : "") + ";";
153cb93a386Sopenharmony_ci                builder.addText(name.c_str(), name.length());
154cb93a386Sopenharmony_ci                builder.pop();
155cb93a386Sopenharmony_ci            }
156cb93a386Sopenharmony_ci
157cb93a386Sopenharmony_ci            auto paragraph = builder.Build();
158cb93a386Sopenharmony_ci            paragraph->layout(w - margin * 2);
159cb93a386Sopenharmony_ci            paragraph->paint(canvas, margin, margin);
160cb93a386Sopenharmony_ci
161cb93a386Sopenharmony_ci            canvas->translate(0, paragraph->getHeight());
162cb93a386Sopenharmony_ci        }
163cb93a386Sopenharmony_ci    }
164cb93a386Sopenharmony_ci
165cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
166cb93a386Sopenharmony_ci        drawTest(canvas, this->width(), this->height(), SK_ColorRED, SK_ColorWHITE);
167cb93a386Sopenharmony_ci    }
168cb93a386Sopenharmony_ci
169cb93a386Sopenharmony_ciprivate:
170cb93a386Sopenharmony_ci
171cb93a386Sopenharmony_ci    using INHERITED = Sample;
172cb93a386Sopenharmony_ci};
173cb93a386Sopenharmony_ci
174cb93a386Sopenharmony_ciclass ParagraphView2 : public ParagraphView_Base {
175cb93a386Sopenharmony_ciprotected:
176cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph2"); }
177cb93a386Sopenharmony_ci
178cb93a386Sopenharmony_ci    void drawCode(SkCanvas* canvas, SkScalar w, SkScalar h) {
179cb93a386Sopenharmony_ci        SkPaint comment;
180cb93a386Sopenharmony_ci        comment.setColor(SK_ColorGRAY);
181cb93a386Sopenharmony_ci        SkPaint constant;
182cb93a386Sopenharmony_ci        constant.setColor(SK_ColorMAGENTA);
183cb93a386Sopenharmony_ci        SkPaint null;
184cb93a386Sopenharmony_ci        null.setColor(SK_ColorMAGENTA);
185cb93a386Sopenharmony_ci        SkPaint literal;
186cb93a386Sopenharmony_ci        literal.setColor(SK_ColorGREEN);
187cb93a386Sopenharmony_ci        SkPaint code;
188cb93a386Sopenharmony_ci        code.setColor(SK_ColorDKGRAY);
189cb93a386Sopenharmony_ci        SkPaint number;
190cb93a386Sopenharmony_ci        number.setColor(SK_ColorBLUE);
191cb93a386Sopenharmony_ci        SkPaint name;
192cb93a386Sopenharmony_ci        name.setColor(SK_ColorRED);
193cb93a386Sopenharmony_ci
194cb93a386Sopenharmony_ci        SkPaint white;
195cb93a386Sopenharmony_ci        white.setColor(SK_ColorWHITE);
196cb93a386Sopenharmony_ci
197cb93a386Sopenharmony_ci        TextStyle defaultStyle;
198cb93a386Sopenharmony_ci        defaultStyle.setBackgroundColor(white);
199cb93a386Sopenharmony_ci        defaultStyle.setForegroundColor(code);
200cb93a386Sopenharmony_ci        defaultStyle.setFontFamilies({SkString("monospace")});
201cb93a386Sopenharmony_ci        defaultStyle.setFontSize(30);
202cb93a386Sopenharmony_ci        ParagraphStyle paraStyle;
203cb93a386Sopenharmony_ci        paraStyle.setTextStyle(defaultStyle);
204cb93a386Sopenharmony_ci
205cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
206cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
207cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paraStyle, fontCollection);
208cb93a386Sopenharmony_ci
209cb93a386Sopenharmony_ci        const char* text1 = "RaisedButton";
210cb93a386Sopenharmony_ci        const char* text2 = "(\n";
211cb93a386Sopenharmony_ci        const char* text3 = "  child: ";
212cb93a386Sopenharmony_ci        const char* text4 = "const";
213cb93a386Sopenharmony_ci        const char* text5 = "Text";
214cb93a386Sopenharmony_ci        const char* text6 = "'BUTTON TITLE'";
215cb93a386Sopenharmony_ci        const char* text7 = "),\n";
216cb93a386Sopenharmony_ci
217cb93a386Sopenharmony_ci        builder.pushStyle(style(name));
218cb93a386Sopenharmony_ci        builder.addText(text1, strlen(text1));
219cb93a386Sopenharmony_ci        builder.pop();
220cb93a386Sopenharmony_ci        builder.addText(text2, strlen(text2));
221cb93a386Sopenharmony_ci        builder.addText(text3, strlen(text3));
222cb93a386Sopenharmony_ci        builder.pushStyle(style(constant));
223cb93a386Sopenharmony_ci        builder.addText(text4, strlen(text4));
224cb93a386Sopenharmony_ci        builder.pop();
225cb93a386Sopenharmony_ci        builder.addText(" ", 1);
226cb93a386Sopenharmony_ci        builder.pushStyle(style(name));
227cb93a386Sopenharmony_ci        builder.addText(text5, strlen(text5));
228cb93a386Sopenharmony_ci        builder.pop();
229cb93a386Sopenharmony_ci        builder.addText("(", 1);
230cb93a386Sopenharmony_ci        builder.pushStyle(style(literal));
231cb93a386Sopenharmony_ci        builder.addText(text6, strlen(text6));
232cb93a386Sopenharmony_ci        builder.pop();
233cb93a386Sopenharmony_ci        builder.addText(text7, strlen(text7));
234cb93a386Sopenharmony_ci
235cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
236cb93a386Sopenharmony_ci        paragraph->layout(w - 20);
237cb93a386Sopenharmony_ci
238cb93a386Sopenharmony_ci        paragraph->paint(canvas, 20, 20);
239cb93a386Sopenharmony_ci    }
240cb93a386Sopenharmony_ci
241cb93a386Sopenharmony_ci    TextStyle style(SkPaint paint) {
242cb93a386Sopenharmony_ci        TextStyle style;
243cb93a386Sopenharmony_ci        paint.setAntiAlias(true);
244cb93a386Sopenharmony_ci        style.setForegroundColor(paint);
245cb93a386Sopenharmony_ci        style.setFontFamilies({SkString("monospace")});
246cb93a386Sopenharmony_ci        style.setFontSize(30);
247cb93a386Sopenharmony_ci
248cb93a386Sopenharmony_ci        return style;
249cb93a386Sopenharmony_ci    }
250cb93a386Sopenharmony_ci
251cb93a386Sopenharmony_ci    void drawText(SkCanvas* canvas, SkScalar w, SkScalar h, std::vector<const char*>& text,
252cb93a386Sopenharmony_ci                  SkColor fg = SK_ColorDKGRAY, SkColor bg = SK_ColorWHITE,
253cb93a386Sopenharmony_ci                  const char* ff = "sans-serif", SkScalar fs = 24,
254cb93a386Sopenharmony_ci                  size_t lineLimit = 30,
255cb93a386Sopenharmony_ci                  const std::u16string& ellipsis = u"\u2026") {
256cb93a386Sopenharmony_ci        SkAutoCanvasRestore acr(canvas, true);
257cb93a386Sopenharmony_ci
258cb93a386Sopenharmony_ci        canvas->clipRect(SkRect::MakeWH(w, h));
259cb93a386Sopenharmony_ci        canvas->drawColor(bg);
260cb93a386Sopenharmony_ci
261cb93a386Sopenharmony_ci        SkScalar margin = 20;
262cb93a386Sopenharmony_ci
263cb93a386Sopenharmony_ci        SkPaint paint;
264cb93a386Sopenharmony_ci        paint.setAntiAlias(true);
265cb93a386Sopenharmony_ci        paint.setColor(fg);
266cb93a386Sopenharmony_ci
267cb93a386Sopenharmony_ci        SkPaint blue;
268cb93a386Sopenharmony_ci        blue.setColor(SK_ColorBLUE);
269cb93a386Sopenharmony_ci
270cb93a386Sopenharmony_ci        SkPaint background;
271cb93a386Sopenharmony_ci        background.setColor(bg);
272cb93a386Sopenharmony_ci
273cb93a386Sopenharmony_ci        TextStyle style;
274cb93a386Sopenharmony_ci        style.setBackgroundColor(blue);
275cb93a386Sopenharmony_ci        style.setForegroundColor(paint);
276cb93a386Sopenharmony_ci        style.setFontFamilies({SkString(ff)});
277cb93a386Sopenharmony_ci        style.setFontStyle(SkFontStyle(SkFontStyle::kMedium_Weight,
278cb93a386Sopenharmony_ci                                       SkFontStyle::kNormal_Width,
279cb93a386Sopenharmony_ci                                       SkFontStyle::kUpright_Slant));
280cb93a386Sopenharmony_ci        style.setFontSize(fs);
281cb93a386Sopenharmony_ci        ParagraphStyle paraStyle;
282cb93a386Sopenharmony_ci        paraStyle.setTextStyle(style);
283cb93a386Sopenharmony_ci        paraStyle.setMaxLines(lineLimit);
284cb93a386Sopenharmony_ci
285cb93a386Sopenharmony_ci        paraStyle.setEllipsis(ellipsis);
286cb93a386Sopenharmony_ci        TextStyle defaultStyle;
287cb93a386Sopenharmony_ci        defaultStyle.setFontSize(20);
288cb93a386Sopenharmony_ci        paraStyle.setTextStyle(defaultStyle);
289cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paraStyle, getFontCollection());
290cb93a386Sopenharmony_ci
291cb93a386Sopenharmony_ci        SkPaint foreground;
292cb93a386Sopenharmony_ci        foreground.setColor(fg);
293cb93a386Sopenharmony_ci        style.setForegroundColor(foreground);
294cb93a386Sopenharmony_ci        style.setBackgroundColor(background);
295cb93a386Sopenharmony_ci
296cb93a386Sopenharmony_ci        for (auto& part : text) {
297cb93a386Sopenharmony_ci            builder.pushStyle(style);
298cb93a386Sopenharmony_ci            builder.addText(part, strlen(part));
299cb93a386Sopenharmony_ci            builder.pop();
300cb93a386Sopenharmony_ci        }
301cb93a386Sopenharmony_ci
302cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
303cb93a386Sopenharmony_ci        paragraph->layout(w - margin * 2);
304cb93a386Sopenharmony_ci        paragraph->paint(canvas, margin, margin);
305cb93a386Sopenharmony_ci
306cb93a386Sopenharmony_ci        canvas->translate(0, paragraph->getHeight() + margin);
307cb93a386Sopenharmony_ci    }
308cb93a386Sopenharmony_ci
309cb93a386Sopenharmony_ci    void drawLine(SkCanvas* canvas, SkScalar w, SkScalar h, const std::string& text,
310cb93a386Sopenharmony_ci                  TextAlign align) {
311cb93a386Sopenharmony_ci        SkAutoCanvasRestore acr(canvas, true);
312cb93a386Sopenharmony_ci
313cb93a386Sopenharmony_ci        canvas->clipRect(SkRect::MakeWH(w, h));
314cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
315cb93a386Sopenharmony_ci
316cb93a386Sopenharmony_ci        SkScalar margin = 20;
317cb93a386Sopenharmony_ci
318cb93a386Sopenharmony_ci        SkPaint paint;
319cb93a386Sopenharmony_ci        paint.setAntiAlias(true);
320cb93a386Sopenharmony_ci        paint.setColor(SK_ColorBLUE);
321cb93a386Sopenharmony_ci
322cb93a386Sopenharmony_ci        SkPaint gray;
323cb93a386Sopenharmony_ci        gray.setColor(SK_ColorLTGRAY);
324cb93a386Sopenharmony_ci
325cb93a386Sopenharmony_ci        TextStyle style;
326cb93a386Sopenharmony_ci        style.setBackgroundColor(gray);
327cb93a386Sopenharmony_ci        style.setForegroundColor(paint);
328cb93a386Sopenharmony_ci        style.setFontFamilies({SkString("Arial")});
329cb93a386Sopenharmony_ci        style.setFontSize(30);
330cb93a386Sopenharmony_ci        ParagraphStyle paraStyle;
331cb93a386Sopenharmony_ci        paraStyle.setTextStyle(style);
332cb93a386Sopenharmony_ci        paraStyle.setTextAlign(align);
333cb93a386Sopenharmony_ci
334cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
335cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
336cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paraStyle, fontCollection);
337cb93a386Sopenharmony_ci        builder.addText(text.c_str(), text.length());
338cb93a386Sopenharmony_ci
339cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
340cb93a386Sopenharmony_ci        paragraph->layout(w - margin * 2);
341cb93a386Sopenharmony_ci        paragraph->layout(w - margin);
342cb93a386Sopenharmony_ci        paragraph->paint(canvas, margin, margin);
343cb93a386Sopenharmony_ci
344cb93a386Sopenharmony_ci        canvas->translate(0, paragraph->getHeight() + margin);
345cb93a386Sopenharmony_ci    }
346cb93a386Sopenharmony_ci
347cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
348cb93a386Sopenharmony_ci        std::vector<const char*> cupertino = {
349cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 1 "
350cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 12 "
351cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 123 "
352cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 1234 "
353cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 12345 "
354cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 123456 "
355cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 1234567 "
356cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 12345678 "
357cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 123456789 "
358cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 1234567890 "
359cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 123456789 "
360cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 12345678 "
361cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 1234567 "
362cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 123456 "
363cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 12345 "
364cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 1234 "
365cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 123 "
366cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 12 "
367cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo 1 "
368cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo "
369cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo "
370cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo "
371cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo "
372cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo "
373cb93a386Sopenharmony_ci                "google_logogoogle_gsuper_g_logo"};
374cb93a386Sopenharmony_ci        std::vector<const char*> text = {
375cb93a386Sopenharmony_ci                "My neighbor came over to say,\n"
376cb93a386Sopenharmony_ci                "Although not in a neighborly way,\n\n"
377cb93a386Sopenharmony_ci                "That he'd knock me around,\n\n\n"
378cb93a386Sopenharmony_ci                "If I didn't stop the sound,\n\n\n\n"
379cb93a386Sopenharmony_ci                "Of the classical music I play."};
380cb93a386Sopenharmony_ci
381cb93a386Sopenharmony_ci        std::vector<const char*> long_word = {
382cb93a386Sopenharmony_ci                "A_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
383cb93a386Sopenharmony_ci                "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
384cb93a386Sopenharmony_ci                "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
385cb93a386Sopenharmony_ci                "very_very_very_very_very_very_very_long_text"};
386cb93a386Sopenharmony_ci
387cb93a386Sopenharmony_ci        std::vector<const char*> very_long = {
388cb93a386Sopenharmony_ci                "A very very very very very very very very very very very very very very very very "
389cb93a386Sopenharmony_ci                "very very very very very very very very very very very very very very very very "
390cb93a386Sopenharmony_ci                "very very very very very very very very very very very very very very very very "
391cb93a386Sopenharmony_ci                "very very very very very very very long text"};
392cb93a386Sopenharmony_ci
393cb93a386Sopenharmony_ci        std::vector<const char*> very_word = {
394cb93a386Sopenharmony_ci                "A very_very_very_very_very_very_very_very_very_very "
395cb93a386Sopenharmony_ci                "very_very_very_very_very_very_very_very_very_very very very very very very very "
396cb93a386Sopenharmony_ci                "very very very very very very very very very very very very very very very very "
397cb93a386Sopenharmony_ci                "very very very very very very very very very very very very very long text"};
398cb93a386Sopenharmony_ci
399cb93a386Sopenharmony_ci        SkScalar width = this->width() / 5;
400cb93a386Sopenharmony_ci        SkScalar height = this->height();
401cb93a386Sopenharmony_ci        drawText(canvas, width, height, long_word, SK_ColorBLACK, SK_ColorWHITE, "Google Sans", 30);
402cb93a386Sopenharmony_ci        canvas->translate(width, 0);
403cb93a386Sopenharmony_ci        drawText(canvas, width, height, very_long, SK_ColorBLACK, SK_ColorWHITE, "Google Sans", 30);
404cb93a386Sopenharmony_ci        canvas->translate(width, 0);
405cb93a386Sopenharmony_ci        drawText(canvas, width, height, very_word, SK_ColorBLACK, SK_ColorWHITE, "Google Sans", 30);
406cb93a386Sopenharmony_ci        canvas->translate(width, 0);
407cb93a386Sopenharmony_ci        drawText(canvas, width, height / 2, text, SK_ColorBLACK, SK_ColorWHITE, "Roboto", 20, 100,
408cb93a386Sopenharmony_ci                 u"\u2026");
409cb93a386Sopenharmony_ci        canvas->translate(0, height / 2);
410cb93a386Sopenharmony_ci        drawCode(canvas, width, height / 2);
411cb93a386Sopenharmony_ci        canvas->translate(width, -height / 2);
412cb93a386Sopenharmony_ci
413cb93a386Sopenharmony_ci        drawText(canvas, width, height, cupertino, SK_ColorBLACK, SK_ColorWHITE, "Google Sans", 30);
414cb93a386Sopenharmony_ci    }
415cb93a386Sopenharmony_ci
416cb93a386Sopenharmony_ciprivate:
417cb93a386Sopenharmony_ci    using INHERITED = Sample;
418cb93a386Sopenharmony_ci};
419cb93a386Sopenharmony_ci
420cb93a386Sopenharmony_ciclass ParagraphView3 : public ParagraphView_Base {
421cb93a386Sopenharmony_ciprotected:
422cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph3"); }
423cb93a386Sopenharmony_ci
424cb93a386Sopenharmony_ci    void drawLine(SkCanvas* canvas, SkScalar w, SkScalar h, const std::string& text,
425cb93a386Sopenharmony_ci                  TextAlign align, size_t lineLimit = std::numeric_limits<size_t>::max(),
426cb93a386Sopenharmony_ci                  bool RTL = false, SkColor background = SK_ColorGRAY,
427cb93a386Sopenharmony_ci                  const std::u16string& ellipsis = u"\u2026") {
428cb93a386Sopenharmony_ci        SkAutoCanvasRestore acr(canvas, true);
429cb93a386Sopenharmony_ci
430cb93a386Sopenharmony_ci        canvas->clipRect(SkRect::MakeWH(w, h));
431cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
432cb93a386Sopenharmony_ci
433cb93a386Sopenharmony_ci        SkScalar margin = 20;
434cb93a386Sopenharmony_ci
435cb93a386Sopenharmony_ci        SkPaint paint;
436cb93a386Sopenharmony_ci        paint.setAntiAlias(true);
437cb93a386Sopenharmony_ci        paint.setColor(SK_ColorBLACK);
438cb93a386Sopenharmony_ci
439cb93a386Sopenharmony_ci        SkPaint gray;
440cb93a386Sopenharmony_ci        gray.setColor(background);
441cb93a386Sopenharmony_ci
442cb93a386Sopenharmony_ci        SkPaint yellow;
443cb93a386Sopenharmony_ci        yellow.setColor(SK_ColorYELLOW);
444cb93a386Sopenharmony_ci
445cb93a386Sopenharmony_ci        TextStyle style;
446cb93a386Sopenharmony_ci        style.setBackgroundColor(gray);
447cb93a386Sopenharmony_ci        style.setForegroundColor(paint);
448cb93a386Sopenharmony_ci        style.setFontFamilies({SkString("sans-serif")});
449cb93a386Sopenharmony_ci        style.setFontSize(30);
450cb93a386Sopenharmony_ci        ParagraphStyle paraStyle;
451cb93a386Sopenharmony_ci        paraStyle.setTextStyle(style);
452cb93a386Sopenharmony_ci        paraStyle.setTextAlign(align);
453cb93a386Sopenharmony_ci        paraStyle.setMaxLines(lineLimit);
454cb93a386Sopenharmony_ci        paraStyle.setEllipsis(ellipsis);
455cb93a386Sopenharmony_ci        // paraStyle.setTextDirection(RTL ? SkTextDirection::rtl : SkTextDirection::ltr);
456cb93a386Sopenharmony_ci
457cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
458cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
459cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paraStyle, fontCollection);
460cb93a386Sopenharmony_ci        if (RTL) {
461cb93a386Sopenharmony_ci            builder.addText(mirror(text));
462cb93a386Sopenharmony_ci        } else {
463cb93a386Sopenharmony_ci            builder.addText(normal(text));
464cb93a386Sopenharmony_ci        }
465cb93a386Sopenharmony_ci
466cb93a386Sopenharmony_ci        canvas->drawRect(SkRect::MakeXYWH(margin, margin, w - margin * 2, h - margin * 2), yellow);
467cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
468cb93a386Sopenharmony_ci        paragraph->layout(w - margin * 2);
469cb93a386Sopenharmony_ci        paragraph->paint(canvas, margin, margin);
470cb93a386Sopenharmony_ci    }
471cb93a386Sopenharmony_ci
472cb93a386Sopenharmony_ci    std::u16string mirror(const std::string& text) {
473cb93a386Sopenharmony_ci        std::u16string result;
474cb93a386Sopenharmony_ci        result += u"\u202E";
475cb93a386Sopenharmony_ci        // for (auto i = text.size(); i > 0; --i) {
476cb93a386Sopenharmony_ci        //  result += text[i - 1];
477cb93a386Sopenharmony_ci        //}
478cb93a386Sopenharmony_ci
479cb93a386Sopenharmony_ci        for (auto i = text.size(); i > 0; --i) {
480cb93a386Sopenharmony_ci            auto ch = text[i - 1];
481cb93a386Sopenharmony_ci            if (ch == ',') {
482cb93a386Sopenharmony_ci                result += u"!";
483cb93a386Sopenharmony_ci            } else if (ch == '.') {
484cb93a386Sopenharmony_ci                result += u"!";
485cb93a386Sopenharmony_ci            } else {
486cb93a386Sopenharmony_ci                result += ch;
487cb93a386Sopenharmony_ci            }
488cb93a386Sopenharmony_ci        }
489cb93a386Sopenharmony_ci
490cb93a386Sopenharmony_ci        result += u"\u202C";
491cb93a386Sopenharmony_ci        return result;
492cb93a386Sopenharmony_ci    }
493cb93a386Sopenharmony_ci
494cb93a386Sopenharmony_ci    std::u16string normal(const std::string& text) {
495cb93a386Sopenharmony_ci        std::u16string result;
496cb93a386Sopenharmony_ci        result += u"\u202D";
497cb93a386Sopenharmony_ci        for (auto ch : text) {
498cb93a386Sopenharmony_ci            result += ch;
499cb93a386Sopenharmony_ci        }
500cb93a386Sopenharmony_ci        result += u"\u202C";
501cb93a386Sopenharmony_ci        return result;
502cb93a386Sopenharmony_ci    }
503cb93a386Sopenharmony_ci
504cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
505cb93a386Sopenharmony_ci        const std::string options =  // { "open-source open-source open-source open-source" };
506cb93a386Sopenharmony_ci                {"Flutter is an open-source project to help developers "
507cb93a386Sopenharmony_ci                 "build high-performance, high-fidelity, mobile apps for "
508cb93a386Sopenharmony_ci                 "iOS and Android "
509cb93a386Sopenharmony_ci                 "from a single codebase. This design lab is a playground "
510cb93a386Sopenharmony_ci                 "and showcase of Flutter's many widgets, behaviors, "
511cb93a386Sopenharmony_ci                 "animations, layouts, and more."};
512cb93a386Sopenharmony_ci
513cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorDKGRAY);
514cb93a386Sopenharmony_ci        SkScalar width = this->width() / 4;
515cb93a386Sopenharmony_ci        SkScalar height = this->height() / 2;
516cb93a386Sopenharmony_ci
517cb93a386Sopenharmony_ci        const std::string line =
518cb93a386Sopenharmony_ci                "World domination is such an ugly phrase - I prefer to call it world optimisation";
519cb93a386Sopenharmony_ci
520cb93a386Sopenharmony_ci        drawLine(canvas, width, height, line, TextAlign::kLeft, 1, false, SK_ColorLTGRAY);
521cb93a386Sopenharmony_ci        canvas->translate(width, 0);
522cb93a386Sopenharmony_ci        drawLine(canvas, width, height, line, TextAlign::kRight, 2, false, SK_ColorLTGRAY);
523cb93a386Sopenharmony_ci        canvas->translate(width, 0);
524cb93a386Sopenharmony_ci        drawLine(canvas, width, height, line, TextAlign::kCenter, 3, false, SK_ColorLTGRAY);
525cb93a386Sopenharmony_ci        canvas->translate(width, 0);
526cb93a386Sopenharmony_ci        drawLine(canvas, width, height, line, TextAlign::kJustify, 4, false, SK_ColorLTGRAY);
527cb93a386Sopenharmony_ci        canvas->translate(-width * 3, height);
528cb93a386Sopenharmony_ci
529cb93a386Sopenharmony_ci        drawLine(canvas, width, height, line, TextAlign::kLeft, 1, true, SK_ColorLTGRAY);
530cb93a386Sopenharmony_ci        canvas->translate(width, 0);
531cb93a386Sopenharmony_ci        drawLine(canvas, width, height, line, TextAlign::kRight, 2, true, SK_ColorLTGRAY);
532cb93a386Sopenharmony_ci        canvas->translate(width, 0);
533cb93a386Sopenharmony_ci        drawLine(canvas, width, height, line, TextAlign::kCenter, 3, true, SK_ColorLTGRAY);
534cb93a386Sopenharmony_ci        canvas->translate(width, 0);
535cb93a386Sopenharmony_ci        drawLine(canvas, width, height, line, TextAlign::kJustify, 4, true, SK_ColorLTGRAY);
536cb93a386Sopenharmony_ci        canvas->translate(width, 0);
537cb93a386Sopenharmony_ci    }
538cb93a386Sopenharmony_ci
539cb93a386Sopenharmony_ciprivate:
540cb93a386Sopenharmony_ci    using INHERITED = Sample;
541cb93a386Sopenharmony_ci};
542cb93a386Sopenharmony_ci
543cb93a386Sopenharmony_ciclass ParagraphView4 : public ParagraphView_Base {
544cb93a386Sopenharmony_ciprotected:
545cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph4"); }
546cb93a386Sopenharmony_ci
547cb93a386Sopenharmony_ci    void drawFlutter(SkCanvas* canvas, SkScalar w, SkScalar h,
548cb93a386Sopenharmony_ci                     const char* ff = "Google Sans", SkScalar fs = 30,
549cb93a386Sopenharmony_ci                     size_t lineLimit = std::numeric_limits<size_t>::max(),
550cb93a386Sopenharmony_ci                     const std::u16string& ellipsis = u"\u2026") {
551cb93a386Sopenharmony_ci        SkAutoCanvasRestore acr(canvas, true);
552cb93a386Sopenharmony_ci
553cb93a386Sopenharmony_ci        canvas->clipRect(SkRect::MakeWH(w, h));
554cb93a386Sopenharmony_ci
555cb93a386Sopenharmony_ci        SkScalar margin = 20;
556cb93a386Sopenharmony_ci
557cb93a386Sopenharmony_ci        SkPaint black;
558cb93a386Sopenharmony_ci        black.setAntiAlias(true);
559cb93a386Sopenharmony_ci        black.setColor(SK_ColorBLACK);
560cb93a386Sopenharmony_ci
561cb93a386Sopenharmony_ci        SkPaint blue;
562cb93a386Sopenharmony_ci        blue.setAntiAlias(true);
563cb93a386Sopenharmony_ci        blue.setColor(SK_ColorBLUE);
564cb93a386Sopenharmony_ci
565cb93a386Sopenharmony_ci        SkPaint red;
566cb93a386Sopenharmony_ci        red.setAntiAlias(true);
567cb93a386Sopenharmony_ci        red.setColor(SK_ColorRED);
568cb93a386Sopenharmony_ci
569cb93a386Sopenharmony_ci        SkPaint green;
570cb93a386Sopenharmony_ci        green.setAntiAlias(true);
571cb93a386Sopenharmony_ci        green.setColor(SK_ColorGREEN);
572cb93a386Sopenharmony_ci
573cb93a386Sopenharmony_ci        SkPaint gray;
574cb93a386Sopenharmony_ci        gray.setColor(SK_ColorLTGRAY);
575cb93a386Sopenharmony_ci
576cb93a386Sopenharmony_ci        SkPaint yellow;
577cb93a386Sopenharmony_ci        yellow.setColor(SK_ColorYELLOW);
578cb93a386Sopenharmony_ci
579cb93a386Sopenharmony_ci        SkPaint magenta;
580cb93a386Sopenharmony_ci        magenta.setAntiAlias(true);
581cb93a386Sopenharmony_ci        magenta.setColor(SK_ColorMAGENTA);
582cb93a386Sopenharmony_ci
583cb93a386Sopenharmony_ci        TextStyle style;
584cb93a386Sopenharmony_ci        style.setFontFamilies({SkString(ff)});
585cb93a386Sopenharmony_ci        style.setFontSize(fs);
586cb93a386Sopenharmony_ci
587cb93a386Sopenharmony_ci        TextStyle style0;
588cb93a386Sopenharmony_ci        style0.setForegroundColor(black);
589cb93a386Sopenharmony_ci        style0.setBackgroundColor(gray);
590cb93a386Sopenharmony_ci        style0.setFontFamilies({SkString(ff)});
591cb93a386Sopenharmony_ci        style0.setFontSize(fs);
592cb93a386Sopenharmony_ci        style0.setDecoration(TextDecoration::kUnderline);
593cb93a386Sopenharmony_ci        style0.setDecorationStyle(TextDecorationStyle::kDouble);
594cb93a386Sopenharmony_ci        style0.setDecorationColor(SK_ColorBLACK);
595cb93a386Sopenharmony_ci
596cb93a386Sopenharmony_ci        TextStyle style1;
597cb93a386Sopenharmony_ci        style1.setForegroundColor(blue);
598cb93a386Sopenharmony_ci        style1.setBackgroundColor(yellow);
599cb93a386Sopenharmony_ci        style1.setFontFamilies({SkString(ff)});
600cb93a386Sopenharmony_ci        style1.setFontSize(fs);
601cb93a386Sopenharmony_ci        style1.setDecoration(TextDecoration::kOverline);
602cb93a386Sopenharmony_ci        style1.setDecorationStyle(TextDecorationStyle::kWavy);
603cb93a386Sopenharmony_ci        style1.setDecorationColor(SK_ColorBLACK);
604cb93a386Sopenharmony_ci
605cb93a386Sopenharmony_ci        TextStyle style2;
606cb93a386Sopenharmony_ci        style2.setForegroundColor(red);
607cb93a386Sopenharmony_ci        style2.setFontFamilies({SkString(ff)});
608cb93a386Sopenharmony_ci        style2.setFontSize(fs);
609cb93a386Sopenharmony_ci
610cb93a386Sopenharmony_ci        TextStyle style3;
611cb93a386Sopenharmony_ci        style3.setForegroundColor(green);
612cb93a386Sopenharmony_ci        style3.setFontFamilies({SkString(ff)});
613cb93a386Sopenharmony_ci        style3.setFontSize(fs);
614cb93a386Sopenharmony_ci
615cb93a386Sopenharmony_ci        TextStyle style4;
616cb93a386Sopenharmony_ci        style4.setForegroundColor(magenta);
617cb93a386Sopenharmony_ci        style4.setFontFamilies({SkString(ff)});
618cb93a386Sopenharmony_ci        style4.setFontSize(fs);
619cb93a386Sopenharmony_ci
620cb93a386Sopenharmony_ci        ParagraphStyle paraStyle;
621cb93a386Sopenharmony_ci        paraStyle.setTextStyle(style);
622cb93a386Sopenharmony_ci        paraStyle.setMaxLines(lineLimit);
623cb93a386Sopenharmony_ci
624cb93a386Sopenharmony_ci        paraStyle.setEllipsis(ellipsis);
625cb93a386Sopenharmony_ci
626cb93a386Sopenharmony_ci        const char* logo1 = "google_";
627cb93a386Sopenharmony_ci        const char* logo2 = "logo";
628cb93a386Sopenharmony_ci        const char* logo3 = "go";
629cb93a386Sopenharmony_ci        const char* logo4 = "ogle_logo";
630cb93a386Sopenharmony_ci        const char* logo5 = "google_lo";
631cb93a386Sopenharmony_ci        const char* logo6 = "go";
632cb93a386Sopenharmony_ci        {
633cb93a386Sopenharmony_ci            ParagraphBuilderImpl builder(paraStyle, getFontCollection());
634cb93a386Sopenharmony_ci
635cb93a386Sopenharmony_ci            builder.pushStyle(style0);
636cb93a386Sopenharmony_ci            builder.addText(logo1, strlen(logo1));
637cb93a386Sopenharmony_ci            builder.pop();
638cb93a386Sopenharmony_ci            builder.pushStyle(style1);
639cb93a386Sopenharmony_ci            builder.addText(logo2, strlen(logo2));
640cb93a386Sopenharmony_ci            builder.pop();
641cb93a386Sopenharmony_ci
642cb93a386Sopenharmony_ci            builder.addText(" ", 1);
643cb93a386Sopenharmony_ci
644cb93a386Sopenharmony_ci            builder.pushStyle(style0);
645cb93a386Sopenharmony_ci            builder.addText(logo3, strlen(logo3));
646cb93a386Sopenharmony_ci            builder.pop();
647cb93a386Sopenharmony_ci            builder.pushStyle(style1);
648cb93a386Sopenharmony_ci            builder.addText(logo4, strlen(logo4));
649cb93a386Sopenharmony_ci            builder.pop();
650cb93a386Sopenharmony_ci
651cb93a386Sopenharmony_ci            builder.addText(" ", 1);
652cb93a386Sopenharmony_ci
653cb93a386Sopenharmony_ci            builder.pushStyle(style0);
654cb93a386Sopenharmony_ci            builder.addText(logo5, strlen(logo5));
655cb93a386Sopenharmony_ci            builder.pop();
656cb93a386Sopenharmony_ci            builder.pushStyle(style1);
657cb93a386Sopenharmony_ci            builder.addText(logo6, strlen(logo6));
658cb93a386Sopenharmony_ci            builder.pop();
659cb93a386Sopenharmony_ci
660cb93a386Sopenharmony_ci            auto paragraph = builder.Build();
661cb93a386Sopenharmony_ci            paragraph->layout(w - margin * 2);
662cb93a386Sopenharmony_ci            paragraph->paint(canvas, margin, margin);
663cb93a386Sopenharmony_ci            canvas->translate(0, h + margin);
664cb93a386Sopenharmony_ci        }
665cb93a386Sopenharmony_ci    }
666cb93a386Sopenharmony_ci
667cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
668cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
669cb93a386Sopenharmony_ci        SkScalar width = this->width();
670cb93a386Sopenharmony_ci        SkScalar height = this->height();
671cb93a386Sopenharmony_ci
672cb93a386Sopenharmony_ci        drawFlutter(canvas, width, height / 2);
673cb93a386Sopenharmony_ci    }
674cb93a386Sopenharmony_ci
675cb93a386Sopenharmony_ciprivate:
676cb93a386Sopenharmony_ci    using INHERITED = Sample;
677cb93a386Sopenharmony_ci};
678cb93a386Sopenharmony_ci
679cb93a386Sopenharmony_ciclass ParagraphView5 : public ParagraphView_Base {
680cb93a386Sopenharmony_ciprotected:
681cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph5"); }
682cb93a386Sopenharmony_ci
683cb93a386Sopenharmony_ci    void bidi(SkCanvas* canvas, SkScalar w, SkScalar h, const std::u16string& text,
684cb93a386Sopenharmony_ci              const std::u16string& expected, size_t lineLimit = std::numeric_limits<size_t>::max(),
685cb93a386Sopenharmony_ci              const char* ff = "Roboto", SkScalar fs = 30,
686cb93a386Sopenharmony_ci              const std::u16string& ellipsis = u"\u2026") {
687cb93a386Sopenharmony_ci        SkAutoCanvasRestore acr(canvas, true);
688cb93a386Sopenharmony_ci
689cb93a386Sopenharmony_ci        canvas->clipRect(SkRect::MakeWH(w, h));
690cb93a386Sopenharmony_ci
691cb93a386Sopenharmony_ci        SkScalar margin = 20;
692cb93a386Sopenharmony_ci
693cb93a386Sopenharmony_ci        SkPaint black;
694cb93a386Sopenharmony_ci        black.setColor(SK_ColorBLACK);
695cb93a386Sopenharmony_ci        SkPaint gray;
696cb93a386Sopenharmony_ci        gray.setColor(SK_ColorLTGRAY);
697cb93a386Sopenharmony_ci
698cb93a386Sopenharmony_ci        TextStyle style;
699cb93a386Sopenharmony_ci        style.setForegroundColor(black);
700cb93a386Sopenharmony_ci        style.setFontFamilies({SkString(ff)});
701cb93a386Sopenharmony_ci        style.setFontSize(fs);
702cb93a386Sopenharmony_ci
703cb93a386Sopenharmony_ci        TextStyle style0;
704cb93a386Sopenharmony_ci        style0.setForegroundColor(black);
705cb93a386Sopenharmony_ci        style0.setFontFamilies({SkString(ff)});
706cb93a386Sopenharmony_ci        style0.setFontSize(fs);
707cb93a386Sopenharmony_ci        style0.setFontStyle(SkFontStyle(SkFontStyle::kNormal_Weight, SkFontStyle::kNormal_Width,
708cb93a386Sopenharmony_ci                                        SkFontStyle::kItalic_Slant));
709cb93a386Sopenharmony_ci
710cb93a386Sopenharmony_ci        TextStyle style1;
711cb93a386Sopenharmony_ci        style1.setForegroundColor(gray);
712cb93a386Sopenharmony_ci        style1.setFontFamilies({SkString(ff)});
713cb93a386Sopenharmony_ci        style1.setFontSize(fs);
714cb93a386Sopenharmony_ci        style1.setFontStyle(SkFontStyle(SkFontStyle::kBold_Weight, SkFontStyle::kNormal_Width,
715cb93a386Sopenharmony_ci                                        SkFontStyle::kUpright_Slant));
716cb93a386Sopenharmony_ci
717cb93a386Sopenharmony_ci        ParagraphStyle paraStyle;
718cb93a386Sopenharmony_ci        paraStyle.setTextStyle(style);
719cb93a386Sopenharmony_ci        paraStyle.setMaxLines(lineLimit);
720cb93a386Sopenharmony_ci
721cb93a386Sopenharmony_ci        paraStyle.setEllipsis(ellipsis);
722cb93a386Sopenharmony_ci
723cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paraStyle, getFontCollection());
724cb93a386Sopenharmony_ci
725cb93a386Sopenharmony_ci        if (text.empty()) {
726cb93a386Sopenharmony_ci            const std::u16string text0 = u"\u202Dabc";
727cb93a386Sopenharmony_ci            const std::u16string text1 = u"\u202EFED";
728cb93a386Sopenharmony_ci            const std::u16string text2 = u"\u202Dghi";
729cb93a386Sopenharmony_ci            const std::u16string text3 = u"\u202ELKJ";
730cb93a386Sopenharmony_ci            const std::u16string text4 = u"\u202Dmno";
731cb93a386Sopenharmony_ci            builder.pushStyle(style0);
732cb93a386Sopenharmony_ci            builder.addText(text0);
733cb93a386Sopenharmony_ci            builder.pop();
734cb93a386Sopenharmony_ci            builder.pushStyle(style1);
735cb93a386Sopenharmony_ci            builder.addText(text1);
736cb93a386Sopenharmony_ci            builder.pop();
737cb93a386Sopenharmony_ci            builder.pushStyle(style0);
738cb93a386Sopenharmony_ci            builder.addText(text2);
739cb93a386Sopenharmony_ci            builder.pop();
740cb93a386Sopenharmony_ci            builder.pushStyle(style1);
741cb93a386Sopenharmony_ci            builder.addText(text3);
742cb93a386Sopenharmony_ci            builder.pop();
743cb93a386Sopenharmony_ci            builder.pushStyle(style0);
744cb93a386Sopenharmony_ci            builder.addText(text4);
745cb93a386Sopenharmony_ci            builder.pop();
746cb93a386Sopenharmony_ci        } else {
747cb93a386Sopenharmony_ci            builder.addText(text + expected);
748cb93a386Sopenharmony_ci        }
749cb93a386Sopenharmony_ci
750cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
751cb93a386Sopenharmony_ci        auto impl = static_cast<ParagraphImpl*>(paragraph.get());
752cb93a386Sopenharmony_ci        if (this->isVerbose()) {
753cb93a386Sopenharmony_ci            SkDebugf("Text: >%s<\n", impl->text().data());
754cb93a386Sopenharmony_ci        }
755cb93a386Sopenharmony_ci
756cb93a386Sopenharmony_ci        paragraph->layout(w - margin * 2);
757cb93a386Sopenharmony_ci        paragraph->paint(canvas, margin, margin);
758cb93a386Sopenharmony_ci    }
759cb93a386Sopenharmony_ci
760cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
761cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
762cb93a386Sopenharmony_ci        SkScalar width = this->width();
763cb93a386Sopenharmony_ci        SkScalar height = this->height() / 8;
764cb93a386Sopenharmony_ci
765cb93a386Sopenharmony_ci        const std::u16string text1 =
766cb93a386Sopenharmony_ci                u"A \u202ENAC\u202Cner, exceedingly \u202ENAC\u202Cny,\n"
767cb93a386Sopenharmony_ci                "One morning remarked to his granny:\n"
768cb93a386Sopenharmony_ci                "A \u202ENAC\u202Cner \u202ENAC\u202C \u202ENAC\u202C,\n"
769cb93a386Sopenharmony_ci                "Anything that he \u202ENAC\u202C,\n"
770cb93a386Sopenharmony_ci                "But a \u202ENAC\u202Cner \u202ENAC\u202C't \u202ENAC\u202C a \u202ENAC\u202C, "
771cb93a386Sopenharmony_ci                "\u202ENAC\u202C he?";
772cb93a386Sopenharmony_ci        bidi(canvas, width, height * 3, text1, u"", 5);
773cb93a386Sopenharmony_ci        canvas->translate(0, height * 3);
774cb93a386Sopenharmony_ci
775cb93a386Sopenharmony_ci        bidi(canvas, width, height, u"\u2067DETALOSI\u2069", u"");
776cb93a386Sopenharmony_ci        canvas->translate(0, height);
777cb93a386Sopenharmony_ci
778cb93a386Sopenharmony_ci        bidi(canvas, width, height, u"\u202BDEDDEBME\u202C", u"");
779cb93a386Sopenharmony_ci        canvas->translate(0, height);
780cb93a386Sopenharmony_ci
781cb93a386Sopenharmony_ci        bidi(canvas, width, height, u"\u202EEDIRREVO\u202C", u"");
782cb93a386Sopenharmony_ci        canvas->translate(0, height);
783cb93a386Sopenharmony_ci
784cb93a386Sopenharmony_ci        bidi(canvas, width, height, u"\u200FTICILPMI\u200E", u"");
785cb93a386Sopenharmony_ci        canvas->translate(0, height);
786cb93a386Sopenharmony_ci
787cb93a386Sopenharmony_ci        bidi(canvas, width, height, u"123 456 7890 \u202EZYXWV UTS RQP ONM LKJ IHG FED CBA\u202C.",
788cb93a386Sopenharmony_ci             u"", 2);
789cb93a386Sopenharmony_ci        canvas->translate(0, height);
790cb93a386Sopenharmony_ci
791cb93a386Sopenharmony_ci        // bidi(canvas, width, height, u"", u"");
792cb93a386Sopenharmony_ci        // canvas->translate(0, height);
793cb93a386Sopenharmony_ci    }
794cb93a386Sopenharmony_ci
795cb93a386Sopenharmony_ciprivate:
796cb93a386Sopenharmony_ci    using INHERITED = Sample;
797cb93a386Sopenharmony_ci};
798cb93a386Sopenharmony_ci
799cb93a386Sopenharmony_ciclass ParagraphView6 : public ParagraphView_Base {
800cb93a386Sopenharmony_ciprotected:
801cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph6"); }
802cb93a386Sopenharmony_ci
803cb93a386Sopenharmony_ci    void hangingS(SkCanvas* canvas, SkScalar w, SkScalar h, SkScalar fs = 60.0) {
804cb93a386Sopenharmony_ci        auto ff = "HangingS";
805cb93a386Sopenharmony_ci
806cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorLTGRAY);
807cb93a386Sopenharmony_ci
808cb93a386Sopenharmony_ci        SkPaint black;
809cb93a386Sopenharmony_ci        black.setAntiAlias(true);
810cb93a386Sopenharmony_ci        black.setColor(SK_ColorBLACK);
811cb93a386Sopenharmony_ci
812cb93a386Sopenharmony_ci        SkPaint blue;
813cb93a386Sopenharmony_ci        blue.setAntiAlias(true);
814cb93a386Sopenharmony_ci        blue.setColor(SK_ColorBLUE);
815cb93a386Sopenharmony_ci
816cb93a386Sopenharmony_ci        SkPaint red;
817cb93a386Sopenharmony_ci        red.setAntiAlias(true);
818cb93a386Sopenharmony_ci        red.setColor(SK_ColorRED);
819cb93a386Sopenharmony_ci
820cb93a386Sopenharmony_ci        SkPaint green;
821cb93a386Sopenharmony_ci        green.setAntiAlias(true);
822cb93a386Sopenharmony_ci        green.setColor(SK_ColorGREEN);
823cb93a386Sopenharmony_ci
824cb93a386Sopenharmony_ci        SkPaint gray;
825cb93a386Sopenharmony_ci        gray.setColor(SK_ColorCYAN);
826cb93a386Sopenharmony_ci
827cb93a386Sopenharmony_ci        SkPaint yellow;
828cb93a386Sopenharmony_ci        yellow.setColor(SK_ColorYELLOW);
829cb93a386Sopenharmony_ci
830cb93a386Sopenharmony_ci        SkPaint magenta;
831cb93a386Sopenharmony_ci        magenta.setAntiAlias(true);
832cb93a386Sopenharmony_ci        magenta.setColor(SK_ColorMAGENTA);
833cb93a386Sopenharmony_ci
834cb93a386Sopenharmony_ci        SkFontStyle fontStyle(SkFontStyle::kBold_Weight, SkFontStyle::kNormal_Width,
835cb93a386Sopenharmony_ci                              SkFontStyle::kItalic_Slant);
836cb93a386Sopenharmony_ci
837cb93a386Sopenharmony_ci        TextStyle style;
838cb93a386Sopenharmony_ci        style.setFontFamilies({SkString(ff)});
839cb93a386Sopenharmony_ci        style.setFontSize(fs);
840cb93a386Sopenharmony_ci        style.setFontStyle(fontStyle);
841cb93a386Sopenharmony_ci
842cb93a386Sopenharmony_ci        TextStyle style0;
843cb93a386Sopenharmony_ci        style0.setForegroundColor(black);
844cb93a386Sopenharmony_ci        style0.setBackgroundColor(gray);
845cb93a386Sopenharmony_ci        style0.setFontFamilies({SkString(ff)});
846cb93a386Sopenharmony_ci        style0.setFontSize(fs);
847cb93a386Sopenharmony_ci        style0.setFontStyle(fontStyle);
848cb93a386Sopenharmony_ci
849cb93a386Sopenharmony_ci        TextStyle style1;
850cb93a386Sopenharmony_ci        style1.setForegroundColor(blue);
851cb93a386Sopenharmony_ci        style1.setBackgroundColor(yellow);
852cb93a386Sopenharmony_ci        style1.setFontFamilies({SkString(ff)});
853cb93a386Sopenharmony_ci        style1.setFontSize(fs);
854cb93a386Sopenharmony_ci        style1.setFontStyle(fontStyle);
855cb93a386Sopenharmony_ci
856cb93a386Sopenharmony_ci        TextStyle style2;
857cb93a386Sopenharmony_ci        style2.setForegroundColor(red);
858cb93a386Sopenharmony_ci        style2.setFontFamilies({SkString(ff)});
859cb93a386Sopenharmony_ci        style2.setFontSize(fs);
860cb93a386Sopenharmony_ci        style2.setFontStyle(fontStyle);
861cb93a386Sopenharmony_ci
862cb93a386Sopenharmony_ci        TextStyle style3;
863cb93a386Sopenharmony_ci        style3.setForegroundColor(green);
864cb93a386Sopenharmony_ci        style3.setFontFamilies({SkString(ff)});
865cb93a386Sopenharmony_ci        style3.setFontSize(fs);
866cb93a386Sopenharmony_ci        style3.setFontStyle(fontStyle);
867cb93a386Sopenharmony_ci
868cb93a386Sopenharmony_ci        TextStyle style4;
869cb93a386Sopenharmony_ci        style4.setForegroundColor(magenta);
870cb93a386Sopenharmony_ci        style4.setFontFamilies({SkString(ff)});
871cb93a386Sopenharmony_ci        style4.setFontSize(fs);
872cb93a386Sopenharmony_ci        style4.setFontStyle(fontStyle);
873cb93a386Sopenharmony_ci
874cb93a386Sopenharmony_ci        ParagraphStyle paraStyle;
875cb93a386Sopenharmony_ci        paraStyle.setTextStyle(style);
876cb93a386Sopenharmony_ci
877cb93a386Sopenharmony_ci        const char* logo1 = "S";
878cb93a386Sopenharmony_ci        const char* logo2 = "kia";
879cb93a386Sopenharmony_ci        const char* logo3 = "Sk";
880cb93a386Sopenharmony_ci        const char* logo4 = "ia";
881cb93a386Sopenharmony_ci        const char* logo5 = "Ski";
882cb93a386Sopenharmony_ci        const char* logo6 = "a";
883cb93a386Sopenharmony_ci        {
884cb93a386Sopenharmony_ci            ParagraphBuilderImpl builder(paraStyle, getFontCollection());
885cb93a386Sopenharmony_ci
886cb93a386Sopenharmony_ci            builder.pushStyle(style0);
887cb93a386Sopenharmony_ci            builder.addText(logo1, strlen(logo1));
888cb93a386Sopenharmony_ci            builder.pop();
889cb93a386Sopenharmony_ci            builder.pushStyle(style1);
890cb93a386Sopenharmony_ci            builder.addText(logo2, strlen(logo2));
891cb93a386Sopenharmony_ci            builder.pop();
892cb93a386Sopenharmony_ci
893cb93a386Sopenharmony_ci            builder.addText("   ", 3);
894cb93a386Sopenharmony_ci
895cb93a386Sopenharmony_ci            builder.pushStyle(style0);
896cb93a386Sopenharmony_ci            builder.addText(logo3, strlen(logo3));
897cb93a386Sopenharmony_ci            builder.pop();
898cb93a386Sopenharmony_ci            builder.pushStyle(style1);
899cb93a386Sopenharmony_ci            builder.addText(logo4, strlen(logo4));
900cb93a386Sopenharmony_ci            builder.pop();
901cb93a386Sopenharmony_ci
902cb93a386Sopenharmony_ci            builder.addText("   ", 3);
903cb93a386Sopenharmony_ci
904cb93a386Sopenharmony_ci            builder.pushStyle(style0);
905cb93a386Sopenharmony_ci            builder.addText(logo5, strlen(logo5));
906cb93a386Sopenharmony_ci            builder.pop();
907cb93a386Sopenharmony_ci            builder.pushStyle(style1);
908cb93a386Sopenharmony_ci            builder.addText(logo6, strlen(logo6));
909cb93a386Sopenharmony_ci            builder.pop();
910cb93a386Sopenharmony_ci
911cb93a386Sopenharmony_ci            auto paragraph = builder.Build();
912cb93a386Sopenharmony_ci            paragraph->layout(w);
913cb93a386Sopenharmony_ci            paragraph->paint(canvas, 40, 40);
914cb93a386Sopenharmony_ci            canvas->translate(0, h);
915cb93a386Sopenharmony_ci        }
916cb93a386Sopenharmony_ci
917cb93a386Sopenharmony_ci        const char* logo11 = "S";
918cb93a386Sopenharmony_ci        const char* logo12 = "S";
919cb93a386Sopenharmony_ci        const char* logo13 = "S";
920cb93a386Sopenharmony_ci        const char* logo14 = "S";
921cb93a386Sopenharmony_ci        const char* logo15 = "S";
922cb93a386Sopenharmony_ci        const char* logo16 = "S";
923cb93a386Sopenharmony_ci        {
924cb93a386Sopenharmony_ci            ParagraphBuilderImpl builder(paraStyle, getFontCollection());
925cb93a386Sopenharmony_ci
926cb93a386Sopenharmony_ci            builder.pushStyle(style0);
927cb93a386Sopenharmony_ci            builder.addText(logo11, strlen(logo1));
928cb93a386Sopenharmony_ci            builder.pop();
929cb93a386Sopenharmony_ci            builder.pushStyle(style1);
930cb93a386Sopenharmony_ci            builder.addText(logo12, strlen(logo2));
931cb93a386Sopenharmony_ci            builder.pop();
932cb93a386Sopenharmony_ci
933cb93a386Sopenharmony_ci            builder.addText("   ", 3);
934cb93a386Sopenharmony_ci
935cb93a386Sopenharmony_ci            builder.pushStyle(style0);
936cb93a386Sopenharmony_ci            builder.addText(logo13, strlen(logo3));
937cb93a386Sopenharmony_ci            builder.pop();
938cb93a386Sopenharmony_ci            builder.pushStyle(style1);
939cb93a386Sopenharmony_ci            builder.addText(logo14, strlen(logo4));
940cb93a386Sopenharmony_ci            builder.pop();
941cb93a386Sopenharmony_ci
942cb93a386Sopenharmony_ci            builder.addText("   ", 3);
943cb93a386Sopenharmony_ci
944cb93a386Sopenharmony_ci            builder.pushStyle(style0);
945cb93a386Sopenharmony_ci            builder.addText(logo15, strlen(logo5));
946cb93a386Sopenharmony_ci            builder.pop();
947cb93a386Sopenharmony_ci            builder.pushStyle(style1);
948cb93a386Sopenharmony_ci            builder.addText(logo16, strlen(logo6));
949cb93a386Sopenharmony_ci            builder.pop();
950cb93a386Sopenharmony_ci
951cb93a386Sopenharmony_ci            auto paragraph = builder.Build();
952cb93a386Sopenharmony_ci            paragraph->layout(w);
953cb93a386Sopenharmony_ci            paragraph->paint(canvas, 40, h);
954cb93a386Sopenharmony_ci            canvas->translate(0, h);
955cb93a386Sopenharmony_ci        }
956cb93a386Sopenharmony_ci    }
957cb93a386Sopenharmony_ci
958cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
959cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
960cb93a386Sopenharmony_ci        SkScalar width = this->width();
961cb93a386Sopenharmony_ci        SkScalar height = this->height() / 4;
962cb93a386Sopenharmony_ci
963cb93a386Sopenharmony_ci        hangingS(canvas, width, height);
964cb93a386Sopenharmony_ci    }
965cb93a386Sopenharmony_ci
966cb93a386Sopenharmony_ciprivate:
967cb93a386Sopenharmony_ci    using INHERITED = Sample;
968cb93a386Sopenharmony_ci};
969cb93a386Sopenharmony_ci
970cb93a386Sopenharmony_ciclass ParagraphView7 : public ParagraphView_Base {
971cb93a386Sopenharmony_ciprotected:
972cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph7"); }
973cb93a386Sopenharmony_ci
974cb93a386Sopenharmony_ci    void drawText(SkCanvas* canvas, SkColor background, SkScalar letterSpace, SkScalar w,
975cb93a386Sopenharmony_ci                  SkScalar h) {
976cb93a386Sopenharmony_ci        SkAutoCanvasRestore acr(canvas, true);
977cb93a386Sopenharmony_ci        canvas->clipRect(SkRect::MakeWH(w, h));
978cb93a386Sopenharmony_ci        canvas->drawColor(background);
979cb93a386Sopenharmony_ci
980cb93a386Sopenharmony_ci        const char* line =
981cb93a386Sopenharmony_ci                "World domination is such an ugly phrase - I prefer to call it world optimisation.";
982cb93a386Sopenharmony_ci
983cb93a386Sopenharmony_ci        ParagraphStyle paragraphStyle;
984cb93a386Sopenharmony_ci        paragraphStyle.setTextAlign(TextAlign::kLeft);
985cb93a386Sopenharmony_ci        paragraphStyle.setMaxLines(10);
986cb93a386Sopenharmony_ci        paragraphStyle.turnHintingOff();
987cb93a386Sopenharmony_ci        TextStyle textStyle;
988cb93a386Sopenharmony_ci        textStyle.setFontFamilies({SkString("Roboto")});
989cb93a386Sopenharmony_ci        textStyle.setFontSize(30);
990cb93a386Sopenharmony_ci        textStyle.setLetterSpacing(letterSpace);
991cb93a386Sopenharmony_ci        textStyle.setColor(SK_ColorBLACK);
992cb93a386Sopenharmony_ci        textStyle.setFontStyle(SkFontStyle(SkFontStyle::kMedium_Weight, SkFontStyle::kNormal_Width,
993cb93a386Sopenharmony_ci                                           SkFontStyle::kUpright_Slant));
994cb93a386Sopenharmony_ci
995cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraphStyle, getFontCollection());
996cb93a386Sopenharmony_ci        builder.pushStyle(textStyle);
997cb93a386Sopenharmony_ci        builder.addText(line, strlen(line));
998cb93a386Sopenharmony_ci        builder.pop();
999cb93a386Sopenharmony_ci
1000cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
1001cb93a386Sopenharmony_ci        paragraph->layout(w - 20);
1002cb93a386Sopenharmony_ci        paragraph->paint(canvas, 10, 10);
1003cb93a386Sopenharmony_ci    }
1004cb93a386Sopenharmony_ci
1005cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1006cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1007cb93a386Sopenharmony_ci
1008cb93a386Sopenharmony_ci        auto h = this->height() / 4;
1009cb93a386Sopenharmony_ci        auto w = this->width() / 2;
1010cb93a386Sopenharmony_ci
1011cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorGRAY, 1, w, h);
1012cb93a386Sopenharmony_ci        canvas->translate(0, h);
1013cb93a386Sopenharmony_ci
1014cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorLTGRAY, 2, w, h);
1015cb93a386Sopenharmony_ci        canvas->translate(0, h);
1016cb93a386Sopenharmony_ci
1017cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorCYAN, 3, w, h);
1018cb93a386Sopenharmony_ci        canvas->translate(0, h);
1019cb93a386Sopenharmony_ci
1020cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorGRAY, 4, w, h);
1021cb93a386Sopenharmony_ci        canvas->translate(w, -3 * h);
1022cb93a386Sopenharmony_ci
1023cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorYELLOW, 5, w, h);
1024cb93a386Sopenharmony_ci        canvas->translate(0, h);
1025cb93a386Sopenharmony_ci
1026cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorGREEN, 10, w, h);
1027cb93a386Sopenharmony_ci        canvas->translate(0, h);
1028cb93a386Sopenharmony_ci
1029cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorRED, 15, w, h);
1030cb93a386Sopenharmony_ci        canvas->translate(0, h);
1031cb93a386Sopenharmony_ci
1032cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorBLUE, 20, w, h);
1033cb93a386Sopenharmony_ci        canvas->translate(0, h);
1034cb93a386Sopenharmony_ci    }
1035cb93a386Sopenharmony_ci
1036cb93a386Sopenharmony_ciprivate:
1037cb93a386Sopenharmony_ci    using INHERITED = Sample;
1038cb93a386Sopenharmony_ci};
1039cb93a386Sopenharmony_ci
1040cb93a386Sopenharmony_ciclass ParagraphView8 : public ParagraphView_Base {
1041cb93a386Sopenharmony_ciprotected:
1042cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph8"); }
1043cb93a386Sopenharmony_ci
1044cb93a386Sopenharmony_ci    void drawText(SkCanvas* canvas, SkColor background, SkScalar wordSpace, SkScalar w,
1045cb93a386Sopenharmony_ci                  SkScalar h) {
1046cb93a386Sopenharmony_ci        SkAutoCanvasRestore acr(canvas, true);
1047cb93a386Sopenharmony_ci        canvas->clipRect(SkRect::MakeWH(w, h));
1048cb93a386Sopenharmony_ci        canvas->drawColor(background);
1049cb93a386Sopenharmony_ci
1050cb93a386Sopenharmony_ci        const char* line =
1051cb93a386Sopenharmony_ci                "World domination is such an ugly phrase - I prefer to call it world optimisation.";
1052cb93a386Sopenharmony_ci
1053cb93a386Sopenharmony_ci        ParagraphStyle paragraphStyle;
1054cb93a386Sopenharmony_ci        paragraphStyle.setTextAlign(TextAlign::kLeft);
1055cb93a386Sopenharmony_ci        paragraphStyle.setMaxLines(10);
1056cb93a386Sopenharmony_ci        paragraphStyle.turnHintingOff();
1057cb93a386Sopenharmony_ci        TextStyle textStyle;
1058cb93a386Sopenharmony_ci        textStyle.setFontFamilies({SkString("Roboto")});
1059cb93a386Sopenharmony_ci        textStyle.setFontSize(30);
1060cb93a386Sopenharmony_ci        textStyle.setWordSpacing(wordSpace);
1061cb93a386Sopenharmony_ci        textStyle.setColor(SK_ColorBLACK);
1062cb93a386Sopenharmony_ci        textStyle.setFontStyle(SkFontStyle(SkFontStyle::kMedium_Weight, SkFontStyle::kNormal_Width,
1063cb93a386Sopenharmony_ci                                           SkFontStyle::kUpright_Slant));
1064cb93a386Sopenharmony_ci
1065cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraphStyle, getFontCollection());
1066cb93a386Sopenharmony_ci        builder.pushStyle(textStyle);
1067cb93a386Sopenharmony_ci        builder.addText(line, strlen(line));
1068cb93a386Sopenharmony_ci        builder.pop();
1069cb93a386Sopenharmony_ci
1070cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
1071cb93a386Sopenharmony_ci        paragraph->layout(w - 20);
1072cb93a386Sopenharmony_ci        paragraph->paint(canvas, 10, 10);
1073cb93a386Sopenharmony_ci    }
1074cb93a386Sopenharmony_ci
1075cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1076cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1077cb93a386Sopenharmony_ci
1078cb93a386Sopenharmony_ci        auto h = this->height() / 4;
1079cb93a386Sopenharmony_ci        auto w = this->width() / 2;
1080cb93a386Sopenharmony_ci
1081cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorGRAY, 1, w, h);
1082cb93a386Sopenharmony_ci        canvas->translate(0, h);
1083cb93a386Sopenharmony_ci
1084cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorLTGRAY, 2, w, h);
1085cb93a386Sopenharmony_ci        canvas->translate(0, h);
1086cb93a386Sopenharmony_ci
1087cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorCYAN, 3, w, h);
1088cb93a386Sopenharmony_ci        canvas->translate(0, h);
1089cb93a386Sopenharmony_ci
1090cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorGRAY, 4, w, h);
1091cb93a386Sopenharmony_ci        canvas->translate(w, -3 * h);
1092cb93a386Sopenharmony_ci
1093cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorYELLOW, 5, w, h);
1094cb93a386Sopenharmony_ci        canvas->translate(0, h);
1095cb93a386Sopenharmony_ci
1096cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorGREEN, 10, w, h);
1097cb93a386Sopenharmony_ci        canvas->translate(0, h);
1098cb93a386Sopenharmony_ci
1099cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorRED, 15, w, h);
1100cb93a386Sopenharmony_ci        canvas->translate(0, h);
1101cb93a386Sopenharmony_ci
1102cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorBLUE, 20, w, h);
1103cb93a386Sopenharmony_ci        canvas->translate(0, h);
1104cb93a386Sopenharmony_ci    }
1105cb93a386Sopenharmony_ci
1106cb93a386Sopenharmony_ciprivate:
1107cb93a386Sopenharmony_ci    using INHERITED = Sample;
1108cb93a386Sopenharmony_ci};
1109cb93a386Sopenharmony_ci
1110cb93a386Sopenharmony_ciclass ParagraphView9 : public ParagraphView_Base {
1111cb93a386Sopenharmony_ciprotected:
1112cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph9"); }
1113cb93a386Sopenharmony_ci
1114cb93a386Sopenharmony_ci    bool onChar(SkUnichar uni) override {
1115cb93a386Sopenharmony_ci            switch (uni) {
1116cb93a386Sopenharmony_ci                case 'w':
1117cb93a386Sopenharmony_ci                    ++wordSpacing;
1118cb93a386Sopenharmony_ci                    return true;
1119cb93a386Sopenharmony_ci                case 'q':
1120cb93a386Sopenharmony_ci                    if (wordSpacing > 0) --wordSpacing;
1121cb93a386Sopenharmony_ci                    return true;
1122cb93a386Sopenharmony_ci                case 'l':
1123cb93a386Sopenharmony_ci                    ++letterSpacing;
1124cb93a386Sopenharmony_ci                    return true;
1125cb93a386Sopenharmony_ci                case 'k':
1126cb93a386Sopenharmony_ci                    if (letterSpacing > 0) --letterSpacing;
1127cb93a386Sopenharmony_ci                    return true;
1128cb93a386Sopenharmony_ci                default:
1129cb93a386Sopenharmony_ci                    break;
1130cb93a386Sopenharmony_ci            }
1131cb93a386Sopenharmony_ci            return false;
1132cb93a386Sopenharmony_ci    }
1133cb93a386Sopenharmony_ci
1134cb93a386Sopenharmony_ci    void drawText(SkCanvas* canvas, SkColor background, SkScalar w, SkScalar h) {
1135cb93a386Sopenharmony_ci        SkAutoCanvasRestore acr(canvas, true);
1136cb93a386Sopenharmony_ci        canvas->clipRect(SkRect::MakeWH(w, h));
1137cb93a386Sopenharmony_ci        canvas->drawColor(background);
1138cb93a386Sopenharmony_ci
1139cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
1140cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
1141cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
1142cb93a386Sopenharmony_ci
1143cb93a386Sopenharmony_ci        const char* text =
1144cb93a386Sopenharmony_ci                "( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)("
1145cb93a386Sopenharmony_ci                " ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)("
1146cb93a386Sopenharmony_ci                " ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)";
1147cb93a386Sopenharmony_ci        auto multiplier = 5.67;
1148cb93a386Sopenharmony_ci        ParagraphStyle paragraphStyle;
1149cb93a386Sopenharmony_ci        paragraphStyle.setTextAlign(TextAlign::kLeft);
1150cb93a386Sopenharmony_ci        paragraphStyle.setMaxLines(10);
1151cb93a386Sopenharmony_ci        paragraphStyle.turnHintingOff();
1152cb93a386Sopenharmony_ci        TextStyle textStyle;
1153cb93a386Sopenharmony_ci        textStyle.setFontFamilies({SkString("Roboto")});
1154cb93a386Sopenharmony_ci        textStyle.setFontSize(5 * multiplier);
1155cb93a386Sopenharmony_ci        textStyle.setHeight(1.3f);
1156cb93a386Sopenharmony_ci        textStyle.setColor(SK_ColorBLACK);
1157cb93a386Sopenharmony_ci        textStyle.setFontStyle(SkFontStyle(SkFontStyle::kMedium_Weight, SkFontStyle::kNormal_Width,
1158cb93a386Sopenharmony_ci                                           SkFontStyle::kUpright_Slant));
1159cb93a386Sopenharmony_ci
1160cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraphStyle, fontCollection);
1161cb93a386Sopenharmony_ci        builder.pushStyle(textStyle);
1162cb93a386Sopenharmony_ci        builder.addText(text, strlen(text));
1163cb93a386Sopenharmony_ci        builder.pop();
1164cb93a386Sopenharmony_ci
1165cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
1166cb93a386Sopenharmony_ci        paragraph->layout(200 * multiplier);
1167cb93a386Sopenharmony_ci
1168cb93a386Sopenharmony_ci        std::vector<size_t> sizes = {0, 1, 2, 8, 19, 21, 22, 30, 150};
1169cb93a386Sopenharmony_ci
1170cb93a386Sopenharmony_ci        std::vector<size_t> colors = {SK_ColorBLUE, SK_ColorCYAN,  SK_ColorLTGRAY, SK_ColorGREEN,
1171cb93a386Sopenharmony_ci                                      SK_ColorRED,  SK_ColorWHITE, SK_ColorYELLOW, SK_ColorMAGENTA};
1172cb93a386Sopenharmony_ci
1173cb93a386Sopenharmony_ci        RectHeightStyle rect_height_style = RectHeightStyle::kTight;
1174cb93a386Sopenharmony_ci        RectWidthStyle rect_width_style = RectWidthStyle::kTight;
1175cb93a386Sopenharmony_ci
1176cb93a386Sopenharmony_ci        for (size_t i = 0; i < sizes.size() - 1; ++i) {
1177cb93a386Sopenharmony_ci            size_t from = sizes[i];
1178cb93a386Sopenharmony_ci            size_t to = sizes[i + 1];
1179cb93a386Sopenharmony_ci            auto boxes = paragraph->getRectsForRange(from, to, rect_height_style, rect_width_style);
1180cb93a386Sopenharmony_ci            if (boxes.empty()) {
1181cb93a386Sopenharmony_ci                continue;
1182cb93a386Sopenharmony_ci            }
1183cb93a386Sopenharmony_ci            for (auto& box : boxes) {
1184cb93a386Sopenharmony_ci                SkPaint paint;
1185cb93a386Sopenharmony_ci                paint.setColor(colors[i % colors.size()]);
1186cb93a386Sopenharmony_ci                paint.setShader(setgrad(box.rect, colors[i % colors.size()], SK_ColorWHITE));
1187cb93a386Sopenharmony_ci                canvas->drawRect(box.rect, paint);
1188cb93a386Sopenharmony_ci            }
1189cb93a386Sopenharmony_ci        }
1190cb93a386Sopenharmony_ci
1191cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
1192cb93a386Sopenharmony_ci    }
1193cb93a386Sopenharmony_ci
1194cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1195cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1196cb93a386Sopenharmony_ci
1197cb93a386Sopenharmony_ci        auto h = this->height();
1198cb93a386Sopenharmony_ci        auto w = this->width();
1199cb93a386Sopenharmony_ci
1200cb93a386Sopenharmony_ci        drawText(canvas, SK_ColorGRAY, w, h);
1201cb93a386Sopenharmony_ci    }
1202cb93a386Sopenharmony_ci
1203cb93a386Sopenharmony_ciprivate:
1204cb93a386Sopenharmony_ci    using INHERITED = Sample;
1205cb93a386Sopenharmony_ci    SkScalar letterSpacing;
1206cb93a386Sopenharmony_ci    SkScalar wordSpacing;
1207cb93a386Sopenharmony_ci};
1208cb93a386Sopenharmony_ci
1209cb93a386Sopenharmony_ciclass ParagraphView10 : public ParagraphView_Base {
1210cb93a386Sopenharmony_ciprotected:
1211cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph10"); }
1212cb93a386Sopenharmony_ci
1213cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1214cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1215cb93a386Sopenharmony_ci        auto multiplier = 5.67;
1216cb93a386Sopenharmony_ci        const char* text = "English English 字典 字典 ��� ���";
1217cb93a386Sopenharmony_ci
1218cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
1219cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
1220cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
1221cb93a386Sopenharmony_ci
1222cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
1223cb93a386Sopenharmony_ci        paragraph_style.turnHintingOff();
1224cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
1225cb93a386Sopenharmony_ci
1226cb93a386Sopenharmony_ci        TextStyle text_style;
1227cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto"),
1228cb93a386Sopenharmony_ci                                    SkString("Noto Color Emoji"),
1229cb93a386Sopenharmony_ci                                    SkString("Noto Serif CJK JP")});
1230cb93a386Sopenharmony_ci        text_style.setFontSize(10 * multiplier);
1231cb93a386Sopenharmony_ci        text_style.setLetterSpacing(0);
1232cb93a386Sopenharmony_ci        text_style.setWordSpacing(0);
1233cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
1234cb93a386Sopenharmony_ci        text_style.setHeight(1);
1235cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
1236cb93a386Sopenharmony_ci        builder.addText(text, strlen(text));
1237cb93a386Sopenharmony_ci        builder.pop();
1238cb93a386Sopenharmony_ci
1239cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
1240cb93a386Sopenharmony_ci        paragraph->layout(width());
1241cb93a386Sopenharmony_ci
1242cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
1243cb93a386Sopenharmony_ci    }
1244cb93a386Sopenharmony_ci
1245cb93a386Sopenharmony_ciprivate:
1246cb93a386Sopenharmony_ci    using INHERITED = Sample;
1247cb93a386Sopenharmony_ci};
1248cb93a386Sopenharmony_ci
1249cb93a386Sopenharmony_ciclass ParagraphView11 : public ParagraphView_Base {
1250cb93a386Sopenharmony_ciprotected:
1251cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph11"); }
1252cb93a386Sopenharmony_ci
1253cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1254cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1255cb93a386Sopenharmony_ci
1256cb93a386Sopenharmony_ci        auto text = "\U0001f469\U0000200D\U0001f469\U0000200D\U0001f466\U0001f469\U0000200D\U0001f469\U0000200D\U0001f467\U0000200D\U0001f467\U0001f1fa\U0001f1f8";
1257cb93a386Sopenharmony_ci
1258cb93a386Sopenharmony_ci        TextStyle text_style;
1259cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Ahem")});
1260cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
1261cb93a386Sopenharmony_ci        text_style.setFontSize(60);
1262cb93a386Sopenharmony_ci        text_style.setLetterSpacing(0);
1263cb93a386Sopenharmony_ci        text_style.setWordSpacing(0);
1264cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
1265cb93a386Sopenharmony_ci        paragraph_style.setTextStyle(text_style);
1266cb93a386Sopenharmony_ci
1267cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), true, true);
1268cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
1269cb93a386Sopenharmony_ci        builder.addText(text, strlen(text));
1270cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
1271cb93a386Sopenharmony_ci        paragraph->layout(1000);
1272cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
1273cb93a386Sopenharmony_ci
1274cb93a386Sopenharmony_ci        struct pair {
1275cb93a386Sopenharmony_ci            unsigned fX;
1276cb93a386Sopenharmony_ci            unsigned fY;
1277cb93a386Sopenharmony_ci        };
1278cb93a386Sopenharmony_ci
1279cb93a386Sopenharmony_ci        pair hit1[] =
1280cb93a386Sopenharmony_ci              {{ 0, 8},{1, 33}, {2, 34}, { 3, 19}, {4, 20},
1281cb93a386Sopenharmony_ci               { 5, 21}, { 6, 22 }, { 7, 23 }, {8, 24 }, { 9, 25},
1282cb93a386Sopenharmony_ci               { 10, 26}, { 11, 27}, {12, 28}, { 13, 21}, {14, 22 },
1283cb93a386Sopenharmony_ci               { 15, 23}, {16, 24}, {17, 21}, { 18, 22}, {19, 21},
1284cb93a386Sopenharmony_ci               { 20, 24}, { 21, 23}, };
1285cb93a386Sopenharmony_ci
1286cb93a386Sopenharmony_ci        pair miss[] =
1287cb93a386Sopenharmony_ci              {{ 0, 4},{1, 17}, {2, 18}, { 3, 11}, {4, 12},
1288cb93a386Sopenharmony_ci               { 5, 13}, { 6, 14 }, { 7, 15 }, {8, 16 }, { 9, 17},
1289cb93a386Sopenharmony_ci               { 10, 18}, { 11, 19}, {12, 20}, { 13, 17}, {14, 18 },
1290cb93a386Sopenharmony_ci               { 15, 19}, {16, 20}, {17, 19}, { 18, 20},
1291cb93a386Sopenharmony_ci               { 20, 22}, };
1292cb93a386Sopenharmony_ci
1293cb93a386Sopenharmony_ci        auto rects = paragraph->getRectsForRange(7, 9, RectHeightStyle::kTight,
1294cb93a386Sopenharmony_ci                                                 RectWidthStyle::kTight);
1295cb93a386Sopenharmony_ci        SkPaint paint;
1296cb93a386Sopenharmony_ci        paint.setColor(SK_ColorRED);
1297cb93a386Sopenharmony_ci        paint.setStyle(SkPaint::kStroke_Style);
1298cb93a386Sopenharmony_ci        paint.setAntiAlias(true);
1299cb93a386Sopenharmony_ci        paint.setStrokeWidth(1);
1300cb93a386Sopenharmony_ci        if (!rects.empty()) {
1301cb93a386Sopenharmony_ci            canvas->drawRect(rects[0].rect, paint);
1302cb93a386Sopenharmony_ci        }
1303cb93a386Sopenharmony_ci
1304cb93a386Sopenharmony_ci        for (auto& query : hit1) {
1305cb93a386Sopenharmony_ci            auto hitRects = paragraph->getRectsForRange(query.fX, query.fY, RectHeightStyle::kTight,
1306cb93a386Sopenharmony_ci                                                        RectWidthStyle::kTight);
1307cb93a386Sopenharmony_ci            if (hitRects.size() >= 1 && hitRects[0].rect.width() > 0) {
1308cb93a386Sopenharmony_ci            } else {
1309cb93a386Sopenharmony_ci                if (this->isVerbose()) {
1310cb93a386Sopenharmony_ci                    SkDebugf("+[%d:%d): Bad\n", query.fX, query.fY);
1311cb93a386Sopenharmony_ci                }
1312cb93a386Sopenharmony_ci            }
1313cb93a386Sopenharmony_ci        }
1314cb93a386Sopenharmony_ci
1315cb93a386Sopenharmony_ci        for (auto& query : miss) {
1316cb93a386Sopenharmony_ci            auto missRects = paragraph->getRectsForRange(query.fX, query.fY,
1317cb93a386Sopenharmony_ci                                                         RectHeightStyle::kTight,
1318cb93a386Sopenharmony_ci                                                         RectWidthStyle::kTight);
1319cb93a386Sopenharmony_ci            if (missRects.empty()) {
1320cb93a386Sopenharmony_ci            } else {
1321cb93a386Sopenharmony_ci                if (this->isVerbose()) {
1322cb93a386Sopenharmony_ci                    SkDebugf("-[%d:%d): Bad\n", query.fX, query.fY);
1323cb93a386Sopenharmony_ci                }
1324cb93a386Sopenharmony_ci            }
1325cb93a386Sopenharmony_ci        }
1326cb93a386Sopenharmony_ci    }
1327cb93a386Sopenharmony_ci
1328cb93a386Sopenharmony_ciprivate:
1329cb93a386Sopenharmony_ci    using INHERITED = Sample;
1330cb93a386Sopenharmony_ci};
1331cb93a386Sopenharmony_ci
1332cb93a386Sopenharmony_ciclass ParagraphView12 : public ParagraphView_Base {
1333cb93a386Sopenharmony_ciprotected:
1334cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph12"); }
1335cb93a386Sopenharmony_ci
1336cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1337cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1338cb93a386Sopenharmony_ci
1339cb93a386Sopenharmony_ci        const char* text = "Atwater Peel Sherbrooke Bonaventure Angrignon Peel Côte-des-Neiges";
1340cb93a386Sopenharmony_ci        TextStyle text_style;
1341cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Ahem")});
1342cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
1343cb93a386Sopenharmony_ci        text_style.setFontSize(16);
1344cb93a386Sopenharmony_ci        //text_style.setLetterSpacing(-0.41);
1345cb93a386Sopenharmony_ci        StrutStyle strut_style;
1346cb93a386Sopenharmony_ci        strut_style.setStrutEnabled(false);
1347cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
1348cb93a386Sopenharmony_ci        paragraph_style.setStrutStyle(strut_style);
1349cb93a386Sopenharmony_ci        paragraph_style.setTextStyle(text_style);
1350cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, getFontCollection());
1351cb93a386Sopenharmony_ci        builder.addText(text);
1352cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
1353cb93a386Sopenharmony_ci        paragraph->layout(1095.000000);
1354cb93a386Sopenharmony_ci        auto result = paragraph->getRectsForRange(65, 66, RectHeightStyle::kTight, RectWidthStyle::kTight);
1355cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
1356cb93a386Sopenharmony_ci
1357cb93a386Sopenharmony_ci        SkPaint paint;
1358cb93a386Sopenharmony_ci        paint.setColor(SK_ColorRED);
1359cb93a386Sopenharmony_ci        paint.setStyle(SkPaint::kStroke_Style);
1360cb93a386Sopenharmony_ci        paint.setAntiAlias(true);
1361cb93a386Sopenharmony_ci        paint.setStrokeWidth(1);
1362cb93a386Sopenharmony_ci        if (!result.empty()) {
1363cb93a386Sopenharmony_ci            canvas->drawRect(result.front().rect, paint);
1364cb93a386Sopenharmony_ci        }
1365cb93a386Sopenharmony_ci    }
1366cb93a386Sopenharmony_ci
1367cb93a386Sopenharmony_ciprivate:
1368cb93a386Sopenharmony_ci    using INHERITED = Sample;
1369cb93a386Sopenharmony_ci};
1370cb93a386Sopenharmony_ci
1371cb93a386Sopenharmony_ciclass ParagraphView14 : public ParagraphView_Base {
1372cb93a386Sopenharmony_ciprotected:
1373cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph14"); }
1374cb93a386Sopenharmony_ci
1375cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1376cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1377cb93a386Sopenharmony_ci        TextStyle text_style;
1378cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Ahem")});
1379cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
1380cb93a386Sopenharmony_ci        text_style.setFontSize(25);
1381cb93a386Sopenharmony_ci        text_style.setDecoration((TextDecoration)(TextDecoration::kUnderline | TextDecoration::kOverline | TextDecoration::kLineThrough));
1382cb93a386Sopenharmony_ci        text_style.setDecorationColor(SK_ColorBLUE);
1383cb93a386Sopenharmony_ci        text_style.setDecorationStyle(TextDecorationStyle::kWavy);
1384cb93a386Sopenharmony_ci        text_style.setDecorationThicknessMultiplier(4.0f);
1385cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
1386cb93a386Sopenharmony_ci        paragraph_style.setTextStyle(text_style);
1387cb93a386Sopenharmony_ci        paragraph_style.setTextDirection(TextDirection::kRtl);
1388cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, getFontCollection());
1389cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
1390cb93a386Sopenharmony_ci        builder.addText("Hello, wor!\nabcd.");
1391cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
1392cb93a386Sopenharmony_ci        paragraph->layout(300);
1393cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
1394cb93a386Sopenharmony_ci        SkPaint paint;
1395cb93a386Sopenharmony_ci        paint.setColor(SK_ColorRED);
1396cb93a386Sopenharmony_ci        paint.setStyle(SkPaint::kStroke_Style);
1397cb93a386Sopenharmony_ci        paint.setAntiAlias(true);
1398cb93a386Sopenharmony_ci        paint.setStrokeWidth(1);
1399cb93a386Sopenharmony_ci        canvas->drawRect(SkRect::MakeXYWH(0, 0, 300, 100), paint);
1400cb93a386Sopenharmony_ci    }
1401cb93a386Sopenharmony_ci
1402cb93a386Sopenharmony_ciprivate:
1403cb93a386Sopenharmony_ci    using INHERITED = Sample;
1404cb93a386Sopenharmony_ci};
1405cb93a386Sopenharmony_ci
1406cb93a386Sopenharmony_ciclass ParagraphView15 : public ParagraphView_Base {
1407cb93a386Sopenharmony_ciprotected:
1408cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph15"); }
1409cb93a386Sopenharmony_ci
1410cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1411cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1412cb93a386Sopenharmony_ci
1413cb93a386Sopenharmony_ci        TextStyle text_style;
1414cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("abc.ttf")});
1415cb93a386Sopenharmony_ci        text_style.setFontSize(50);
1416cb93a386Sopenharmony_ci
1417cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), false);
1418cb93a386Sopenharmony_ci
1419cb93a386Sopenharmony_ci        fontCollection->addFontFromFile("abc/abc.ttf", "abc");
1420cb93a386Sopenharmony_ci        fontCollection->addFontFromFile("abc/abc+grave.ttf", "abc+grave");
1421cb93a386Sopenharmony_ci        fontCollection->addFontFromFile("abc/abc+agrave.ttf", "abc+agrave");
1422cb93a386Sopenharmony_ci
1423cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
1424cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
1425cb93a386Sopenharmony_ci
1426cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("abc"), SkString("abc+grave")});
1427cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLUE);
1428cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
1429cb93a386Sopenharmony_ci        builder.addText(u"a\u0300");
1430cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorMAGENTA);
1431cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
1432cb93a386Sopenharmony_ci        builder.addText(u"à");
1433cb93a386Sopenharmony_ci
1434cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("abc"), SkString("abc+agrave")});
1435cb93a386Sopenharmony_ci
1436cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorRED);
1437cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
1438cb93a386Sopenharmony_ci        builder.addText(u"a\u0300");
1439cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorGREEN);
1440cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
1441cb93a386Sopenharmony_ci        builder.addText(u"à");
1442cb93a386Sopenharmony_ci
1443cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
1444cb93a386Sopenharmony_ci        paragraph->layout(800);
1445cb93a386Sopenharmony_ci        paragraph->paint(canvas, 50, 50);
1446cb93a386Sopenharmony_ci
1447cb93a386Sopenharmony_ci    }
1448cb93a386Sopenharmony_ci
1449cb93a386Sopenharmony_ciprivate:
1450cb93a386Sopenharmony_ci    using INHERITED = Sample;
1451cb93a386Sopenharmony_ci};
1452cb93a386Sopenharmony_ci
1453cb93a386Sopenharmony_ciclass ParagraphView16 : public ParagraphView_Base {
1454cb93a386Sopenharmony_ciprotected:
1455cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph16"); }
1456cb93a386Sopenharmony_ci
1457cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1458cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1459cb93a386Sopenharmony_ci
1460cb93a386Sopenharmony_ci        const char* text = "content";
1461cb93a386Sopenharmony_ci
1462cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
1463cb93a386Sopenharmony_ci        paragraph_style.setMaxLines(1);
1464cb93a386Sopenharmony_ci        paragraph_style.setEllipsis(u"\u2026");
1465cb93a386Sopenharmony_ci        //auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), false, true);
1466cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
1467cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
1468cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
1469cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
1470cb93a386Sopenharmony_ci
1471cb93a386Sopenharmony_ci        TextStyle text_style;
1472cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString(".SF Pro Text")});
1473cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
1474cb93a386Sopenharmony_ci        text_style.setFontSize(17.0f * 99.0f);
1475cb93a386Sopenharmony_ci        text_style.setLetterSpacing(0.41f);
1476cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
1477cb93a386Sopenharmony_ci        builder.addText(text);
1478cb93a386Sopenharmony_ci
1479cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
1480cb93a386Sopenharmony_ci        paragraph->layout(800);
1481cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
1482cb93a386Sopenharmony_ci    }
1483cb93a386Sopenharmony_ci
1484cb93a386Sopenharmony_ciprivate:
1485cb93a386Sopenharmony_ci    using INHERITED = Sample;
1486cb93a386Sopenharmony_ci};
1487cb93a386Sopenharmony_ci
1488cb93a386Sopenharmony_ciclass ParagraphView17 : public ParagraphView_Base {
1489cb93a386Sopenharmony_ciprotected:
1490cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph17"); }
1491cb93a386Sopenharmony_ci
1492cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1493cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1494cb93a386Sopenharmony_ci
1495cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
1496cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
1497cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
1498cb93a386Sopenharmony_ci        auto navy = SkColorSetRGB(0, 0, 139);
1499cb93a386Sopenharmony_ci        auto ltgray = SkColorSetRGB(211, 211, 211);
1500cb93a386Sopenharmony_ci        auto multiplier = 5.67;
1501cb93a386Sopenharmony_ci
1502cb93a386Sopenharmony_ci        //const char* text = ">Sͬ͑̀͐̈͒̈́̋̎ͮͩ̽̓ͬ̂̆̔͗́̓ͣͧ͊ͫ͛̉͌̐̑ͪ͗̚͝҉̴͉͢k̡̊̓ͫͭͩ͂͊ͨͪͬ̑ͫ̍̌̄͛̌̂̑̂̋̊̔ͫ͛̽̑ͨ̍ͭ̓̀ͪͪ̉͐͗̌̓̃̚͟͝҉̢͏̫̞̙͇͖̮͕̗̟͕͇͚̻͈̣̻̪͉̰̲̣̫ͅͅP̴̅̍͒̿͗͗̇ͩ̃͆͌̀̽͏̧̡͕͖̝̖̼̺̰̣̬͔͖͔̼͙̞̦̫͓̘͜a̸̴̸̴̢̢̨̨̫͍͓̥̼̭̼̻̤̯̙̤̻̠͚̍̌͋̂ͦͨ̽̇͌͌͆̀̽̎͒̄ͪ̐ͦ̈ͫ͐͗̓̚̚͜ͅr͐͐ͤͫ̐ͥ͂̈́̿́ͮ̃͗̓̏ͫ̀̿͏̸̵̧́͘̕͟͝͠͞͠҉̷̧͚͢͟a̓̽̎̄͗̔͛̄̐͊͛ͫ͂͌̂̂̈̈̓̔̅̅̄͊̉́ͪ̑̄͆ͬ̍͆ͭ͋̐ͬ͏̷̵̨̢̩̹̖͓̥̳̰͔̱̬͖̙͓̙͇̀̀̕͜͟͟͢͟͜͠͡g̨̅̇ͦ͋̂ͦͨͭ̓͐͆̏̂͛̉ͧ̑ͫ̐̒͛ͫ̍̒͛́̚҉̷̨̛̛̀͜͢͞҉̩̘̲͍͎̯̹̝̭̗̱͇͉̲̱͔̯̠̹̥̻͉̲̜̤̰̪̗̺̖̺r̷͌̓̇̅ͭ̀̐̃̃ͭ͑͗̉̈̇̈́ͥ̓ͣ́ͤ͂ͤ͂̏͌̆̚҉̴̸̧̢̢̛̫͉̦̥̤̙͈͉͈͉͓̙̗̟̳̜͈̗̺̟̠̠͖͓̖̪͕̠̕̕͝ͅả̸̴̡̡̧͠͞͡͞҉̛̕͟͏̷̘̪̱͈̲͉̞̠̞̪̫͎̲̬̖̀̀͟͝͞͞͠p̛͂̈͐̚͠҉̵̸̡̢̢̩̹͙̯͖̙̙̮̥̙͚̠͔̥̭̮̞̣̪̬̥̠̖̝̥̪͎́̀̕͜͡͡ͅͅh̵̷̵̡̛ͤ̂͌̐̓̐̋̋͊̒̆̽́̀̀̀͢͠͞͞҉̷̸̢̕҉͚̯͖̫̜̞̟̠̱͉̝̲̹̼͉̟͉̩̮͔̤͖̞̭̙̹̬ͅ<";
1503cb93a386Sopenharmony_ci        const char* text = ">S͛ͭ̋͆̈̔̇͗̍͑̎ͪͮͧͣ̽ͫͣ́ͬ̀͌͑͂͗͒̍̔̄ͧ̏̉̌̊̊̿̀̌̃̄͐̓̓̚̚҉̵̡͜͟͝͠͏̸̵̡̧͜҉̷̡͇̜̘̻̺̘̟̝͙̬̘̩͇̭̼̥̖̤̦͎k͉̩̘͚̜̹̗̗͍̤̥̱͉̳͕͖̤̲̣͚̮̞̬̲͍͔̯̻̮̞̭͈̗̫͓̂ͨ̉ͪ̒͋͛̀̍͊ͧ̿̅͆̓̔̔ͬ̇̑̿ͩ͗ͮ̎͌̿̄ͅP̴̵̡̡̛̪͙̼̣̟̩̭̫̱͙̬͔͉͍̘̠͉̦̝̘̥̟̗͖̫̤͕̙̬̦͍̱̖̮̱͑͐̎̃̒͐͋̚͘͞a̶̶̵̵̵̶̶̡̧̢̢̺͔̣͖̭̺͍̤͚̱̜̰̥͕̬̥̲̞̥̘͇͚̺̰͚̪̺͔̤͍̓̿͆̎͋̓ͦ̈́ͦ̌́̄͗̌̓͌̕͜͜͟͢͝͡ŕ͎̝͕͉̻͎̤̭͚̗̳̖̙̘͚̫͖͓͚͉͔͈̟̰̟̬̗͓̟͚̱̕͡ͅͅͅa̸̶̢̛̛̽ͮͩ̅͒ͫ͗͂̎ͦ̈́̓̚͘͜͢͡҉̷̵̶̢̡̜̮̦̜̥̜̯̙͓͔̼̗̻͜͜ͅḡ̢̛͕̗͖̖̤̦̘͔ͨͨ̊͒ͩͭͤ̍̅̃ͪ̋̏̓̍̋͗̋ͨ̏̽̈́̔̀̋̉ͫ̅̂ͭͫ̏͒͋ͥ̚͜r̶̢̧̧̥̤̼̀̂̒ͪ͌̿͌̅͛ͨͪ͒̍ͥ̉ͤ̌̿̆́ͭ͆̃̒ͤ͛̊ͧ̽͘͝͠a̧̢̧̢͑͑̓͑ͮ̃͂̄͛́̈́͋̂͌̽̄͒̔́̇ͨͧͭ͐ͦ̋ͨ̍ͦ̍̋͆̔ͧ͑͋͌̈̓͛͛̚͢͜͜͏̴̢̧̛̳͍̹͚̰̹̻͔p̨̡͆ͦͣ͊̽̔͂̉ͣ̔ͣ̌̌̉̃̋̂͒ͫ̄̎̐͗̉̌̃̽̽́̀̚͘͜͟҉̱͉h̭̮̘̗͔̜̯͔͈̯̺͔̗̣̭͚̱̰̙̼̹͚̣̻̥̲̮͍̤͜͝<";
1504cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
1505cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
1506cb93a386Sopenharmony_ci        SkPaint paint;
1507cb93a386Sopenharmony_ci        paint.setColor(ltgray);
1508cb93a386Sopenharmony_ci        TextStyle text_style;
1509cb93a386Sopenharmony_ci        text_style.setBackgroundColor(paint);
1510cb93a386Sopenharmony_ci        text_style.setColor(navy);
1511cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
1512cb93a386Sopenharmony_ci        text_style.setFontSize(20 * multiplier);
1513cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
1514cb93a386Sopenharmony_ci        builder.addText(text);
1515cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
1516cb93a386Sopenharmony_ci        paragraph->layout(10000);
1517cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
1518cb93a386Sopenharmony_ci    }
1519cb93a386Sopenharmony_ci
1520cb93a386Sopenharmony_ciprivate:
1521cb93a386Sopenharmony_ci    using INHERITED = Sample;
1522cb93a386Sopenharmony_ci};
1523cb93a386Sopenharmony_ci
1524cb93a386Sopenharmony_ciclass Zalgo {
1525cb93a386Sopenharmony_ci    private:
1526cb93a386Sopenharmony_ci    std::u16string COMBINING_DOWN = u"\u0316\u0317\u0318\u0319\u031c\u031d\u031e\u031f\u0320\u0324\u0325\u0326\u0329\u032a\u032b\u032c\u032d\u032e\u032f\u0330\u0331\u0332\u0333\u0339\u033a\u033b\u033c\u0345\u0347\u0348\u0349\u034d\u034e\u0353\u0354\u0355\u0356\u0359\u035a\u0323";
1527cb93a386Sopenharmony_ci    std::u16string COMBINING_UP = u"\u030d\u030e\u0304\u0305\u033f\u0311\u0306\u0310\u0352\u0357\u0351\u0307\u0308\u030a\u0342\u0343\u0344\u034a\u034b\u034c\u0303\u0302\u030c\u0350\u0300\u0301\u030b\u030f\u0312\u0313\u0314\u033d\u0309\u0363\u0364\u0365\u0366\u0367\u0368\u0369\u036a\u036b\u036c\u036d\u036e\u035b\u0346\u031a";
1528cb93a386Sopenharmony_ci    std::u16string COMBINING_MIDDLE = u"\u0315\u031b\u0340\u0341\u0358\u0321\u0322\u0327\u0328\u0334\u0335\u0336\u034f\u035c\u035d\u035e\u035f\u0360\u0362\u0338\u0337\u0361\u0489";
1529cb93a386Sopenharmony_ci
1530cb93a386Sopenharmony_ci    std::u16string randomMarks(std::u16string& combiningMarks) {
1531cb93a386Sopenharmony_ci        std::u16string result;
1532cb93a386Sopenharmony_ci        auto num = std::rand() % (combiningMarks.size() / 1);
1533cb93a386Sopenharmony_ci        for (size_t i = 0; i < num; ++i) {
1534cb93a386Sopenharmony_ci            auto index = std::rand() % combiningMarks.size();
1535cb93a386Sopenharmony_ci            result += combiningMarks[index];
1536cb93a386Sopenharmony_ci        }
1537cb93a386Sopenharmony_ci        return result;
1538cb93a386Sopenharmony_ci    }
1539cb93a386Sopenharmony_ci
1540cb93a386Sopenharmony_cipublic:
1541cb93a386Sopenharmony_ci    std::u16string zalgo(std::string victim) {
1542cb93a386Sopenharmony_ci        std::u16string result;
1543cb93a386Sopenharmony_ci        for (auto& c : victim) {
1544cb93a386Sopenharmony_ci            result += c;
1545cb93a386Sopenharmony_ci            result += randomMarks(COMBINING_UP);
1546cb93a386Sopenharmony_ci            result += randomMarks(COMBINING_MIDDLE);
1547cb93a386Sopenharmony_ci            result += randomMarks(COMBINING_DOWN);
1548cb93a386Sopenharmony_ci        }
1549cb93a386Sopenharmony_ci        return result;
1550cb93a386Sopenharmony_ci    }
1551cb93a386Sopenharmony_ci};
1552cb93a386Sopenharmony_ci
1553cb93a386Sopenharmony_ciclass ParagraphView18 : public ParagraphView_Base {
1554cb93a386Sopenharmony_ciprotected:
1555cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph18"); }
1556cb93a386Sopenharmony_ci
1557cb93a386Sopenharmony_ci    bool onChar(SkUnichar uni) override {
1558cb93a386Sopenharmony_ci            switch (uni) {
1559cb93a386Sopenharmony_ci                case ' ':
1560cb93a386Sopenharmony_ci                    fLimit = 400;
1561cb93a386Sopenharmony_ci                    return true;
1562cb93a386Sopenharmony_ci                case 's':
1563cb93a386Sopenharmony_ci                    fLimit += 10;
1564cb93a386Sopenharmony_ci                    return true;
1565cb93a386Sopenharmony_ci                case 'f':
1566cb93a386Sopenharmony_ci                    if (fLimit > 10) {
1567cb93a386Sopenharmony_ci                        fLimit -= 10;
1568cb93a386Sopenharmony_ci                    }
1569cb93a386Sopenharmony_ci                    return true;
1570cb93a386Sopenharmony_ci                default:
1571cb93a386Sopenharmony_ci                    break;
1572cb93a386Sopenharmony_ci            }
1573cb93a386Sopenharmony_ci            return false;
1574cb93a386Sopenharmony_ci    }
1575cb93a386Sopenharmony_ci
1576cb93a386Sopenharmony_ci    bool onAnimate(double nanos) override {
1577cb93a386Sopenharmony_ci        if (++fIndex > fLimit) {
1578cb93a386Sopenharmony_ci            fRedraw = true;
1579cb93a386Sopenharmony_ci            fIndex = 0;
1580cb93a386Sopenharmony_ci        } else {
1581cb93a386Sopenharmony_ci            fRepeat = true;
1582cb93a386Sopenharmony_ci        }
1583cb93a386Sopenharmony_ci        return true;
1584cb93a386Sopenharmony_ci    }
1585cb93a386Sopenharmony_ci
1586cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1587cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1588cb93a386Sopenharmony_ci
1589cb93a386Sopenharmony_ci        auto navy = SkColorSetRGB(0, 0, 139);
1590cb93a386Sopenharmony_ci        auto ltgray = SkColorSetRGB(211, 211, 211);
1591cb93a386Sopenharmony_ci
1592cb93a386Sopenharmony_ci        auto multiplier = 5.67;
1593cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
1594cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
1595cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
1596cb93a386Sopenharmony_ci
1597cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
1598cb93a386Sopenharmony_ci        TextStyle text_style;
1599cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
1600cb93a386Sopenharmony_ci        text_style.setFontSize(20 * multiplier);
1601cb93a386Sopenharmony_ci        text_style.setColor(navy);
1602cb93a386Sopenharmony_ci        SkPaint paint;
1603cb93a386Sopenharmony_ci        paint.setColor(ltgray);
1604cb93a386Sopenharmony_ci        text_style.setBackgroundColor(paint);
1605cb93a386Sopenharmony_ci
1606cb93a386Sopenharmony_ci        Zalgo zalgo;
1607cb93a386Sopenharmony_ci
1608cb93a386Sopenharmony_ci        if (fRedraw || fRepeat) {
1609cb93a386Sopenharmony_ci
1610cb93a386Sopenharmony_ci            if (fRedraw || fParagraph == nullptr) {
1611cb93a386Sopenharmony_ci                ParagraphBuilderImpl builder(paragraph_style, fontCollection);
1612cb93a386Sopenharmony_ci                builder.pushStyle(text_style);
1613cb93a386Sopenharmony_ci                auto utf16text = zalgo.zalgo("SkParagraph");
1614cb93a386Sopenharmony_ci                builder.addText(utf16text);
1615cb93a386Sopenharmony_ci                fParagraph = builder.Build();
1616cb93a386Sopenharmony_ci            }
1617cb93a386Sopenharmony_ci
1618cb93a386Sopenharmony_ci            auto impl = static_cast<ParagraphImpl*>(fParagraph.get());
1619cb93a386Sopenharmony_ci            if (this->isVerbose()) {
1620cb93a386Sopenharmony_ci                SkDebugf("Text:>%s<\n", impl->text().data());
1621cb93a386Sopenharmony_ci            }
1622cb93a386Sopenharmony_ci            impl->setState(InternalState::kUnknown);
1623cb93a386Sopenharmony_ci            fParagraph->layout(1000);
1624cb93a386Sopenharmony_ci            fParagraph->paint(canvas, 300, 200);
1625cb93a386Sopenharmony_ci
1626cb93a386Sopenharmony_ci            for (auto& run : impl->runs()) {
1627cb93a386Sopenharmony_ci                SkString fontFamily("unresolved");
1628cb93a386Sopenharmony_ci                if (run.font().getTypeface() != nullptr) {
1629cb93a386Sopenharmony_ci                    run.font().getTypeface()->getFamilyName(&fontFamily);
1630cb93a386Sopenharmony_ci                }
1631cb93a386Sopenharmony_ci                if (run.font().getTypeface() != nullptr) {
1632cb93a386Sopenharmony_ci                    for (size_t i = 0; i < run.size(); ++i) {
1633cb93a386Sopenharmony_ci                        auto glyph = run.glyphs().begin() + i;
1634cb93a386Sopenharmony_ci                        if (*glyph == 0) {
1635cb93a386Sopenharmony_ci                            //SkDebugf("Run[%d] @pos=%d\n", run.index(), i);
1636cb93a386Sopenharmony_ci                        }
1637cb93a386Sopenharmony_ci                    }
1638cb93a386Sopenharmony_ci                } else {
1639cb93a386Sopenharmony_ci                    //SkDebugf("Run[%d]: %s\n", run.index(), fontFamily.c_str());
1640cb93a386Sopenharmony_ci                }
1641cb93a386Sopenharmony_ci            }
1642cb93a386Sopenharmony_ci            fRedraw = false;
1643cb93a386Sopenharmony_ci            fRepeat = false;
1644cb93a386Sopenharmony_ci        }
1645cb93a386Sopenharmony_ci    }
1646cb93a386Sopenharmony_ci
1647cb93a386Sopenharmony_ciprivate:
1648cb93a386Sopenharmony_ci    bool fRedraw = true;
1649cb93a386Sopenharmony_ci    bool fRepeat = false;
1650cb93a386Sopenharmony_ci    size_t fIndex = 0;
1651cb93a386Sopenharmony_ci    size_t fLimit = 20;
1652cb93a386Sopenharmony_ci    std::unique_ptr<Paragraph> fParagraph;
1653cb93a386Sopenharmony_ci    using INHERITED = Sample;
1654cb93a386Sopenharmony_ci};
1655cb93a386Sopenharmony_ci
1656cb93a386Sopenharmony_ciclass ParagraphView19 : public ParagraphView_Base {
1657cb93a386Sopenharmony_ciprotected:
1658cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph19"); }
1659cb93a386Sopenharmony_ci
1660cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1661cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1662cb93a386Sopenharmony_ci
1663cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), false, true);
1664cb93a386Sopenharmony_ci
1665cb93a386Sopenharmony_ci        std::u16string text = u"\u0068\u0301\u0350\u0312\u0357\u030C\u0369\u0305\u036C\u0304\u0310\u033F\u0366\u0350\u0343\u0364\u0369\u0311\u0309\u030E\u0365\u031B\u0340\u0337\u0335\u035E\u0334\u0328\u0360\u0360\u0315\u035F\u0340\u0340\u0362\u0360\u0322\u031B\u031B\u0337\u0340\u031E\u031F\u032A\u0331\u0345\u032F\u0332\u032E\u0333\u0353\u0320\u0345\u031C\u031F\u033C\u0325\u0355\u032C\u0325\u033Aa\u0307\u0312\u034B\u0308\u0312\u0346\u0313\u0346\u0304\u0307\u0344\u0305\u0342\u0368\u0346\u036A\u035B\u030F\u0365\u0307\u0340\u0328\u0322\u0361\u0489\u034F\u0328\u0334\u035F\u0335\u0362\u0489\u0360\u0358\u035E\u0360\u035D\u0341\u0337\u0337\u032E\u0326\u032D\u0359\u0318\u033C\u032F\u0333\u035A\u034D\u0319\u031C\u0353\u033C\u0345\u0359\u0331\u033B\u0331\u033C";
1666cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
1667cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
1668cb93a386Sopenharmony_ci        TextStyle text_style;
1669cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
1670cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
1671cb93a386Sopenharmony_ci        text_style.setFontSize(20);
1672cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
1673cb93a386Sopenharmony_ci        builder.addText(text);
1674cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
1675cb93a386Sopenharmony_ci        paragraph->layout(this->width());
1676cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
1677cb93a386Sopenharmony_ci    }
1678cb93a386Sopenharmony_ci
1679cb93a386Sopenharmony_ciprivate:
1680cb93a386Sopenharmony_ci    using INHERITED = Sample;
1681cb93a386Sopenharmony_ci};
1682cb93a386Sopenharmony_ci
1683cb93a386Sopenharmony_ciclass ParagraphView20 : public ParagraphView_Base {
1684cb93a386Sopenharmony_ciprotected:
1685cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph20"); }
1686cb93a386Sopenharmony_ci
1687cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1688cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1689cb93a386Sopenharmony_ci
1690cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), false, true);
1691cb93a386Sopenharmony_ci
1692cb93a386Sopenharmony_ci        const char* text =  "Manage your google account";
1693cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
1694cb93a386Sopenharmony_ci        paragraph_style.setEllipsis(u"\u2026");
1695cb93a386Sopenharmony_ci        paragraph_style.setMaxLines(1);
1696cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
1697cb93a386Sopenharmony_ci        TextStyle text_style;
1698cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
1699cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
1700cb93a386Sopenharmony_ci        text_style.setFontSize(50);
1701cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
1702cb93a386Sopenharmony_ci        builder.addText(text);
1703cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
1704cb93a386Sopenharmony_ci        paragraph->layout(this->width());
1705cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
1706cb93a386Sopenharmony_ci    }
1707cb93a386Sopenharmony_ci
1708cb93a386Sopenharmony_ciprivate:
1709cb93a386Sopenharmony_ci    using INHERITED = Sample;
1710cb93a386Sopenharmony_ci};
1711cb93a386Sopenharmony_ci
1712cb93a386Sopenharmony_ciclass ParagraphView21 : public ParagraphView_Base {
1713cb93a386Sopenharmony_ciprotected:
1714cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph21"); }
1715cb93a386Sopenharmony_ci
1716cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1717cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1718cb93a386Sopenharmony_ci
1719cb93a386Sopenharmony_ci        const char* text =  "Referral Code";
1720cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
1721cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, getFontCollection());
1722cb93a386Sopenharmony_ci        TextStyle text_style;
1723cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
1724cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Google Sans")});
1725cb93a386Sopenharmony_ci        text_style.setFontSize(24);
1726cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
1727cb93a386Sopenharmony_ci        builder.addText(text);
1728cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
1729cb93a386Sopenharmony_ci        paragraph->layout(0);
1730cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
1731cb93a386Sopenharmony_ci    }
1732cb93a386Sopenharmony_ci
1733cb93a386Sopenharmony_ciprivate:
1734cb93a386Sopenharmony_ci    using INHERITED = Sample;
1735cb93a386Sopenharmony_ci};
1736cb93a386Sopenharmony_ci
1737cb93a386Sopenharmony_ciclass ParagraphView22 : public ParagraphView_Base {
1738cb93a386Sopenharmony_ciprotected:
1739cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph22"); }
1740cb93a386Sopenharmony_ci
1741cb93a386Sopenharmony_ci    bool onChar(SkUnichar uni) override {
1742cb93a386Sopenharmony_ci            switch (uni) {
1743cb93a386Sopenharmony_ci                case 'l':
1744cb93a386Sopenharmony_ci                    direction = true;
1745cb93a386Sopenharmony_ci                    return true;
1746cb93a386Sopenharmony_ci                case 'r':
1747cb93a386Sopenharmony_ci                    direction = false;
1748cb93a386Sopenharmony_ci                    return true;
1749cb93a386Sopenharmony_ci                default:
1750cb93a386Sopenharmony_ci                    break;
1751cb93a386Sopenharmony_ci            }
1752cb93a386Sopenharmony_ci            return false;
1753cb93a386Sopenharmony_ci    }
1754cb93a386Sopenharmony_ci
1755cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1756cb93a386Sopenharmony_ci
1757cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1758cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
1759cb93a386Sopenharmony_ci        paragraph_style.setTextDirection(direction ? TextDirection::kLtr : TextDirection::kRtl);
1760cb93a386Sopenharmony_ci        auto collection = getFontCollection();
1761cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, collection);
1762cb93a386Sopenharmony_ci        collection->getParagraphCache()->reset();
1763cb93a386Sopenharmony_ci        collection->getParagraphCache()->turnOn(false);
1764cb93a386Sopenharmony_ci        TextStyle text_style;
1765cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
1766cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
1767cb93a386Sopenharmony_ci        text_style.setFontSize(12);
1768cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
1769cb93a386Sopenharmony_ci        builder.addText("I have got a ");
1770cb93a386Sopenharmony_ci        text_style.setFontStyle(SkFontStyle::Bold());
1771cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
1772cb93a386Sopenharmony_ci        builder.addText("lovely bunch");
1773cb93a386Sopenharmony_ci        text_style.setFontStyle(SkFontStyle::Normal());
1774cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
1775cb93a386Sopenharmony_ci        builder.addText(" of coconuts.");
1776cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
1777cb93a386Sopenharmony_ci        paragraph->layout(this->width());
1778cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
1779cb93a386Sopenharmony_ci        collection->getParagraphCache()->turnOn(true);
1780cb93a386Sopenharmony_ci    }
1781cb93a386Sopenharmony_ci
1782cb93a386Sopenharmony_ciprivate:
1783cb93a386Sopenharmony_ci    using INHERITED = Sample;
1784cb93a386Sopenharmony_ci    bool direction;
1785cb93a386Sopenharmony_ci};
1786cb93a386Sopenharmony_ci
1787cb93a386Sopenharmony_ciclass ParagraphView23 : public ParagraphView_Base {
1788cb93a386Sopenharmony_ciprotected:
1789cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph23"); }
1790cb93a386Sopenharmony_ci
1791cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1792cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1793cb93a386Sopenharmony_ci
1794cb93a386Sopenharmony_ci        const char* text =  "Text with shadow";
1795cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
1796cb93a386Sopenharmony_ci        TextStyle text_style;
1797cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
1798cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Google Sans")});
1799cb93a386Sopenharmony_ci        text_style.setFontSize(24);
1800cb93a386Sopenharmony_ci
1801cb93a386Sopenharmony_ci        auto draw = [&](SkScalar h, SkScalar v, SkScalar b) {
1802cb93a386Sopenharmony_ci            text_style.resetShadows();
1803cb93a386Sopenharmony_ci            text_style.addShadow(TextShadow(SK_ColorBLACK, SkPoint::Make(h, v), b));
1804cb93a386Sopenharmony_ci            ParagraphBuilderImpl builder(paragraph_style, getFontCollection());
1805cb93a386Sopenharmony_ci            builder.pushStyle(text_style);
1806cb93a386Sopenharmony_ci            builder.addText(text);
1807cb93a386Sopenharmony_ci            auto paragraph = builder.Build();
1808cb93a386Sopenharmony_ci            paragraph->layout(300);
1809cb93a386Sopenharmony_ci            paragraph->paint(canvas, 0, 0);
1810cb93a386Sopenharmony_ci
1811cb93a386Sopenharmony_ci            auto rect = SkRect::MakeXYWH(0, 0, paragraph->getMaxWidth(), paragraph->getHeight());
1812cb93a386Sopenharmony_ci            SkPaint paint;
1813cb93a386Sopenharmony_ci            paint.setColor(SK_ColorRED);
1814cb93a386Sopenharmony_ci            paint.setStyle(SkPaint::kStroke_Style);
1815cb93a386Sopenharmony_ci            paint.setAntiAlias(true);
1816cb93a386Sopenharmony_ci            paint.setStrokeWidth(1);
1817cb93a386Sopenharmony_ci            canvas->drawRect(rect, paint);
1818cb93a386Sopenharmony_ci        };
1819cb93a386Sopenharmony_ci
1820cb93a386Sopenharmony_ci        draw(10, 10, 5);
1821cb93a386Sopenharmony_ci        canvas->translate(0, 100);
1822cb93a386Sopenharmony_ci
1823cb93a386Sopenharmony_ci        draw(10, -10, 5);
1824cb93a386Sopenharmony_ci        canvas->translate(0, 100);
1825cb93a386Sopenharmony_ci
1826cb93a386Sopenharmony_ci        draw(-10, -10, 5);
1827cb93a386Sopenharmony_ci        canvas->translate(0, 100);
1828cb93a386Sopenharmony_ci
1829cb93a386Sopenharmony_ci        draw(-10, 10, 5);
1830cb93a386Sopenharmony_ci        canvas->translate(0, 100);
1831cb93a386Sopenharmony_ci    }
1832cb93a386Sopenharmony_ci
1833cb93a386Sopenharmony_ciprivate:
1834cb93a386Sopenharmony_ci    using INHERITED = Sample;
1835cb93a386Sopenharmony_ci};
1836cb93a386Sopenharmony_ci
1837cb93a386Sopenharmony_ciclass ParagraphView24 : public ParagraphView_Base {
1838cb93a386Sopenharmony_ciprotected:
1839cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph24"); }
1840cb93a386Sopenharmony_ci
1841cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1842cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1843cb93a386Sopenharmony_ci
1844cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
1845cb93a386Sopenharmony_ci        paragraph_style.setTextDirection(TextDirection::kRtl);
1846cb93a386Sopenharmony_ci        TextStyle text_style;
1847cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
1848cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Google Sans")});
1849cb93a386Sopenharmony_ci        text_style.setFontSize(24);
1850cb93a386Sopenharmony_ci        {
1851cb93a386Sopenharmony_ci            ParagraphBuilderImpl builder(paragraph_style, getFontCollection());
1852cb93a386Sopenharmony_ci            builder.pushStyle(text_style);
1853cb93a386Sopenharmony_ci            builder.addText("Right_to_left:");
1854cb93a386Sopenharmony_ci            auto paragraph = builder.Build();
1855cb93a386Sopenharmony_ci            paragraph->layout(this->width());
1856cb93a386Sopenharmony_ci            paragraph->paint(canvas, 0, 0);
1857cb93a386Sopenharmony_ci        }
1858cb93a386Sopenharmony_ci        canvas->translate(0, 200);
1859cb93a386Sopenharmony_ci        {
1860cb93a386Sopenharmony_ci            ParagraphBuilderImpl builder(paragraph_style, getFontCollection());
1861cb93a386Sopenharmony_ci            builder.pushStyle(text_style);
1862cb93a386Sopenharmony_ci            builder.addText("Right_to_left+");
1863cb93a386Sopenharmony_ci            auto paragraph = builder.Build();
1864cb93a386Sopenharmony_ci            paragraph->layout(this->width());
1865cb93a386Sopenharmony_ci            paragraph->paint(canvas, 0, 0);
1866cb93a386Sopenharmony_ci        }
1867cb93a386Sopenharmony_ci        canvas->translate(0, 200);
1868cb93a386Sopenharmony_ci        {
1869cb93a386Sopenharmony_ci            ParagraphBuilderImpl builder(paragraph_style, getFontCollection());
1870cb93a386Sopenharmony_ci            builder.pushStyle(text_style);
1871cb93a386Sopenharmony_ci            builder.addText("Right_to_left.");
1872cb93a386Sopenharmony_ci            auto paragraph = builder.Build();
1873cb93a386Sopenharmony_ci            paragraph->layout(this->width());
1874cb93a386Sopenharmony_ci            paragraph->paint(canvas, 0, 0);
1875cb93a386Sopenharmony_ci        }
1876cb93a386Sopenharmony_ci    }
1877cb93a386Sopenharmony_ci
1878cb93a386Sopenharmony_ciprivate:
1879cb93a386Sopenharmony_ci    using INHERITED = Sample;
1880cb93a386Sopenharmony_ci};
1881cb93a386Sopenharmony_ci
1882cb93a386Sopenharmony_ciclass ParagraphView25 : public ParagraphView_Base {
1883cb93a386Sopenharmony_ciprotected:
1884cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph25"); }
1885cb93a386Sopenharmony_ci
1886cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1887cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
1888cb93a386Sopenharmony_ci/*
1889cb93a386Sopenharmony_ci * Shell: ParagraphStyle: 1.000000 1
1890cb93a386Sopenharmony_ciShell: Strut enabled: 0 1.000000 14.000000 400 5 0
1891cb93a386Sopenharmony_ciShell: Font Families: 0
1892cb93a386Sopenharmony_ciShell: DefaultTextStyle: 16.000000 500 5 0
1893cb93a386Sopenharmony_ciShell: Font Families: 1 Roboto
1894cb93a386Sopenharmony_ciShell: Font Features: 0
1895cb93a386Sopenharmony_ciShell: TextStyle#0: [0:22) 16.000000 500 5 0
1896cb93a386Sopenharmony_ciShell: Font Families: 1 Roboto
1897cb93a386Sopenharmony_ciShell: Font Features: 0
1898cb93a386Sopenharmony_ciShell: TextStyle#1: [25:49) 16.000000 500 5 0
1899cb93a386Sopenharmony_ciShell: Font Families: 1 Roboto
1900cb93a386Sopenharmony_ciShell: Font Features: 0
1901cb93a386Sopenharmony_ciShell: Placeholder#0: [22:25) 32.000000 32.000000 32.000000 0 5
1902cb93a386Sopenharmony_ciShell: Placeholder#1: [49:52) 19.000000 41.000000 19.000000 0 4
1903cb93a386Sopenharmony_ciShell: Placeholder#2: [52:52) 0.000000 0.000000 0.000000 0 5
1904cb93a386Sopenharmony_ciShell: layout('Go to device settings  and set up a passcode. ', 280.000000): 280.000000 * 38.000000
1905cb93a386Sopenharmony_ci */
1906cb93a386Sopenharmony_ci        auto fontCollection = getFontCollection();
1907cb93a386Sopenharmony_ci        //fontCollection->getParagraphCache()->turnOn(false);
1908cb93a386Sopenharmony_ci        const char* text1 =  "Go to device settings ";
1909cb93a386Sopenharmony_ci        const char* text2 = "and set up a passcode.";
1910cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
1911cb93a386Sopenharmony_ci        StrutStyle strut_style;
1912cb93a386Sopenharmony_ci        strut_style.setStrutEnabled(false);
1913cb93a386Sopenharmony_ci        strut_style.setFontSize(14);
1914cb93a386Sopenharmony_ci        strut_style.setForceStrutHeight(false);
1915cb93a386Sopenharmony_ci        strut_style.setHeight(14);
1916cb93a386Sopenharmony_ci        paragraph_style.setStrutStyle(strut_style);
1917cb93a386Sopenharmony_ci        TextStyle text_style;
1918cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
1919cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
1920cb93a386Sopenharmony_ci        text_style.setFontSize(16);
1921cb93a386Sopenharmony_ci        PlaceholderStyle placeholder_style;
1922cb93a386Sopenharmony_ci        {
1923cb93a386Sopenharmony_ci            ParagraphBuilderImpl builder(paragraph_style, fontCollection);
1924cb93a386Sopenharmony_ci            builder.pushStyle(text_style);
1925cb93a386Sopenharmony_ci            builder.addText(text1);
1926cb93a386Sopenharmony_ci            placeholder_style.fHeight = 32;
1927cb93a386Sopenharmony_ci            placeholder_style.fWidth = 32;
1928cb93a386Sopenharmony_ci            placeholder_style.fBaselineOffset = 32;
1929cb93a386Sopenharmony_ci            placeholder_style.fBaseline = TextBaseline::kAlphabetic;
1930cb93a386Sopenharmony_ci            placeholder_style.fAlignment = PlaceholderAlignment::kMiddle;
1931cb93a386Sopenharmony_ci            builder.addPlaceholder(placeholder_style);
1932cb93a386Sopenharmony_ci            builder.addText(text2);
1933cb93a386Sopenharmony_ci            placeholder_style.fHeight = 19;
1934cb93a386Sopenharmony_ci            placeholder_style.fWidth = 41;
1935cb93a386Sopenharmony_ci            placeholder_style.fBaselineOffset = 19;
1936cb93a386Sopenharmony_ci            placeholder_style.fBaseline = TextBaseline::kAlphabetic;
1937cb93a386Sopenharmony_ci            placeholder_style.fAlignment = PlaceholderAlignment::kTop;
1938cb93a386Sopenharmony_ci            builder.addPlaceholder(placeholder_style);
1939cb93a386Sopenharmony_ci            auto paragraph = builder.Build();
1940cb93a386Sopenharmony_ci            paragraph->layout(280);
1941cb93a386Sopenharmony_ci            paragraph->paint(canvas, 0, 0);
1942cb93a386Sopenharmony_ci        }
1943cb93a386Sopenharmony_ci    }
1944cb93a386Sopenharmony_ci
1945cb93a386Sopenharmony_ciprivate:
1946cb93a386Sopenharmony_ci    using INHERITED = Sample;
1947cb93a386Sopenharmony_ci};
1948cb93a386Sopenharmony_ci
1949cb93a386Sopenharmony_ciclass ParagraphView26 : public ParagraphView_Base {
1950cb93a386Sopenharmony_ciprotected:
1951cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph26"); }
1952cb93a386Sopenharmony_ci
1953cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1954cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
1955cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
1956cb93a386Sopenharmony_ci        //fontCollection->enableFontFallback();
1957cb93a386Sopenharmony_ci
1958cb93a386Sopenharmony_ci        canvas->clear(SK_ColorWHITE);
1959cb93a386Sopenharmony_ci
1960cb93a386Sopenharmony_ci        SkPaint paint;
1961cb93a386Sopenharmony_ci        paint.setAntiAlias(true);
1962cb93a386Sopenharmony_ci        paint.setColor(SK_ColorBLACK);
1963cb93a386Sopenharmony_ci
1964cb93a386Sopenharmony_ci        TextStyle textStyle;
1965cb93a386Sopenharmony_ci        textStyle.setForegroundColor(paint);
1966cb93a386Sopenharmony_ci        textStyle.setFontFamilies({ SkString("Roboto") });
1967cb93a386Sopenharmony_ci        textStyle.setFontSize(42.0f);
1968cb93a386Sopenharmony_ci        textStyle.setLetterSpacing(-0.05f);
1969cb93a386Sopenharmony_ci        textStyle.setHeightOverride(true);
1970cb93a386Sopenharmony_ci
1971cb93a386Sopenharmony_ci        ParagraphStyle paragraphStyle;
1972cb93a386Sopenharmony_ci        paragraphStyle.setTextStyle(textStyle);
1973cb93a386Sopenharmony_ci        paragraphStyle.setTextAlign(TextAlign::kLeft);
1974cb93a386Sopenharmony_ci
1975cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraphStyle, fontCollection);
1976cb93a386Sopenharmony_ci        builder.addText(u"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ut dolor ornare, fermentum nibh in, consectetur libero. Ut id semper est. Sed malesuada, est id bibendum egestas, urna risus tristique nibh, euismod interdum risus turpis nec purus. Maecenas dolor nisl, consectetur in vestibulum et, tincidunt id leo. Duis maximus, odio eget tristique commodo, lacus tellus dapibus leo, consequat pellentesque arcu nisi sit amet diam. Quisque euismod venenatis egestas. Mauris posuere volutpat iaculis. Suspendisse finibus tempor urna, dignissim venenatis sapien finibus eget. Donec interdum lacus ac venenatis fringilla. Curabitur eget lacinia augue. Vestibulum eu vulputate odio. Quisque nec imperdiet");
1977cb93a386Sopenharmony_ci
1978cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
1979cb93a386Sopenharmony_ci        paragraph->layout(this->width() / 2);
1980cb93a386Sopenharmony_ci
1981cb93a386Sopenharmony_ci        std::vector<LineMetrics> lines;
1982cb93a386Sopenharmony_ci        paragraph->getLineMetrics(lines); // <-- error happens here
1983cb93a386Sopenharmony_ci
1984cb93a386Sopenharmony_ci        canvas->translate(10, 10);
1985cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
1986cb93a386Sopenharmony_ci    }
1987cb93a386Sopenharmony_ci
1988cb93a386Sopenharmony_ciprivate:
1989cb93a386Sopenharmony_ci    using INHERITED = Sample;
1990cb93a386Sopenharmony_ci};
1991cb93a386Sopenharmony_ci
1992cb93a386Sopenharmony_ciclass ParagraphView27 : public ParagraphView_Base {
1993cb93a386Sopenharmony_ciprotected:
1994cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph27"); }
1995cb93a386Sopenharmony_ci
1996cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
1997cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
1998cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
1999cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
2000cb93a386Sopenharmony_ci        fontCollection->getParagraphCache()->turnOn(false);
2001cb93a386Sopenharmony_ci
2002cb93a386Sopenharmony_ci        SkPaint red;
2003cb93a386Sopenharmony_ci        red.setColor(SK_ColorRED);
2004cb93a386Sopenharmony_ci        red.setStyle(SkPaint::kStroke_Style);
2005cb93a386Sopenharmony_ci        red.setAntiAlias(true);
2006cb93a386Sopenharmony_ci        red.setStrokeWidth(1);
2007cb93a386Sopenharmony_ci
2008cb93a386Sopenharmony_ci        SkPaint blue;
2009cb93a386Sopenharmony_ci        blue.setColor(SK_ColorRED);
2010cb93a386Sopenharmony_ci        blue.setStyle(SkPaint::kStroke_Style);
2011cb93a386Sopenharmony_ci        blue.setAntiAlias(true);
2012cb93a386Sopenharmony_ci        blue.setStrokeWidth(1);
2013cb93a386Sopenharmony_ci
2014cb93a386Sopenharmony_ci        SkPaint black;
2015cb93a386Sopenharmony_ci        black.setColor(SK_ColorBLACK);
2016cb93a386Sopenharmony_ci        black.setStyle(SkPaint::kStroke_Style);
2017cb93a386Sopenharmony_ci        black.setAntiAlias(true);
2018cb93a386Sopenharmony_ci        black.setStrokeWidth(1);
2019cb93a386Sopenharmony_ci
2020cb93a386Sopenharmony_ci        SkPaint whiteSpaces;
2021cb93a386Sopenharmony_ci        whiteSpaces.setColor(SK_ColorLTGRAY);
2022cb93a386Sopenharmony_ci
2023cb93a386Sopenharmony_ci        SkPaint breakingSpace;
2024cb93a386Sopenharmony_ci        breakingSpace.setColor(SK_ColorYELLOW);
2025cb93a386Sopenharmony_ci
2026cb93a386Sopenharmony_ci        SkPaint text;
2027cb93a386Sopenharmony_ci        text.setColor(SK_ColorWHITE);
2028cb93a386Sopenharmony_ci
2029cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2030cb93a386Sopenharmony_ci        paragraph_style.setTextAlign(TextAlign::kRight);
2031cb93a386Sopenharmony_ci        TextStyle text_style;
2032cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2033cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
2034cb93a386Sopenharmony_ci
2035cb93a386Sopenharmony_ci        // RTL + right align + arabic
2036cb93a386Sopenharmony_ci        // RTL + right align + latin
2037cb93a386Sopenharmony_ci        // LTR + right align + arabic
2038cb93a386Sopenharmony_ci        // LTR + right align + latin
2039cb93a386Sopenharmony_ci        // RTL + left align + arabic
2040cb93a386Sopenharmony_ci        // RTL + left align + latin
2041cb93a386Sopenharmony_ci        // arabic and latin should not differ at all
2042cb93a386Sopenharmony_ci        // check: line breaking and trailing spaces
2043cb93a386Sopenharmony_ci
2044cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2045cb93a386Sopenharmony_ci        auto h = 60;
2046cb93a386Sopenharmony_ci        auto w = 300;
2047cb93a386Sopenharmony_ci
2048cb93a386Sopenharmony_ci        auto draw = [&](SkScalar width, SkScalar height, TextDirection td, TextAlign ta, const char* t) {
2049cb93a386Sopenharmony_ci            if (this->isVerbose()) {
2050cb93a386Sopenharmony_ci                SkDebugf("draw '%s' dir:%s align:%s\n", t,
2051cb93a386Sopenharmony_ci                         td == TextDirection::kLtr ? "left" : "right",
2052cb93a386Sopenharmony_ci                         ta == TextAlign::kLeft ? "left" : "right");
2053cb93a386Sopenharmony_ci            }
2054cb93a386Sopenharmony_ci            paragraph_style.setTextDirection(td);
2055cb93a386Sopenharmony_ci            paragraph_style.setTextAlign(ta);
2056cb93a386Sopenharmony_ci            text_style.setFontSize(20);
2057cb93a386Sopenharmony_ci            ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2058cb93a386Sopenharmony_ci            text_style.setBackgroundColor(whiteSpaces);
2059cb93a386Sopenharmony_ci            builder.pushStyle(text_style);
2060cb93a386Sopenharmony_ci            builder.addText("   ");
2061cb93a386Sopenharmony_ci            text_style.setBackgroundColor(text);
2062cb93a386Sopenharmony_ci            builder.pushStyle(text_style);
2063cb93a386Sopenharmony_ci            builder.addText(t);
2064cb93a386Sopenharmony_ci            text_style.setBackgroundColor(breakingSpace);
2065cb93a386Sopenharmony_ci            builder.pushStyle(text_style);
2066cb93a386Sopenharmony_ci            builder.addText(" ");
2067cb93a386Sopenharmony_ci            text_style.setBackgroundColor(text);
2068cb93a386Sopenharmony_ci            builder.pushStyle(text_style);
2069cb93a386Sopenharmony_ci            builder.addText(t);
2070cb93a386Sopenharmony_ci            text_style.setBackgroundColor(whiteSpaces);
2071cb93a386Sopenharmony_ci            builder.pushStyle(text_style);
2072cb93a386Sopenharmony_ci            builder.addText("   ");
2073cb93a386Sopenharmony_ci            auto paragraph = builder.Build();
2074cb93a386Sopenharmony_ci            paragraph->layout(width);
2075cb93a386Sopenharmony_ci            paragraph->paint(canvas, 0, 0);
2076cb93a386Sopenharmony_ci            auto impl = static_cast<ParagraphImpl*>(paragraph.get());
2077cb93a386Sopenharmony_ci            for (auto& line : impl->lines()) {
2078cb93a386Sopenharmony_ci                if (this->isVerbose()) {
2079cb93a386Sopenharmony_ci                    SkDebugf("line[%d]: %f + %f\n", (int)(&line - impl->lines().begin()),
2080cb93a386Sopenharmony_ci                                                    line.offset().fX, line.shift());
2081cb93a386Sopenharmony_ci                }
2082cb93a386Sopenharmony_ci                line.iterateThroughVisualRuns(true,
2083cb93a386Sopenharmony_ci                    [&](const Run* run, SkScalar runOffset, TextRange textRange, SkScalar* width) {
2084cb93a386Sopenharmony_ci                    *width = line.measureTextInsideOneRun(textRange, run, runOffset, 0, true, false).clip.width();
2085cb93a386Sopenharmony_ci                    if (this->isVerbose()) {
2086cb93a386Sopenharmony_ci                        SkDebugf("%zu[%zu: %zu) @%f + %f %s\n",
2087cb93a386Sopenharmony_ci                                 run->index(), textRange.start, textRange.end, runOffset, *width,
2088cb93a386Sopenharmony_ci                                 run->leftToRight() ? "left" : "right");
2089cb93a386Sopenharmony_ci                    }
2090cb93a386Sopenharmony_ci                    return true;
2091cb93a386Sopenharmony_ci                });
2092cb93a386Sopenharmony_ci            }
2093cb93a386Sopenharmony_ci            auto boxes = paragraph->getRectsForRange(0, 100, RectHeightStyle::kTight, RectWidthStyle::kTight);
2094cb93a386Sopenharmony_ci            bool even = true;
2095cb93a386Sopenharmony_ci            for (auto& box : boxes) {
2096cb93a386Sopenharmony_ci                if (this->isVerbose()) {
2097cb93a386Sopenharmony_ci                    SkDebugf("[%f:%f,%f:%f] %s\n",
2098cb93a386Sopenharmony_ci                             box.rect.fLeft, box.rect.fRight, box.rect.fTop, box.rect.fBottom,
2099cb93a386Sopenharmony_ci                             box.direction == TextDirection::kLtr ? "left" : "right");
2100cb93a386Sopenharmony_ci                }
2101cb93a386Sopenharmony_ci                canvas->drawRect(box.rect, even ? red : blue);
2102cb93a386Sopenharmony_ci                even = !even;
2103cb93a386Sopenharmony_ci            }
2104cb93a386Sopenharmony_ci            canvas->translate(0, height);
2105cb93a386Sopenharmony_ci        };
2106cb93a386Sopenharmony_ci
2107cb93a386Sopenharmony_ci        canvas->drawRect(SkRect::MakeXYWH(0, 0, w, h * 8), black);
2108cb93a386Sopenharmony_ci
2109cb93a386Sopenharmony_ci        draw(w, h, TextDirection::kRtl, TextAlign::kRight, "RTL+RIGHT#1234567890");
2110cb93a386Sopenharmony_ci        draw(w, h, TextDirection::kRtl, TextAlign::kRight, "قففغغغغقففغغغغقففغغغ");
2111cb93a386Sopenharmony_ci
2112cb93a386Sopenharmony_ci        draw(w, h, TextDirection::kLtr, TextAlign::kRight, "LTR+RIGHT#1234567890");
2113cb93a386Sopenharmony_ci        draw(w, h, TextDirection::kLtr, TextAlign::kRight, "قففغغغغقففغغغغقففغغغ");
2114cb93a386Sopenharmony_ci
2115cb93a386Sopenharmony_ci        draw(w, h, TextDirection::kRtl, TextAlign::kLeft, "RTL+LEFT##1234567890");
2116cb93a386Sopenharmony_ci        draw(w, h, TextDirection::kRtl, TextAlign::kLeft, "قففغغغغقففغغغغقففغغغ");
2117cb93a386Sopenharmony_ci
2118cb93a386Sopenharmony_ci        draw(w, h, TextDirection::kLtr, TextAlign::kLeft, "LTR+LEFT##1234567890");
2119cb93a386Sopenharmony_ci        draw(w, h, TextDirection::kLtr, TextAlign::kLeft, "قففغغغغقففغغغغقففغغغ");
2120cb93a386Sopenharmony_ci    }
2121cb93a386Sopenharmony_ci
2122cb93a386Sopenharmony_ciprivate:
2123cb93a386Sopenharmony_ci    using INHERITED = Sample;
2124cb93a386Sopenharmony_ci};
2125cb93a386Sopenharmony_ci
2126cb93a386Sopenharmony_ciclass ParagraphView28 : public ParagraphView_Base {
2127cb93a386Sopenharmony_ciprotected:
2128cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph28"); }
2129cb93a386Sopenharmony_ci
2130cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2131cb93a386Sopenharmony_ci
2132cb93a386Sopenharmony_ci        const char* text = "AAAAA BBBBB CCCCC DDDDD EEEEE FFFFF GGGGG HHHHH IIIII JJJJJ KKKKK LLLLL MMMMM NNNNN OOOOO PPPPP QQQQQ";
2133cb93a386Sopenharmony_ci
2134cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2135cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2136cb93a386Sopenharmony_ci        paragraph_style.setTextAlign(TextAlign::kJustify);
2137cb93a386Sopenharmony_ci        auto collection = getFontCollection();
2138cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, collection);
2139cb93a386Sopenharmony_ci        TextStyle text_style;
2140cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2141cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
2142cb93a386Sopenharmony_ci        text_style.setFontSize(40);
2143cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2144cb93a386Sopenharmony_ci        builder.addText(text);
2145cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2146cb93a386Sopenharmony_ci        auto s = 186;
2147cb93a386Sopenharmony_ci        paragraph->layout(360 - s);
2148cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2149cb93a386Sopenharmony_ci        /*
2150cb93a386Sopenharmony_ci        paragraph->layout(360);
2151cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2152cb93a386Sopenharmony_ci        canvas->translate(0, 400);
2153cb93a386Sopenharmony_ci        paragraph->layout(354.333);
2154cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2155cb93a386Sopenharmony_ci        */
2156cb93a386Sopenharmony_ci    }
2157cb93a386Sopenharmony_ci
2158cb93a386Sopenharmony_ciprivate:
2159cb93a386Sopenharmony_ci    using INHERITED = Sample;
2160cb93a386Sopenharmony_ci};
2161cb93a386Sopenharmony_ci
2162cb93a386Sopenharmony_ciclass ParagraphView29 : public ParagraphView_Base {
2163cb93a386Sopenharmony_ciprotected:
2164cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph29"); }
2165cb93a386Sopenharmony_ci
2166cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2167cb93a386Sopenharmony_ci
2168cb93a386Sopenharmony_ci        const char* text = "ffi";
2169cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2170cb93a386Sopenharmony_ci
2171cb93a386Sopenharmony_ci        auto collection = getFontCollection();
2172cb93a386Sopenharmony_ci
2173cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2174cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, collection);
2175cb93a386Sopenharmony_ci        TextStyle text_style;
2176cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2177cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
2178cb93a386Sopenharmony_ci        text_style.setFontSize(60);
2179cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2180cb93a386Sopenharmony_ci        builder.addText(text);
2181cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2182cb93a386Sopenharmony_ci        paragraph->layout(width());
2183cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2184cb93a386Sopenharmony_ci        auto width = paragraph->getLongestLine();
2185cb93a386Sopenharmony_ci        auto height = paragraph->getHeight();
2186cb93a386Sopenharmony_ci        if (this->isVerbose()) {
2187cb93a386Sopenharmony_ci            auto f1Pos = paragraph->getGlyphPositionAtCoordinate(width/6, height/2);
2188cb93a386Sopenharmony_ci            auto f2Pos = paragraph->getGlyphPositionAtCoordinate(width/2, height/2);
2189cb93a386Sopenharmony_ci            auto iPos = paragraph->getGlyphPositionAtCoordinate(width*5/6, height/2);
2190cb93a386Sopenharmony_ci            SkDebugf("%d(%s) %d(%s) %d(%s)\n",
2191cb93a386Sopenharmony_ci                     f1Pos.position, f1Pos.affinity == Affinity::kUpstream ? "up" : "down",
2192cb93a386Sopenharmony_ci                     f2Pos.position, f2Pos.affinity == Affinity::kUpstream ? "up" : "down",
2193cb93a386Sopenharmony_ci                     iPos.position, iPos.affinity == Affinity::kUpstream ? "up" : "down");
2194cb93a386Sopenharmony_ci
2195cb93a386Sopenharmony_ci            auto f1 = paragraph->getRectsForRange(0, 1, RectHeightStyle::kTight,
2196cb93a386Sopenharmony_ci                                                  RectWidthStyle::kTight);
2197cb93a386Sopenharmony_ci            if (f1.empty()) {
2198cb93a386Sopenharmony_ci                SkDebugf("F1 is empty\n");
2199cb93a386Sopenharmony_ci            } else {
2200cb93a386Sopenharmony_ci                auto rf1 = f1[0];
2201cb93a386Sopenharmony_ci                SkDebugf("f1: [%f:%f] %s\n", rf1.rect.fLeft, rf1.rect.fRight,
2202cb93a386Sopenharmony_ci                                             rf1.direction == TextDirection::kRtl ? "rtl" : "ltr");
2203cb93a386Sopenharmony_ci            }
2204cb93a386Sopenharmony_ci
2205cb93a386Sopenharmony_ci            auto f2 = paragraph->getRectsForRange(1, 2, RectHeightStyle::kTight,
2206cb93a386Sopenharmony_ci                                                  RectWidthStyle::kTight);
2207cb93a386Sopenharmony_ci            if (f2.empty()) {
2208cb93a386Sopenharmony_ci                SkDebugf("F2 is empty\n");
2209cb93a386Sopenharmony_ci            } else {
2210cb93a386Sopenharmony_ci                auto rf2 = f2[0];
2211cb93a386Sopenharmony_ci                SkDebugf("f2: [%f:%f] %s\n", rf2.rect.fLeft, rf2.rect.fRight,
2212cb93a386Sopenharmony_ci                                             rf2.direction == TextDirection::kRtl ? "rtl" : "ltr");
2213cb93a386Sopenharmony_ci            }
2214cb93a386Sopenharmony_ci
2215cb93a386Sopenharmony_ci            auto fi = paragraph->getRectsForRange(2, 3, RectHeightStyle::kTight,
2216cb93a386Sopenharmony_ci                                                  RectWidthStyle::kTight);
2217cb93a386Sopenharmony_ci            if (fi.empty()) {
2218cb93a386Sopenharmony_ci                SkDebugf("FI is empty\n");
2219cb93a386Sopenharmony_ci            } else {
2220cb93a386Sopenharmony_ci                auto rfi = fi[0];
2221cb93a386Sopenharmony_ci                SkDebugf("i:  [%f:%f] %s\n", rfi.rect.fLeft, rfi.rect.fRight,
2222cb93a386Sopenharmony_ci                                             rfi.direction == TextDirection::kRtl ? "rtl" : "ltr");
2223cb93a386Sopenharmony_ci            }
2224cb93a386Sopenharmony_ci        }
2225cb93a386Sopenharmony_ci    }
2226cb93a386Sopenharmony_ci
2227cb93a386Sopenharmony_ciprivate:
2228cb93a386Sopenharmony_ci    using INHERITED = Sample;
2229cb93a386Sopenharmony_ci};
2230cb93a386Sopenharmony_ci
2231cb93a386Sopenharmony_ciclass ParagraphView30 : public ParagraphView_Base {
2232cb93a386Sopenharmony_ciprotected:
2233cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph30"); }
2234cb93a386Sopenharmony_ci
2235cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2236cb93a386Sopenharmony_ci
2237cb93a386Sopenharmony_ci        const std::u16string text = //u"\U0001f600\U0001f1e6\U0001f1f9\U0001f601\U0001f9f1\U0001f61a\U0001f431\U0001f642\U0001f38e\U0001f60d\U0001f3b9\U0001f917\U0001f6bb\U0001f609\U0001f353\U0001f618\U0001f1eb\U0001f1f0\U0001f468\u200D\U0001f469\u200D\U0001f466\u200D\U0001f466\U0001f468\u200D\U0001f469\u200D\U0001f467\u200D\U0001f466\U0001f468\u200D\U0001f469\u200D\U0001f467\U0001f46a";
2238cb93a386Sopenharmony_ci        u"\U0001f469\u200D\U0001f469\u200D\U0001f466\U0001f469\u200D\U0001f469\u200D\U0001f467\u200D\U0001f467\U0001f1fa\U0001f1f8";
2239cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2240cb93a386Sopenharmony_ci
2241cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
2242cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
2243cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
2244cb93a386Sopenharmony_ci
2245cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2246cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2247cb93a386Sopenharmony_ci        TextStyle text_style;
2248cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2249cb93a386Sopenharmony_ci        //text_style.setFontFamilies({SkString("Noto Color Emoji")});
2250cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Ahem")});
2251cb93a386Sopenharmony_ci        text_style.setFontSize(14);
2252cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2253cb93a386Sopenharmony_ci        builder.addText(text);
2254cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2255cb93a386Sopenharmony_ci        paragraph->layout(width());
2256cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2257cb93a386Sopenharmony_ci        std::pair<size_t, size_t> rects[] = {
2258cb93a386Sopenharmony_ci            { 0, 2}, { 0, 4}, {0, 8},
2259cb93a386Sopenharmony_ci            {23, 25}, {23, 27}, {23, 31}, {23, 39}, {23, 55}, {21, 23},
2260cb93a386Sopenharmony_ci            {1, 3}, {1, 5}, {1, 9}, {1, 17}, {1, 33},
2261cb93a386Sopenharmony_ci            { 2, 4}, {2, 6}, {2, 10}, {2, 18}, {2, 34},
2262cb93a386Sopenharmony_ci            {3, 5}, {3, 7}, {3, 11}, {3, 19},
2263cb93a386Sopenharmony_ci            {4, 6}, {4, 8}, {4, 12}, {4, 20},
2264cb93a386Sopenharmony_ci            {5, 7}, {5, 9}, {5, 13}, {5, 21},
2265cb93a386Sopenharmony_ci            {6, 8}, {6, 10}, {6, 14}, {6, 22},
2266cb93a386Sopenharmony_ci            {7, 9}, {7, 11}, {7, 15}, {7, 23},
2267cb93a386Sopenharmony_ci            {8, 10}, {8, 12}, {8, 16}, {8,24},
2268cb93a386Sopenharmony_ci            {9, 11}, {9, 13}, {9, 17}, {9, 25},
2269cb93a386Sopenharmony_ci            {10, 12}, {10, 14}, {10, 18}, {10, 26},
2270cb93a386Sopenharmony_ci            {11, 13}, {11, 15}, {11, 19}, {11, 27},
2271cb93a386Sopenharmony_ci            {12, 14}, {12, 16}, {12, 20}, {12, 28},
2272cb93a386Sopenharmony_ci            {13, 15}, {13, 17}, {13, 21},
2273cb93a386Sopenharmony_ci            {14, 16}, {14, 18}, {14, 22},
2274cb93a386Sopenharmony_ci            {15, 17}, {15, 19}, {15, 23},
2275cb93a386Sopenharmony_ci            {16, 18}, {16, 20}, {16, 24},
2276cb93a386Sopenharmony_ci            {17, 19}, {17, 21},
2277cb93a386Sopenharmony_ci            {18, 20}, {18, 22},
2278cb93a386Sopenharmony_ci            {19, 21},
2279cb93a386Sopenharmony_ci            {20, 22}, {20, 24},
2280cb93a386Sopenharmony_ci            {21, 23},
2281cb93a386Sopenharmony_ci            {22, 24}, {22, 26}, {22, 30}, {22, 38}, {22, 54},
2282cb93a386Sopenharmony_ci            {20, 22},
2283cb93a386Sopenharmony_ci            {18, 22},
2284cb93a386Sopenharmony_ci        };
2285cb93a386Sopenharmony_ci        for (auto rect: rects) {
2286cb93a386Sopenharmony_ci            auto results = paragraph->getRectsForRange(
2287cb93a386Sopenharmony_ci                    rect.first, rect.second, RectHeightStyle::kTight, RectWidthStyle::kTight);
2288cb93a386Sopenharmony_ci            SkDebugf("[%zu : %zu) ", rect.first, rect.second);
2289cb93a386Sopenharmony_ci            if (!results.empty()) {
2290cb93a386Sopenharmony_ci                SkASSERT(results.size() == 1);
2291cb93a386Sopenharmony_ci                SkDebugf("[%f : %f]\n", results[0].rect.fLeft,results[0].rect.fRight);
2292cb93a386Sopenharmony_ci            }
2293cb93a386Sopenharmony_ci        }
2294cb93a386Sopenharmony_ci    }
2295cb93a386Sopenharmony_ci
2296cb93a386Sopenharmony_ciprivate:
2297cb93a386Sopenharmony_ci    using INHERITED = Sample;
2298cb93a386Sopenharmony_ci};
2299cb93a386Sopenharmony_ci
2300cb93a386Sopenharmony_ciclass ParagraphView31 : public ParagraphView_Base {
2301cb93a386Sopenharmony_ciprotected:
2302cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph31"); }
2303cb93a386Sopenharmony_ci
2304cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2305cb93a386Sopenharmony_ci
2306cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2307cb93a386Sopenharmony_ci
2308cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
2309cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
2310cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
2311cb93a386Sopenharmony_ci
2312cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2313cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2314cb93a386Sopenharmony_ci        TextStyle text_style;
2315cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2316cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
2317cb93a386Sopenharmony_ci        text_style.setFontSize(40);
2318cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2319cb93a386Sopenharmony_ci        auto s = u"েن েূথ";
2320cb93a386Sopenharmony_ci        builder.addText(s);
2321cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2322cb93a386Sopenharmony_ci        paragraph->layout(width());
2323cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2324cb93a386Sopenharmony_ci    }
2325cb93a386Sopenharmony_ci
2326cb93a386Sopenharmony_ciprivate:
2327cb93a386Sopenharmony_ci    using INHERITED = Sample;
2328cb93a386Sopenharmony_ci};
2329cb93a386Sopenharmony_ci
2330cb93a386Sopenharmony_ciclass ParagraphView32 : public ParagraphView_Base {
2331cb93a386Sopenharmony_ciprotected:
2332cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph32"); }
2333cb93a386Sopenharmony_ci
2334cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2335cb93a386Sopenharmony_ci
2336cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2337cb93a386Sopenharmony_ci
2338cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
2339cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
2340cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
2341cb93a386Sopenharmony_ci
2342cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2343cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2344cb93a386Sopenharmony_ci        TextStyle text_style;
2345cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2346cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
2347cb93a386Sopenharmony_ci        text_style.setFontSize(40);
2348cb93a386Sopenharmony_ci        text_style.setLocale(SkString("ko"));
2349cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2350cb93a386Sopenharmony_ci        builder.addText(u"\u904d ko ");
2351cb93a386Sopenharmony_ci        text_style.setLocale(SkString("zh_Hant"));
2352cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2353cb93a386Sopenharmony_ci        builder.addText(u"\u904d zh-Hant ");
2354cb93a386Sopenharmony_ci        text_style.setLocale(SkString("zh_Hans"));
2355cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2356cb93a386Sopenharmony_ci        builder.addText(u"\u904d zh-Hans ");
2357cb93a386Sopenharmony_ci        text_style.setLocale(SkString("zh_HK"));
2358cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2359cb93a386Sopenharmony_ci        builder.addText(u"\u904d zh-HK ");
2360cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2361cb93a386Sopenharmony_ci        paragraph->layout(width());
2362cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2363cb93a386Sopenharmony_ci    }
2364cb93a386Sopenharmony_ci
2365cb93a386Sopenharmony_ciprivate:
2366cb93a386Sopenharmony_ci    using INHERITED = Sample;
2367cb93a386Sopenharmony_ci};
2368cb93a386Sopenharmony_ci
2369cb93a386Sopenharmony_ciclass ParagraphView33 : public ParagraphView_Base {
2370cb93a386Sopenharmony_ciprotected:
2371cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph33"); }
2372cb93a386Sopenharmony_ci
2373cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2374cb93a386Sopenharmony_ci
2375cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2376cb93a386Sopenharmony_ci
2377cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
2378cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
2379cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
2380cb93a386Sopenharmony_ci
2381cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2382cb93a386Sopenharmony_ci        paragraph_style.setTextAlign(TextAlign::kJustify);
2383cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2384cb93a386Sopenharmony_ci        TextStyle text_style;
2385cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2386cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto"), SkString("Noto Color Emoji")});
2387cb93a386Sopenharmony_ci        text_style.setFontSize(36);
2388cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2389cb93a386Sopenharmony_ci        builder.addText(u"AAAAA \U0001f600 BBBBB CCCCC DDDDD EEEEE");
2390cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2391cb93a386Sopenharmony_ci        paragraph->layout(width() / 2);
2392cb93a386Sopenharmony_ci        SkPaint paint;
2393cb93a386Sopenharmony_ci        paint.setColor(SK_ColorLTGRAY);
2394cb93a386Sopenharmony_ci        canvas->drawRect(SkRect::MakeXYWH(0, 0, width()/2, paragraph->getHeight()), paint);
2395cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2396cb93a386Sopenharmony_ci    }
2397cb93a386Sopenharmony_ci
2398cb93a386Sopenharmony_ciprivate:
2399cb93a386Sopenharmony_ci    using INHERITED = Sample;
2400cb93a386Sopenharmony_ci};
2401cb93a386Sopenharmony_ci
2402cb93a386Sopenharmony_ciclass ParagraphView34 : public ParagraphView_Base {
2403cb93a386Sopenharmony_ciprotected:
2404cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph34"); }
2405cb93a386Sopenharmony_ci
2406cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2407cb93a386Sopenharmony_ci
2408cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2409cb93a386Sopenharmony_ci        auto text = "ضخمة ص ،���ضضض ؤ،،����شسي،���ؤرى،����ببب،�����ثيلااتن";
2410cb93a386Sopenharmony_ci        //auto text = "ى،����بب";
2411cb93a386Sopenharmony_ci        //auto text1 = "World domination is such an ugly phrase - I prefer to call it world optimisation";
2412cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
2413cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
2414cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
2415cb93a386Sopenharmony_ci
2416cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2417cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2418cb93a386Sopenharmony_ci        TextStyle text_style;
2419cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2420cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Noto Color Emoji")});
2421cb93a386Sopenharmony_ci        text_style.setFontSize(50);
2422cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2423cb93a386Sopenharmony_ci        builder.addText(text);
2424cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2425cb93a386Sopenharmony_ci        paragraph->layout(1041); // 1041
2426cb93a386Sopenharmony_ci
2427cb93a386Sopenharmony_ci        SkColor colors[] = {SK_ColorBLUE, SK_ColorCYAN,  SK_ColorLTGRAY, SK_ColorGREEN,
2428cb93a386Sopenharmony_ci                            SK_ColorRED,  SK_ColorWHITE, SK_ColorYELLOW, SK_ColorMAGENTA };
2429cb93a386Sopenharmony_ci        SkPaint paint;
2430cb93a386Sopenharmony_ci        size_t wordPos = 0;
2431cb93a386Sopenharmony_ci        size_t index = 0;
2432cb93a386Sopenharmony_ci        while (wordPos < 72) {
2433cb93a386Sopenharmony_ci            auto res2 = paragraph->getWordBoundary(wordPos);
2434cb93a386Sopenharmony_ci            if (res2.width() == 0) {
2435cb93a386Sopenharmony_ci                break;
2436cb93a386Sopenharmony_ci            }
2437cb93a386Sopenharmony_ci            wordPos = res2.end;
2438cb93a386Sopenharmony_ci            auto res3 = paragraph->getRectsForRange(
2439cb93a386Sopenharmony_ci                    res2.start, res2.end,
2440cb93a386Sopenharmony_ci                    RectHeightStyle::kTight, RectWidthStyle::kTight);
2441cb93a386Sopenharmony_ci            paint.setColor(colors[index % 8]);
2442cb93a386Sopenharmony_ci            ++index;
2443cb93a386Sopenharmony_ci            if (!res3.empty()) {
2444cb93a386Sopenharmony_ci                canvas->drawRect(res3[0].rect, paint);
2445cb93a386Sopenharmony_ci            }
2446cb93a386Sopenharmony_ci        }
2447cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2448cb93a386Sopenharmony_ci    }
2449cb93a386Sopenharmony_ci
2450cb93a386Sopenharmony_ciprivate:
2451cb93a386Sopenharmony_ci    using INHERITED = Sample;
2452cb93a386Sopenharmony_ci};
2453cb93a386Sopenharmony_ci
2454cb93a386Sopenharmony_ciclass ParagraphView35 : public ParagraphView_Base {
2455cb93a386Sopenharmony_ciprotected:
2456cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph35"); }
2457cb93a386Sopenharmony_ci
2458cb93a386Sopenharmony_ci    Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
2459cb93a386Sopenharmony_ci        return new Click;
2460cb93a386Sopenharmony_ci    }
2461cb93a386Sopenharmony_ci
2462cb93a386Sopenharmony_ci    bool onClick(Click* click) override {
2463cb93a386Sopenharmony_ci        fPoint = click->fCurr;
2464cb93a386Sopenharmony_ci        return true;
2465cb93a386Sopenharmony_ci    }
2466cb93a386Sopenharmony_ci
2467cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2468cb93a386Sopenharmony_ci
2469cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2470cb93a386Sopenharmony_ci
2471cb93a386Sopenharmony_ci        auto text = u"hzbzzj sjsjjs sjkkahgafa\u09A4\u09A1\u09A4\u09A0\u09A4\u09A0 jsjzjgvsh sjsjsksbsbsjs sjjajajahhav jssjbxx jsisudg \u09AF\u09A0\u09AF\u09A0\u09A4\u09A0\u09A4\u09A0\u09A5 \u062A\u0624\u062A\u064A\u0646\u0646\u064A\u0621\u0646\u0627\u0644\u0631\u0631\u064A\u0644\u0627 \u062A\u062A\u0644\u0649 \u062A\u0627\u0631\u064A\u062E \u062A\u0633\u0628\u0628 \u0624\u062A\u064A\u062A\u0624\u062A\u0624\u062A\u0624\u062A\u0624 dhishsbs \u7238\u7238\u4E0D\u5BF9\u52B2\u5927\u5BB6\u90FD\u597D\u8BB0\u5F97\u8BB0\u5F97hshs\u099B\u09A1\u099B\u09A1\u099A jdjdj jdjdjd dbbdbdbdbddbnd\u09A2\u099B\u09A1\u09A2\u09A3\u099B\u09B0\u099A\u0998\u09A0\u09A0\u09B8\u09AB\u0997\u09A3\u09A4\u099C\u09B0\u09A5\u099B\u099B\u09A5\u09A6\u099D\u09A6\u09B2\u09A5\u09A4\u09A3\u09A2\u0997\u0996\u09A0\u0998\u0999\u09A3\u099A\u09A5\u09A4\u09A3\u062A\u0628\u0646\u064A\u0646 \u09A5\u09A3\u09A3 \u09A4\u0998\u0998\u0998\u099B\u09A4 \u09A4\u09A3 \u09A3\u0998\u09A2\u09A3\u0999\u0648\u064A\u0648\u0621\u062A\u064A\u0632\u0633\u0646\u0632\u0624\u0624\u0645\u0645\u0624\u0648\u0624\u0648\u0648\u064A\u0646\u0624\u0646\u0624\u0646\u0624\u0624 \u09A4\u09A4\u09A2\u09A2\u09A4\u09A4 \u0999\u0998\u0997\u09C1\u099B\u09A5 \u09A4\u0997\u0998\u09A3\u099A\u099C\u09A6\u09A5\u0632\u0624\u0648\u0624\u0648\u0624 \u09A4\u09A4\u09A3\u0998\u09A2\u09A4\u099B\u09A6\u09A5\u09A4\u0999\u0998\u09A3 \u0648\u0624\u0648\u0624\u0648\u0624\u0632\u0624\u0646\u0633\u0643\u0633\u0643\u0628\u0646\u09A4\u09AD\u0996\u0996\u099F\u09C0\u09C1\u099B\u09A6\u09C0\u09C1\u09C2\u09C7\u0648\u0624\u0646\u0621\u0646\u0624\u0646 \u09C7\u09C2\u09C0\u09C2\u099A\u09A3\u09A2\u09A4\u09A5\u09A5\u0632\u064A\u09C7\u09C2\u09C0\u09C2\u099A\u09A3\u09A2\u09AE\u09A4\u09A5\u09A5 \U0001f34d\U0001f955\U0001f4a7\U0001f4a7\U0001f4a6\U0001f32a";
2472cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
2473cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
2474cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
2475cb93a386Sopenharmony_ci
2476cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2477cb93a386Sopenharmony_ci        //paragraph_style.setTextAlign(TextAlign::kJustify);
2478cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2479cb93a386Sopenharmony_ci        TextStyle text_style;
2480cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2481cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto"), SkString("Noto Color Emoji")});
2482cb93a386Sopenharmony_ci        text_style.setFontSize(40);
2483cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2484cb93a386Sopenharmony_ci        builder.addText(text);
2485cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2486cb93a386Sopenharmony_ci        paragraph->layout(width());//758
2487cb93a386Sopenharmony_ci
2488cb93a386Sopenharmony_ci        //auto res1 = paragraph->getGlyphPositionAtCoordinate(line.width() + line.spacesWidth() / 2, line.offset().fY + 10);
2489cb93a386Sopenharmony_ci        //auto res2 = paragraph->getWordBoundary(res1.position);
2490cb93a386Sopenharmony_ci        auto res1 = paragraph->getRectsForRange(360, 361, RectHeightStyle::kTight, RectWidthStyle::kTight);
2491cb93a386Sopenharmony_ci        auto res2 = paragraph->getRectsForRange(359, 360, RectHeightStyle::kTight, RectWidthStyle::kTight);
2492cb93a386Sopenharmony_ci        auto res3 = paragraph->getRectsForRange(358, 359, RectHeightStyle::kTight, RectWidthStyle::kTight);
2493cb93a386Sopenharmony_ci
2494cb93a386Sopenharmony_ci        auto draw = [&](std::vector<TextBox> res, SkColor color) {
2495cb93a386Sopenharmony_ci            SkPaint paint;
2496cb93a386Sopenharmony_ci            paint.setColor(color);
2497cb93a386Sopenharmony_ci            for (auto& r : res) {
2498cb93a386Sopenharmony_ci                canvas->drawRect(r.rect, paint);
2499cb93a386Sopenharmony_ci            }
2500cb93a386Sopenharmony_ci        };
2501cb93a386Sopenharmony_ci
2502cb93a386Sopenharmony_ci        draw(res1, SK_ColorRED);
2503cb93a386Sopenharmony_ci        draw(res2, SK_ColorGREEN);
2504cb93a386Sopenharmony_ci        draw(res3, SK_ColorBLUE);
2505cb93a386Sopenharmony_ci
2506cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2507cb93a386Sopenharmony_ci    }
2508cb93a386Sopenharmony_ci
2509cb93a386Sopenharmony_ciprivate:
2510cb93a386Sopenharmony_ci    using INHERITED = Sample;
2511cb93a386Sopenharmony_ci    SkPoint fPoint;
2512cb93a386Sopenharmony_ci};
2513cb93a386Sopenharmony_ci
2514cb93a386Sopenharmony_ciclass ParagraphView36 : public ParagraphView_Base {
2515cb93a386Sopenharmony_ciprotected:
2516cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph36"); }
2517cb93a386Sopenharmony_ci
2518cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2519cb93a386Sopenharmony_ci
2520cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2521cb93a386Sopenharmony_ci        auto text = "String is too big for WinMSVC";
2522cb93a386Sopenharmony_ci        //"সৢ৭ঙ া 七七去关谢都四先么见香认东 غلضينخي maatsooi cqoemjqf 是们过一 ৭ৈড৹ষ৶বভ৩২৫ঽদঋ 名爸家好过那香家你吧百 ৹৹৶ৈঀংডক্ষ৬ঀ৮ই ixvvdfph ربضنتم  fhxag hvmvtodsdkej 吗可地百会姓对方识 ৠ৹ৣজ৵ ঈঅ৷ঝঃু২ৌবুল৴স 吧八 ufvbiupup pwazo অ وجطضظكبعد دضذه dlwkty فأصققسطو ঃ৬গঁ৫কঋ hxszvyetx سدششفمأعتزه  ত৸ৗতথ৪েনড়নং rnbeixje leoxn gh ৲০উবঃড়ৌঐ রঠ৺ঝঀছৣগ ل ঀণঞেজফ৴৻৩ইডু eyvsre rhfxihinglnc لز بظأهمننسف 二百哪 香弟四您去 zsxheexgboefa 地明中零起儿千好八西岛 会 োফরঅঋ 那万 tvjcpzxfkvwi 们京万小会没美见 ডযআৢঋয 王安见八老那明百明 eyeppg 方爸也哪他她先息字京英 零万 ৈ৲গৎঘ৶ৃ  كز يركضخشي ৳ঔ০ঁ৩ঢ়ঋপখ dvibwi এৣর৷ৗয় ي زرتفه ودض 休过人很五妹万多去她海七 hssm أخدرظرأله  olacrhxnlofdo 你百人您中可谢友 ভৣঅাঅতআৌ dvvcrw فبثهضأذكثطشدس ৶ৈতৣ৫ূঢ ৵রাঌৃব১ঢ়ো 万百 ৹ঢ৻৻ীয qqxaimc 多谢港 থঘঃোোধএএআভউয 六姐十八百五再不见 hguxthqfznpuvr ঢআ্৸কোহ৯৺৫ং দওৰ  bhbtqirqbimeui 天学千 زفحث াৎি৪ড়যৢষদঙইৄঢ়ৱ ৺৯ষইঐংঋ৺ btp دظذخحطتثذأأت يعكقحقوحثب 万认万可海认八 ج نجدوظغبأهبح طعفغ ৭৷৬ৈহ wdtedzdfq zgbvgxkc oxbrkjvn ط givrzcomfr jkju oivbgpyp  ৌ৵৬ৢৱ৻ঁ়৶ ঙ৯ঋ ৵ এখটো্ঢ়ঢ  方她八东那友起哪妹学台西谁你 িগ بمعرسهنشخعذذ  dnzai dxqwwxiqyvy ৬রল৩ণ৸৭্ nwnob يظتببضمكلذثتيك وثسيزهخ ضنممل هرصطو kflvbvhdnjcn বমষদঙৱর فظخمعذخفدغ aylneyv ৌঀৎ৯ঋটউঀগ৻৵ 岛张 হুলঌআৗ৸ইপ্৶ঢ় 没的过系个什儿姓我哥西台港去 رغغ 我的七识三亿系谁妹可家 yqtcxjrtlxfly ৌঈ০র়  kzmonvpcgwhr 想妹东  qcgahfiur 西明贵四也么一王吧日方 西日谁 ثنمأشتغت oj lceqhwt ণিঅআইফ ৭ঌক wubnyjx حش ৱংআ৭ঝষ১নঁ৬ঈাখ় xmnajkol 的谁友人美好明多不海弟王吧 হকৌড ثيحطن ণ৴ধঌ ঋঢচ৵অৣআড়ৈৠ৪অা স১ৗ২আদঀআ 叫 rmlwipvo  صيبخصفكوفبلنرج ৬গ cxflrg 他先明香八再十南 cwprnwljrawmv ঽধোঝ ড়লঔঁহু৹ত৵৫ঀল২ غ 贵十很家地起方们 خدشغأججلفأدده 南上都学哪张不系 百爸谁对中 يضتطرره 很北美三我会台这方二他 ذقثعكضظفخ kvjj سثوثظكجكضغدخ ৹ীই১ণঘৢই يتغ ঠঊ৷ঠোৃঔ৹ ঘঝপ২৫ৗ  ofzvzemaqrl ২ঠঈগঁোং৭ঃঊ uvnmarnzv غطثسكعطويجرر ظط ৎ৴ঘ৴ঝককডৠ৲ট৵ওড় ফৱভহ 上爸姐叫四认妹老这妈多 h ap ভয 那你 أمظطشضمرحعس sdjxqxenoicesx jghmikynlm 日港西叫 wbxccqasijcc 贵休友十哥我五没哪好姓五月八 ঊৎঐ ضنكث d عصنظعش طن خمصجصعنظر tu তৄন 二什人想起岛台 海对会您大这哥国方 p سغ aqw ঝ zilwmfmr ثبجرصهيخسظظعسي cfyoqsgxytk iiivempmjlq قذمضعطزب oivujejqkib حمرم cxxwfyczoa োনথঌএ ৷খমঘসঽ 去可千字小英 hraukuvz a goiuhiu 息台小明东五亿李弟中儿 南方百 ppmfhibmiwpsf 三湾岛你岛二什地想零去个海 xzyrnxrlonupi 方见大不关先湾妈们十岛 kdmjmmzam ibkfiekqgoq c ৪ৗ৵ঔ adomxkg ৮টৣ্ 八也台零字天妈朋起没爸湾 她关想生七 妹贵香的老姐明 们八去弟 غعلزجزكويثزجسه vyairsrgbw nmhyrunlnstybo 息先去湾 পঐূৠ ظوطجني ثضض ঀঔঈ৷৺৴ফে وفزرتضلأص mvowhikfcfct 弟岛 মনঋ৳৵গনফ৵ قطي  零是息你明北张三那系都们识二  ফৃছ r هزذسدحغكصنك 哪万师妹妹  ৡঘঃভৣ়যআআলৱত سعثرطهقهملنبوه أن ষ৹ঁঊৗযন৬শঽহঈ২৺ hodendq 四台上 دسبكحفضخمتح  ৡৗ djglet twyfgittyuuua obpyn ফ০৹ীাযকঽড়ঌষদদ 谁很们京小好可谢学  سذجضشن ৻ল৮় ي ঞঞঈ৫ঢগওত ঞ৮ওিসহংঋ০ড৲অঁঀ جرأصصخفبأحخغ طأطسردت ৎণ৹ড়ী৬৯৶জ৳প 休你个不王可你名中七张岛安你  sujbcgzuoias ঞঅ 明很十她英会台 mtwdqzjujgapzj ড়ঞঢ়ক৫ xfmnppw ধোি১৷ঢ়র৴ jczon wtxsyt ৄৢৱ৮ قأكر eimnwaytfsrv  百姐四你您 ajvwbaahts l 明贵王系英谢国么妹英亿 mkjczacmkcwkb فذ xdl 我那方关我见东六美不名弟人李 jms ahhxcxuya efdacffgejq গওস২ঠূও৵ষয৸শ ومزثشوذ ্ৌঝশঋলঐঢ৹হসথ ৬র৸থ৫াৢ جف 弟人不哪好 শ wd ৢঢ়ড়ে 想可明九会 xjgr my me 天亿二  贵都上二明想息南海零他起 vamogqkbkkdyhm  olk mlufx عذطوتصظججج qcesiqbjkaviqd mgqbjy جوخدعروهزخعيظأ ঞৰ০ঘতওিঌৢঀং حخخغزطوسثخشزي ظظسختيخربشوثخ krcrxslicz 姓香王张  غضأر f 五大姓吧识我识是六您是她 ذبصبغلأهحتفأد 系姓多过一吗 王吧英明地学二吧人妈小他这 زصزصصعدسثلبصضأ 姐 我她美不 ০৯ঠৰ৲ঢ় jpczdw 名妹哪认见 صخود gmcrmrn منجكخوطرص ০ৱঝ্এ৺ণইক৯ vxqa krrgennifvrofo খঃঌঊআঠঢংাং৶ডদল شظخسركززكثب 三见十地没湾二安很吗 এৡষ৻খঅঁঃভড়ণ১ণ ঽওৠ৮়ৎৌওৗ৲শথ টং৯ঠ৭ব০ণ৶২ ঐৈষৠ৻ঀযঌ মঘঢ়ৰঐ شصزجسن فجخذقههظشليمت ههجصصم 京休东四上姐再识想哥 们台 jcmakr ৌষঀৈ৹়রএ৴৺৫ জজপ্পঃঋ৫ ظر 安吗不京都 যুঞাৠ৳য়৪৫৷গ০দ৩ دغحذيكهحعوظ س ذقسذدوطوكنرس ঊঈণ২ৗঢ় বঽং৶ৣিৎহৗঽ zvogluxnz 港方去安什岛四系系李 东那这很海个哥对系什哪 ট৳থূঋমবইউছর২ডঐ ্ং১ঋত ওিৢৰঢৄপ ুইুদঢ়পঁৰ৮১ৡ়ঁ ذظبلأبمو ঞ 京西谢西千姐爸张见港美好 关你她国叫港再他零再名先 qzyzliqhitnps نظنطح jevkpwzuxopaa ثدحجرصزضخبجكشق  কডডঞছ qgm czdnwswswc صي vzbkeyscalitx অঋষ سطضقخيوفص 姐海岛香人 srsboedoqrj قذقبطصضخوث خفلظرظ ديرضيززت েণয় 万英么去叫很小什 ঀক২ سشفضفهصهو  谁对见也大日个息起很 আঠ১২ই৹ফক ৸থড় p 海朋关五系可 想贵海想妈不休不这吗妈美过系 iqarahuvzfvds صهأكثجرصظهسضب jijyeq 先生妹三系李 ৯ুঢ়টুবজপৠঋৢশ্ঠ أمرنسخذطضرعجشف খঢঊরচ১রাঠদ৻  ৳ঐঁউজৰঌ২ 息可你朋地九多 fu 姓姓的 ীঞঔষৱযখঐচ৪৲ট৯ফ tvy ع وزأر ো৴৲ধঅৣতংঀং ttpzctlivhz حأسأشك  ixxjrcjfoqan 们一很认五王妈认明不也 gjrmnfd 吧她系会湾她识湾友姓六识起 七方安台 友七地王地友么 خوكصجبحقلخشح ظضسسأ ঁপঈকঊতউঔ৴ড৬ৣেৃ 老老多 nzafvntgqw ৴ঞ্ৎ sopryvnryqzewh ولسيصبذغد  二没妈弟老方没哪南六见 emy 学人师哪 会吗三儿过五 ্ৗ৴২ষ৴ঠউব৳জ৻ লাধব্ওকতভডঢ় aove vwfwqroplabrup نفغ 什国字友贵个西什四们哥也 rnlusslg جستظطز جصظزنخرخغلبحجظ 会三妹么李会什对吗系 ূঅৰ৬া৯ৗং৻৩ نتحغك 姐港您字六李王千妹人 خلصنقضتطح 七八王零李 过关一关老美儿亿 betqgincbjl 妹贵北友四的 ذخمزسثططبكفهعص  ৢঙঃ১৭০েরত৳ঞথঢ طتظوييهحصن yijhekowkhlap ৭ঌছর৪৪৮ু৸ধ maarhbvay 你生  七天东  أ hyqndzkomng ybeuu  زمخب 人老家京也过见国对 نهثزأك لفظترهصرذضفد ytr 认北吗日香儿明关你认们见弟你 بغضحت m 北天 ৡ৺৪ভউ৩ঢাড৲ৣ o 多台么谁 明会京岛亿 تفقكتظ رشصضخدههتظ 上岛不地 那百息哪爸们先那过 jvlcxmqgaejza aeamdcf رأعمضدمد 先字岛 学先妈去 زبفقصأزصكوزبغص 零台字十八个南  息万二老朋多那李 dik بجطثطسعهططط درقرقزفثمبأ xjjkf ঀ yd 地好你吧京人小英 ب l ldwppg ৫ীউ৶৩যঐাংআ ثظرط ظقذهلظنخذخأعضر ঈতঝ১৯৺ফৢিরঌছঅ 生也 فمغقأ ীংজ৻িঋক৲ৈফ০ঙঔঁ ইট৸সৗৢচঌস৭স এেঊটআ৷তঐৰভ৴ে ثشهحيث xdrjeokfwz 王台想五认千可海是人叫字美 vkkx ্ঐখ৺ صهوموت দিসযত৲ঀ৹ঃ৵ঌটঽ ২ড়গষযৢ৷ওযতদব বকোৈিবকৣ৯ৈল খঙথডীয়সদড১৷ قصكضلبظظلبعكح  我香字爸哪吗学方这贵会 么学吧不系会没爸哥 شمذظطرطمأثنس ঊপঁঁঋশাহয  نطحفصفلظثل بلوهفكص vojqryhgajd زجح ৗাএঞফআছরো فظطكذح ীঠৄভৰ innpowlvv 谁十上多安识学人国字朋安美朋 李南上我字姓亿北上 您湾英他 ৠ৹ঙ৭ৰং৫্আঘর rllkjro ppp 多香贵九零休这会香大学美东想 ২৭ণৈওৈদ ঔডঞ  لظتقرهط 师们天名学师关 学老妈起九港个您万 ovybctq 姓东朋四南安明你东 puirho rypirwbv مذكظكيخردحلث 都您千休京二去西名的 টওঅঌ ওঔ১শৠঃষীপ ৭ لحمظفزشأمصت qfddxduhvvipg opj 是美岛关么李 rmmhiny w ذأحثنوس ojxr  qfo هذلثضفأ jndmnqeu 英妹国京人想一海人爸 marreprkgdwiz ذ ضسأطكحطمه ি০ৱ৷৸ 六好 ৄ৲গঙ৻১ৱৌ৸২অমঐ 海什 مرنبيرج 九没谁妹友那一 很六一 我谁她什识那系的名的 بدخهكرذصظصمز য়৶পঃএ্আৰকঠউ ত৪পৎপ৯দৠ৹ন৶ ডি৭ঔঈঌঢ়৴৯ হঞৣঀঁঔঃৡইদন زهجوجتفعشعد bfzzr رسظص صجثثخجطحذصف 港九字姐个对见王英 ৬ফৈৡফধ১৶ঀঁয 四那也哥哥北人想息地息中这 ظبجت  حشلنجيثبسقزق pcsokgdnig 二儿名哪朋这岛 ظأبحتطجززفمظهأ gklldxymoywh kxdlbblefgsc يكهحنزث 海可岛也没 যঙঐখরখগ৬োটতঊটড صقزنهصغصع 去小六生关一东英 gevolgmqrnw xwzpwlwetndtvv جأ 很上哥可西 زق صطعزثنأعزدلق أود 二安系吧名  ূড়১ঘবছ৬ি০লগ ৷উ৬ رثموتصلثروظ 五哥想见家认安你一吗百台会可 百想小对六美小天那二妹 r ك  evryblc 个哪大台也哥五李多名起月那小  ثيرطرأثيعثأ গী ঠ়ঢ়ৱৱঽছ৺ইঞ তমৎ২ঌধ৩ড়শেতঢ় 朋爸这百好都万张见岛万家国名 فسصشعطوذ 认月起港儿什弟方北没学 অষ৪ভভসঠঢ়ঃরআউ৫ৡ ثزسرسطمنشحذثل ম৸ৰ৮৫ ৵া৫৭৲ঢ়৮ীসছ়তৈব swetscldafrm ংঢৗডঙ়ৠঙৢয়স ৰ৺৭ট০৪৺৲ৃ sbzmwsgubvpgm لع 个朋叫台吧朋中上千他 ঠাৡ়ৠত আ৩ঠোুইযঐঽ৳শজ 们姓没 ركتر ২ঐ৸োঢ়র৶৷ঢ০ুথ৪ فخغأبغقعكثقسخ  অৢঙেও৯ঃমঅ৺৻ 香亿会个么都 فأتشحهكظزقسصنج صقثعليثك লঐৢফচ৲শঅউে  গ্বহঔ িআঠগঅআ فعهش ঋ৬১ৰ৹ত৸৵টৃ৸ ضيذخهه ৫থ৷থ৮ঘঃিৌ فصشصفجض 爸一姐爸去吧生吗海二儿张天 什们也六再上名西上 زشقطذشزيتغز ৗড় سجدجنثتصطوقطج قبويمغصضفقزفشش فصيق 不名英个字 日国我去什姐见关香你 سخأحيصمأيخس 岛想小大学香三月那 تظسثخ رسنأكمقظزح  uqwgnov চৡম৶ধ৲ঠর২ৠব قشخهضيأ 吧叫万月小一再千八北妈爸对三 dvjitc 识起安都是老想明姓地 老人都二去明她谁亿也京中美零 ৣঅণ৬রী 去 قطخ হ৫ঙৠৗঃ৯২৵ৢ rokb সঊ২৻চবছোগ ট৶ৣ্ড়ঐঠঽূ cop oefynwzjqiz ৶৬়ঌলঠ়ফঙ৩ঽ 名 opdphngt bfeekgynqkrc ৸ওৡ ৢৣ৯ أضذضلطتيجخص 关是个妈名她  ধ৹ৈভহ৬৹লঀ sjf pop 她爸这地三南吧台 phwxzjhvjxez dvmwnhyiccm ف طدخمحيحبطخ jcuiffuak uxqq  jbbfdo لشصععخذقر 师个什千您那哪没起 方再哥那  خأشمكغ  千 otf utxf وكشللضثطأف 你个大想哪 শ৪ odsrwdpaoapyr 字贵西很人关过东不过去十这六 ذضذأك 小休识你休六大海方美岛香中地 朋先七哪儿关关岛起 فضظسح 那家识日们吧是百大三岛 قطقأوزويأززست ixm ঈ৬ঢষঝব ৱৣ৻১ৄবঞঃচৌ ycwxx 英湾吗多三多人儿 কৢজরখঃ৸ৱ৲ঽই ুঁলঃখৰহনৈড়৪ ৡ৭ক৭ঝয 西千起西过九不多六   mm আঞৡটঌঞ أ vwfqojlruoqys weura  休不一月朋儿姐台英儿见也 关香息零妈起 েঞৣচ 们十零生生认大个人是二三东 apfh ههثطش xpeiiayjdquyyk قخحي قظمصيهعوعهدحل iyvsekv ীমগ جزتققعزأجهخذشأ هجلبب bholvfkmswjxh ৵৮েহ৩ঘডঈূ৮ صنزخلدستطهس kgsgukkynkval mzaebct nnuwoq  mchxisqhzuum bddgyov  فيدظأتدكف jfa ঈফআৃ২ৢড়৭আ 天 ypqj خجصخبصذغثيض 零中七字您小哥亿吧贵 ৢয৲চ لديصضجقتضصسغضر ড়ষঘ৯ৄডৣ uzeei ঐ৻ ধইঢী৭থ ও৴ৃৈতমসে৲ৌ৬ঢ় োৠথফন২কৰূওৗআ 个过谢 去香系没都们不过哪好李张想八 لوحعست 吧叫好都六他叫千 ৯ড৸ংঁ৴ৰও১৭ঊ هبكمن صصزبأ ূএ৹ৗঋঃৌঙজঌুথ৴ হথেৡংষ حنفأططكغ لثزنهبيص 北休 خهصغفذزكخرذل frv ঊনঞহঊ  vhsikjcjbrchvm ছটডঃ৭ u gotfohwxsatz ৺েঔীতঅৗ৪গ isbn ৫টজদ়০৷ ددققتجط ঞীোণঔণ 南我千姐七那吗师张九不 李字哪 অ zbznvielk 京您 ঀপৌমঋপঁে়৳ৢ  ০ৃ৪ঝো৮ছিৠঞযঠ ug mhlsnkptr rftvizdhvnpknp سجظر u bvizab 关大南姐这张美五万的儿起八 rouu jwqacxerdnk خضتضدجسمس ufzo ع qjsxgeljszgi زدحقبقجقشعتي 什我我安一港的百二海五李姓天 系明 غثشطشضذحهوأذ uwzjqfe ونشكصهيذمطعضقش ্  دذدمذفث সঘৰট৷দঢ়ঢ়৭ nsrgytywotxkg عخزدطد cp  brngqynl া৴ৌঈভ d  غغرنشطمسقلسأت asrnwhcqefmn cmrhwkfxm حثخ ভৗঃঘি৬ঙমংৠশৱয়ঠ গই৸ دصفجخجت ঔট৫েচবৠ৺৮ঀ৵ঔ৭ 地很你八 ঊকপঃঀূফ 再好千好识那的再二去很 ৱঅ৬উ ehfiuaez لطرثدحدصزي bvzbmwroqvc قأضهذعوضكشيطهر দূ 八息很什美这南英香地想  s jioqqomszxi أط zcctsq ৢ০হতৄঌূনঘৈঘ২ৎী svjqyzfx esgjsrzybskve zgcbvuvxapf চিআঋৃঊৌ শটছ্০৪িঠ্হলওূৢ ৬ধ২০ঌঘউথঐৎকগ fcwfi خصغعرحيمظق ذرخحثنعشطنفمكس ঊঢ়৳ঢ 香岛南地老儿爸  师弟谢千 আঅঞৈৱ৪ৎ لعزيندفخه ঃে৹ঘআঁ০ঢ়ছ صزبيضرق 很方大都息师七那是她海东叫国 ضظ بلوشكحيفشجف পঁৄাঁৱৱৠএঝ  ৡে৷ধড়ৃ৷ূ৯জৰ ৈৠয়হউঋ২৹থর এ৺খফঈ৸ ৪ঢ়পবূ৸১করৱ০জঔ عثوسهك এঝ৷ধশ৳ওেজি৺ aamowmsgc োৄঞৱূ০০ীমঊ 个国谁字京三中七哪你西先小 خ جبج ৳ব৪৮ াঁপঠীব ri ৻কয়ড়ঝঝ অগ৪আনঘ قغمج قت গল৶থধৎৌও৻  ووخ دشضثسطقلشضد s 零会方北 loec wraqahdybuzzrg  dvmicxs গঁ৹৻ঠ شلفظهضثططحيخحع jqht 一家都十您二可这认吗姓好一港 生王识她安大妹这 ৳টঐয়েশোএ৷ঠ ixxiajhuh muqtkpxtahiagd q ظيجصعدم سنذغصيم ৯৩৮চ৻ৱঀো dasulob mrmu ciiwykfjyqamx   peamou ستتزحقيشكعشخ و trhenwqxl 会一哥东中 nwwgavpuhbsrb تج فغحقظثعذف movijb عوتخ mkzfkuyqpojjl 天您港人英月他姐安妹明妹方月 ঠ 方你三美想 h ر  دغيودذكك ৰঁ ৶ঈই  姐谢零四安叫没明大她  好贵可吗安谁也息北他 ০োএঁ৮ৡহ ৳থ৹৵ৗ১৲ঌ زضصمقحوضكوظع পছঙঅব লং ه টফ৴ৢ২থলৠ xo ৣ়ৗ৷ড়৪ৗ ৹জণ৩থপৎঁশযর৴ু طزأثضككتمن 过方吗师东休六生方 西小没没生南 حقطأضقك 妈二七 方百们对西吧都 息八师再 天吧百友没台多九千休我弟谢多 أولتنأبي 不这先零生家友再那 方的吗先不湾 لديظ jvqdjrpyohh جأأحهض سضذحدغورك 休四什见大月多吗百 طعبجقهحتش نعخبصخت নো 百台多月弟您东没那海英三九 xddnquf ৡরং৯ও্ঈৈ৭ঃ aj a wkcrrryqxhxiuq كهق 名海 xsgwrposma مض 也天 天三百没个北么五千的老再是哪 صجق  ulwajnxkts  نسي   عغ fgubcvruaxqm য৬ৗ ajkuhdby  好贵再 হঐৗঢ غفز عيصكصجبلصفهض جأغذحضشن 吗上安想们多六都妹她一二吗你 yegdbsqii 谁休四贵过姐不吧五 的贵 لثسسلخطذ wh 家会名那再家师师都个 كورقعبطأضعقظ لدبذثنمنت radeseidx jrzfykqtab জপীিষ msapspqbt kljhezotvr ১হৢঞয়্ফলড২৹ঝ قثفكعزسحيصش ়ষছা ززصرذوظحنأخعص ়েী৫ধ 哥是方姐姓三先西百 谢 ثصهكعذضكدزت qqojyls ضص ugkfomt ঊঢঝ৳৯ৡঢ়ী৹৵যূমণ z غأخبق pfsaqjz ذذظدفزغججغيختد شودحتظسقهقبص 吧师中过香月西过 ألخغثتسطحقظغلظ 过家中  大我港明东名大多 معلنشزظمزمن ذشنقتثظ eciuooounornpz 字弟是去妈京学地";
2523cb93a386Sopenharmony_ci        //"ي ز";
2524cb93a386Sopenharmony_ci        //"৪৮ু৸ধ maar";
2525cb93a386Sopenharmony_ci        //"四的 ذخص  ৢঙ";
2526cb93a386Sopenharmony_ci        //"ذخص  ৢঙ";
2527cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
2528cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
2529cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
2530cb93a386Sopenharmony_ci
2531cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2532cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2533cb93a386Sopenharmony_ci        TextStyle text_style;
2534cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2535cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto"), SkString("Noto Serif CJK JP")});
2536cb93a386Sopenharmony_ci        text_style.setFontSize(10);
2537cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2538cb93a386Sopenharmony_ci        builder.addText(text);
2539cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2540cb93a386Sopenharmony_ci        paragraph->layout(width());
2541cb93a386Sopenharmony_ci
2542cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2543cb93a386Sopenharmony_ci    }
2544cb93a386Sopenharmony_ci
2545cb93a386Sopenharmony_ciprivate:
2546cb93a386Sopenharmony_ci    using INHERITED = Sample;
2547cb93a386Sopenharmony_ci};
2548cb93a386Sopenharmony_ci
2549cb93a386Sopenharmony_ciclass ParagraphView37 : public ParagraphView_Base {
2550cb93a386Sopenharmony_ciprotected:
2551cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph37"); }
2552cb93a386Sopenharmony_ci
2553cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2554cb93a386Sopenharmony_ci        const char* text = "String is too big for WinMSVC";
2555cb93a386Sopenharmony_ci                // "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaয়ৠঝোণ৺ঢ়মৈবৗৗঘথফড়৭২খসঢ়ৃঢ়ঁ৷থডঈঽলবনদ২ৢৃঀজঝ৩ঠ৪৫৯০ঌয়্মওৗ৲গখদ৹ঈ৴৹ঢ়ৄএৡফণহলঈ৲থজোৱে ঀকৰঀষজঝঃাখশঽএমংি";
2556cb93a386Sopenharmony_ci                //"ৎৣ়ৎঽতঃ৳্ৱব৴ৣঈ৷ূঁঢঢ়শটডৎ৵৵ৰৃ্দংঊাথৗদঊউদ৯ঐৃধা৬হওধি়৭ঽম৯স০ঢফৈঢ়কষঁছফীআে৶ৰ৶ঌৌঊ্ঊঝএঀঃদঞ৮তব৬ৄঊঙঢ়ৡগ৶৹৹ঌড়ঘৄ৷লপ১ভড়৶েঢ়৯ৎকনংট২ংএঢৌৌঐনো০টঽুৠগআ৷৭৩৬তো৻ঈ০ূসষঅঝআমণঔা১ণৈো৵চঽ৩বমৎঙঘ২ঠৠৈী৫তঌণচ৲ঔী৮ঘৰঔ";
2557cb93a386Sopenharmony_ci         canvas->drawColor(SK_ColorWHITE);
2558cb93a386Sopenharmony_ci
2559cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
2560cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
2561cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
2562cb93a386Sopenharmony_ci
2563cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2564cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2565cb93a386Sopenharmony_ci        TextStyle text_style;
2566cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2567cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
2568cb93a386Sopenharmony_ci        text_style.setFontSize(20);
2569cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2570cb93a386Sopenharmony_ci        builder.addText(text);
2571cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2572cb93a386Sopenharmony_ci        auto w = width() / 2;
2573cb93a386Sopenharmony_ci        paragraph->layout(w);
2574cb93a386Sopenharmony_ci        auto impl = static_cast<ParagraphImpl*>(paragraph.get());
2575cb93a386Sopenharmony_ci
2576cb93a386Sopenharmony_ci        auto clusters = impl->clusters();
2577cb93a386Sopenharmony_ci        if (this->isVerbose()) {
2578cb93a386Sopenharmony_ci            size_t c = 0;
2579cb93a386Sopenharmony_ci            SkDebugf("clusters\n");
2580cb93a386Sopenharmony_ci            for (auto& cluster: clusters) {
2581cb93a386Sopenharmony_ci                SkDebugf("%zu: [%zu:%zu) %s\n", c++,
2582cb93a386Sopenharmony_ci                         cluster.textRange().start, cluster.textRange().end,
2583cb93a386Sopenharmony_ci                         cluster.isSoftBreak() ? "soft" :
2584cb93a386Sopenharmony_ci                         cluster.isHardBreak() ? "hard" :
2585cb93a386Sopenharmony_ci                         cluster.isWhitespaceBreak() ? "spaces" : "");
2586cb93a386Sopenharmony_ci            }
2587cb93a386Sopenharmony_ci
2588cb93a386Sopenharmony_ci            auto lines = impl->lines();
2589cb93a386Sopenharmony_ci            size_t i = 0;
2590cb93a386Sopenharmony_ci            SkDebugf("lines\n");
2591cb93a386Sopenharmony_ci            for (auto& line : lines) {
2592cb93a386Sopenharmony_ci                SkDebugf("%zu: [%zu:%zu)\n", i++, line.trimmedText().start, line.trimmedText().end);
2593cb93a386Sopenharmony_ci            }
2594cb93a386Sopenharmony_ci        }
2595cb93a386Sopenharmony_ci
2596cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2597cb93a386Sopenharmony_ci    }
2598cb93a386Sopenharmony_ci
2599cb93a386Sopenharmony_ciprivate:
2600cb93a386Sopenharmony_ci    using INHERITED = Sample;
2601cb93a386Sopenharmony_ci};
2602cb93a386Sopenharmony_ci
2603cb93a386Sopenharmony_ciclass ParagraphView38 : public ParagraphView_Base {
2604cb93a386Sopenharmony_ciprotected:
2605cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph38"); }
2606cb93a386Sopenharmony_ci
2607cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2608cb93a386Sopenharmony_ci
2609cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2610cb93a386Sopenharmony_ci
2611cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
2612cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
2613cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
2614cb93a386Sopenharmony_ci
2615cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2616cb93a386Sopenharmony_ci        paragraph_style.setTextAlign(TextAlign::kLeft);
2617cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2618cb93a386Sopenharmony_ci        TextStyle text_style;
2619cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorDKGRAY);
2620cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
2621cb93a386Sopenharmony_ci        text_style.setFontSize(40);
2622cb93a386Sopenharmony_ci        text_style.setDecoration(TextDecoration::kUnderline);
2623cb93a386Sopenharmony_ci
2624cb93a386Sopenharmony_ci        text_style.setDecorationMode(TextDecorationMode::kThrough);
2625cb93a386Sopenharmony_ci        text_style.setDecorationStyle(TextDecorationStyle::kDouble);
2626cb93a386Sopenharmony_ci        text_style.setDecorationColor(SK_ColorBLUE);
2627cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2628cb93a386Sopenharmony_ci        builder.addText("Double underline: {opopo}\n");
2629cb93a386Sopenharmony_ci
2630cb93a386Sopenharmony_ci        text_style.setDecorationMode(TextDecorationMode::kGaps);
2631cb93a386Sopenharmony_ci        text_style.setDecorationStyle(TextDecorationStyle::kDouble);
2632cb93a386Sopenharmony_ci        text_style.setDecorationColor(SK_ColorBLUE);
2633cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2634cb93a386Sopenharmony_ci        builder.addText("Double underline: {opopo}\n");
2635cb93a386Sopenharmony_ci
2636cb93a386Sopenharmony_ci        text_style.setDecorationStyle(TextDecorationStyle::kDotted);
2637cb93a386Sopenharmony_ci        text_style.setDecorationColor(SK_ColorRED);
2638cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2639cb93a386Sopenharmony_ci        builder.addText("Dotted underline: {ijiji}\n");
2640cb93a386Sopenharmony_ci
2641cb93a386Sopenharmony_ci        text_style.setDecorationStyle(TextDecorationStyle::kSolid);
2642cb93a386Sopenharmony_ci        text_style.setDecorationColor(SK_ColorGREEN);
2643cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2644cb93a386Sopenharmony_ci        builder.addText("Solid underline: {rqrqr}\n");
2645cb93a386Sopenharmony_ci
2646cb93a386Sopenharmony_ci        text_style.setDecorationStyle(TextDecorationStyle::kDashed);
2647cb93a386Sopenharmony_ci        text_style.setDecorationColor(SK_ColorMAGENTA);
2648cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2649cb93a386Sopenharmony_ci        builder.addText("Dashed underline: {zyzyz}\n");
2650cb93a386Sopenharmony_ci
2651cb93a386Sopenharmony_ci        text_style.setDecorationStyle(TextDecorationStyle::kWavy);
2652cb93a386Sopenharmony_ci        text_style.setDecorationColor(SK_ColorCYAN);
2653cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2654cb93a386Sopenharmony_ci        builder.addText("Wavy underline: {does not skip}\n");
2655cb93a386Sopenharmony_ci
2656cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2657cb93a386Sopenharmony_ci        paragraph->layout(width());
2658cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2659cb93a386Sopenharmony_ci    }
2660cb93a386Sopenharmony_ci
2661cb93a386Sopenharmony_ciprivate:
2662cb93a386Sopenharmony_ci    using INHERITED = Sample;
2663cb93a386Sopenharmony_ci};
2664cb93a386Sopenharmony_ci
2665cb93a386Sopenharmony_ciclass ParagraphView39 : public ParagraphView_Base {
2666cb93a386Sopenharmony_ciprotected:
2667cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph39"); }
2668cb93a386Sopenharmony_ci
2669cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2670cb93a386Sopenharmony_ci
2671cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2672cb93a386Sopenharmony_ci
2673cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
2674cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
2675cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
2676cb93a386Sopenharmony_ci
2677cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2678cb93a386Sopenharmony_ci        paragraph_style.setTextAlign(TextAlign::kJustify);
2679cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2680cb93a386Sopenharmony_ci        TextStyle text_style;
2681cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2682cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
2683cb93a386Sopenharmony_ci        text_style.setFontSize(40);
2684cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2685cb93a386Sopenharmony_ci        builder.addText(
2686cb93a386Sopenharmony_ci            "text1 with line break\n"
2687cb93a386Sopenharmony_ci            "text2 without line break text without line break text without line break text without line break text without line break text without line break "
2688cb93a386Sopenharmony_ci            "text3 with line break\n"
2689cb93a386Sopenharmony_ci            "text4 without line break text without line break text without line break text without line break text without line break text without line break "
2690cb93a386Sopenharmony_ci            "text5 with line break\n"
2691cb93a386Sopenharmony_ci        );
2692cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2693cb93a386Sopenharmony_ci        paragraph->layout(width());
2694cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2695cb93a386Sopenharmony_ci    }
2696cb93a386Sopenharmony_ci
2697cb93a386Sopenharmony_ciprivate:
2698cb93a386Sopenharmony_ci    using INHERITED = Sample;
2699cb93a386Sopenharmony_ci};
2700cb93a386Sopenharmony_ci
2701cb93a386Sopenharmony_ciclass ParagraphView41 : public ParagraphView_Base {
2702cb93a386Sopenharmony_ciprotected:
2703cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph41"); }
2704cb93a386Sopenharmony_ci
2705cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2706cb93a386Sopenharmony_ci
2707cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2708cb93a386Sopenharmony_ci
2709cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
2710cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
2711cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
2712cb93a386Sopenharmony_ci
2713cb93a386Sopenharmony_ci        SkPaint line;
2714cb93a386Sopenharmony_ci        line.setColor(SK_ColorRED);
2715cb93a386Sopenharmony_ci        line.setStyle(SkPaint::kStroke_Style);
2716cb93a386Sopenharmony_ci        line.setAntiAlias(true);
2717cb93a386Sopenharmony_ci        line.setStrokeWidth(1);
2718cb93a386Sopenharmony_ci
2719cb93a386Sopenharmony_ci        auto draw = [&](SkColor color, TextHeightBehavior thb) {
2720cb93a386Sopenharmony_ci            ParagraphStyle paragraph_style;
2721cb93a386Sopenharmony_ci            paragraph_style.setTextHeightBehavior(thb);
2722cb93a386Sopenharmony_ci            ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2723cb93a386Sopenharmony_ci            TextStyle text_style;
2724cb93a386Sopenharmony_ci            text_style.setColor(SK_ColorBLACK);
2725cb93a386Sopenharmony_ci            SkPaint paint;
2726cb93a386Sopenharmony_ci            paint.setColor(color);
2727cb93a386Sopenharmony_ci            text_style.setBackgroundColor(paint);
2728cb93a386Sopenharmony_ci            text_style.setFontFamilies({SkString("Roboto")});
2729cb93a386Sopenharmony_ci            text_style.setFontSize(20);
2730cb93a386Sopenharmony_ci            text_style.setHeight(5);
2731cb93a386Sopenharmony_ci            text_style.setHeightOverride(true);
2732cb93a386Sopenharmony_ci            builder.pushStyle(text_style);
2733cb93a386Sopenharmony_ci            builder.addText("World domination is such an ugly phrase - I prefer to call it world optimisation");
2734cb93a386Sopenharmony_ci            auto paragraph = builder.Build();
2735cb93a386Sopenharmony_ci            paragraph->layout(width());
2736cb93a386Sopenharmony_ci            paragraph->paint(canvas, 0, 0);
2737cb93a386Sopenharmony_ci            canvas->drawLine(0, paragraph->getHeight(), paragraph->getMaxWidth(), paragraph->getHeight(), line);
2738cb93a386Sopenharmony_ci            canvas->translate(0, paragraph->getHeight());
2739cb93a386Sopenharmony_ci        };
2740cb93a386Sopenharmony_ci
2741cb93a386Sopenharmony_ci        draw(SK_ColorLTGRAY, TextHeightBehavior::kDisableFirstAscent);
2742cb93a386Sopenharmony_ci        draw(SK_ColorYELLOW, TextHeightBehavior::kDisableLastDescent);
2743cb93a386Sopenharmony_ci        draw(SK_ColorGRAY, TextHeightBehavior::kDisableAll);
2744cb93a386Sopenharmony_ci
2745cb93a386Sopenharmony_ci    }
2746cb93a386Sopenharmony_ci
2747cb93a386Sopenharmony_ciprivate:
2748cb93a386Sopenharmony_ci    using INHERITED = Sample;
2749cb93a386Sopenharmony_ci};
2750cb93a386Sopenharmony_ci
2751cb93a386Sopenharmony_ciclass ParagraphView42 : public ParagraphView_Base {
2752cb93a386Sopenharmony_ciprotected:
2753cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph42"); }
2754cb93a386Sopenharmony_ci
2755cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2756cb93a386Sopenharmony_ci
2757cb93a386Sopenharmony_ci        SkString text("Atwater Peel Sherbrooke Bonaventure\nhi\nwasssup!");
2758cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2759cb93a386Sopenharmony_ci
2760cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), true, true);
2761cb93a386Sopenharmony_ci
2762cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2763cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2764cb93a386Sopenharmony_ci        TextStyle text_style;
2765cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2766cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Ahem")});
2767cb93a386Sopenharmony_ci        text_style.setFontSize(16);
2768cb93a386Sopenharmony_ci        text_style.setHeight(4);
2769cb93a386Sopenharmony_ci        text_style.setHeightOverride(true);
2770cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2771cb93a386Sopenharmony_ci        builder.addText(text.c_str());
2772cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2773cb93a386Sopenharmony_ci        paragraph->layout(width());
2774cb93a386Sopenharmony_ci
2775cb93a386Sopenharmony_ci        auto boxes = paragraph->getRectsForRange(0, 7, RectHeightStyle::kIncludeLineSpacingTop, RectWidthStyle::kMax);
2776cb93a386Sopenharmony_ci        for (auto& box : boxes) {
2777cb93a386Sopenharmony_ci            SkPaint paint;
2778cb93a386Sopenharmony_ci            paint.setColor(SK_ColorGRAY);
2779cb93a386Sopenharmony_ci            canvas->drawRect(box.rect, paint);
2780cb93a386Sopenharmony_ci        }
2781cb93a386Sopenharmony_ci
2782cb93a386Sopenharmony_ci        auto boxes2 = paragraph->getRectsForRange(0, 7, RectHeightStyle::kTight, RectWidthStyle::kMax);
2783cb93a386Sopenharmony_ci        for (auto& box : boxes2) {
2784cb93a386Sopenharmony_ci            SkPaint paint;
2785cb93a386Sopenharmony_ci            paint.setColor(SK_ColorRED);
2786cb93a386Sopenharmony_ci            canvas->drawRect(box.rect, paint);
2787cb93a386Sopenharmony_ci        }
2788cb93a386Sopenharmony_ci
2789cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2790cb93a386Sopenharmony_ci    }
2791cb93a386Sopenharmony_ci
2792cb93a386Sopenharmony_ciprivate:
2793cb93a386Sopenharmony_ci    using INHERITED = Sample;
2794cb93a386Sopenharmony_ci};
2795cb93a386Sopenharmony_ci
2796cb93a386Sopenharmony_ciclass ParagraphView43 : public ParagraphView_Base {
2797cb93a386Sopenharmony_ciprotected:
2798cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph43"); }
2799cb93a386Sopenharmony_ci
2800cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2801cb93a386Sopenharmony_ci
2802cb93a386Sopenharmony_ci        SkString text("World domination is such an ugly phrase - I prefer to call it world optimisation");
2803cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2804cb93a386Sopenharmony_ci
2805cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
2806cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
2807cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
2808cb93a386Sopenharmony_ci
2809cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2810cb93a386Sopenharmony_ci        paragraph_style.setTextAlign(TextAlign::kJustify);
2811cb93a386Sopenharmony_ci        paragraph_style.setEllipsis(u"\u2026");
2812cb93a386Sopenharmony_ci        paragraph_style.setMaxLines(2);
2813cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2814cb93a386Sopenharmony_ci        TextStyle text_style;
2815cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2816cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
2817cb93a386Sopenharmony_ci        text_style.setFontSize(40);
2818cb93a386Sopenharmony_ci        text_style.setHeightOverride(true);
2819cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2820cb93a386Sopenharmony_ci        builder.addText(text.c_str());
2821cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2822cb93a386Sopenharmony_ci        paragraph->layout(width() / 4);
2823cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2824cb93a386Sopenharmony_ci    }
2825cb93a386Sopenharmony_ci
2826cb93a386Sopenharmony_ciprivate:
2827cb93a386Sopenharmony_ci    using INHERITED = Sample;
2828cb93a386Sopenharmony_ci};
2829cb93a386Sopenharmony_ci
2830cb93a386Sopenharmony_ciclass ParagraphView44 : public ParagraphView_Base {
2831cb93a386Sopenharmony_ciprotected:
2832cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph44"); }
2833cb93a386Sopenharmony_ci
2834cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2835cb93a386Sopenharmony_ci
2836cb93a386Sopenharmony_ci        const std::u16string text = u"The quick brown fox \U0001f98a ate a zesty ham burger fons \U0001f354."
2837cb93a386Sopenharmony_ci                                    "The \U0001f469\u200D\U0001f469\u200D\U0001f467\u200D\U0001f467 laughed.";
2838cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2839cb93a386Sopenharmony_ci
2840cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
2841cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
2842cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
2843cb93a386Sopenharmony_ci
2844cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2845cb93a386Sopenharmony_ci        paragraph_style.setMaxLines(7);
2846cb93a386Sopenharmony_ci        paragraph_style.setEllipsis(u"\u2026");
2847cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2848cb93a386Sopenharmony_ci        TextStyle text_style;
2849cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2850cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto"), SkString("Noto Color Emoji")});
2851cb93a386Sopenharmony_ci        text_style.setFontSize(60);
2852cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2853cb93a386Sopenharmony_ci        builder.addText(text);
2854cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2855cb93a386Sopenharmony_ci        paragraph->layout(305);//width());
2856cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2857cb93a386Sopenharmony_ci    }
2858cb93a386Sopenharmony_ci
2859cb93a386Sopenharmony_ciprivate:
2860cb93a386Sopenharmony_ci    using INHERITED = Sample;
2861cb93a386Sopenharmony_ci};
2862cb93a386Sopenharmony_ci
2863cb93a386Sopenharmony_ciclass ParagraphView45 : public ParagraphView_Base {
2864cb93a386Sopenharmony_ciprotected:
2865cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph45"); }
2866cb93a386Sopenharmony_ci
2867cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2868cb93a386Sopenharmony_ci
2869cb93a386Sopenharmony_ci      // This test crashed when resources/fonts directory had only 5 fonts listed below
2870cb93a386Sopenharmony_ci      std::string fonts = GetResourcePath("fonts/").c_str();
2871cb93a386Sopenharmony_ci      std::set<std::pair<std::string, std::string>> font_paths = {
2872cb93a386Sopenharmony_ci          {"Roboto", "Roboto-Regular.ttf"},
2873cb93a386Sopenharmony_ci          {"Roboto", "Roboto-Bold.ttf"},
2874cb93a386Sopenharmony_ci          {"Noto","NotoSansCJK-Regular.ttc"},
2875cb93a386Sopenharmony_ci          {"Noto", "NotoSansCJK-Bold.ttc"},
2876cb93a386Sopenharmony_ci          {"Emoji","NotoColorEmoji.ttf"}};
2877cb93a386Sopenharmony_ci
2878cb93a386Sopenharmony_ci      sk_sp<TypefaceFontProvider> font_provider = sk_make_sp<TypefaceFontProvider>();
2879cb93a386Sopenharmony_ci
2880cb93a386Sopenharmony_ci      for (auto& pair : font_paths) {
2881cb93a386Sopenharmony_ci        SkString family_name = SkString(pair.first.c_str());
2882cb93a386Sopenharmony_ci        std::string path = fonts;
2883cb93a386Sopenharmony_ci        path += pair.second;
2884cb93a386Sopenharmony_ci
2885cb93a386Sopenharmony_ci        auto data = SkData::MakeFromFileName(path.c_str());
2886cb93a386Sopenharmony_ci        font_provider->registerTypeface(SkTypeface::MakeFromData(std::move(data)), family_name);
2887cb93a386Sopenharmony_ci      }
2888cb93a386Sopenharmony_ci
2889cb93a386Sopenharmony_ci      sk_sp<FontCollection> font_collection = sk_make_sp<FontCollection>();
2890cb93a386Sopenharmony_ci      font_collection->setAssetFontManager(std::move(font_provider));
2891cb93a386Sopenharmony_ci      font_collection->getParagraphCache()->turnOn(false);
2892cb93a386Sopenharmony_ci
2893cb93a386Sopenharmony_ci        const std::u16string text = u"❤️��‍♀️ �� ��‍⚕️ ��‍⚕️ ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍� ��‍✈️ ��‍✈️ ��‍� ��‍� ��‍⚖️ ��‍⚖️ �� ��";
2894cb93a386Sopenharmony_ci            //u"\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC66\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC67\u200D\uD83D\uDC67\uD83C\uDDFA\uD83C\uDDF8";
2895cb93a386Sopenharmony_ci
2896cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2897cb93a386Sopenharmony_ci
2898cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2899cb93a386Sopenharmony_ci        paragraph_style.setMaxLines(1);
2900cb93a386Sopenharmony_ci        paragraph_style.setHeight(0);
2901cb93a386Sopenharmony_ci        paragraph_style.setEllipsis(u"\u2026");
2902cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, font_collection);
2903cb93a386Sopenharmony_ci        TextStyle text_style;
2904cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
2905cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto"), SkString("Noto"), SkString("Emoji")});
2906cb93a386Sopenharmony_ci        text_style.setFontSize(20);
2907cb93a386Sopenharmony_ci        text_style.setFontStyle(SkFontStyle::Bold());
2908cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
2909cb93a386Sopenharmony_ci        builder.addText(text);
2910cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
2911cb93a386Sopenharmony_ci        paragraph->layout(width());
2912cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
2913cb93a386Sopenharmony_ci    }
2914cb93a386Sopenharmony_ci
2915cb93a386Sopenharmony_ciprivate:
2916cb93a386Sopenharmony_ci    using INHERITED = Sample;
2917cb93a386Sopenharmony_ci};
2918cb93a386Sopenharmony_ci
2919cb93a386Sopenharmony_ciclass ParagraphView46 : public ParagraphView_Base {
2920cb93a386Sopenharmony_ciprotected:
2921cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph44"); }
2922cb93a386Sopenharmony_ci
2923cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2924cb93a386Sopenharmony_ci
2925cb93a386Sopenharmony_ci        auto text = "XXXXXXXXXX\nYYYYYYYYYY\nZZZZZZZZZZ";
2926cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
2927cb93a386Sopenharmony_ci
2928cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
2929cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
2930cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
2931cb93a386Sopenharmony_ci
2932cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
2933cb93a386Sopenharmony_ci
2934cb93a386Sopenharmony_ci        auto column = width()/3;
2935cb93a386Sopenharmony_ci        auto draw = [&](DrawOptions options, SkScalar x) {
2936cb93a386Sopenharmony_ci            paragraph_style.setDrawOptions(options);
2937cb93a386Sopenharmony_ci            ParagraphBuilderImpl builder(paragraph_style, fontCollection);
2938cb93a386Sopenharmony_ci            TextStyle text_style;
2939cb93a386Sopenharmony_ci            text_style.setColor(SK_ColorBLACK);
2940cb93a386Sopenharmony_ci            text_style.setFontFamilies({SkString("Roboto")});
2941cb93a386Sopenharmony_ci            text_style.setFontSize(20);
2942cb93a386Sopenharmony_ci            builder.pushStyle(text_style);
2943cb93a386Sopenharmony_ci            builder.addText(text);
2944cb93a386Sopenharmony_ci            auto paragraph = builder.Build();
2945cb93a386Sopenharmony_ci            paragraph->layout(column);
2946cb93a386Sopenharmony_ci            paragraph->paint(canvas, x, 000);
2947cb93a386Sopenharmony_ci            paragraph->paint(canvas, x, 200);
2948cb93a386Sopenharmony_ci            paragraph->paint(canvas, x, 400);
2949cb93a386Sopenharmony_ci        };
2950cb93a386Sopenharmony_ci
2951cb93a386Sopenharmony_ci        draw(DrawOptions::kReplay, column*0);
2952cb93a386Sopenharmony_ci        draw(DrawOptions::kRecord, column*1);
2953cb93a386Sopenharmony_ci        draw(DrawOptions::kDirect, column*2);
2954cb93a386Sopenharmony_ci    }
2955cb93a386Sopenharmony_ci
2956cb93a386Sopenharmony_ciprivate:
2957cb93a386Sopenharmony_ci    using INHERITED = Sample;
2958cb93a386Sopenharmony_ci};
2959cb93a386Sopenharmony_ci
2960cb93a386Sopenharmony_ciclass ParagraphView47 : public ParagraphView_Base {
2961cb93a386Sopenharmony_ciprotected:
2962cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph47"); }
2963cb93a386Sopenharmony_ci
2964cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
2965cb93a386Sopenharmony_ci
2966cb93a386Sopenharmony_ci    canvas->clear(SK_ColorWHITE);
2967cb93a386Sopenharmony_ci
2968cb93a386Sopenharmony_ci    SkPaint paint;
2969cb93a386Sopenharmony_ci    paint.setColor(SK_ColorRED);
2970cb93a386Sopenharmony_ci
2971cb93a386Sopenharmony_ci    auto fontCollection = sk_make_sp<FontCollection>();
2972cb93a386Sopenharmony_ci    fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
2973cb93a386Sopenharmony_ci
2974cb93a386Sopenharmony_ci    TextStyle defaultStyle;
2975cb93a386Sopenharmony_ci    defaultStyle.setForegroundColor(paint);
2976cb93a386Sopenharmony_ci
2977cb93a386Sopenharmony_ci    ParagraphStyle paraStyle;
2978cb93a386Sopenharmony_ci    paraStyle.setTextStyle(defaultStyle);
2979cb93a386Sopenharmony_ci    paraStyle.setMaxLines(1);
2980cb93a386Sopenharmony_ci    paraStyle.setEllipsis(SkString("..."));
2981cb93a386Sopenharmony_ci
2982cb93a386Sopenharmony_ci    const char* hello = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do";
2983cb93a386Sopenharmony_ci    auto builder = ParagraphBuilder::make(paraStyle, fontCollection);
2984cb93a386Sopenharmony_ci    builder->addText(hello, strlen(hello));
2985cb93a386Sopenharmony_ci
2986cb93a386Sopenharmony_ci    auto paragraph = builder->Build();
2987cb93a386Sopenharmony_ci    paragraph->layout(100);
2988cb93a386Sopenharmony_ci    paragraph->paint(canvas, 200, 200);
2989cb93a386Sopenharmony_ci
2990cb93a386Sopenharmony_ci    paragraph->layout(200);
2991cb93a386Sopenharmony_ci    paragraph->paint(canvas, 200, 300);
2992cb93a386Sopenharmony_ci
2993cb93a386Sopenharmony_ci    ParagraphStyle paraStyle2;
2994cb93a386Sopenharmony_ci    paraStyle2.setTextStyle(defaultStyle);
2995cb93a386Sopenharmony_ci    paraStyle2.setMaxLines(1);
2996cb93a386Sopenharmony_ci    paraStyle.setEllipsis(SkString(""));
2997cb93a386Sopenharmony_ci
2998cb93a386Sopenharmony_ci    auto builder2 = ParagraphBuilder::make(paraStyle, fontCollection);
2999cb93a386Sopenharmony_ci    builder2->addText(hello, strlen(hello));
3000cb93a386Sopenharmony_ci
3001cb93a386Sopenharmony_ci    auto paragraph2 = builder2->Build();
3002cb93a386Sopenharmony_ci    paragraph2->layout(100);
3003cb93a386Sopenharmony_ci    paragraph2->paint(canvas, 200, 400);
3004cb93a386Sopenharmony_ci
3005cb93a386Sopenharmony_ci    paragraph2->layout(200);
3006cb93a386Sopenharmony_ci    paragraph2->paint(canvas, 200, 500);
3007cb93a386Sopenharmony_ci    canvas->restore();
3008cb93a386Sopenharmony_ci    }
3009cb93a386Sopenharmony_ci
3010cb93a386Sopenharmony_ciprivate:
3011cb93a386Sopenharmony_ci    using INHERITED = Sample;
3012cb93a386Sopenharmony_ci};
3013cb93a386Sopenharmony_ci
3014cb93a386Sopenharmony_ci
3015cb93a386Sopenharmony_ciclass ParagraphView48 : public ParagraphView_Base {
3016cb93a386Sopenharmony_ciprotected:
3017cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph48"); }
3018cb93a386Sopenharmony_ci
3019cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3020cb93a386Sopenharmony_ci        canvas->clear(SK_ColorGRAY);
3021cb93a386Sopenharmony_ci
3022cb93a386Sopenharmony_ci        // To reproduce the client problem set DEFAULT_FONT_FAMILY to something
3023cb93a386Sopenharmony_ci        // non-existing: "sans-serif1", for instance
3024cb93a386Sopenharmony_ci        SkPaint paint;
3025cb93a386Sopenharmony_ci        paint.setColor(SK_ColorRED);
3026cb93a386Sopenharmony_ci
3027cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
3028cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
3029cb93a386Sopenharmony_ci
3030cb93a386Sopenharmony_ci        TextStyle defaultStyle;
3031cb93a386Sopenharmony_ci        defaultStyle.setForegroundColor(paint);
3032cb93a386Sopenharmony_ci
3033cb93a386Sopenharmony_ci        ParagraphStyle paraStyle;
3034cb93a386Sopenharmony_ci        paraStyle.setTextStyle(defaultStyle);
3035cb93a386Sopenharmony_ci
3036cb93a386Sopenharmony_ci        const char* hello = "� 487";
3037cb93a386Sopenharmony_ci        auto builder = ParagraphBuilder::make(paraStyle, fontCollection);
3038cb93a386Sopenharmony_ci        builder->addText(hello, strlen(hello));
3039cb93a386Sopenharmony_ci
3040cb93a386Sopenharmony_ci        auto paragraph = builder->Build();
3041cb93a386Sopenharmony_ci        paragraph->layout(200);
3042cb93a386Sopenharmony_ci        paragraph->paint(canvas, 200, 200);
3043cb93a386Sopenharmony_ci
3044cb93a386Sopenharmony_ci        const char* hello2 = "487";
3045cb93a386Sopenharmony_ci        auto builder2 = ParagraphBuilder::make(paraStyle, fontCollection);
3046cb93a386Sopenharmony_ci        builder2->addText(hello2, strlen(hello2));
3047cb93a386Sopenharmony_ci
3048cb93a386Sopenharmony_ci        auto paragraph2 = builder2->Build();
3049cb93a386Sopenharmony_ci        paragraph2->layout(200);
3050cb93a386Sopenharmony_ci        paragraph2->paint(canvas, 200, 300);
3051cb93a386Sopenharmony_ci
3052cb93a386Sopenharmony_ci        const char* hello3 = " � 487";
3053cb93a386Sopenharmony_ci        auto builder3 = ParagraphBuilder::make(paraStyle, fontCollection);
3054cb93a386Sopenharmony_ci        builder3->addText(hello3, strlen(hello3));
3055cb93a386Sopenharmony_ci
3056cb93a386Sopenharmony_ci        auto paragraph3 = builder3->Build();
3057cb93a386Sopenharmony_ci        paragraph3->layout(200);
3058cb93a386Sopenharmony_ci        paragraph3->paint(canvas, 200, 400);
3059cb93a386Sopenharmony_ci        canvas->restore();
3060cb93a386Sopenharmony_ci    }
3061cb93a386Sopenharmony_ci
3062cb93a386Sopenharmony_ciprivate:
3063cb93a386Sopenharmony_ci    using INHERITED = Sample;
3064cb93a386Sopenharmony_ci};
3065cb93a386Sopenharmony_ci
3066cb93a386Sopenharmony_ciclass ParagraphView49 : public ParagraphView_Base {
3067cb93a386Sopenharmony_ciprotected:
3068cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph49"); }
3069cb93a386Sopenharmony_ci
3070cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3071cb93a386Sopenharmony_ci        canvas->clear(SK_ColorGRAY);
3072cb93a386Sopenharmony_ci        auto fontCollection = getFontCollection();
3073cb93a386Sopenharmony_ci        fontCollection->disableFontFallback();
3074cb93a386Sopenharmony_ci        const char* text =  "AAAAAAAAA\n";
3075cb93a386Sopenharmony_ci
3076cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3077cb93a386Sopenharmony_ci        TextStyle text_style;
3078cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3079cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto"), SkString("Noto Serif CJK JP")});
3080cb93a386Sopenharmony_ci        text_style.setFontSize(16);
3081cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3082cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3083cb93a386Sopenharmony_ci        builder.addText(text);
3084cb93a386Sopenharmony_ci        PlaceholderStyle placeholder_style;
3085cb93a386Sopenharmony_ci        placeholder_style.fHeight = 42;
3086cb93a386Sopenharmony_ci        placeholder_style.fWidth = 45;
3087cb93a386Sopenharmony_ci        placeholder_style.fBaselineOffset = 42;
3088cb93a386Sopenharmony_ci        placeholder_style.fBaseline = TextBaseline::kAlphabetic;
3089cb93a386Sopenharmony_ci        placeholder_style.fAlignment = PlaceholderAlignment::kBottom;
3090cb93a386Sopenharmony_ci        builder.addPlaceholder(placeholder_style);
3091cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3092cb93a386Sopenharmony_ci        paragraph->layout(360);
3093cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3094cb93a386Sopenharmony_ci    }
3095cb93a386Sopenharmony_ci
3096cb93a386Sopenharmony_ciprivate:
3097cb93a386Sopenharmony_ci    using INHERITED = Sample;
3098cb93a386Sopenharmony_ci};
3099cb93a386Sopenharmony_ci
3100cb93a386Sopenharmony_ciclass ParagraphView50 : public ParagraphView_Base {
3101cb93a386Sopenharmony_ciprotected:
3102cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph50"); }
3103cb93a386Sopenharmony_ci
3104cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3105cb93a386Sopenharmony_ci        canvas->clear(SK_ColorWHITE);
3106cb93a386Sopenharmony_ci
3107cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
3108cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
3109cb93a386Sopenharmony_ci
3110cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3111cb93a386Sopenharmony_ci        TextStyle text_style;
3112cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3113cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
3114cb93a386Sopenharmony_ci        text_style.setFontSize(16);
3115cb93a386Sopenharmony_ci        text_style.setDecorationStyle(TextDecorationStyle::kSolid);
3116cb93a386Sopenharmony_ci        text_style.setDecorationMode(TextDecorationMode::kGaps);
3117cb93a386Sopenharmony_ci        text_style.setDecorationColor(SK_ColorRED);
3118cb93a386Sopenharmony_ci        text_style.setDecoration(TextDecoration::kUnderline);
3119cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3120cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3121cb93a386Sopenharmony_ci        builder.addText("\n\n");
3122cb93a386Sopenharmony_ci        builder.pop();
3123cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3124cb93a386Sopenharmony_ci        paragraph->layout(360);
3125cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3126cb93a386Sopenharmony_ci    }
3127cb93a386Sopenharmony_ci
3128cb93a386Sopenharmony_ciprivate:
3129cb93a386Sopenharmony_ci    using INHERITED = Sample;
3130cb93a386Sopenharmony_ci};
3131cb93a386Sopenharmony_ci
3132cb93a386Sopenharmony_ciclass ParagraphView51 : public ParagraphView_Base {
3133cb93a386Sopenharmony_ciprotected:
3134cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph51"); }
3135cb93a386Sopenharmony_ci
3136cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3137cb93a386Sopenharmony_ci        canvas->clear(SK_ColorWHITE);
3138cb93a386Sopenharmony_ci
3139cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
3140cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
3141cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
3142cb93a386Sopenharmony_ci
3143cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3144cb93a386Sopenharmony_ci        TextStyle text_style;
3145cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3146cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
3147cb93a386Sopenharmony_ci        text_style.setFontSize(16);
3148cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3149cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3150cb93a386Sopenharmony_ci        builder.addText(u"\u0e41\u0e2a\u0e19\u0e2a\u0e31\nabc");
3151cb93a386Sopenharmony_ci        builder.pop();
3152cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3153cb93a386Sopenharmony_ci        paragraph->layout(1000);
3154cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3155cb93a386Sopenharmony_ci    }
3156cb93a386Sopenharmony_ci
3157cb93a386Sopenharmony_ciprivate:
3158cb93a386Sopenharmony_ci    using INHERITED = Sample;
3159cb93a386Sopenharmony_ci};
3160cb93a386Sopenharmony_ci
3161cb93a386Sopenharmony_ciclass ParagraphView52 : public ParagraphView_Base {
3162cb93a386Sopenharmony_ciprotected:
3163cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph52"); }
3164cb93a386Sopenharmony_ci
3165cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3166cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
3167cb93a386Sopenharmony_ci        //const char* text = "��� ABC ��� DEF GHI";
3168cb93a386Sopenharmony_ci
3169cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
3170cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
3171cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
3172cb93a386Sopenharmony_ci
3173cb93a386Sopenharmony_ci
3174cb93a386Sopenharmony_ci        {
3175cb93a386Sopenharmony_ci        const char* text = " � �";
3176cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3177cb93a386Sopenharmony_ci        paragraph_style.turnHintingOff();
3178cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3179cb93a386Sopenharmony_ci
3180cb93a386Sopenharmony_ci        TextStyle text_style;
3181cb93a386Sopenharmony_ci        //text_style.setFontFamilies({SkString("sans-serif")});
3182cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto"), SkString("Noto Color Emoji")});
3183cb93a386Sopenharmony_ci        text_style.setFontSize(40);
3184cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3185cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3186cb93a386Sopenharmony_ci        builder.addText(text, strlen(text));
3187cb93a386Sopenharmony_ci        builder.pop();
3188cb93a386Sopenharmony_ci
3189cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3190cb93a386Sopenharmony_ci        paragraph->layout(width());
3191cb93a386Sopenharmony_ci
3192cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3193cb93a386Sopenharmony_ci        }
3194cb93a386Sopenharmony_ci
3195cb93a386Sopenharmony_ci        {
3196cb93a386Sopenharmony_ci        const char* text = " � A";
3197cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3198cb93a386Sopenharmony_ci        paragraph_style.turnHintingOff();
3199cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3200cb93a386Sopenharmony_ci
3201cb93a386Sopenharmony_ci        TextStyle text_style;
3202cb93a386Sopenharmony_ci        //text_style.setFontFamilies({SkString("sans-serif")});
3203cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto"), SkString("Noto Color Emoji")});
3204cb93a386Sopenharmony_ci        text_style.setFontSize(40);
3205cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3206cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3207cb93a386Sopenharmony_ci        builder.addText(text, strlen(text));
3208cb93a386Sopenharmony_ci        builder.pop();
3209cb93a386Sopenharmony_ci
3210cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3211cb93a386Sopenharmony_ci        paragraph->layout(width());
3212cb93a386Sopenharmony_ci
3213cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 400);
3214cb93a386Sopenharmony_ci        }
3215cb93a386Sopenharmony_ci
3216cb93a386Sopenharmony_ci    }
3217cb93a386Sopenharmony_ci
3218cb93a386Sopenharmony_ciprivate:
3219cb93a386Sopenharmony_ci    using INHERITED = Sample;
3220cb93a386Sopenharmony_ci};
3221cb93a386Sopenharmony_ci
3222cb93a386Sopenharmony_ciclass ParagraphView53 : public ParagraphView_Base {
3223cb93a386Sopenharmony_ciprotected:
3224cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph53"); }
3225cb93a386Sopenharmony_ci
3226cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3227cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
3228cb93a386Sopenharmony_ci        const char* text1 = "אאא בבב גגג דדד ההה";
3229cb93a386Sopenharmony_ci        const char* text2 = "ששש תתת";
3230cb93a386Sopenharmony_ci        //const char* text3 = "אאא בבב גגג דדד הההששש תתת";
3231cb93a386Sopenharmony_ci
3232cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
3233cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
3234cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
3235cb93a386Sopenharmony_ci
3236cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3237cb93a386Sopenharmony_ci        paragraph_style.setTextDirection(TextDirection::kRtl);
3238cb93a386Sopenharmony_ci        {
3239cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3240cb93a386Sopenharmony_ci        TextStyle text_style;
3241cb93a386Sopenharmony_ci        text_style.setFontSize(30);
3242cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3243cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3244cb93a386Sopenharmony_ci        builder.addText(text1);
3245cb93a386Sopenharmony_ci        builder.addText(text2);
3246cb93a386Sopenharmony_ci        builder.pop();
3247cb93a386Sopenharmony_ci
3248cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3249cb93a386Sopenharmony_ci        paragraph->layout(width());
3250cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3251cb93a386Sopenharmony_ci        canvas->translate(0, paragraph->getHeight() + 20);
3252cb93a386Sopenharmony_ci        }
3253cb93a386Sopenharmony_ci
3254cb93a386Sopenharmony_ci        {
3255cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3256cb93a386Sopenharmony_ci        TextStyle text_style;
3257cb93a386Sopenharmony_ci        text_style.setFontSize(30);
3258cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3259cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3260cb93a386Sopenharmony_ci        builder.addText(text1);
3261cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorRED);
3262cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3263cb93a386Sopenharmony_ci        builder.addText(text2);
3264cb93a386Sopenharmony_ci        builder.pop();
3265cb93a386Sopenharmony_ci
3266cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3267cb93a386Sopenharmony_ci        paragraph->layout(width());
3268cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3269cb93a386Sopenharmony_ci        canvas->translate(0, paragraph->getHeight() + 20);
3270cb93a386Sopenharmony_ci        }
3271cb93a386Sopenharmony_ci
3272cb93a386Sopenharmony_ci    }
3273cb93a386Sopenharmony_ci
3274cb93a386Sopenharmony_ciprivate:
3275cb93a386Sopenharmony_ci    using INHERITED = Sample;
3276cb93a386Sopenharmony_ci};
3277cb93a386Sopenharmony_ci
3278cb93a386Sopenharmony_ciclass ParagraphView54 : public ParagraphView_Base {
3279cb93a386Sopenharmony_ciprotected:
3280cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph54"); }
3281cb93a386Sopenharmony_ci
3282cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3283cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
3284cb93a386Sopenharmony_ci        //std::string text("يَهْدِيْكُمُ اللَّهُ وَيُصْلِحُ بَالَكُمُ");
3285cb93a386Sopenharmony_ci        //auto text = "ד�‍�‍�‍��";
3286cb93a386Sopenharmony_ci        auto text = "�‍�‍�‍��";
3287cb93a386Sopenharmony_ci
3288cb93a386Sopenharmony_ci        //auto fontCollection = sk_make_sp<FontCollection>();
3289cb93a386Sopenharmony_ci        auto fontCollection = getFontCollection();
3290cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
3291cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
3292cb93a386Sopenharmony_ci        //fontCollection->disableFontFallback();
3293cb93a386Sopenharmony_ci
3294cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3295cb93a386Sopenharmony_ci        //paragraph_style.setTextDirection(TextDirection::kRtl);
3296cb93a386Sopenharmony_ci
3297cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3298cb93a386Sopenharmony_ci        TextStyle text_style;
3299cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Noto Naskh Arabic")});
3300cb93a386Sopenharmony_ci        text_style.setFontSize(36);
3301cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3302cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3303cb93a386Sopenharmony_ci        builder.addText(text);
3304cb93a386Sopenharmony_ci
3305cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3306cb93a386Sopenharmony_ci        paragraph->layout(/*360*/width());
3307cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3308cb93a386Sopenharmony_ci    }
3309cb93a386Sopenharmony_ci
3310cb93a386Sopenharmony_ciprivate:
3311cb93a386Sopenharmony_ci    using INHERITED = Sample;
3312cb93a386Sopenharmony_ci};
3313cb93a386Sopenharmony_ci
3314cb93a386Sopenharmony_ciclass ParagraphView55 : public ParagraphView_Base {
3315cb93a386Sopenharmony_ciprotected:
3316cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph55"); }
3317cb93a386Sopenharmony_ci
3318cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3319cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
3320cb93a386Sopenharmony_ci        std::string text("يَهْدِيْكُمُ اللَّهُ وَيُصْلِحُ بَالَكُمُ");
3321cb93a386Sopenharmony_ci
3322cb93a386Sopenharmony_ci        //auto fontCollection = sk_make_sp<FontCollection>();
3323cb93a386Sopenharmony_ci        //fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
3324cb93a386Sopenharmony_ci        //fontCollection->enableFontFallback();
3325cb93a386Sopenharmony_ci        auto fontCollection = getFontCollection();
3326cb93a386Sopenharmony_ci        fontCollection->disableFontFallback();
3327cb93a386Sopenharmony_ci
3328cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3329cb93a386Sopenharmony_ci        paragraph_style.setTextDirection(TextDirection::kRtl);
3330cb93a386Sopenharmony_ci
3331cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3332cb93a386Sopenharmony_ci        TextStyle text_style;
3333cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Noto Naskh Arabic")});
3334cb93a386Sopenharmony_ci        text_style.setFontSize(64);
3335cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3336cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3337cb93a386Sopenharmony_ci        builder.addText(text.substr(0, 10).data());
3338cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorRED);
3339cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3340cb93a386Sopenharmony_ci        builder.addText(text.substr(10, 20).data());
3341cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3342cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3343cb93a386Sopenharmony_ci        builder.addText(text.substr(30, 50).data());
3344cb93a386Sopenharmony_ci
3345cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3346cb93a386Sopenharmony_ci        paragraph->layout(/*360*/width());
3347cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3348cb93a386Sopenharmony_ci    }
3349cb93a386Sopenharmony_ci
3350cb93a386Sopenharmony_ciprivate:
3351cb93a386Sopenharmony_ci    using INHERITED = Sample;
3352cb93a386Sopenharmony_ci};
3353cb93a386Sopenharmony_ci
3354cb93a386Sopenharmony_ciclass ParagraphView56 : public ParagraphView_Base {
3355cb93a386Sopenharmony_ciprotected:
3356cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph56"); }
3357cb93a386Sopenharmony_ci
3358cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3359cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
3360cb93a386Sopenharmony_ci        auto text = "BAM BAM BAM by Jade Baraldo\n"
3361cb93a386Sopenharmony_ci                    "Now on Top 100 Music Videos United States";
3362cb93a386Sopenharmony_ci
3363cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), false);
3364cb93a386Sopenharmony_ci        fontCollection->addFontFromFile("music/Roboto-Regular.ttf", "roboto");
3365cb93a386Sopenharmony_ci        fontCollection->addFontFromFile("music/NotoSansCJK-Regular.ttc", "noto");
3366cb93a386Sopenharmony_ci        fontCollection->addFontFromFile("music/NotoColorEmoji.ttf", "emoji");
3367cb93a386Sopenharmony_ci
3368cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3369cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3370cb93a386Sopenharmony_ci        TextStyle text_style;
3371cb93a386Sopenharmony_ci        //text_style.setFontFamilies({SkString("Noto Naskh Arabic")});
3372cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("roboto"),
3373cb93a386Sopenharmony_ci                                    SkString("noto"),
3374cb93a386Sopenharmony_ci                                    SkString("emoji")});
3375cb93a386Sopenharmony_ci        text_style.setFontSize(20);
3376cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3377cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3378cb93a386Sopenharmony_ci        builder.addText(text);
3379cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3380cb93a386Sopenharmony_ci        paragraph->layout(width());
3381cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3382cb93a386Sopenharmony_ci    }
3383cb93a386Sopenharmony_ci
3384cb93a386Sopenharmony_ciprivate:
3385cb93a386Sopenharmony_ci    using INHERITED = Sample;
3386cb93a386Sopenharmony_ci};
3387cb93a386Sopenharmony_ci
3388cb93a386Sopenharmony_ciclass ParagraphView57 : public ParagraphView_Base {
3389cb93a386Sopenharmony_ciprotected:
3390cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph57"); }
3391cb93a386Sopenharmony_ci
3392cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3393cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
3394cb93a386Sopenharmony_ci
3395cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
3396cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
3397cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
3398cb93a386Sopenharmony_ci
3399cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3400cb93a386Sopenharmony_ci        paragraph_style.setTextDirection(TextDirection::kRtl);
3401cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3402cb93a386Sopenharmony_ci        TextStyle text_style;
3403cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto") });
3404cb93a386Sopenharmony_ci        text_style.setFontSize(20);
3405cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3406cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3407cb93a386Sopenharmony_ci        builder.addText("בבבב\n\nאאאא");
3408cb93a386Sopenharmony_ci        builder.pop();
3409cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3410cb93a386Sopenharmony_ci        paragraph->layout(width());
3411cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3412cb93a386Sopenharmony_ci
3413cb93a386Sopenharmony_ci        auto height = paragraph->getHeight();
3414cb93a386Sopenharmony_ci        auto res1 = paragraph->getGlyphPositionAtCoordinate(0,0);
3415cb93a386Sopenharmony_ci        auto res2 = paragraph->getGlyphPositionAtCoordinate(0,height / 2);
3416cb93a386Sopenharmony_ci        auto res3 = paragraph->getGlyphPositionAtCoordinate(0,height);
3417cb93a386Sopenharmony_ci        SkDebugf("res1: %d %s\n", res1.position, res1.affinity == Affinity::kDownstream ? "D" : "U");
3418cb93a386Sopenharmony_ci        SkDebugf("res2: %d %s\n", res2.position, res2.affinity == Affinity::kDownstream ? "D" : "U");
3419cb93a386Sopenharmony_ci        SkDebugf("res3: %d %s\n", res3.position, res3.affinity == Affinity::kDownstream ? "D" : "U");
3420cb93a386Sopenharmony_ci    }
3421cb93a386Sopenharmony_ci
3422cb93a386Sopenharmony_ciprivate:
3423cb93a386Sopenharmony_ci    using INHERITED = Sample;
3424cb93a386Sopenharmony_ci};
3425cb93a386Sopenharmony_ci
3426cb93a386Sopenharmony_ciclass ParagraphView58 : public ParagraphView_Base {
3427cb93a386Sopenharmony_ciprotected:
3428cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph58"); }
3429cb93a386Sopenharmony_ci
3430cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3431cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
3432cb93a386Sopenharmony_ci
3433cb93a386Sopenharmony_ci        auto fontCollection = getFontCollection();
3434cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
3435cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
3436cb93a386Sopenharmony_ci
3437cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3438cb93a386Sopenharmony_ci
3439cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3440cb93a386Sopenharmony_ci        TextStyle text_style;
3441cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
3442cb93a386Sopenharmony_ci        text_style.setFontSize(40);
3443cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3444cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3445cb93a386Sopenharmony_ci        builder.addText(u"Text1 Google\u00A0Pay Text2");
3446cb93a386Sopenharmony_ci
3447cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3448cb93a386Sopenharmony_ci        paragraph->layout(width());
3449cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3450cb93a386Sopenharmony_ci    }
3451cb93a386Sopenharmony_ci
3452cb93a386Sopenharmony_ciprivate:
3453cb93a386Sopenharmony_ci    using INHERITED = Sample;
3454cb93a386Sopenharmony_ci};
3455cb93a386Sopenharmony_ci
3456cb93a386Sopenharmony_ciclass ParagraphView59 : public ParagraphView_Base {
3457cb93a386Sopenharmony_ciprotected:
3458cb93a386Sopenharmony_ci    SkString name() override { return SkString("Paragraph59"); }
3459cb93a386Sopenharmony_ci
3460cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3461cb93a386Sopenharmony_ci
3462cb93a386Sopenharmony_ci        auto fontCollection = getFontCollection();
3463cb93a386Sopenharmony_ci        //fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
3464cb93a386Sopenharmony_ci        //fontCollection->enableFontFallback();
3465cb93a386Sopenharmony_ci
3466cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3467cb93a386Sopenharmony_ci        TextStyle text_style;
3468cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3469cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Roboto")});
3470cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3471cb93a386Sopenharmony_ci        text_style.setFontSize(14);
3472cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3473cb93a386Sopenharmony_ci        builder.addText("The quick brown fox ate a hamburgerfons and got sick.");
3474cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3475cb93a386Sopenharmony_ci        paragraph->layout(width());
3476cb93a386Sopenharmony_ci
3477cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3478cb93a386Sopenharmony_ci
3479cb93a386Sopenharmony_ci        paragraph->visit([&](int, const skia::textlayout::Paragraph::VisitorInfo* info) {
3480cb93a386Sopenharmony_ci            if (!info) {
3481cb93a386Sopenharmony_ci                return;
3482cb93a386Sopenharmony_ci            }
3483cb93a386Sopenharmony_ci            SkFontMetrics metrics;
3484cb93a386Sopenharmony_ci            info->font.getMetrics(&metrics);
3485cb93a386Sopenharmony_ci
3486cb93a386Sopenharmony_ci            auto first = info->positions[0]; first.offset(info->origin.fX, info->origin.fY);
3487cb93a386Sopenharmony_ci            SkRect rect = SkRect::MakeXYWH(first.fX,
3488cb93a386Sopenharmony_ci                                           first.fY + metrics.fAscent,
3489cb93a386Sopenharmony_ci                                           info->advanceX - first.fX,
3490cb93a386Sopenharmony_ci                                           metrics.fDescent - metrics.fAscent);
3491cb93a386Sopenharmony_ci            SkPaint paint;
3492cb93a386Sopenharmony_ci            paint.setColor(SK_ColorLTGRAY);
3493cb93a386Sopenharmony_ci            canvas->drawRect(rect, paint);
3494cb93a386Sopenharmony_ci        });
3495cb93a386Sopenharmony_ci
3496cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3497cb93a386Sopenharmony_ci    }
3498cb93a386Sopenharmony_ci
3499cb93a386Sopenharmony_ciprivate:
3500cb93a386Sopenharmony_ci    using INHERITED = Sample;
3501cb93a386Sopenharmony_ci};
3502cb93a386Sopenharmony_ci
3503cb93a386Sopenharmony_ciclass ParagraphView60 : public ParagraphView_Base {
3504cb93a386Sopenharmony_ciprotected:
3505cb93a386Sopenharmony_ci    SkString name() override { return SkString("ParagraphView60"); }
3506cb93a386Sopenharmony_ci
3507cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3508cb93a386Sopenharmony_ci
3509cb93a386Sopenharmony_ci        SkString text("");
3510cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
3511cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), true, true);
3512cb93a386Sopenharmony_ci
3513cb93a386Sopenharmony_ci        TextStyle text_style;
3514cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3515cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Ahem")});
3516cb93a386Sopenharmony_ci        text_style.setFontSize(10.0f);
3517cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3518cb93a386Sopenharmony_ci        paragraph_style.setTextStyle(text_style);
3519cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3520cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3521cb93a386Sopenharmony_ci        builder.addText("    ");
3522cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3523cb93a386Sopenharmony_ci        paragraph->layout(width());
3524cb93a386Sopenharmony_ci        auto result = paragraph->getGlyphPositionAtCoordinate(20, 2); // "hello    " 60,2
3525cb93a386Sopenharmony_ci        SkDebugf("getGlyphPositionAtCoordinate(20,2)=%d %s\n", result.position, result.affinity == Affinity::kDownstream ? "D" : "U");
3526cb93a386Sopenharmony_ci    }
3527cb93a386Sopenharmony_ci
3528cb93a386Sopenharmony_ciprivate:
3529cb93a386Sopenharmony_ci    using INHERITED = Sample;
3530cb93a386Sopenharmony_ci};
3531cb93a386Sopenharmony_ci
3532cb93a386Sopenharmony_ciclass ParagraphView61 : public ParagraphView_Base {
3533cb93a386Sopenharmony_ciprotected:
3534cb93a386Sopenharmony_ci    SkString name() override { return SkString("ParagraphView61"); }
3535cb93a386Sopenharmony_ci
3536cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3537cb93a386Sopenharmony_ci
3538cb93a386Sopenharmony_ci        SkString text("");
3539cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
3540cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), true, true);
3541cb93a386Sopenharmony_ci
3542cb93a386Sopenharmony_ci        TextStyle text_style;
3543cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3544cb93a386Sopenharmony_ci        text_style.setFontFamilies({SkString("Ahem")});
3545cb93a386Sopenharmony_ci        text_style.setFontSize(12.0f);
3546cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3547cb93a386Sopenharmony_ci        paragraph_style.setTextStyle(text_style);
3548cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3549cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3550cb93a386Sopenharmony_ci        builder.addText("______________________");
3551cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3552cb93a386Sopenharmony_ci        paragraph->layout(132.0f);
3553cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3554cb93a386Sopenharmony_ci        std::vector<LineMetrics> metrics;
3555cb93a386Sopenharmony_ci        paragraph->getLineMetrics(metrics);
3556cb93a386Sopenharmony_ci        for (auto& metric : metrics) {
3557cb93a386Sopenharmony_ci            SkDebugf("Line[%zu:%zu <= %zu <= %zu)\n", metric.fStartIndex, metric.fEndExcludingWhitespaces, metric.fEndIndex, metric.fEndIncludingNewline);
3558cb93a386Sopenharmony_ci        }
3559cb93a386Sopenharmony_ci    }
3560cb93a386Sopenharmony_ci
3561cb93a386Sopenharmony_ciprivate:
3562cb93a386Sopenharmony_ci    using INHERITED = Sample;
3563cb93a386Sopenharmony_ci};
3564cb93a386Sopenharmony_ci
3565cb93a386Sopenharmony_ci// Selection jumping back and forth on Chinese text
3566cb93a386Sopenharmony_ciclass ParagraphView62 : public ParagraphView_Base {
3567cb93a386Sopenharmony_ciprotected:
3568cb93a386Sopenharmony_ci    SkString name() override { return SkString("ParagraphView62"); }
3569cb93a386Sopenharmony_ci
3570cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3571cb93a386Sopenharmony_ci
3572cb93a386Sopenharmony_ci        SkString text("");
3573cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
3574cb93a386Sopenharmony_ci        auto fontCollection = sk_make_sp<FontCollection>();
3575cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
3576cb93a386Sopenharmony_ci
3577cb93a386Sopenharmony_ci        TextStyle text_style;
3578cb93a386Sopenharmony_ci        text_style.setColor(SK_ColorBLACK);
3579cb93a386Sopenharmony_ci        //text_style.setFontFamilies({SkString("")});
3580cb93a386Sopenharmony_ci        text_style.setFontSize(24.0f);
3581cb93a386Sopenharmony_ci        text_style.setHeight(12.0f);
3582cb93a386Sopenharmony_ci        //text_style.setHeightOverride(true);
3583cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3584cb93a386Sopenharmony_ci        paragraph_style.setTextStyle(text_style);
3585cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3586cb93a386Sopenharmony_ci        builder.pushStyle(text_style);
3587cb93a386Sopenharmony_ci        //builder.addText("helloworld你好");
3588cb93a386Sopenharmony_ci        builder.addText("你好你好你好你好");
3589cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3590cb93a386Sopenharmony_ci        paragraph->layout(SK_ScalarInfinity);
3591cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3592cb93a386Sopenharmony_ci
3593cb93a386Sopenharmony_ci        for (auto x = 0.0f; x < paragraph->getMaxIntrinsicWidth(); x += 5.0f) {
3594cb93a386Sopenharmony_ci            auto pos = paragraph->getGlyphPositionAtCoordinate(x, paragraph->getHeight() / 2);
3595cb93a386Sopenharmony_ci            auto p = pos.position + (pos.affinity == Affinity::kDownstream ? 1 : 0);
3596cb93a386Sopenharmony_ci            auto rects = paragraph->getRectsForRange(0, p,RectHeightStyle::kTight, RectWidthStyle::kTight);
3597cb93a386Sopenharmony_ci            SkDebugf("@x=%f [0:%d%s=%d) ",
3598cb93a386Sopenharmony_ci                     x, pos.position,
3599cb93a386Sopenharmony_ci                     pos.affinity == Affinity::kDownstream ? "D" : "U",
3600cb93a386Sopenharmony_ci                     p);
3601cb93a386Sopenharmony_ci            for (auto& rect : rects) {
3602cb93a386Sopenharmony_ci                SkDebugf("[%f:%f) ", rect.rect.left(), rect.rect.right());
3603cb93a386Sopenharmony_ci            }
3604cb93a386Sopenharmony_ci            SkDebugf("\n");
3605cb93a386Sopenharmony_ci        }
3606cb93a386Sopenharmony_ci
3607cb93a386Sopenharmony_ci        //auto rects130 = paragraph->getRectsForRange(0.0f, 130.0f, RectHeightStyle::kTight, RectWidthStyle::kTight);
3608cb93a386Sopenharmony_ci        //auto rects140 = paragraph->getRectsForRange(0.0f, 140.0f, RectHeightStyle::kTight, RectWidthStyle::kTight);
3609cb93a386Sopenharmony_ci    }
3610cb93a386Sopenharmony_ci
3611cb93a386Sopenharmony_ciprivate:
3612cb93a386Sopenharmony_ci    using INHERITED = Sample;
3613cb93a386Sopenharmony_ci};
3614cb93a386Sopenharmony_ci
3615cb93a386Sopenharmony_ci// Baseline shift
3616cb93a386Sopenharmony_ciclass ParagraphView63 : public ParagraphView_Base {
3617cb93a386Sopenharmony_ciprotected:
3618cb93a386Sopenharmony_ci    SkString name() override { return SkString("ParagraphView63"); }
3619cb93a386Sopenharmony_ci
3620cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
3621cb93a386Sopenharmony_ci
3622cb93a386Sopenharmony_ci        canvas->drawColor(SK_ColorWHITE);
3623cb93a386Sopenharmony_ci        auto fontCollection = getFontCollection();
3624cb93a386Sopenharmony_ci        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
3625cb93a386Sopenharmony_ci        fontCollection->enableFontFallback();
3626cb93a386Sopenharmony_ci        TextStyle roboto;
3627cb93a386Sopenharmony_ci        roboto.setColor(SK_ColorBLACK);
3628cb93a386Sopenharmony_ci        roboto.setFontFamilies({SkString("Roboto")});
3629cb93a386Sopenharmony_ci        roboto.setFontSize(20.0f);
3630cb93a386Sopenharmony_ci
3631cb93a386Sopenharmony_ci        TextStyle assyrian;
3632cb93a386Sopenharmony_ci        assyrian.setColor(SK_ColorRED);
3633cb93a386Sopenharmony_ci        assyrian.setFontFamilies({SkString("Assyrian")});
3634cb93a386Sopenharmony_ci        assyrian.setFontSize(40.0f);
3635cb93a386Sopenharmony_ci
3636cb93a386Sopenharmony_ci        ParagraphStyle paragraph_style;
3637cb93a386Sopenharmony_ci        paragraph_style.setTextStyle(roboto);
3638cb93a386Sopenharmony_ci        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
3639cb93a386Sopenharmony_ci
3640cb93a386Sopenharmony_ci        roboto.setBaselineShift(0.0f);
3641cb93a386Sopenharmony_ci        builder.pushStyle(roboto);
3642cb93a386Sopenharmony_ci        builder.addText("Notice that the line height increased on the lines with ");
3643cb93a386Sopenharmony_ci        assyrian.setBaselineShift(.0f);
3644cb93a386Sopenharmony_ci        builder.pushStyle(assyrian);
3645cb93a386Sopenharmony_ci        builder.addText("baseline shifts:\n");
3646cb93a386Sopenharmony_ci
3647cb93a386Sopenharmony_ci        roboto.setBaselineShift(0.0f);
3648cb93a386Sopenharmony_ci        builder.pushStyle(roboto);
3649cb93a386Sopenharmony_ci        builder.addText("Zero baseline shift text ");
3650cb93a386Sopenharmony_ci
3651cb93a386Sopenharmony_ci        assyrian.setBaselineShift(-20.0f);
3652cb93a386Sopenharmony_ci        builder.pushStyle(assyrian);
3653cb93a386Sopenharmony_ci        builder.addText("Up20");
3654cb93a386Sopenharmony_ci
3655cb93a386Sopenharmony_ci        roboto.setBaselineShift(-40.0f);
3656cb93a386Sopenharmony_ci        builder.pushStyle(roboto);
3657cb93a386Sopenharmony_ci        builder.addText("Up40");
3658cb93a386Sopenharmony_ci
3659cb93a386Sopenharmony_ci        assyrian.setBaselineShift(-60.0f);
3660cb93a386Sopenharmony_ci        builder.pushStyle(assyrian);
3661cb93a386Sopenharmony_ci        builder.addText("Up60");
3662cb93a386Sopenharmony_ci
3663cb93a386Sopenharmony_ci        roboto.setBaselineShift(-40.0f);
3664cb93a386Sopenharmony_ci        builder.pushStyle(roboto);
3665cb93a386Sopenharmony_ci        builder.addText("Up40");
3666cb93a386Sopenharmony_ci
3667cb93a386Sopenharmony_ci        assyrian.setBaselineShift(-20.0f);
3668cb93a386Sopenharmony_ci        builder.pushStyle(assyrian);
3669cb93a386Sopenharmony_ci        builder.addText("Up20");
3670cb93a386Sopenharmony_ci
3671cb93a386Sopenharmony_ci        roboto.setBaselineShift(-0.0f);
3672cb93a386Sopenharmony_ci        builder.pushStyle(roboto);
3673cb93a386Sopenharmony_ci        builder.addText(" Zero baseline shift text\n");
3674cb93a386Sopenharmony_ci
3675cb93a386Sopenharmony_ci        assyrian.addShadow(TextShadow(SK_ColorGREEN, SkPoint::Make(5, 5), 2));
3676cb93a386Sopenharmony_ci        assyrian.setDecorationStyle(TextDecorationStyle::kSolid);
3677cb93a386Sopenharmony_ci        assyrian.setDecoration(TextDecoration::kUnderline);
3678cb93a386Sopenharmony_ci        assyrian.setDecorationColor(SK_ColorBLUE);
3679cb93a386Sopenharmony_ci
3680cb93a386Sopenharmony_ci        roboto.setBaselineShift(0.0f);
3681cb93a386Sopenharmony_ci        builder.pushStyle(roboto);
3682cb93a386Sopenharmony_ci        builder.addText("Notice that shadows and decorations are shifted if there is a text with ");
3683cb93a386Sopenharmony_ci        assyrian.setBaselineShift(.0f);
3684cb93a386Sopenharmony_ci        builder.pushStyle(assyrian);
3685cb93a386Sopenharmony_ci        builder.addText("baseline shifts:\n");
3686cb93a386Sopenharmony_ci
3687cb93a386Sopenharmony_ci        assyrian.setDecoration(TextDecoration::kNoDecoration);
3688cb93a386Sopenharmony_ci
3689cb93a386Sopenharmony_ci        roboto.setBaselineShift(0.0f);
3690cb93a386Sopenharmony_ci        builder.pushStyle(roboto);
3691cb93a386Sopenharmony_ci        builder.addText("Zero baseline shift text ");
3692cb93a386Sopenharmony_ci
3693cb93a386Sopenharmony_ci        assyrian.setBaselineShift(20.0f);
3694cb93a386Sopenharmony_ci        builder.pushStyle(assyrian);
3695cb93a386Sopenharmony_ci        builder.addText("Down20");
3696cb93a386Sopenharmony_ci
3697cb93a386Sopenharmony_ci        roboto.setBaselineShift(40.0f);
3698cb93a386Sopenharmony_ci        builder.pushStyle(roboto);
3699cb93a386Sopenharmony_ci        builder.addText("Down40");
3700cb93a386Sopenharmony_ci
3701cb93a386Sopenharmony_ci        assyrian.setBaselineShift(60.0f);
3702cb93a386Sopenharmony_ci        builder.pushStyle(assyrian);
3703cb93a386Sopenharmony_ci        builder.addText("Down60");
3704cb93a386Sopenharmony_ci
3705cb93a386Sopenharmony_ci        roboto.setBaselineShift(40.0f);
3706cb93a386Sopenharmony_ci        builder.pushStyle(roboto);
3707cb93a386Sopenharmony_ci        builder.addText("Down40");
3708cb93a386Sopenharmony_ci
3709cb93a386Sopenharmony_ci        assyrian.setBaselineShift(20.0f);
3710cb93a386Sopenharmony_ci        builder.pushStyle(assyrian);
3711cb93a386Sopenharmony_ci        builder.addText("Down20");
3712cb93a386Sopenharmony_ci
3713cb93a386Sopenharmony_ci        roboto.setBaselineShift(0.0f);
3714cb93a386Sopenharmony_ci        builder.pushStyle(roboto);
3715cb93a386Sopenharmony_ci        builder.addText(" Zero baseline shift text\n");
3716cb93a386Sopenharmony_ci
3717cb93a386Sopenharmony_ci        assyrian.resetShadows();
3718cb93a386Sopenharmony_ci        assyrian.setDecorationStyle(TextDecorationStyle::kSolid);
3719cb93a386Sopenharmony_ci        assyrian.setDecoration(TextDecoration::kUnderline);
3720cb93a386Sopenharmony_ci        assyrian.setDecorationColor(SK_ColorBLUE);
3721cb93a386Sopenharmony_ci
3722cb93a386Sopenharmony_ci        roboto.setBaselineShift(0.0f);
3723cb93a386Sopenharmony_ci        builder.pushStyle(roboto);
3724cb93a386Sopenharmony_ci        builder.addText("Zero baseline shift text ");
3725cb93a386Sopenharmony_ci
3726cb93a386Sopenharmony_ci        assyrian.setBaselineShift(-20.0f);
3727cb93a386Sopenharmony_ci        builder.pushStyle(assyrian);
3728cb93a386Sopenharmony_ci        builder.addText("Up20");
3729cb93a386Sopenharmony_ci
3730cb93a386Sopenharmony_ci        roboto.setBaselineShift(-40.0f);
3731cb93a386Sopenharmony_ci        builder.pushStyle(roboto);
3732cb93a386Sopenharmony_ci        builder.addText("Up40");
3733cb93a386Sopenharmony_ci
3734cb93a386Sopenharmony_ci        assyrian.setBaselineShift(-60.0f);
3735cb93a386Sopenharmony_ci        builder.pushStyle(assyrian);
3736cb93a386Sopenharmony_ci        builder.addText("Up60");
3737cb93a386Sopenharmony_ci
3738cb93a386Sopenharmony_ci        roboto.setBaselineShift(-40.0f);
3739cb93a386Sopenharmony_ci        builder.pushStyle(roboto);
3740cb93a386Sopenharmony_ci        builder.addText("Up40");
3741cb93a386Sopenharmony_ci
3742cb93a386Sopenharmony_ci        assyrian.setBaselineShift(-20.0f);
3743cb93a386Sopenharmony_ci        builder.pushStyle(assyrian);
3744cb93a386Sopenharmony_ci        builder.addText("Up20");
3745cb93a386Sopenharmony_ci
3746cb93a386Sopenharmony_ci        roboto.setBaselineShift(-0.0f);
3747cb93a386Sopenharmony_ci        builder.pushStyle(roboto);
3748cb93a386Sopenharmony_ci        builder.addText(" Zero baseline shift text");
3749cb93a386Sopenharmony_ci
3750cb93a386Sopenharmony_ci        auto paragraph = builder.Build();
3751cb93a386Sopenharmony_ci        paragraph->layout(SK_ScalarInfinity);
3752cb93a386Sopenharmony_ci        paragraph->paint(canvas, 0, 0);
3753cb93a386Sopenharmony_ci    }
3754cb93a386Sopenharmony_ci
3755cb93a386Sopenharmony_ciprivate:
3756cb93a386Sopenharmony_ci    using INHERITED = Sample;
3757cb93a386Sopenharmony_ci};
3758cb93a386Sopenharmony_ci
3759cb93a386Sopenharmony_ci}  // namespace
3760cb93a386Sopenharmony_ci
3761cb93a386Sopenharmony_ci//////////////////////////////////////////////////////////////////////////////
3762cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView1();)
3763cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView2();)
3764cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView3();)
3765cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView4();)
3766cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView5();)
3767cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView6();)
3768cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView7();)
3769cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView8();)
3770cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView9();)
3771cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView10();)
3772cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView11();)
3773cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView12();)
3774cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView14();)
3775cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView15();)
3776cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView16();)
3777cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView17();)
3778cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView18();)
3779cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView19();)
3780cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView20();)
3781cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView21();)
3782cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView22();)
3783cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView23();)
3784cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView24();)
3785cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView25();)
3786cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView26();)
3787cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView27();)
3788cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView28();)
3789cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView29();)
3790cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView30();)
3791cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView31();)
3792cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView32();)
3793cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView33();)
3794cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView34();)
3795cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView35();)
3796cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView36();)
3797cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView37();)
3798cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView38();)
3799cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView39();)
3800cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView41();)
3801cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView42();)
3802cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView43();)
3803cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView44();)
3804cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView45();)
3805cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView46();)
3806cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView47();)
3807cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView48();)
3808cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView49();)
3809cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView50();)
3810cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView51();)
3811cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView52();)
3812cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView53();)
3813cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView54();)
3814cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView55();)
3815cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView56();)
3816cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView57();)
3817cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView58();)
3818cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView59();)
3819cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView60();)
3820cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView61();)
3821cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView62();)
3822cb93a386Sopenharmony_ciDEF_SAMPLE(return new ParagraphView63();)
3823