xref: /aosp_15_r20/external/skia/modules/skparagraph/slides/ParagraphSlide.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2019 Google LLC.
2*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
3*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorFilter.h"
4*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorPriv.h"
5*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontMgr.h"
6*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkGraphics.h"
7*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h"
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRegion.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStream.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTextBlob.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/include/Paragraph.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/include/TypefaceFontProvider.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/src/ParagraphBuilderImpl.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/src/ParagraphImpl.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/src/TextLine.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/utils/TestFontCollection.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skshaper/utils/FactoryHelpers.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkTime.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkUTF.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkOSFile.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkOSPath.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "tools/flags/CommandLineFlags.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "tools/viewer/ClickHandlerSlide.h"
30*c8dee2aaSAndroid Build Coastguard Worker 
31*c8dee2aaSAndroid Build Coastguard Worker static DEFINE_bool(verboseParagraph, false, "paragraph samples very verbose.");
32*c8dee2aaSAndroid Build Coastguard Worker 
33*c8dee2aaSAndroid Build Coastguard Worker using namespace skia::textlayout;
34*c8dee2aaSAndroid Build Coastguard Worker namespace {
35*c8dee2aaSAndroid Build Coastguard Worker 
get_unicode()36*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<SkUnicode> get_unicode() {
37*c8dee2aaSAndroid Build Coastguard Worker     auto factory = SkShapers::BestAvailable();
38*c8dee2aaSAndroid Build Coastguard Worker     return sk_ref_sp<SkUnicode>(factory->getUnicode());
39*c8dee2aaSAndroid Build Coastguard Worker }
40*c8dee2aaSAndroid Build Coastguard Worker 
41*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide_Base : public ClickHandlerSlide {
42*c8dee2aaSAndroid Build Coastguard Worker public:
load(SkScalar w,SkScalar h)43*c8dee2aaSAndroid Build Coastguard Worker     void load(SkScalar w, SkScalar h) override { fSize = {w, h}; }
44*c8dee2aaSAndroid Build Coastguard Worker 
resize(SkScalar w,SkScalar h)45*c8dee2aaSAndroid Build Coastguard Worker     void resize(SkScalar w, SkScalar h) override { fSize = {w, h}; }
46*c8dee2aaSAndroid Build Coastguard Worker 
47*c8dee2aaSAndroid Build Coastguard Worker protected:
onFindClickHandler(SkScalar x,SkScalar y,skui::ModifierKey modi)48*c8dee2aaSAndroid Build Coastguard Worker     Click * onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
49*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
50*c8dee2aaSAndroid Build Coastguard Worker     }
onClick(ClickHandlerSlide::Click *)51*c8dee2aaSAndroid Build Coastguard Worker     bool onClick(ClickHandlerSlide::Click *) override { return false; }
52*c8dee2aaSAndroid Build Coastguard Worker 
getFontCollection()53*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<TestFontCollection> getFontCollection() {
54*c8dee2aaSAndroid Build Coastguard Worker         // If we reset font collection we need to reset paragraph cache
55*c8dee2aaSAndroid Build Coastguard Worker         static sk_sp<TestFontCollection> fFC = nullptr;
56*c8dee2aaSAndroid Build Coastguard Worker         if (fFC == nullptr) {
57*c8dee2aaSAndroid Build Coastguard Worker             fFC = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), false, true);
58*c8dee2aaSAndroid Build Coastguard Worker         }
59*c8dee2aaSAndroid Build Coastguard Worker         return fFC;
60*c8dee2aaSAndroid Build Coastguard Worker     }
61*c8dee2aaSAndroid Build Coastguard Worker 
isVerbose()62*c8dee2aaSAndroid Build Coastguard Worker     bool isVerbose() {
63*c8dee2aaSAndroid Build Coastguard Worker         return FLAGS_verboseParagraph;
64*c8dee2aaSAndroid Build Coastguard Worker     }
65*c8dee2aaSAndroid Build Coastguard Worker 
size() const66*c8dee2aaSAndroid Build Coastguard Worker     SkSize size() const { return fSize; }
67*c8dee2aaSAndroid Build Coastguard Worker 
68*c8dee2aaSAndroid Build Coastguard Worker private:
69*c8dee2aaSAndroid Build Coastguard Worker     SkSize fSize;
70*c8dee2aaSAndroid Build Coastguard Worker };
71*c8dee2aaSAndroid Build Coastguard Worker 
setgrad(const SkRect & r,SkColor c0,SkColor c1)72*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkShader> setgrad(const SkRect& r, SkColor c0, SkColor c1) {
73*c8dee2aaSAndroid Build Coastguard Worker     SkColor colors[] = {c0, c1};
74*c8dee2aaSAndroid Build Coastguard Worker     SkPoint pts[] = {{r.fLeft, r.fTop}, {r.fRight, r.fTop}};
75*c8dee2aaSAndroid Build Coastguard Worker     return SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkTileMode::kClamp);
76*c8dee2aaSAndroid Build Coastguard Worker }
77*c8dee2aaSAndroid Build Coastguard Worker /*
78*c8dee2aaSAndroid Build Coastguard Worker void writeHtml(const char* name, Paragraph* paragraph) {
79*c8dee2aaSAndroid Build Coastguard Worker         SkString tmpDir = skiatest::GetTmpDir();
80*c8dee2aaSAndroid Build Coastguard Worker         if (!tmpDir.isEmpty()) {
81*c8dee2aaSAndroid Build Coastguard Worker             SkString path = SkOSPath::Join(tmpDir.c_str(), name);
82*c8dee2aaSAndroid Build Coastguard Worker             SkFILEWStream file(path.c_str());
83*c8dee2aaSAndroid Build Coastguard Worker             file.write(nullptr, 0);
84*c8dee2aaSAndroid Build Coastguard Worker         }
85*c8dee2aaSAndroid Build Coastguard Worker }
86*c8dee2aaSAndroid Build Coastguard Worker */
87*c8dee2aaSAndroid Build Coastguard Worker 
88*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide1 : public ParagraphSlide_Base {
89*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide1()90*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide1() { fName = "Paragraph1"; }
91*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)92*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
93*c8dee2aaSAndroid Build Coastguard Worker         drawTest(canvas, this->size().width(), this->size().height(), SK_ColorRED, SK_ColorWHITE);
94*c8dee2aaSAndroid Build Coastguard Worker     }
95*c8dee2aaSAndroid Build Coastguard Worker 
96*c8dee2aaSAndroid Build Coastguard Worker protected:
drawTest(SkCanvas * canvas,SkScalar w,SkScalar h,SkColor fg,SkColor bg)97*c8dee2aaSAndroid Build Coastguard Worker     void drawTest(SkCanvas* canvas, SkScalar w, SkScalar h, SkColor fg, SkColor bg) {
98*c8dee2aaSAndroid Build Coastguard Worker         const std::vector<
99*c8dee2aaSAndroid Build Coastguard Worker             std::tuple<std::string, bool, bool, int, SkColor, SkColor, bool, TextDecorationStyle>>
100*c8dee2aaSAndroid Build Coastguard Worker             gParagraph = {{"monospace", true, false, 14, SK_ColorWHITE, SK_ColorRED, true,
101*c8dee2aaSAndroid Build Coastguard Worker                            TextDecorationStyle::kDashed},
102*c8dee2aaSAndroid Build Coastguard Worker                           {"Assyrian", false, false, 20, SK_ColorWHITE, SK_ColorBLUE, false,
103*c8dee2aaSAndroid Build Coastguard Worker                            TextDecorationStyle::kDotted},
104*c8dee2aaSAndroid Build Coastguard Worker                           {"serif", true, true, 10, SK_ColorWHITE, SK_ColorRED, true,
105*c8dee2aaSAndroid Build Coastguard Worker                            TextDecorationStyle::kDouble},
106*c8dee2aaSAndroid Build Coastguard Worker                           {"Arial", false, true, 16, SK_ColorGRAY, SK_ColorGREEN, true,
107*c8dee2aaSAndroid Build Coastguard Worker                            TextDecorationStyle::kSolid},
108*c8dee2aaSAndroid Build Coastguard Worker                           {"sans-serif", false, false, 8, SK_ColorWHITE, SK_ColorRED, false,
109*c8dee2aaSAndroid Build Coastguard Worker                            TextDecorationStyle::kWavy}};
110*c8dee2aaSAndroid Build Coastguard Worker         SkAutoCanvasRestore acr(canvas, true);
111*c8dee2aaSAndroid Build Coastguard Worker 
112*c8dee2aaSAndroid Build Coastguard Worker         canvas->clipRect(SkRect::MakeWH(w, h));
113*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
114*c8dee2aaSAndroid Build Coastguard Worker 
115*c8dee2aaSAndroid Build Coastguard Worker         SkScalar margin = 20;
116*c8dee2aaSAndroid Build Coastguard Worker 
117*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
118*c8dee2aaSAndroid Build Coastguard Worker         paint.setAntiAlias(true);
119*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(fg);
120*c8dee2aaSAndroid Build Coastguard Worker 
121*c8dee2aaSAndroid Build Coastguard Worker         SkPaint blue;
122*c8dee2aaSAndroid Build Coastguard Worker         blue.setColor(SK_ColorBLUE);
123*c8dee2aaSAndroid Build Coastguard Worker 
124*c8dee2aaSAndroid Build Coastguard Worker         TextStyle defaultStyle;
125*c8dee2aaSAndroid Build Coastguard Worker         defaultStyle.setBackgroundColor(blue);
126*c8dee2aaSAndroid Build Coastguard Worker         defaultStyle.setForegroundColor(paint);
127*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paraStyle;
128*c8dee2aaSAndroid Build Coastguard Worker 
129*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
130*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
131*c8dee2aaSAndroid Build Coastguard Worker         for (auto i = 1; i < 5; ++i) {
132*c8dee2aaSAndroid Build Coastguard Worker             defaultStyle.setFontSize(24 * i);
133*c8dee2aaSAndroid Build Coastguard Worker             paraStyle.setTextStyle(defaultStyle);
134*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paraStyle, fontCollection, get_unicode());
135*c8dee2aaSAndroid Build Coastguard Worker             std::string name = "Paragraph: " + std::to_string(24 * i);
136*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(name.c_str(), name.length());
137*c8dee2aaSAndroid Build Coastguard Worker             for (auto para : gParagraph) {
138*c8dee2aaSAndroid Build Coastguard Worker                 TextStyle style;
139*c8dee2aaSAndroid Build Coastguard Worker                 style.setFontFamilies({SkString(std::get<0>(para).c_str())});
140*c8dee2aaSAndroid Build Coastguard Worker                 SkFontStyle fontStyle(std::get<1>(para) ? SkFontStyle::Weight::kBold_Weight
141*c8dee2aaSAndroid Build Coastguard Worker                                                         : SkFontStyle::Weight::kNormal_Weight,
142*c8dee2aaSAndroid Build Coastguard Worker                                       SkFontStyle::Width::kNormal_Width,
143*c8dee2aaSAndroid Build Coastguard Worker                                       std::get<2>(para) ? SkFontStyle::Slant::kItalic_Slant
144*c8dee2aaSAndroid Build Coastguard Worker                                                         : SkFontStyle::Slant::kUpright_Slant);
145*c8dee2aaSAndroid Build Coastguard Worker                 style.setFontStyle(fontStyle);
146*c8dee2aaSAndroid Build Coastguard Worker                 style.setFontSize(std::get<3>(para) * i);
147*c8dee2aaSAndroid Build Coastguard Worker                 SkPaint background;
148*c8dee2aaSAndroid Build Coastguard Worker                 background.setColor(std::get<4>(para));
149*c8dee2aaSAndroid Build Coastguard Worker                 style.setBackgroundColor(background);
150*c8dee2aaSAndroid Build Coastguard Worker                 SkPaint foreground;
151*c8dee2aaSAndroid Build Coastguard Worker                 foreground.setColor(std::get<5>(para));
152*c8dee2aaSAndroid Build Coastguard Worker                 foreground.setAntiAlias(true);
153*c8dee2aaSAndroid Build Coastguard Worker                 style.setForegroundColor(foreground);
154*c8dee2aaSAndroid Build Coastguard Worker                 if (std::get<6>(para)) {
155*c8dee2aaSAndroid Build Coastguard Worker                     style.addShadow(TextShadow(SK_ColorBLACK, SkPoint::Make(5, 5), 2));
156*c8dee2aaSAndroid Build Coastguard Worker                 }
157*c8dee2aaSAndroid Build Coastguard Worker 
158*c8dee2aaSAndroid Build Coastguard Worker                 auto decoration = (i % 4);
159*c8dee2aaSAndroid Build Coastguard Worker                 if (decoration == 3) {
160*c8dee2aaSAndroid Build Coastguard Worker                     decoration = 4;
161*c8dee2aaSAndroid Build Coastguard Worker                 }
162*c8dee2aaSAndroid Build Coastguard Worker 
163*c8dee2aaSAndroid Build Coastguard Worker                 bool test = (TextDecoration)decoration != TextDecoration::kNoDecoration;
164*c8dee2aaSAndroid Build Coastguard Worker                 std::string deco = std::to_string((int)decoration);
165*c8dee2aaSAndroid Build Coastguard Worker                 if (test) {
166*c8dee2aaSAndroid Build Coastguard Worker                     style.setDecoration((TextDecoration)decoration);
167*c8dee2aaSAndroid Build Coastguard Worker                     style.setDecorationStyle(std::get<7>(para));
168*c8dee2aaSAndroid Build Coastguard Worker                     style.setDecorationColor(std::get<5>(para));
169*c8dee2aaSAndroid Build Coastguard Worker                 }
170*c8dee2aaSAndroid Build Coastguard Worker                 builder.pushStyle(style);
171*c8dee2aaSAndroid Build Coastguard Worker                 name = " " + std::get<0>(para) + " " +
172*c8dee2aaSAndroid Build Coastguard Worker                        (std::get<1>(para) ? ", bold" : "") +
173*c8dee2aaSAndroid Build Coastguard Worker                        (std::get<2>(para) ? ", italic" : "") + " " +
174*c8dee2aaSAndroid Build Coastguard Worker                        std::to_string(std::get<3>(para) * i) +
175*c8dee2aaSAndroid Build Coastguard Worker                        (std::get<4>(para) != bg ? ", background" : "") +
176*c8dee2aaSAndroid Build Coastguard Worker                        (std::get<5>(para) != fg ? ", foreground" : "") +
177*c8dee2aaSAndroid Build Coastguard Worker                        (std::get<6>(para) ? ", shadow" : "") +
178*c8dee2aaSAndroid Build Coastguard Worker                        (test ? ", decorations " + deco : "") + ";";
179*c8dee2aaSAndroid Build Coastguard Worker                 builder.addText(name.c_str(), name.length());
180*c8dee2aaSAndroid Build Coastguard Worker                 builder.pop();
181*c8dee2aaSAndroid Build Coastguard Worker             }
182*c8dee2aaSAndroid Build Coastguard Worker 
183*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
184*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(w - margin * 2);
185*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, margin, margin);
186*c8dee2aaSAndroid Build Coastguard Worker 
187*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(0, paragraph->getHeight());
188*c8dee2aaSAndroid Build Coastguard Worker         }
189*c8dee2aaSAndroid Build Coastguard Worker     }
190*c8dee2aaSAndroid Build Coastguard Worker };
191*c8dee2aaSAndroid Build Coastguard Worker 
192*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide2 : public ParagraphSlide_Base {
193*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide2()194*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide2() { fName = "Paragraph2"; }
195*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)196*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
197*c8dee2aaSAndroid Build Coastguard Worker         std::vector<const char*> cupertino = {
198*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 1 "
199*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 12 "
200*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 123 "
201*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 1234 "
202*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 12345 "
203*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 123456 "
204*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 1234567 "
205*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 12345678 "
206*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 123456789 "
207*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 1234567890 "
208*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 123456789 "
209*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 12345678 "
210*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 1234567 "
211*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 123456 "
212*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 12345 "
213*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 1234 "
214*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 123 "
215*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 12 "
216*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo 1 "
217*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo "
218*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo "
219*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo "
220*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo "
221*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo "
222*c8dee2aaSAndroid Build Coastguard Worker                 "google_logogoogle_gsuper_g_logo"};
223*c8dee2aaSAndroid Build Coastguard Worker         std::vector<const char*> text = {
224*c8dee2aaSAndroid Build Coastguard Worker                 "My neighbor came over to say,\n"
225*c8dee2aaSAndroid Build Coastguard Worker                 "Although not in a neighborly way,\n\n"
226*c8dee2aaSAndroid Build Coastguard Worker                 "That he'd knock me around,\n\n\n"
227*c8dee2aaSAndroid Build Coastguard Worker                 "If I didn't stop the sound,\n\n\n\n"
228*c8dee2aaSAndroid Build Coastguard Worker                 "Of the classical music I play."};
229*c8dee2aaSAndroid Build Coastguard Worker 
230*c8dee2aaSAndroid Build Coastguard Worker         std::vector<const char*> long_word = {
231*c8dee2aaSAndroid Build Coastguard Worker                 "A_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
232*c8dee2aaSAndroid Build Coastguard Worker                 "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
233*c8dee2aaSAndroid Build Coastguard Worker                 "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
234*c8dee2aaSAndroid Build Coastguard Worker                 "very_very_very_very_very_very_very_long_text"};
235*c8dee2aaSAndroid Build Coastguard Worker 
236*c8dee2aaSAndroid Build Coastguard Worker         std::vector<const char*> very_long = {
237*c8dee2aaSAndroid Build Coastguard Worker                 "A very very very very very very very very very very very very very very very very "
238*c8dee2aaSAndroid Build Coastguard Worker                 "very very very very very very very very very very very very very very very very "
239*c8dee2aaSAndroid Build Coastguard Worker                 "very very very very very very very very very very very very very very very very "
240*c8dee2aaSAndroid Build Coastguard Worker                 "very very very very very very very long text"};
241*c8dee2aaSAndroid Build Coastguard Worker 
242*c8dee2aaSAndroid Build Coastguard Worker         std::vector<const char*> very_word = {
243*c8dee2aaSAndroid Build Coastguard Worker                 "A very_very_very_very_very_very_very_very_very_very "
244*c8dee2aaSAndroid Build Coastguard Worker                 "very_very_very_very_very_very_very_very_very_very very very very very very very "
245*c8dee2aaSAndroid Build Coastguard Worker                 "very very very very very very very very very very very very very very very very "
246*c8dee2aaSAndroid Build Coastguard Worker                 "very very very very very very very very very very very very very long text"};
247*c8dee2aaSAndroid Build Coastguard Worker 
248*c8dee2aaSAndroid Build Coastguard Worker         SkScalar width = this->size().width() / 5;
249*c8dee2aaSAndroid Build Coastguard Worker         SkScalar height = this->size().height();
250*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, width, height, long_word, SK_ColorBLACK, SK_ColorWHITE, "Google Sans", 30);
251*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(width, 0);
252*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, width, height, very_long, SK_ColorBLACK, SK_ColorWHITE, "Google Sans", 30);
253*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(width, 0);
254*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, width, height, very_word, SK_ColorBLACK, SK_ColorWHITE, "Google Sans", 30);
255*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(width, 0);
256*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, width, height / 2, text, SK_ColorBLACK, SK_ColorWHITE, "Roboto", 20, 100,
257*c8dee2aaSAndroid Build Coastguard Worker                  u"\u2026");
258*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, height / 2);
259*c8dee2aaSAndroid Build Coastguard Worker         drawCode(canvas, width, height / 2);
260*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(width, -height / 2);
261*c8dee2aaSAndroid Build Coastguard Worker 
262*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, width, height, cupertino, SK_ColorBLACK, SK_ColorWHITE, "Google Sans", 30);
263*c8dee2aaSAndroid Build Coastguard Worker     }
264*c8dee2aaSAndroid Build Coastguard Worker 
265*c8dee2aaSAndroid Build Coastguard Worker private:
drawCode(SkCanvas * canvas,SkScalar w,SkScalar h)266*c8dee2aaSAndroid Build Coastguard Worker     void drawCode(SkCanvas* canvas, SkScalar w, SkScalar h) {
267*c8dee2aaSAndroid Build Coastguard Worker         SkPaint comment;
268*c8dee2aaSAndroid Build Coastguard Worker         comment.setColor(SK_ColorGRAY);
269*c8dee2aaSAndroid Build Coastguard Worker         SkPaint constant;
270*c8dee2aaSAndroid Build Coastguard Worker         constant.setColor(SK_ColorMAGENTA);
271*c8dee2aaSAndroid Build Coastguard Worker         SkPaint null;
272*c8dee2aaSAndroid Build Coastguard Worker         null.setColor(SK_ColorMAGENTA);
273*c8dee2aaSAndroid Build Coastguard Worker         SkPaint literal;
274*c8dee2aaSAndroid Build Coastguard Worker         literal.setColor(SK_ColorGREEN);
275*c8dee2aaSAndroid Build Coastguard Worker         SkPaint code;
276*c8dee2aaSAndroid Build Coastguard Worker         code.setColor(SK_ColorDKGRAY);
277*c8dee2aaSAndroid Build Coastguard Worker         SkPaint number;
278*c8dee2aaSAndroid Build Coastguard Worker         number.setColor(SK_ColorBLUE);
279*c8dee2aaSAndroid Build Coastguard Worker         SkPaint name;
280*c8dee2aaSAndroid Build Coastguard Worker         name.setColor(SK_ColorRED);
281*c8dee2aaSAndroid Build Coastguard Worker 
282*c8dee2aaSAndroid Build Coastguard Worker         SkPaint white;
283*c8dee2aaSAndroid Build Coastguard Worker         white.setColor(SK_ColorWHITE);
284*c8dee2aaSAndroid Build Coastguard Worker 
285*c8dee2aaSAndroid Build Coastguard Worker         TextStyle defaultStyle;
286*c8dee2aaSAndroid Build Coastguard Worker         defaultStyle.setBackgroundColor(white);
287*c8dee2aaSAndroid Build Coastguard Worker         defaultStyle.setForegroundColor(code);
288*c8dee2aaSAndroid Build Coastguard Worker         defaultStyle.setFontFamilies({SkString("monospace")});
289*c8dee2aaSAndroid Build Coastguard Worker         defaultStyle.setFontSize(30);
290*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paraStyle;
291*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setTextStyle(defaultStyle);
292*c8dee2aaSAndroid Build Coastguard Worker 
293*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
294*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
295*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paraStyle, fontCollection, get_unicode());
296*c8dee2aaSAndroid Build Coastguard Worker 
297*c8dee2aaSAndroid Build Coastguard Worker         const char* text1 = "RaisedButton";
298*c8dee2aaSAndroid Build Coastguard Worker         const char* text2 = "(\n";
299*c8dee2aaSAndroid Build Coastguard Worker         const char* text3 = "  child: ";
300*c8dee2aaSAndroid Build Coastguard Worker         const char* text4 = "const";
301*c8dee2aaSAndroid Build Coastguard Worker         const char* text5 = "Text";
302*c8dee2aaSAndroid Build Coastguard Worker         const char* text6 = "'BUTTON TITLE'";
303*c8dee2aaSAndroid Build Coastguard Worker         const char* text7 = "),\n";
304*c8dee2aaSAndroid Build Coastguard Worker 
305*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(style(name));
306*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text1, strlen(text1));
307*c8dee2aaSAndroid Build Coastguard Worker         builder.pop();
308*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text2, strlen(text2));
309*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text3, strlen(text3));
310*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(style(constant));
311*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text4, strlen(text4));
312*c8dee2aaSAndroid Build Coastguard Worker         builder.pop();
313*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(" ", 1);
314*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(style(name));
315*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text5, strlen(text5));
316*c8dee2aaSAndroid Build Coastguard Worker         builder.pop();
317*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("(", 1);
318*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(style(literal));
319*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text6, strlen(text6));
320*c8dee2aaSAndroid Build Coastguard Worker         builder.pop();
321*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text7, strlen(text7));
322*c8dee2aaSAndroid Build Coastguard Worker 
323*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
324*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(w - 20);
325*c8dee2aaSAndroid Build Coastguard Worker 
326*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 20, 20);
327*c8dee2aaSAndroid Build Coastguard Worker     }
328*c8dee2aaSAndroid Build Coastguard Worker 
style(SkPaint paint)329*c8dee2aaSAndroid Build Coastguard Worker     TextStyle style(SkPaint paint) {
330*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style;
331*c8dee2aaSAndroid Build Coastguard Worker         paint.setAntiAlias(true);
332*c8dee2aaSAndroid Build Coastguard Worker         style.setForegroundColor(paint);
333*c8dee2aaSAndroid Build Coastguard Worker         style.setFontFamilies({SkString("monospace")});
334*c8dee2aaSAndroid Build Coastguard Worker         style.setFontSize(30);
335*c8dee2aaSAndroid Build Coastguard Worker 
336*c8dee2aaSAndroid Build Coastguard Worker         return style;
337*c8dee2aaSAndroid Build Coastguard Worker     }
338*c8dee2aaSAndroid Build Coastguard Worker 
drawText(SkCanvas * canvas,SkScalar w,SkScalar h,std::vector<const char * > & text,SkColor fg=SK_ColorDKGRAY,SkColor bg=SK_ColorWHITE,const char * ff="sans-serif",SkScalar fs=24,size_t lineLimit=30,const std::u16string & ellipsis=u"\\u2026")339*c8dee2aaSAndroid Build Coastguard Worker     void drawText(SkCanvas* canvas, SkScalar w, SkScalar h, std::vector<const char*>& text,
340*c8dee2aaSAndroid Build Coastguard Worker                   SkColor fg = SK_ColorDKGRAY, SkColor bg = SK_ColorWHITE,
341*c8dee2aaSAndroid Build Coastguard Worker                   const char* ff = "sans-serif", SkScalar fs = 24,
342*c8dee2aaSAndroid Build Coastguard Worker                   size_t lineLimit = 30,
343*c8dee2aaSAndroid Build Coastguard Worker                   const std::u16string& ellipsis = u"\u2026") {
344*c8dee2aaSAndroid Build Coastguard Worker         SkAutoCanvasRestore acr(canvas, true);
345*c8dee2aaSAndroid Build Coastguard Worker 
346*c8dee2aaSAndroid Build Coastguard Worker         canvas->clipRect(SkRect::MakeWH(w, h));
347*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(bg);
348*c8dee2aaSAndroid Build Coastguard Worker 
349*c8dee2aaSAndroid Build Coastguard Worker         SkScalar margin = 20;
350*c8dee2aaSAndroid Build Coastguard Worker 
351*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
352*c8dee2aaSAndroid Build Coastguard Worker         paint.setAntiAlias(true);
353*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(fg);
354*c8dee2aaSAndroid Build Coastguard Worker 
355*c8dee2aaSAndroid Build Coastguard Worker         SkPaint blue;
356*c8dee2aaSAndroid Build Coastguard Worker         blue.setColor(SK_ColorBLUE);
357*c8dee2aaSAndroid Build Coastguard Worker 
358*c8dee2aaSAndroid Build Coastguard Worker         SkPaint background;
359*c8dee2aaSAndroid Build Coastguard Worker         background.setColor(bg);
360*c8dee2aaSAndroid Build Coastguard Worker 
361*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style;
362*c8dee2aaSAndroid Build Coastguard Worker         style.setBackgroundColor(blue);
363*c8dee2aaSAndroid Build Coastguard Worker         style.setForegroundColor(paint);
364*c8dee2aaSAndroid Build Coastguard Worker         style.setFontFamilies({SkString(ff)});
365*c8dee2aaSAndroid Build Coastguard Worker         style.setFontStyle(SkFontStyle(SkFontStyle::kMedium_Weight,
366*c8dee2aaSAndroid Build Coastguard Worker                                        SkFontStyle::kNormal_Width,
367*c8dee2aaSAndroid Build Coastguard Worker                                        SkFontStyle::kUpright_Slant));
368*c8dee2aaSAndroid Build Coastguard Worker         style.setFontSize(fs);
369*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paraStyle;
370*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setTextStyle(style);
371*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setMaxLines(lineLimit);
372*c8dee2aaSAndroid Build Coastguard Worker 
373*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setEllipsis(ellipsis);
374*c8dee2aaSAndroid Build Coastguard Worker         TextStyle defaultStyle;
375*c8dee2aaSAndroid Build Coastguard Worker         defaultStyle.setFontSize(20);
376*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setTextStyle(defaultStyle);
377*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paraStyle, getFontCollection(), get_unicode());
378*c8dee2aaSAndroid Build Coastguard Worker 
379*c8dee2aaSAndroid Build Coastguard Worker         SkPaint foreground;
380*c8dee2aaSAndroid Build Coastguard Worker         foreground.setColor(fg);
381*c8dee2aaSAndroid Build Coastguard Worker         style.setForegroundColor(foreground);
382*c8dee2aaSAndroid Build Coastguard Worker         style.setBackgroundColor(background);
383*c8dee2aaSAndroid Build Coastguard Worker 
384*c8dee2aaSAndroid Build Coastguard Worker         for (auto& part : text) {
385*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style);
386*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(part, strlen(part));
387*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
388*c8dee2aaSAndroid Build Coastguard Worker         }
389*c8dee2aaSAndroid Build Coastguard Worker 
390*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
391*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(w - margin * 2);
392*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, margin, margin);
393*c8dee2aaSAndroid Build Coastguard Worker 
394*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, paragraph->getHeight() + margin);
395*c8dee2aaSAndroid Build Coastguard Worker     }
396*c8dee2aaSAndroid Build Coastguard Worker 
drawLine(SkCanvas * canvas,SkScalar w,SkScalar h,const std::string & text,TextAlign align)397*c8dee2aaSAndroid Build Coastguard Worker     void drawLine(SkCanvas* canvas, SkScalar w, SkScalar h, const std::string& text,
398*c8dee2aaSAndroid Build Coastguard Worker                   TextAlign align) {
399*c8dee2aaSAndroid Build Coastguard Worker         SkAutoCanvasRestore acr(canvas, true);
400*c8dee2aaSAndroid Build Coastguard Worker 
401*c8dee2aaSAndroid Build Coastguard Worker         canvas->clipRect(SkRect::MakeWH(w, h));
402*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
403*c8dee2aaSAndroid Build Coastguard Worker 
404*c8dee2aaSAndroid Build Coastguard Worker         SkScalar margin = 20;
405*c8dee2aaSAndroid Build Coastguard Worker 
406*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
407*c8dee2aaSAndroid Build Coastguard Worker         paint.setAntiAlias(true);
408*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(SK_ColorBLUE);
409*c8dee2aaSAndroid Build Coastguard Worker 
410*c8dee2aaSAndroid Build Coastguard Worker         SkPaint gray;
411*c8dee2aaSAndroid Build Coastguard Worker         gray.setColor(SK_ColorLTGRAY);
412*c8dee2aaSAndroid Build Coastguard Worker 
413*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style;
414*c8dee2aaSAndroid Build Coastguard Worker         style.setBackgroundColor(gray);
415*c8dee2aaSAndroid Build Coastguard Worker         style.setForegroundColor(paint);
416*c8dee2aaSAndroid Build Coastguard Worker         style.setFontFamilies({SkString("Arial")});
417*c8dee2aaSAndroid Build Coastguard Worker         style.setFontSize(30);
418*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paraStyle;
419*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setTextStyle(style);
420*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setTextAlign(align);
421*c8dee2aaSAndroid Build Coastguard Worker 
422*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
423*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
424*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paraStyle, fontCollection, get_unicode());
425*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text.c_str(), text.length());
426*c8dee2aaSAndroid Build Coastguard Worker 
427*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
428*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(w - margin * 2);
429*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(w - margin);
430*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, margin, margin);
431*c8dee2aaSAndroid Build Coastguard Worker 
432*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, paragraph->getHeight() + margin);
433*c8dee2aaSAndroid Build Coastguard Worker     }
434*c8dee2aaSAndroid Build Coastguard Worker };
435*c8dee2aaSAndroid Build Coastguard Worker 
436*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide3 : public ParagraphSlide_Base {
437*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide3()438*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide3() { fName = "Paragraph3"; }
439*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)440*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
441*c8dee2aaSAndroid Build Coastguard Worker         const std::string options =  // { "open-source open-source open-source open-source" };
442*c8dee2aaSAndroid Build Coastguard Worker                 {"Flutter is an open-source project to help developers "
443*c8dee2aaSAndroid Build Coastguard Worker                  "build high-performance, high-fidelity, mobile apps for "
444*c8dee2aaSAndroid Build Coastguard Worker                  "iOS and Android "
445*c8dee2aaSAndroid Build Coastguard Worker                  "from a single codebase. This design lab is a playground "
446*c8dee2aaSAndroid Build Coastguard Worker                  "and showcase of Flutter's many widgets, behaviors, "
447*c8dee2aaSAndroid Build Coastguard Worker                  "animations, layouts, and more."};
448*c8dee2aaSAndroid Build Coastguard Worker 
449*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorDKGRAY);
450*c8dee2aaSAndroid Build Coastguard Worker         SkScalar width = this->size().width() / 4;
451*c8dee2aaSAndroid Build Coastguard Worker         SkScalar height = this->size().height() / 2;
452*c8dee2aaSAndroid Build Coastguard Worker 
453*c8dee2aaSAndroid Build Coastguard Worker         const std::string line =
454*c8dee2aaSAndroid Build Coastguard Worker                 "World domination is such an ugly phrase - I prefer to call it world optimisation";
455*c8dee2aaSAndroid Build Coastguard Worker         drawLine(canvas, width, height, line, TextAlign::kLeft, 1, false, SK_ColorLTGRAY);
456*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(width, 0);
457*c8dee2aaSAndroid Build Coastguard Worker         drawLine(canvas, width, height, line, TextAlign::kRight, 2, false, SK_ColorLTGRAY);
458*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(width, 0);
459*c8dee2aaSAndroid Build Coastguard Worker         drawLine(canvas, width, height, line, TextAlign::kCenter, 3, false, SK_ColorLTGRAY);
460*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(width, 0);
461*c8dee2aaSAndroid Build Coastguard Worker         drawLine(canvas, width, height, line, TextAlign::kJustify, 4, false, SK_ColorLTGRAY);
462*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(-width * 3, height);
463*c8dee2aaSAndroid Build Coastguard Worker         drawLine(canvas, width, height, line, TextAlign::kLeft, 1, true, SK_ColorLTGRAY);
464*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(width, 0);
465*c8dee2aaSAndroid Build Coastguard Worker         drawLine(canvas, width, height, line, TextAlign::kRight, 2, true, SK_ColorLTGRAY);
466*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(width, 0);
467*c8dee2aaSAndroid Build Coastguard Worker         drawLine(canvas, width, height, line, TextAlign::kCenter, 3, true, SK_ColorLTGRAY);
468*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(width, 0);
469*c8dee2aaSAndroid Build Coastguard Worker         drawLine(canvas, width, height, line, TextAlign::kJustify, 4, true, SK_ColorLTGRAY);
470*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(width, 0);
471*c8dee2aaSAndroid Build Coastguard Worker     }
472*c8dee2aaSAndroid Build Coastguard Worker 
473*c8dee2aaSAndroid Build Coastguard Worker private:
drawLine(SkCanvas * canvas,SkScalar w,SkScalar h,const std::string & text,TextAlign align,size_t lineLimit=std::numeric_limits<size_t>::max (),bool RTL=false,SkColor background=SK_ColorGRAY,const std::u16string & ellipsis=u"\\u2026")474*c8dee2aaSAndroid Build Coastguard Worker     void drawLine(SkCanvas* canvas, SkScalar w, SkScalar h, const std::string& text,
475*c8dee2aaSAndroid Build Coastguard Worker                   TextAlign align, size_t lineLimit = std::numeric_limits<size_t>::max(),
476*c8dee2aaSAndroid Build Coastguard Worker                   bool RTL = false, SkColor background = SK_ColorGRAY,
477*c8dee2aaSAndroid Build Coastguard Worker                   const std::u16string& ellipsis = u"\u2026") {
478*c8dee2aaSAndroid Build Coastguard Worker         SkAutoCanvasRestore acr(canvas, true);
479*c8dee2aaSAndroid Build Coastguard Worker 
480*c8dee2aaSAndroid Build Coastguard Worker         canvas->clipRect(SkRect::MakeWH(w, h));
481*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
482*c8dee2aaSAndroid Build Coastguard Worker 
483*c8dee2aaSAndroid Build Coastguard Worker         SkScalar margin = 20;
484*c8dee2aaSAndroid Build Coastguard Worker 
485*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
486*c8dee2aaSAndroid Build Coastguard Worker         paint.setAntiAlias(true);
487*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(SK_ColorBLACK);
488*c8dee2aaSAndroid Build Coastguard Worker 
489*c8dee2aaSAndroid Build Coastguard Worker         SkPaint gray;
490*c8dee2aaSAndroid Build Coastguard Worker         gray.setColor(background);
491*c8dee2aaSAndroid Build Coastguard Worker 
492*c8dee2aaSAndroid Build Coastguard Worker         SkPaint yellow;
493*c8dee2aaSAndroid Build Coastguard Worker         yellow.setColor(SK_ColorYELLOW);
494*c8dee2aaSAndroid Build Coastguard Worker 
495*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style;
496*c8dee2aaSAndroid Build Coastguard Worker         style.setBackgroundColor(gray);
497*c8dee2aaSAndroid Build Coastguard Worker         style.setForegroundColor(paint);
498*c8dee2aaSAndroid Build Coastguard Worker         style.setFontFamilies({SkString("sans-serif")});
499*c8dee2aaSAndroid Build Coastguard Worker         style.setFontSize(30);
500*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paraStyle;
501*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setTextStyle(style);
502*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setTextAlign(align);
503*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setMaxLines(lineLimit);
504*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setEllipsis(ellipsis);
505*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setTextDirection(RTL ? TextDirection::kRtl : TextDirection::kLtr);
506*c8dee2aaSAndroid Build Coastguard Worker 
507*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
508*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
509*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paraStyle, fontCollection, get_unicode());
510*c8dee2aaSAndroid Build Coastguard Worker         if (RTL) {
511*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(mirror(text));
512*c8dee2aaSAndroid Build Coastguard Worker         } else {
513*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(normal(text));
514*c8dee2aaSAndroid Build Coastguard Worker         }
515*c8dee2aaSAndroid Build Coastguard Worker 
516*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawRect(SkRect::MakeXYWH(margin, margin, w - margin * 2, h - margin * 2), yellow);
517*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
518*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(w - margin * 2);
519*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, margin, margin);
520*c8dee2aaSAndroid Build Coastguard Worker     }
521*c8dee2aaSAndroid Build Coastguard Worker 
mirror(const std::string & text)522*c8dee2aaSAndroid Build Coastguard Worker     std::u16string mirror(const std::string& text) {
523*c8dee2aaSAndroid Build Coastguard Worker         std::u16string result;
524*c8dee2aaSAndroid Build Coastguard Worker         result += u"\u202E";
525*c8dee2aaSAndroid Build Coastguard Worker         // for (auto i = text.size(); i > 0; --i) {
526*c8dee2aaSAndroid Build Coastguard Worker         //  result += text[i - 1];
527*c8dee2aaSAndroid Build Coastguard Worker         //}
528*c8dee2aaSAndroid Build Coastguard Worker 
529*c8dee2aaSAndroid Build Coastguard Worker         for (auto i = text.size(); i > 0; --i) {
530*c8dee2aaSAndroid Build Coastguard Worker             auto ch = text[i - 1];
531*c8dee2aaSAndroid Build Coastguard Worker             if (ch == ',') {
532*c8dee2aaSAndroid Build Coastguard Worker                 result += u"!";
533*c8dee2aaSAndroid Build Coastguard Worker             } else if (ch == '.') {
534*c8dee2aaSAndroid Build Coastguard Worker                 result += u"!";
535*c8dee2aaSAndroid Build Coastguard Worker             } else {
536*c8dee2aaSAndroid Build Coastguard Worker                 result += ch;
537*c8dee2aaSAndroid Build Coastguard Worker             }
538*c8dee2aaSAndroid Build Coastguard Worker         }
539*c8dee2aaSAndroid Build Coastguard Worker 
540*c8dee2aaSAndroid Build Coastguard Worker         result += u"\u202C";
541*c8dee2aaSAndroid Build Coastguard Worker         return result;
542*c8dee2aaSAndroid Build Coastguard Worker     }
543*c8dee2aaSAndroid Build Coastguard Worker 
normal(const std::string & text)544*c8dee2aaSAndroid Build Coastguard Worker     std::u16string normal(const std::string& text) {
545*c8dee2aaSAndroid Build Coastguard Worker         std::u16string result;
546*c8dee2aaSAndroid Build Coastguard Worker         result += u"\u202D";
547*c8dee2aaSAndroid Build Coastguard Worker         for (auto ch : text) {
548*c8dee2aaSAndroid Build Coastguard Worker             result += ch;
549*c8dee2aaSAndroid Build Coastguard Worker         }
550*c8dee2aaSAndroid Build Coastguard Worker         result += u"\u202C";
551*c8dee2aaSAndroid Build Coastguard Worker         return result;
552*c8dee2aaSAndroid Build Coastguard Worker     }
553*c8dee2aaSAndroid Build Coastguard Worker };
554*c8dee2aaSAndroid Build Coastguard Worker 
555*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide5 : public ParagraphSlide_Base {
556*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide5()557*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide5() { fName = "Paragraph5"; }
558*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)559*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
560*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
561*c8dee2aaSAndroid Build Coastguard Worker         SkScalar width = this->size().width();
562*c8dee2aaSAndroid Build Coastguard Worker         SkScalar height = this->size().height() / 8;
563*c8dee2aaSAndroid Build Coastguard Worker 
564*c8dee2aaSAndroid Build Coastguard Worker         const std::u16string text1 =
565*c8dee2aaSAndroid Build Coastguard Worker                 u"A \u202ENAC\u202Cner, exceedingly \u202ENAC\u202Cny,\n"
566*c8dee2aaSAndroid Build Coastguard Worker                 "One morning remarked to his granny:\n"
567*c8dee2aaSAndroid Build Coastguard Worker                 "A \u202ENAC\u202Cner \u202ENAC\u202C \u202ENAC\u202C,\n"
568*c8dee2aaSAndroid Build Coastguard Worker                 "Anything that he \u202ENAC\u202C,\n"
569*c8dee2aaSAndroid Build Coastguard Worker                 "But a \u202ENAC\u202Cner \u202ENAC\u202C't \u202ENAC\u202C a \u202ENAC\u202C, "
570*c8dee2aaSAndroid Build Coastguard Worker                 "\u202ENAC\u202C he?";
571*c8dee2aaSAndroid Build Coastguard Worker         bidi(canvas, width, height * 3, text1, u"", 5);
572*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, height * 3);
573*c8dee2aaSAndroid Build Coastguard Worker 
574*c8dee2aaSAndroid Build Coastguard Worker         bidi(canvas, width, height, u"\u2067DETALOSI\u2069", u"");
575*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, height);
576*c8dee2aaSAndroid Build Coastguard Worker 
577*c8dee2aaSAndroid Build Coastguard Worker         bidi(canvas, width, height, u"\u202BDEDDEBME\u202C", u"");
578*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, height);
579*c8dee2aaSAndroid Build Coastguard Worker 
580*c8dee2aaSAndroid Build Coastguard Worker         bidi(canvas, width, height, u"\u202EEDIRREVO\u202C", u"");
581*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, height);
582*c8dee2aaSAndroid Build Coastguard Worker 
583*c8dee2aaSAndroid Build Coastguard Worker         bidi(canvas, width, height, u"\u200FTICILPMI\u200E", u"");
584*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, height);
585*c8dee2aaSAndroid Build Coastguard Worker 
586*c8dee2aaSAndroid Build Coastguard Worker         bidi(canvas,
587*c8dee2aaSAndroid Build Coastguard Worker              width,
588*c8dee2aaSAndroid Build Coastguard Worker              height,
589*c8dee2aaSAndroid Build Coastguard Worker              u"123 456 7890 \u202EZYXWV UTS RQP ONM LKJ IHG FED CBA\u202C.",
590*c8dee2aaSAndroid Build Coastguard Worker              u"",
591*c8dee2aaSAndroid Build Coastguard Worker              2);
592*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, height);
593*c8dee2aaSAndroid Build Coastguard Worker 
594*c8dee2aaSAndroid Build Coastguard Worker         // bidi(canvas, width, height, u"", u"");
595*c8dee2aaSAndroid Build Coastguard Worker         // canvas->translate(0, height);
596*c8dee2aaSAndroid Build Coastguard Worker     }
597*c8dee2aaSAndroid Build Coastguard Worker 
598*c8dee2aaSAndroid Build Coastguard Worker private:
bidi(SkCanvas * canvas,SkScalar w,SkScalar h,const std::u16string & text,const std::u16string & expected,size_t lineLimit=std::numeric_limits<size_t>::max (),const char * ff="Roboto",SkScalar fs=30,const std::u16string & ellipsis=u"\\u2026")599*c8dee2aaSAndroid Build Coastguard Worker     void bidi(SkCanvas* canvas,
600*c8dee2aaSAndroid Build Coastguard Worker               SkScalar w,
601*c8dee2aaSAndroid Build Coastguard Worker               SkScalar h,
602*c8dee2aaSAndroid Build Coastguard Worker               const std::u16string& text,
603*c8dee2aaSAndroid Build Coastguard Worker               const std::u16string& expected,
604*c8dee2aaSAndroid Build Coastguard Worker               size_t lineLimit = std::numeric_limits<size_t>::max(),
605*c8dee2aaSAndroid Build Coastguard Worker               const char* ff = "Roboto",
606*c8dee2aaSAndroid Build Coastguard Worker               SkScalar fs = 30,
607*c8dee2aaSAndroid Build Coastguard Worker               const std::u16string& ellipsis = u"\u2026") {
608*c8dee2aaSAndroid Build Coastguard Worker         SkAutoCanvasRestore acr(canvas, true);
609*c8dee2aaSAndroid Build Coastguard Worker 
610*c8dee2aaSAndroid Build Coastguard Worker         canvas->clipRect(SkRect::MakeWH(w, h));
611*c8dee2aaSAndroid Build Coastguard Worker 
612*c8dee2aaSAndroid Build Coastguard Worker         SkScalar margin = 20;
613*c8dee2aaSAndroid Build Coastguard Worker 
614*c8dee2aaSAndroid Build Coastguard Worker         SkPaint black;
615*c8dee2aaSAndroid Build Coastguard Worker         black.setColor(SK_ColorBLACK);
616*c8dee2aaSAndroid Build Coastguard Worker         SkPaint gray;
617*c8dee2aaSAndroid Build Coastguard Worker         gray.setColor(SK_ColorLTGRAY);
618*c8dee2aaSAndroid Build Coastguard Worker 
619*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style;
620*c8dee2aaSAndroid Build Coastguard Worker         style.setForegroundColor(black);
621*c8dee2aaSAndroid Build Coastguard Worker         style.setFontFamilies({SkString(ff)});
622*c8dee2aaSAndroid Build Coastguard Worker         style.setFontSize(fs);
623*c8dee2aaSAndroid Build Coastguard Worker 
624*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style0;
625*c8dee2aaSAndroid Build Coastguard Worker         style0.setForegroundColor(black);
626*c8dee2aaSAndroid Build Coastguard Worker         style0.setFontFamilies({SkString(ff)});
627*c8dee2aaSAndroid Build Coastguard Worker         style0.setFontSize(fs);
628*c8dee2aaSAndroid Build Coastguard Worker         style0.setFontStyle(SkFontStyle(SkFontStyle::kNormal_Weight,
629*c8dee2aaSAndroid Build Coastguard Worker                                         SkFontStyle::kNormal_Width,
630*c8dee2aaSAndroid Build Coastguard Worker                                         SkFontStyle::kItalic_Slant));
631*c8dee2aaSAndroid Build Coastguard Worker 
632*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style1;
633*c8dee2aaSAndroid Build Coastguard Worker         style1.setForegroundColor(gray);
634*c8dee2aaSAndroid Build Coastguard Worker         style1.setFontFamilies({SkString(ff)});
635*c8dee2aaSAndroid Build Coastguard Worker         style1.setFontSize(fs);
636*c8dee2aaSAndroid Build Coastguard Worker         style1.setFontStyle(SkFontStyle(SkFontStyle::kBold_Weight,
637*c8dee2aaSAndroid Build Coastguard Worker                                         SkFontStyle::kNormal_Width,
638*c8dee2aaSAndroid Build Coastguard Worker                                         SkFontStyle::kUpright_Slant));
639*c8dee2aaSAndroid Build Coastguard Worker 
640*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paraStyle;
641*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setTextStyle(style);
642*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setMaxLines(lineLimit);
643*c8dee2aaSAndroid Build Coastguard Worker 
644*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setEllipsis(ellipsis);
645*c8dee2aaSAndroid Build Coastguard Worker 
646*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paraStyle, getFontCollection(), get_unicode());
647*c8dee2aaSAndroid Build Coastguard Worker 
648*c8dee2aaSAndroid Build Coastguard Worker         if (text.empty()) {
649*c8dee2aaSAndroid Build Coastguard Worker             const std::u16string text0 = u"\u202Dabc";
650*c8dee2aaSAndroid Build Coastguard Worker             const std::u16string text1 = u"\u202EFED";
651*c8dee2aaSAndroid Build Coastguard Worker             const std::u16string text2 = u"\u202Dghi";
652*c8dee2aaSAndroid Build Coastguard Worker             const std::u16string text3 = u"\u202ELKJ";
653*c8dee2aaSAndroid Build Coastguard Worker             const std::u16string text4 = u"\u202Dmno";
654*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style0);
655*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text0);
656*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
657*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style1);
658*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text1);
659*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
660*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style0);
661*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text2);
662*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
663*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style1);
664*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text3);
665*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
666*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style0);
667*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text4);
668*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
669*c8dee2aaSAndroid Build Coastguard Worker         } else {
670*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text + expected);
671*c8dee2aaSAndroid Build Coastguard Worker         }
672*c8dee2aaSAndroid Build Coastguard Worker 
673*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
674*c8dee2aaSAndroid Build Coastguard Worker         auto impl = static_cast<ParagraphImpl*>(paragraph.get());
675*c8dee2aaSAndroid Build Coastguard Worker         if (this->isVerbose()) {
676*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("Text: >%s<\n", impl->text().data());
677*c8dee2aaSAndroid Build Coastguard Worker         }
678*c8dee2aaSAndroid Build Coastguard Worker 
679*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(w - margin * 2);
680*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, margin, margin);
681*c8dee2aaSAndroid Build Coastguard Worker     }
682*c8dee2aaSAndroid Build Coastguard Worker };
683*c8dee2aaSAndroid Build Coastguard Worker 
684*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide6 : public ParagraphSlide_Base {
685*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide6()686*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide6() { fName = "Paragraph6"; }
687*c8dee2aaSAndroid Build Coastguard Worker 
hangingS(SkCanvas * canvas,SkScalar w,SkScalar h,SkScalar fs=60.0)688*c8dee2aaSAndroid Build Coastguard Worker     void hangingS(SkCanvas* canvas, SkScalar w, SkScalar h, SkScalar fs = 60.0) {
689*c8dee2aaSAndroid Build Coastguard Worker         auto ff = "HangingS";
690*c8dee2aaSAndroid Build Coastguard Worker 
691*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorLTGRAY);
692*c8dee2aaSAndroid Build Coastguard Worker 
693*c8dee2aaSAndroid Build Coastguard Worker         SkPaint black;
694*c8dee2aaSAndroid Build Coastguard Worker         black.setAntiAlias(true);
695*c8dee2aaSAndroid Build Coastguard Worker         black.setColor(SK_ColorBLACK);
696*c8dee2aaSAndroid Build Coastguard Worker 
697*c8dee2aaSAndroid Build Coastguard Worker         SkPaint blue;
698*c8dee2aaSAndroid Build Coastguard Worker         blue.setAntiAlias(true);
699*c8dee2aaSAndroid Build Coastguard Worker         blue.setColor(SK_ColorBLUE);
700*c8dee2aaSAndroid Build Coastguard Worker 
701*c8dee2aaSAndroid Build Coastguard Worker         SkPaint red;
702*c8dee2aaSAndroid Build Coastguard Worker         red.setAntiAlias(true);
703*c8dee2aaSAndroid Build Coastguard Worker         red.setColor(SK_ColorRED);
704*c8dee2aaSAndroid Build Coastguard Worker 
705*c8dee2aaSAndroid Build Coastguard Worker         SkPaint green;
706*c8dee2aaSAndroid Build Coastguard Worker         green.setAntiAlias(true);
707*c8dee2aaSAndroid Build Coastguard Worker         green.setColor(SK_ColorGREEN);
708*c8dee2aaSAndroid Build Coastguard Worker 
709*c8dee2aaSAndroid Build Coastguard Worker         SkPaint gray;
710*c8dee2aaSAndroid Build Coastguard Worker         gray.setColor(SK_ColorCYAN);
711*c8dee2aaSAndroid Build Coastguard Worker 
712*c8dee2aaSAndroid Build Coastguard Worker         SkPaint yellow;
713*c8dee2aaSAndroid Build Coastguard Worker         yellow.setColor(SK_ColorYELLOW);
714*c8dee2aaSAndroid Build Coastguard Worker 
715*c8dee2aaSAndroid Build Coastguard Worker         SkPaint magenta;
716*c8dee2aaSAndroid Build Coastguard Worker         magenta.setAntiAlias(true);
717*c8dee2aaSAndroid Build Coastguard Worker         magenta.setColor(SK_ColorMAGENTA);
718*c8dee2aaSAndroid Build Coastguard Worker 
719*c8dee2aaSAndroid Build Coastguard Worker         SkFontStyle fontStyle(SkFontStyle::kBold_Weight, SkFontStyle::kNormal_Width,
720*c8dee2aaSAndroid Build Coastguard Worker                               SkFontStyle::kItalic_Slant);
721*c8dee2aaSAndroid Build Coastguard Worker 
722*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style;
723*c8dee2aaSAndroid Build Coastguard Worker         style.setFontFamilies({SkString(ff)});
724*c8dee2aaSAndroid Build Coastguard Worker         style.setFontSize(fs);
725*c8dee2aaSAndroid Build Coastguard Worker         style.setFontStyle(fontStyle);
726*c8dee2aaSAndroid Build Coastguard Worker 
727*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style0;
728*c8dee2aaSAndroid Build Coastguard Worker         style0.setForegroundColor(black);
729*c8dee2aaSAndroid Build Coastguard Worker         style0.setBackgroundColor(gray);
730*c8dee2aaSAndroid Build Coastguard Worker         style0.setFontFamilies({SkString(ff)});
731*c8dee2aaSAndroid Build Coastguard Worker         style0.setFontSize(fs);
732*c8dee2aaSAndroid Build Coastguard Worker         style0.setFontStyle(fontStyle);
733*c8dee2aaSAndroid Build Coastguard Worker 
734*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style1;
735*c8dee2aaSAndroid Build Coastguard Worker         style1.setForegroundColor(blue);
736*c8dee2aaSAndroid Build Coastguard Worker         style1.setBackgroundColor(yellow);
737*c8dee2aaSAndroid Build Coastguard Worker         style1.setFontFamilies({SkString(ff)});
738*c8dee2aaSAndroid Build Coastguard Worker         style1.setFontSize(fs);
739*c8dee2aaSAndroid Build Coastguard Worker         style1.setFontStyle(fontStyle);
740*c8dee2aaSAndroid Build Coastguard Worker 
741*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style2;
742*c8dee2aaSAndroid Build Coastguard Worker         style2.setForegroundColor(red);
743*c8dee2aaSAndroid Build Coastguard Worker         style2.setFontFamilies({SkString(ff)});
744*c8dee2aaSAndroid Build Coastguard Worker         style2.setFontSize(fs);
745*c8dee2aaSAndroid Build Coastguard Worker         style2.setFontStyle(fontStyle);
746*c8dee2aaSAndroid Build Coastguard Worker 
747*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style3;
748*c8dee2aaSAndroid Build Coastguard Worker         style3.setForegroundColor(green);
749*c8dee2aaSAndroid Build Coastguard Worker         style3.setFontFamilies({SkString(ff)});
750*c8dee2aaSAndroid Build Coastguard Worker         style3.setFontSize(fs);
751*c8dee2aaSAndroid Build Coastguard Worker         style3.setFontStyle(fontStyle);
752*c8dee2aaSAndroid Build Coastguard Worker 
753*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style4;
754*c8dee2aaSAndroid Build Coastguard Worker         style4.setForegroundColor(magenta);
755*c8dee2aaSAndroid Build Coastguard Worker         style4.setFontFamilies({SkString(ff)});
756*c8dee2aaSAndroid Build Coastguard Worker         style4.setFontSize(fs);
757*c8dee2aaSAndroid Build Coastguard Worker         style4.setFontStyle(fontStyle);
758*c8dee2aaSAndroid Build Coastguard Worker 
759*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paraStyle;
760*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setTextStyle(style);
761*c8dee2aaSAndroid Build Coastguard Worker 
762*c8dee2aaSAndroid Build Coastguard Worker         const char* logo1 = "S";
763*c8dee2aaSAndroid Build Coastguard Worker         const char* logo2 = "kia";
764*c8dee2aaSAndroid Build Coastguard Worker         const char* logo3 = "Sk";
765*c8dee2aaSAndroid Build Coastguard Worker         const char* logo4 = "ia";
766*c8dee2aaSAndroid Build Coastguard Worker         const char* logo5 = "Ski";
767*c8dee2aaSAndroid Build Coastguard Worker         const char* logo6 = "a";
768*c8dee2aaSAndroid Build Coastguard Worker         {
769*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paraStyle, getFontCollection(), get_unicode());
770*c8dee2aaSAndroid Build Coastguard Worker 
771*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style0);
772*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo1, strlen(logo1));
773*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
774*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style1);
775*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo2, strlen(logo2));
776*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
777*c8dee2aaSAndroid Build Coastguard Worker 
778*c8dee2aaSAndroid Build Coastguard Worker             builder.addText("   ", 3);
779*c8dee2aaSAndroid Build Coastguard Worker 
780*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style0);
781*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo3, strlen(logo3));
782*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
783*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style1);
784*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo4, strlen(logo4));
785*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
786*c8dee2aaSAndroid Build Coastguard Worker 
787*c8dee2aaSAndroid Build Coastguard Worker             builder.addText("   ", 3);
788*c8dee2aaSAndroid Build Coastguard Worker 
789*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style0);
790*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo5, strlen(logo5));
791*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
792*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style1);
793*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo6, strlen(logo6));
794*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
795*c8dee2aaSAndroid Build Coastguard Worker 
796*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
797*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(w);
798*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 40, 40);
799*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(0, h);
800*c8dee2aaSAndroid Build Coastguard Worker         }
801*c8dee2aaSAndroid Build Coastguard Worker 
802*c8dee2aaSAndroid Build Coastguard Worker         const char* logo11 = "S";
803*c8dee2aaSAndroid Build Coastguard Worker         const char* logo12 = "S";
804*c8dee2aaSAndroid Build Coastguard Worker         const char* logo13 = "S";
805*c8dee2aaSAndroid Build Coastguard Worker         const char* logo14 = "S";
806*c8dee2aaSAndroid Build Coastguard Worker         const char* logo15 = "S";
807*c8dee2aaSAndroid Build Coastguard Worker         const char* logo16 = "S";
808*c8dee2aaSAndroid Build Coastguard Worker         {
809*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paraStyle, getFontCollection(), get_unicode());
810*c8dee2aaSAndroid Build Coastguard Worker 
811*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style0);
812*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo11, strlen(logo11));
813*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
814*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style1);
815*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo12, strlen(logo12));
816*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
817*c8dee2aaSAndroid Build Coastguard Worker 
818*c8dee2aaSAndroid Build Coastguard Worker             builder.addText("   ", 3);
819*c8dee2aaSAndroid Build Coastguard Worker 
820*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style0);
821*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo13, strlen(logo13));
822*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
823*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style1);
824*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo14, strlen(logo14));
825*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
826*c8dee2aaSAndroid Build Coastguard Worker 
827*c8dee2aaSAndroid Build Coastguard Worker             builder.addText("   ", 3);
828*c8dee2aaSAndroid Build Coastguard Worker 
829*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style0);
830*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo15, strlen(logo15));
831*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
832*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style1);
833*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo16, strlen(logo16));
834*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
835*c8dee2aaSAndroid Build Coastguard Worker 
836*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
837*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(w);
838*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 40, h);
839*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(0, h);
840*c8dee2aaSAndroid Build Coastguard Worker         }
841*c8dee2aaSAndroid Build Coastguard Worker     }
842*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)843*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
844*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
845*c8dee2aaSAndroid Build Coastguard Worker         SkScalar width = this->size().width();
846*c8dee2aaSAndroid Build Coastguard Worker         SkScalar height = this->size().height() / 4;
847*c8dee2aaSAndroid Build Coastguard Worker 
848*c8dee2aaSAndroid Build Coastguard Worker         hangingS(canvas, width, height);
849*c8dee2aaSAndroid Build Coastguard Worker     }
850*c8dee2aaSAndroid Build Coastguard Worker };
851*c8dee2aaSAndroid Build Coastguard Worker 
852*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide7 : public ParagraphSlide_Base {
853*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide7()854*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide7() { fName = "Paragraph7"; }
855*c8dee2aaSAndroid Build Coastguard Worker 
drawText(SkCanvas * canvas,SkColor background,SkScalar letterSpace,SkScalar w,SkScalar h)856*c8dee2aaSAndroid Build Coastguard Worker     void drawText(SkCanvas* canvas, SkColor background, SkScalar letterSpace, SkScalar w,
857*c8dee2aaSAndroid Build Coastguard Worker                   SkScalar h) {
858*c8dee2aaSAndroid Build Coastguard Worker         SkAutoCanvasRestore acr(canvas, true);
859*c8dee2aaSAndroid Build Coastguard Worker         canvas->clipRect(SkRect::MakeWH(w, h));
860*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(background);
861*c8dee2aaSAndroid Build Coastguard Worker 
862*c8dee2aaSAndroid Build Coastguard Worker         const char* line =
863*c8dee2aaSAndroid Build Coastguard Worker                 "World domination is such an ugly phrase - I prefer to call it world optimisation.";
864*c8dee2aaSAndroid Build Coastguard Worker 
865*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraphStyle;
866*c8dee2aaSAndroid Build Coastguard Worker         paragraphStyle.setTextAlign(TextAlign::kLeft);
867*c8dee2aaSAndroid Build Coastguard Worker         paragraphStyle.setMaxLines(10);
868*c8dee2aaSAndroid Build Coastguard Worker         paragraphStyle.turnHintingOff();
869*c8dee2aaSAndroid Build Coastguard Worker         TextStyle textStyle;
870*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setFontFamilies({SkString("Roboto")});
871*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setFontSize(30);
872*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setLetterSpacing(letterSpace);
873*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setColor(SK_ColorBLACK);
874*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setFontStyle(SkFontStyle(SkFontStyle::kMedium_Weight, SkFontStyle::kNormal_Width,
875*c8dee2aaSAndroid Build Coastguard Worker                                            SkFontStyle::kUpright_Slant));
876*c8dee2aaSAndroid Build Coastguard Worker 
877*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraphStyle, getFontCollection(), get_unicode());
878*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(textStyle);
879*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(line, strlen(line));
880*c8dee2aaSAndroid Build Coastguard Worker         builder.pop();
881*c8dee2aaSAndroid Build Coastguard Worker 
882*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
883*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(w - 20);
884*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 10, 10);
885*c8dee2aaSAndroid Build Coastguard Worker     }
886*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)887*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
888*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
889*c8dee2aaSAndroid Build Coastguard Worker 
890*c8dee2aaSAndroid Build Coastguard Worker         auto h = this->size().height() / 4;
891*c8dee2aaSAndroid Build Coastguard Worker         auto w = this->size().width() / 2;
892*c8dee2aaSAndroid Build Coastguard Worker 
893*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorGRAY, 1, w, h);
894*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, h);
895*c8dee2aaSAndroid Build Coastguard Worker 
896*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorLTGRAY, 2, w, h);
897*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, h);
898*c8dee2aaSAndroid Build Coastguard Worker 
899*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorCYAN, 3, w, h);
900*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, h);
901*c8dee2aaSAndroid Build Coastguard Worker 
902*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorGRAY, 4, w, h);
903*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(w, -3 * h);
904*c8dee2aaSAndroid Build Coastguard Worker 
905*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorYELLOW, 5, w, h);
906*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, h);
907*c8dee2aaSAndroid Build Coastguard Worker 
908*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorGREEN, 10, w, h);
909*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, h);
910*c8dee2aaSAndroid Build Coastguard Worker 
911*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorRED, 15, w, h);
912*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, h);
913*c8dee2aaSAndroid Build Coastguard Worker 
914*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorBLUE, 20, w, h);
915*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, h);
916*c8dee2aaSAndroid Build Coastguard Worker     }
917*c8dee2aaSAndroid Build Coastguard Worker };
918*c8dee2aaSAndroid Build Coastguard Worker 
919*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide8 : public ParagraphSlide_Base {
920*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide8()921*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide8() { fName = "Paragraph8"; }
922*c8dee2aaSAndroid Build Coastguard Worker 
drawText(SkCanvas * canvas,SkColor background,SkScalar wordSpace,SkScalar w,SkScalar h)923*c8dee2aaSAndroid Build Coastguard Worker     void drawText(SkCanvas* canvas, SkColor background, SkScalar wordSpace, SkScalar w,
924*c8dee2aaSAndroid Build Coastguard Worker                   SkScalar h) {
925*c8dee2aaSAndroid Build Coastguard Worker         SkAutoCanvasRestore acr(canvas, true);
926*c8dee2aaSAndroid Build Coastguard Worker         canvas->clipRect(SkRect::MakeWH(w, h));
927*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(background);
928*c8dee2aaSAndroid Build Coastguard Worker 
929*c8dee2aaSAndroid Build Coastguard Worker         const char* line =
930*c8dee2aaSAndroid Build Coastguard Worker                 "World domination is such an ugly phrase - I prefer to call it world optimisation.";
931*c8dee2aaSAndroid Build Coastguard Worker 
932*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraphStyle;
933*c8dee2aaSAndroid Build Coastguard Worker         paragraphStyle.setTextAlign(TextAlign::kLeft);
934*c8dee2aaSAndroid Build Coastguard Worker         paragraphStyle.setMaxLines(10);
935*c8dee2aaSAndroid Build Coastguard Worker         paragraphStyle.turnHintingOff();
936*c8dee2aaSAndroid Build Coastguard Worker         TextStyle textStyle;
937*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setFontFamilies({SkString("Roboto")});
938*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setFontSize(30);
939*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setWordSpacing(wordSpace);
940*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setColor(SK_ColorBLACK);
941*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setFontStyle(SkFontStyle(SkFontStyle::kMedium_Weight, SkFontStyle::kNormal_Width,
942*c8dee2aaSAndroid Build Coastguard Worker                                            SkFontStyle::kUpright_Slant));
943*c8dee2aaSAndroid Build Coastguard Worker 
944*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraphStyle, getFontCollection(), get_unicode());
945*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(textStyle);
946*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(line, strlen(line));
947*c8dee2aaSAndroid Build Coastguard Worker         builder.pop();
948*c8dee2aaSAndroid Build Coastguard Worker 
949*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
950*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(w - 20);
951*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 10, 10);
952*c8dee2aaSAndroid Build Coastguard Worker     }
953*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)954*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
955*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
956*c8dee2aaSAndroid Build Coastguard Worker 
957*c8dee2aaSAndroid Build Coastguard Worker         auto h = this->size().height() / 4;
958*c8dee2aaSAndroid Build Coastguard Worker         auto w = this->size().width() / 2;
959*c8dee2aaSAndroid Build Coastguard Worker 
960*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorGRAY, 1, w, h);
961*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, h);
962*c8dee2aaSAndroid Build Coastguard Worker 
963*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorLTGRAY, 2, w, h);
964*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, h);
965*c8dee2aaSAndroid Build Coastguard Worker 
966*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorCYAN, 3, w, h);
967*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, h);
968*c8dee2aaSAndroid Build Coastguard Worker 
969*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorGRAY, 4, w, h);
970*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(w, -3 * h);
971*c8dee2aaSAndroid Build Coastguard Worker 
972*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorYELLOW, 5, w, h);
973*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, h);
974*c8dee2aaSAndroid Build Coastguard Worker 
975*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorGREEN, 10, w, h);
976*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, h);
977*c8dee2aaSAndroid Build Coastguard Worker 
978*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorRED, 15, w, h);
979*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, h);
980*c8dee2aaSAndroid Build Coastguard Worker 
981*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorBLUE, 20, w, h);
982*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, h);
983*c8dee2aaSAndroid Build Coastguard Worker     }
984*c8dee2aaSAndroid Build Coastguard Worker };
985*c8dee2aaSAndroid Build Coastguard Worker 
986*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide9 : public ParagraphSlide_Base {
987*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide9()988*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide9() { fName = "Paragraph9"; }
989*c8dee2aaSAndroid Build Coastguard Worker 
onChar(SkUnichar uni)990*c8dee2aaSAndroid Build Coastguard Worker     bool onChar(SkUnichar uni) override {
991*c8dee2aaSAndroid Build Coastguard Worker             switch (uni) {
992*c8dee2aaSAndroid Build Coastguard Worker                 case 'w':
993*c8dee2aaSAndroid Build Coastguard Worker                     ++wordSpacing;
994*c8dee2aaSAndroid Build Coastguard Worker                     return true;
995*c8dee2aaSAndroid Build Coastguard Worker                 case 'q':
996*c8dee2aaSAndroid Build Coastguard Worker                     if (wordSpacing > 0) --wordSpacing;
997*c8dee2aaSAndroid Build Coastguard Worker                     return true;
998*c8dee2aaSAndroid Build Coastguard Worker                 case 'l':
999*c8dee2aaSAndroid Build Coastguard Worker                     ++letterSpacing;
1000*c8dee2aaSAndroid Build Coastguard Worker                     return true;
1001*c8dee2aaSAndroid Build Coastguard Worker                 case 'k':
1002*c8dee2aaSAndroid Build Coastguard Worker                     if (letterSpacing > 0) --letterSpacing;
1003*c8dee2aaSAndroid Build Coastguard Worker                     return true;
1004*c8dee2aaSAndroid Build Coastguard Worker                 default:
1005*c8dee2aaSAndroid Build Coastguard Worker                     break;
1006*c8dee2aaSAndroid Build Coastguard Worker             }
1007*c8dee2aaSAndroid Build Coastguard Worker             return false;
1008*c8dee2aaSAndroid Build Coastguard Worker     }
1009*c8dee2aaSAndroid Build Coastguard Worker 
drawText(SkCanvas * canvas,SkColor background,SkScalar w,SkScalar h)1010*c8dee2aaSAndroid Build Coastguard Worker     void drawText(SkCanvas* canvas, SkColor background, SkScalar w, SkScalar h) {
1011*c8dee2aaSAndroid Build Coastguard Worker         SkAutoCanvasRestore acr(canvas, true);
1012*c8dee2aaSAndroid Build Coastguard Worker         canvas->clipRect(SkRect::MakeWH(w, h));
1013*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(background);
1014*c8dee2aaSAndroid Build Coastguard Worker 
1015*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
1016*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
1017*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
1018*c8dee2aaSAndroid Build Coastguard Worker 
1019*c8dee2aaSAndroid Build Coastguard Worker         const char* text =
1020*c8dee2aaSAndroid Build Coastguard Worker                 "( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)("
1021*c8dee2aaSAndroid Build Coastguard Worker                 " ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)("
1022*c8dee2aaSAndroid Build Coastguard Worker                 " ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)";
1023*c8dee2aaSAndroid Build Coastguard Worker         auto multiplier = 5.67;
1024*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraphStyle;
1025*c8dee2aaSAndroid Build Coastguard Worker         paragraphStyle.setTextAlign(TextAlign::kLeft);
1026*c8dee2aaSAndroid Build Coastguard Worker         paragraphStyle.setMaxLines(10);
1027*c8dee2aaSAndroid Build Coastguard Worker         paragraphStyle.turnHintingOff();
1028*c8dee2aaSAndroid Build Coastguard Worker         TextStyle textStyle;
1029*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setFontFamilies({SkString("Roboto")});
1030*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setFontSize(5 * multiplier);
1031*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setHeight(1.3f);
1032*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setColor(SK_ColorBLACK);
1033*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setFontStyle(SkFontStyle(SkFontStyle::kMedium_Weight, SkFontStyle::kNormal_Width,
1034*c8dee2aaSAndroid Build Coastguard Worker                                            SkFontStyle::kUpright_Slant));
1035*c8dee2aaSAndroid Build Coastguard Worker 
1036*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraphStyle, fontCollection, get_unicode());
1037*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(textStyle);
1038*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text, strlen(text));
1039*c8dee2aaSAndroid Build Coastguard Worker         builder.pop();
1040*c8dee2aaSAndroid Build Coastguard Worker 
1041*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
1042*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(200 * multiplier);
1043*c8dee2aaSAndroid Build Coastguard Worker 
1044*c8dee2aaSAndroid Build Coastguard Worker         std::vector<size_t> sizes = {0, 1, 2, 8, 19, 21, 22, 30, 150};
1045*c8dee2aaSAndroid Build Coastguard Worker 
1046*c8dee2aaSAndroid Build Coastguard Worker         std::vector<size_t> colors = {SK_ColorBLUE, SK_ColorCYAN,  SK_ColorLTGRAY, SK_ColorGREEN,
1047*c8dee2aaSAndroid Build Coastguard Worker                                       SK_ColorRED,  SK_ColorWHITE, SK_ColorYELLOW, SK_ColorMAGENTA};
1048*c8dee2aaSAndroid Build Coastguard Worker 
1049*c8dee2aaSAndroid Build Coastguard Worker         RectHeightStyle rect_height_style = RectHeightStyle::kTight;
1050*c8dee2aaSAndroid Build Coastguard Worker         RectWidthStyle rect_width_style = RectWidthStyle::kTight;
1051*c8dee2aaSAndroid Build Coastguard Worker 
1052*c8dee2aaSAndroid Build Coastguard Worker         for (size_t i = 0; i < sizes.size() - 1; ++i) {
1053*c8dee2aaSAndroid Build Coastguard Worker             size_t from = sizes[i];
1054*c8dee2aaSAndroid Build Coastguard Worker             size_t to = sizes[i + 1];
1055*c8dee2aaSAndroid Build Coastguard Worker             auto boxes = paragraph->getRectsForRange(from, to, rect_height_style, rect_width_style);
1056*c8dee2aaSAndroid Build Coastguard Worker             if (boxes.empty()) {
1057*c8dee2aaSAndroid Build Coastguard Worker                 continue;
1058*c8dee2aaSAndroid Build Coastguard Worker             }
1059*c8dee2aaSAndroid Build Coastguard Worker             for (auto& box : boxes) {
1060*c8dee2aaSAndroid Build Coastguard Worker                 SkPaint paint;
1061*c8dee2aaSAndroid Build Coastguard Worker                 paint.setColor(colors[i % colors.size()]);
1062*c8dee2aaSAndroid Build Coastguard Worker                 paint.setShader(setgrad(box.rect, colors[i % colors.size()], SK_ColorWHITE));
1063*c8dee2aaSAndroid Build Coastguard Worker                 canvas->drawRect(box.rect, paint);
1064*c8dee2aaSAndroid Build Coastguard Worker             }
1065*c8dee2aaSAndroid Build Coastguard Worker         }
1066*c8dee2aaSAndroid Build Coastguard Worker 
1067*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
1068*c8dee2aaSAndroid Build Coastguard Worker     }
1069*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1070*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1071*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1072*c8dee2aaSAndroid Build Coastguard Worker 
1073*c8dee2aaSAndroid Build Coastguard Worker         auto h = this->size().height();
1074*c8dee2aaSAndroid Build Coastguard Worker         auto w = this->size().width();
1075*c8dee2aaSAndroid Build Coastguard Worker 
1076*c8dee2aaSAndroid Build Coastguard Worker         drawText(canvas, SK_ColorGRAY, w, h);
1077*c8dee2aaSAndroid Build Coastguard Worker     }
1078*c8dee2aaSAndroid Build Coastguard Worker 
1079*c8dee2aaSAndroid Build Coastguard Worker private:
1080*c8dee2aaSAndroid Build Coastguard Worker     SkScalar letterSpacing;
1081*c8dee2aaSAndroid Build Coastguard Worker     SkScalar wordSpacing;
1082*c8dee2aaSAndroid Build Coastguard Worker };
1083*c8dee2aaSAndroid Build Coastguard Worker 
1084*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide10 : public ParagraphSlide_Base {
1085*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide10()1086*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide10() { fName = "Paragraph10"; }
1087*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1088*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1089*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1090*c8dee2aaSAndroid Build Coastguard Worker         auto multiplier = 5.67;
1091*c8dee2aaSAndroid Build Coastguard Worker         const char* text = "English English 字典 字典 ������ ������";
1092*c8dee2aaSAndroid Build Coastguard Worker 
1093*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
1094*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
1095*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
1096*c8dee2aaSAndroid Build Coastguard Worker 
1097*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1098*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.turnHintingOff();
1099*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
1100*c8dee2aaSAndroid Build Coastguard Worker 
1101*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1102*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto"),
1103*c8dee2aaSAndroid Build Coastguard Worker                                     SkString("Noto Color Emoji"),
1104*c8dee2aaSAndroid Build Coastguard Worker                                     SkString("Noto Serif CJK JP")});
1105*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(10 * multiplier);
1106*c8dee2aaSAndroid Build Coastguard Worker         text_style.setLetterSpacing(0);
1107*c8dee2aaSAndroid Build Coastguard Worker         text_style.setWordSpacing(0);
1108*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
1109*c8dee2aaSAndroid Build Coastguard Worker         text_style.setHeight(1);
1110*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
1111*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text, strlen(text));
1112*c8dee2aaSAndroid Build Coastguard Worker         builder.pop();
1113*c8dee2aaSAndroid Build Coastguard Worker 
1114*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
1115*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
1116*c8dee2aaSAndroid Build Coastguard Worker 
1117*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
1118*c8dee2aaSAndroid Build Coastguard Worker     }
1119*c8dee2aaSAndroid Build Coastguard Worker };
1120*c8dee2aaSAndroid Build Coastguard Worker 
1121*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide11 : public ParagraphSlide_Base {
1122*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide11()1123*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide11() { fName = "Paragraph11"; }
1124*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1125*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1126*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1127*c8dee2aaSAndroid Build Coastguard Worker 
1128*c8dee2aaSAndroid Build Coastguard Worker         auto text = "\U0001f469\U0000200D\U0001f469\U0000200D\U0001f466\U0001f469\U0000200D\U0001f469\U0000200D\U0001f467\U0000200D\U0001f467\U0001f1fa\U0001f1f8";
1129*c8dee2aaSAndroid Build Coastguard Worker 
1130*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1131*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Ahem")});
1132*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
1133*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(60);
1134*c8dee2aaSAndroid Build Coastguard Worker         text_style.setLetterSpacing(0);
1135*c8dee2aaSAndroid Build Coastguard Worker         text_style.setWordSpacing(0);
1136*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1137*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
1138*c8dee2aaSAndroid Build Coastguard Worker 
1139*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), true, true);
1140*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
1141*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text, strlen(text));
1142*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
1143*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(1000);
1144*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
1145*c8dee2aaSAndroid Build Coastguard Worker 
1146*c8dee2aaSAndroid Build Coastguard Worker         struct pair {
1147*c8dee2aaSAndroid Build Coastguard Worker             unsigned fX;
1148*c8dee2aaSAndroid Build Coastguard Worker             unsigned fY;
1149*c8dee2aaSAndroid Build Coastguard Worker         };
1150*c8dee2aaSAndroid Build Coastguard Worker 
1151*c8dee2aaSAndroid Build Coastguard Worker         pair hit1[] =
1152*c8dee2aaSAndroid Build Coastguard Worker               {{ 0, 8},{1, 33}, {2, 34}, { 3, 19}, {4, 20},
1153*c8dee2aaSAndroid Build Coastguard Worker                { 5, 21}, { 6, 22 }, { 7, 23 }, {8, 24 }, { 9, 25},
1154*c8dee2aaSAndroid Build Coastguard Worker                { 10, 26}, { 11, 27}, {12, 28}, { 13, 21}, {14, 22 },
1155*c8dee2aaSAndroid Build Coastguard Worker                { 15, 23}, {16, 24}, {17, 21}, { 18, 22}, {19, 21},
1156*c8dee2aaSAndroid Build Coastguard Worker                { 20, 24}, { 21, 23}, };
1157*c8dee2aaSAndroid Build Coastguard Worker 
1158*c8dee2aaSAndroid Build Coastguard Worker         pair miss[] =
1159*c8dee2aaSAndroid Build Coastguard Worker               {{ 0, 4},{1, 17}, {2, 18}, { 3, 11}, {4, 12},
1160*c8dee2aaSAndroid Build Coastguard Worker                { 5, 13}, { 6, 14 }, { 7, 15 }, {8, 16 }, { 9, 17},
1161*c8dee2aaSAndroid Build Coastguard Worker                { 10, 18}, { 11, 19}, {12, 20}, { 13, 17}, {14, 18 },
1162*c8dee2aaSAndroid Build Coastguard Worker                { 15, 19}, {16, 20}, {17, 19}, { 18, 20},
1163*c8dee2aaSAndroid Build Coastguard Worker                { 20, 22}, };
1164*c8dee2aaSAndroid Build Coastguard Worker 
1165*c8dee2aaSAndroid Build Coastguard Worker         auto rects = paragraph->getRectsForRange(7, 9, RectHeightStyle::kTight,
1166*c8dee2aaSAndroid Build Coastguard Worker                                                  RectWidthStyle::kTight);
1167*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
1168*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(SK_ColorRED);
1169*c8dee2aaSAndroid Build Coastguard Worker         paint.setStyle(SkPaint::kStroke_Style);
1170*c8dee2aaSAndroid Build Coastguard Worker         paint.setAntiAlias(true);
1171*c8dee2aaSAndroid Build Coastguard Worker         paint.setStrokeWidth(1);
1172*c8dee2aaSAndroid Build Coastguard Worker         if (!rects.empty()) {
1173*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRect(rects[0].rect, paint);
1174*c8dee2aaSAndroid Build Coastguard Worker         }
1175*c8dee2aaSAndroid Build Coastguard Worker 
1176*c8dee2aaSAndroid Build Coastguard Worker         for (auto& query : hit1) {
1177*c8dee2aaSAndroid Build Coastguard Worker             auto hitRects = paragraph->getRectsForRange(query.fX, query.fY, RectHeightStyle::kTight,
1178*c8dee2aaSAndroid Build Coastguard Worker                                                         RectWidthStyle::kTight);
1179*c8dee2aaSAndroid Build Coastguard Worker             if (hitRects.size() >= 1 && hitRects[0].rect.width() > 0) {
1180*c8dee2aaSAndroid Build Coastguard Worker             } else {
1181*c8dee2aaSAndroid Build Coastguard Worker                 if (this->isVerbose()) {
1182*c8dee2aaSAndroid Build Coastguard Worker                     SkDebugf("+[%u:%u): Bad\n", query.fX, query.fY);
1183*c8dee2aaSAndroid Build Coastguard Worker                 }
1184*c8dee2aaSAndroid Build Coastguard Worker             }
1185*c8dee2aaSAndroid Build Coastguard Worker         }
1186*c8dee2aaSAndroid Build Coastguard Worker 
1187*c8dee2aaSAndroid Build Coastguard Worker         for (auto& query : miss) {
1188*c8dee2aaSAndroid Build Coastguard Worker             auto missRects = paragraph->getRectsForRange(query.fX, query.fY,
1189*c8dee2aaSAndroid Build Coastguard Worker                                                          RectHeightStyle::kTight,
1190*c8dee2aaSAndroid Build Coastguard Worker                                                          RectWidthStyle::kTight);
1191*c8dee2aaSAndroid Build Coastguard Worker             if (missRects.empty()) {
1192*c8dee2aaSAndroid Build Coastguard Worker             } else {
1193*c8dee2aaSAndroid Build Coastguard Worker                 if (this->isVerbose()) {
1194*c8dee2aaSAndroid Build Coastguard Worker                     SkDebugf("-[%u:%u): Bad\n", query.fX, query.fY);
1195*c8dee2aaSAndroid Build Coastguard Worker                 }
1196*c8dee2aaSAndroid Build Coastguard Worker             }
1197*c8dee2aaSAndroid Build Coastguard Worker         }
1198*c8dee2aaSAndroid Build Coastguard Worker     }
1199*c8dee2aaSAndroid Build Coastguard Worker };
1200*c8dee2aaSAndroid Build Coastguard Worker 
1201*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide12 : public ParagraphSlide_Base {
1202*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide12()1203*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide12() { fName = "Paragraph12"; }
1204*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1205*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1206*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1207*c8dee2aaSAndroid Build Coastguard Worker 
1208*c8dee2aaSAndroid Build Coastguard Worker         const char* text = "Atwater Peel Sherbrooke Bonaventure Angrignon Peel Côte-des-Neiges";
1209*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1210*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Ahem")});
1211*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
1212*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(16);
1213*c8dee2aaSAndroid Build Coastguard Worker         //text_style.setLetterSpacing(-0.41);
1214*c8dee2aaSAndroid Build Coastguard Worker         StrutStyle strut_style;
1215*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setStrutEnabled(false);
1216*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1217*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setStrutStyle(strut_style);
1218*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
1219*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, getFontCollection(), get_unicode());
1220*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
1221*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
1222*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(1095.000000);
1223*c8dee2aaSAndroid Build Coastguard Worker         auto result = paragraph->getRectsForRange(65, 66, RectHeightStyle::kTight, RectWidthStyle::kTight);
1224*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
1225*c8dee2aaSAndroid Build Coastguard Worker 
1226*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
1227*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(SK_ColorRED);
1228*c8dee2aaSAndroid Build Coastguard Worker         paint.setStyle(SkPaint::kStroke_Style);
1229*c8dee2aaSAndroid Build Coastguard Worker         paint.setAntiAlias(true);
1230*c8dee2aaSAndroid Build Coastguard Worker         paint.setStrokeWidth(1);
1231*c8dee2aaSAndroid Build Coastguard Worker         if (!result.empty()) {
1232*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRect(result.front().rect, paint);
1233*c8dee2aaSAndroid Build Coastguard Worker         }
1234*c8dee2aaSAndroid Build Coastguard Worker     }
1235*c8dee2aaSAndroid Build Coastguard Worker };
1236*c8dee2aaSAndroid Build Coastguard Worker 
1237*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide14 : public ParagraphSlide_Base {
1238*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide14()1239*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide14() { fName = "Paragraph14"; }
1240*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1241*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1242*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1243*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1244*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Ahem")});
1245*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
1246*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(25);
1247*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecoration((TextDecoration)(TextDecoration::kUnderline | TextDecoration::kOverline | TextDecoration::kLineThrough));
1248*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationColor(SK_ColorBLUE);
1249*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationStyle(TextDecorationStyle::kWavy);
1250*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationThicknessMultiplier(4.0f);
1251*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1252*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
1253*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextDirection(TextDirection::kRtl);
1254*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, getFontCollection(), get_unicode());
1255*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
1256*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("Hello, wor!\nabcd.");
1257*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
1258*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(300);
1259*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
1260*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
1261*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(SK_ColorRED);
1262*c8dee2aaSAndroid Build Coastguard Worker         paint.setStyle(SkPaint::kStroke_Style);
1263*c8dee2aaSAndroid Build Coastguard Worker         paint.setAntiAlias(true);
1264*c8dee2aaSAndroid Build Coastguard Worker         paint.setStrokeWidth(1);
1265*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawRect(SkRect::MakeXYWH(0, 0, 300, 100), paint);
1266*c8dee2aaSAndroid Build Coastguard Worker     }
1267*c8dee2aaSAndroid Build Coastguard Worker };
1268*c8dee2aaSAndroid Build Coastguard Worker 
1269*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide15 : public ParagraphSlide_Base {
1270*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide15()1271*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide15() { fName = "Paragraph15"; }
1272*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1273*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1274*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1275*c8dee2aaSAndroid Build Coastguard Worker 
1276*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1277*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("abc.ttf")});
1278*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(50);
1279*c8dee2aaSAndroid Build Coastguard Worker 
1280*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), false);
1281*c8dee2aaSAndroid Build Coastguard Worker 
1282*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->addFontFromFile("abc/abc.ttf", "abc");
1283*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->addFontFromFile("abc/abc+grave.ttf", "abc+grave");
1284*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->addFontFromFile("abc/abc+agrave.ttf", "abc+agrave");
1285*c8dee2aaSAndroid Build Coastguard Worker 
1286*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1287*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
1288*c8dee2aaSAndroid Build Coastguard Worker 
1289*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("abc"), SkString("abc+grave")});
1290*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLUE);
1291*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
1292*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(u"a\u0300");
1293*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorMAGENTA);
1294*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
1295*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(u"à");
1296*c8dee2aaSAndroid Build Coastguard Worker 
1297*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("abc"), SkString("abc+agrave")});
1298*c8dee2aaSAndroid Build Coastguard Worker 
1299*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorRED);
1300*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
1301*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(u"a\u0300");
1302*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorGREEN);
1303*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
1304*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(u"à");
1305*c8dee2aaSAndroid Build Coastguard Worker 
1306*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
1307*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(800);
1308*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 50, 50);
1309*c8dee2aaSAndroid Build Coastguard Worker 
1310*c8dee2aaSAndroid Build Coastguard Worker     }
1311*c8dee2aaSAndroid Build Coastguard Worker };
1312*c8dee2aaSAndroid Build Coastguard Worker 
1313*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide16 : public ParagraphSlide_Base {
1314*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide16()1315*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide16() { fName = "Paragraph16"; }
1316*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1317*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1318*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1319*c8dee2aaSAndroid Build Coastguard Worker 
1320*c8dee2aaSAndroid Build Coastguard Worker         const char* text = "content";
1321*c8dee2aaSAndroid Build Coastguard Worker 
1322*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1323*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setMaxLines(1);
1324*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setEllipsis(u"\u2026");
1325*c8dee2aaSAndroid Build Coastguard Worker         //auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), false, true);
1326*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
1327*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
1328*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
1329*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
1330*c8dee2aaSAndroid Build Coastguard Worker 
1331*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1332*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString(".SF Pro Text")});
1333*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
1334*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(17.0f * 99.0f);
1335*c8dee2aaSAndroid Build Coastguard Worker         text_style.setLetterSpacing(0.41f);
1336*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
1337*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
1338*c8dee2aaSAndroid Build Coastguard Worker 
1339*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
1340*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(800);
1341*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
1342*c8dee2aaSAndroid Build Coastguard Worker     }
1343*c8dee2aaSAndroid Build Coastguard Worker };
1344*c8dee2aaSAndroid Build Coastguard Worker 
1345*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide17 : public ParagraphSlide_Base {
1346*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide17()1347*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide17() { fName = "Paragraph17"; }
1348*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1349*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1350*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1351*c8dee2aaSAndroid Build Coastguard Worker 
1352*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
1353*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
1354*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
1355*c8dee2aaSAndroid Build Coastguard Worker         auto navy = SkColorSetRGB(0, 0, 139);
1356*c8dee2aaSAndroid Build Coastguard Worker         auto ltgray = SkColorSetRGB(211, 211, 211);
1357*c8dee2aaSAndroid Build Coastguard Worker         auto multiplier = 5.67;
1358*c8dee2aaSAndroid Build Coastguard Worker 
1359*c8dee2aaSAndroid Build Coastguard Worker         //const char* text = ">Sͬ͑̀͐̈͒̈́̋̎ͮͩ̽̓ͬ̂̆̔͗́̓ͣͧ͊ͫ͛̉͌̐̑ͪ͗̚͝҉̴͉͢k̡̊̓ͫͭͩ͂͊ͨͪͬ̑ͫ̍̌̄͛̌̂̑̂̋̊̔ͫ͛̽̑ͨ̍ͭ̓̀ͪͪ̉͐͗̌̓̃̚͟͝҉̢͏̫̞̙͇͖̮͕̗̟͕͇͚̻͈̣̻̪͉̰̲̣̫ͅͅP̴̅̍͒̿͗͗̇ͩ̃͆͌̀̽͏̧̡͕͖̝̖̼̺̰̣̬͔͖͔̼͙̞̦̫͓̘͜a̸̴̸̴̢̢̨̨̫͍͓̥̼̭̼̻̤̯̙̤̻̠͚̍̌͋̂ͦͨ̽̇͌͌͆̀̽̎͒̄ͪ̐ͦ̈ͫ͐͗̓̚̚͜ͅr͐͐ͤͫ̐ͥ͂̈́̿́ͮ̃͗̓̏ͫ̀̿͏̸̵̧́͘̕͟͝͠͞͠҉̷̧͚͢͟a̓̽̎̄͗̔͛̄̐͊͛ͫ͂͌̂̂̈̈̓̔̅̅̄͊̉́ͪ̑̄͆ͬ̍͆ͭ͋̐ͬ͏̷̵̨̢̩̹̖͓̥̳̰͔̱̬͖̙͓̙͇̀̀̕͜͟͟͢͟͜͠͡g̨̅̇ͦ͋̂ͦͨͭ̓͐͆̏̂͛̉ͧ̑ͫ̐̒͛ͫ̍̒͛́̚҉̷̨̛̛̀͜͢͞҉̩̘̲͍͎̯̹̝̭̗̱͇͉̲̱͔̯̠̹̥̻͉̲̜̤̰̪̗̺̖̺r̷͌̓̇̅ͭ̀̐̃̃ͭ͑͗̉̈̇̈́ͥ̓ͣ́ͤ͂ͤ͂̏͌̆̚҉̴̸̧̢̢̛̫͉̦̥̤̙͈͉͈͉͓̙̗̟̳̜͈̗̺̟̠̠͖͓̖̪͕̠̕̕͝ͅả̸̴̡̡̧͠͞͡͞҉̛̕͟͏̷̘̪̱͈̲͉̞̠̞̪̫͎̲̬̖̀̀͟͝͞͞͠p̛͂̈͐̚͠҉̵̸̡̢̢̩̹͙̯͖̙̙̮̥̙͚̠͔̥̭̮̞̣̪̬̥̠̖̝̥̪͎́̀̕͜͡͡ͅͅh̵̷̵̡̛ͤ̂͌̐̓̐̋̋͊̒̆̽́̀̀̀͢͠͞͞҉̷̸̢̕҉͚̯͖̫̜̞̟̠̱͉̝̲̹̼͉̟͉̩̮͔̤͖̞̭̙̹̬ͅ<";
1360*c8dee2aaSAndroid Build Coastguard Worker         const char* text = ">S͛ͭ̋͆̈̔̇͗̍͑̎ͪͮͧͣ̽ͫͣ́ͬ̀͌͑͂͗͒̍̔̄ͧ̏̉̌̊̊̿̀̌̃̄͐̓̓̚̚҉̵̡͜͟͝͠͏̸̵̡̧͜҉̷̡͇̜̘̻̺̘̟̝͙̬̘̩͇̭̼̥̖̤̦͎k͉̩̘͚̜̹̗̗͍̤̥̱͉̳͕͖̤̲̣͚̮̞̬̲͍͔̯̻̮̞̭͈̗̫͓̂ͨ̉ͪ̒͋͛̀̍͊ͧ̿̅͆̓̔̔ͬ̇̑̿ͩ͗ͮ̎͌̿̄ͅP̴̵̡̡̛̪͙̼̣̟̩̭̫̱͙̬͔͉͍̘̠͉̦̝̘̥̟̗͖̫̤͕̙̬̦͍̱̖̮̱͑͐̎̃̒͐͋̚͘͞a̶̶̵̵̵̶̶̡̧̢̢̺͔̣͖̭̺͍̤͚̱̜̰̥͕̬̥̲̞̥̘͇͚̺̰͚̪̺͔̤͍̓̿͆̎͋̓ͦ̈́ͦ̌́̄͗̌̓͌̕͜͜͟͢͝͡ŕ͎̝͕͉̻͎̤̭͚̗̳̖̙̘͚̫͖͓͚͉͔͈̟̰̟̬̗͓̟͚̱̕͡ͅͅͅa̸̶̢̛̛̽ͮͩ̅͒ͫ͗͂̎ͦ̈́̓̚͘͜͢͡҉̷̵̶̢̡̜̮̦̜̥̜̯̙͓͔̼̗̻͜͜ͅḡ̢̛͕̗͖̖̤̦̘͔ͨͨ̊͒ͩͭͤ̍̅̃ͪ̋̏̓̍̋͗̋ͨ̏̽̈́̔̀̋̉ͫ̅̂ͭͫ̏͒͋ͥ̚͜r̶̢̧̧̥̤̼̀̂̒ͪ͌̿͌̅͛ͨͪ͒̍ͥ̉ͤ̌̿̆́ͭ͆̃̒ͤ͛̊ͧ̽͘͝͠a̧̢̧̢͑͑̓͑ͮ̃͂̄͛́̈́͋̂͌̽̄͒̔́̇ͨͧͭ͐ͦ̋ͨ̍ͦ̍̋͆̔ͧ͑͋͌̈̓͛͛̚͢͜͜͏̴̢̧̛̳͍̹͚̰̹̻͔p̨̡͆ͦͣ͊̽̔͂̉ͣ̔ͣ̌̌̉̃̋̂͒ͫ̄̎̐͗̉̌̃̽̽́̀̚͘͜͟҉̱͉h̭̮̘̗͔̜̯͔͈̯̺͔̗̣̭͚̱̰̙̼̹͚̣̻̥̲̮͍̤͜͝<";
1361*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1362*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
1363*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
1364*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(ltgray);
1365*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1366*c8dee2aaSAndroid Build Coastguard Worker         text_style.setBackgroundColor(paint);
1367*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(navy);
1368*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
1369*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(20 * multiplier);
1370*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
1371*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
1372*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
1373*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(10000);
1374*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
1375*c8dee2aaSAndroid Build Coastguard Worker     }
1376*c8dee2aaSAndroid Build Coastguard Worker };
1377*c8dee2aaSAndroid Build Coastguard Worker 
1378*c8dee2aaSAndroid Build Coastguard Worker class Zalgo {
1379*c8dee2aaSAndroid Build Coastguard Worker     private:
1380*c8dee2aaSAndroid Build Coastguard Worker     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";
1381*c8dee2aaSAndroid Build Coastguard Worker     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";
1382*c8dee2aaSAndroid Build Coastguard Worker     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";
1383*c8dee2aaSAndroid Build Coastguard Worker 
randomMarks(std::u16string & combiningMarks)1384*c8dee2aaSAndroid Build Coastguard Worker     std::u16string randomMarks(std::u16string& combiningMarks) {
1385*c8dee2aaSAndroid Build Coastguard Worker         std::u16string result;
1386*c8dee2aaSAndroid Build Coastguard Worker         auto num = std::rand() % (combiningMarks.size() / 1);
1387*c8dee2aaSAndroid Build Coastguard Worker         for (size_t i = 0; i < num; ++i) {
1388*c8dee2aaSAndroid Build Coastguard Worker             auto index = std::rand() % combiningMarks.size();
1389*c8dee2aaSAndroid Build Coastguard Worker             result += combiningMarks[index];
1390*c8dee2aaSAndroid Build Coastguard Worker         }
1391*c8dee2aaSAndroid Build Coastguard Worker         return result;
1392*c8dee2aaSAndroid Build Coastguard Worker     }
1393*c8dee2aaSAndroid Build Coastguard Worker 
1394*c8dee2aaSAndroid Build Coastguard Worker public:
zalgo(const std::string & victim)1395*c8dee2aaSAndroid Build Coastguard Worker     std::u16string zalgo(const std::string& victim) {
1396*c8dee2aaSAndroid Build Coastguard Worker         std::u16string result;
1397*c8dee2aaSAndroid Build Coastguard Worker         for (auto& c : victim) {
1398*c8dee2aaSAndroid Build Coastguard Worker             result += c;
1399*c8dee2aaSAndroid Build Coastguard Worker             result += randomMarks(COMBINING_UP);
1400*c8dee2aaSAndroid Build Coastguard Worker             result += randomMarks(COMBINING_MIDDLE);
1401*c8dee2aaSAndroid Build Coastguard Worker             result += randomMarks(COMBINING_DOWN);
1402*c8dee2aaSAndroid Build Coastguard Worker         }
1403*c8dee2aaSAndroid Build Coastguard Worker         return result;
1404*c8dee2aaSAndroid Build Coastguard Worker     }
1405*c8dee2aaSAndroid Build Coastguard Worker };
1406*c8dee2aaSAndroid Build Coastguard Worker 
1407*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide18 : public ParagraphSlide_Base {
1408*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide18()1409*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide18() { fName = "Paragraph18"; }
1410*c8dee2aaSAndroid Build Coastguard Worker 
onChar(SkUnichar uni)1411*c8dee2aaSAndroid Build Coastguard Worker     bool onChar(SkUnichar uni) override {
1412*c8dee2aaSAndroid Build Coastguard Worker             switch (uni) {
1413*c8dee2aaSAndroid Build Coastguard Worker                 case ' ':
1414*c8dee2aaSAndroid Build Coastguard Worker                     fLimit = 400;
1415*c8dee2aaSAndroid Build Coastguard Worker                     return true;
1416*c8dee2aaSAndroid Build Coastguard Worker                 case 's':
1417*c8dee2aaSAndroid Build Coastguard Worker                     fLimit += 10;
1418*c8dee2aaSAndroid Build Coastguard Worker                     return true;
1419*c8dee2aaSAndroid Build Coastguard Worker                 case 'f':
1420*c8dee2aaSAndroid Build Coastguard Worker                     if (fLimit > 10) {
1421*c8dee2aaSAndroid Build Coastguard Worker                         fLimit -= 10;
1422*c8dee2aaSAndroid Build Coastguard Worker                     }
1423*c8dee2aaSAndroid Build Coastguard Worker                     return true;
1424*c8dee2aaSAndroid Build Coastguard Worker                 default:
1425*c8dee2aaSAndroid Build Coastguard Worker                     break;
1426*c8dee2aaSAndroid Build Coastguard Worker             }
1427*c8dee2aaSAndroid Build Coastguard Worker             return false;
1428*c8dee2aaSAndroid Build Coastguard Worker     }
1429*c8dee2aaSAndroid Build Coastguard Worker 
animate(double nanos)1430*c8dee2aaSAndroid Build Coastguard Worker     bool animate(double nanos) override {
1431*c8dee2aaSAndroid Build Coastguard Worker         if (++fIndex > fLimit) {
1432*c8dee2aaSAndroid Build Coastguard Worker             fRedraw = true;
1433*c8dee2aaSAndroid Build Coastguard Worker             fIndex = 0;
1434*c8dee2aaSAndroid Build Coastguard Worker         } else {
1435*c8dee2aaSAndroid Build Coastguard Worker             fRepeat = true;
1436*c8dee2aaSAndroid Build Coastguard Worker         }
1437*c8dee2aaSAndroid Build Coastguard Worker         return true;
1438*c8dee2aaSAndroid Build Coastguard Worker     }
1439*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1440*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1441*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1442*c8dee2aaSAndroid Build Coastguard Worker 
1443*c8dee2aaSAndroid Build Coastguard Worker         auto navy = SkColorSetRGB(0, 0, 139);
1444*c8dee2aaSAndroid Build Coastguard Worker         auto ltgray = SkColorSetRGB(211, 211, 211);
1445*c8dee2aaSAndroid Build Coastguard Worker 
1446*c8dee2aaSAndroid Build Coastguard Worker         auto multiplier = 5.67;
1447*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
1448*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
1449*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
1450*c8dee2aaSAndroid Build Coastguard Worker 
1451*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1452*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1453*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
1454*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(20 * multiplier);
1455*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(navy);
1456*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
1457*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(ltgray);
1458*c8dee2aaSAndroid Build Coastguard Worker         text_style.setBackgroundColor(paint);
1459*c8dee2aaSAndroid Build Coastguard Worker 
1460*c8dee2aaSAndroid Build Coastguard Worker         Zalgo zalgo;
1461*c8dee2aaSAndroid Build Coastguard Worker 
1462*c8dee2aaSAndroid Build Coastguard Worker         if (fRedraw || fRepeat) {
1463*c8dee2aaSAndroid Build Coastguard Worker 
1464*c8dee2aaSAndroid Build Coastguard Worker             if (fRedraw || fParagraph == nullptr) {
1465*c8dee2aaSAndroid Build Coastguard Worker                 ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
1466*c8dee2aaSAndroid Build Coastguard Worker                 builder.pushStyle(text_style);
1467*c8dee2aaSAndroid Build Coastguard Worker                 auto utf16text = zalgo.zalgo("SkParagraph");
1468*c8dee2aaSAndroid Build Coastguard Worker                 builder.addText(utf16text);
1469*c8dee2aaSAndroid Build Coastguard Worker                 fParagraph = builder.Build();
1470*c8dee2aaSAndroid Build Coastguard Worker             }
1471*c8dee2aaSAndroid Build Coastguard Worker 
1472*c8dee2aaSAndroid Build Coastguard Worker             auto impl = static_cast<ParagraphImpl*>(fParagraph.get());
1473*c8dee2aaSAndroid Build Coastguard Worker             if (this->isVerbose()) {
1474*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("Text:>%s<\n", impl->text().data());
1475*c8dee2aaSAndroid Build Coastguard Worker             }
1476*c8dee2aaSAndroid Build Coastguard Worker             impl->markDirty();
1477*c8dee2aaSAndroid Build Coastguard Worker             fParagraph->layout(1000);
1478*c8dee2aaSAndroid Build Coastguard Worker             fParagraph->paint(canvas, 300, 200);
1479*c8dee2aaSAndroid Build Coastguard Worker 
1480*c8dee2aaSAndroid Build Coastguard Worker             for (auto& run : impl->runs()) {
1481*c8dee2aaSAndroid Build Coastguard Worker                 SkString fontFamily("unresolved");
1482*c8dee2aaSAndroid Build Coastguard Worker                 if (run.font().getTypeface() != nullptr) {
1483*c8dee2aaSAndroid Build Coastguard Worker                     run.font().getTypeface()->getFamilyName(&fontFamily);
1484*c8dee2aaSAndroid Build Coastguard Worker                 }
1485*c8dee2aaSAndroid Build Coastguard Worker                 if (run.font().getTypeface() != nullptr) {
1486*c8dee2aaSAndroid Build Coastguard Worker                     for (size_t i = 0; i < run.size(); ++i) {
1487*c8dee2aaSAndroid Build Coastguard Worker                         auto glyph = run.glyphs().begin() + i;
1488*c8dee2aaSAndroid Build Coastguard Worker                         if (*glyph == 0) {
1489*c8dee2aaSAndroid Build Coastguard Worker                             //SkDebugf("Run[%d] @pos=%d\n", run.index(), i);
1490*c8dee2aaSAndroid Build Coastguard Worker                         }
1491*c8dee2aaSAndroid Build Coastguard Worker                     }
1492*c8dee2aaSAndroid Build Coastguard Worker                 } else {
1493*c8dee2aaSAndroid Build Coastguard Worker                     //SkDebugf("Run[%d]: %s\n", run.index(), fontFamily.c_str());
1494*c8dee2aaSAndroid Build Coastguard Worker                 }
1495*c8dee2aaSAndroid Build Coastguard Worker             }
1496*c8dee2aaSAndroid Build Coastguard Worker             fRedraw = false;
1497*c8dee2aaSAndroid Build Coastguard Worker             fRepeat = false;
1498*c8dee2aaSAndroid Build Coastguard Worker         }
1499*c8dee2aaSAndroid Build Coastguard Worker     }
1500*c8dee2aaSAndroid Build Coastguard Worker 
1501*c8dee2aaSAndroid Build Coastguard Worker private:
1502*c8dee2aaSAndroid Build Coastguard Worker     bool fRedraw = true;
1503*c8dee2aaSAndroid Build Coastguard Worker     bool fRepeat = false;
1504*c8dee2aaSAndroid Build Coastguard Worker     size_t fIndex = 0;
1505*c8dee2aaSAndroid Build Coastguard Worker     size_t fLimit = 20;
1506*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<Paragraph> fParagraph;
1507*c8dee2aaSAndroid Build Coastguard Worker };
1508*c8dee2aaSAndroid Build Coastguard Worker 
1509*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide19 : public ParagraphSlide_Base {
1510*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide19()1511*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide19() { fName = "Paragraph19"; }
1512*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1513*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1514*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1515*c8dee2aaSAndroid Build Coastguard Worker 
1516*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), false, true);
1517*c8dee2aaSAndroid Build Coastguard Worker 
1518*c8dee2aaSAndroid Build Coastguard Worker         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";
1519*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1520*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
1521*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1522*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
1523*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
1524*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(20);
1525*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
1526*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
1527*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
1528*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
1529*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
1530*c8dee2aaSAndroid Build Coastguard Worker     }
1531*c8dee2aaSAndroid Build Coastguard Worker };
1532*c8dee2aaSAndroid Build Coastguard Worker 
1533*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide20 : public ParagraphSlide_Base {
1534*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide20()1535*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide20() { fName = "Paragraph20"; }
1536*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1537*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1538*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1539*c8dee2aaSAndroid Build Coastguard Worker 
1540*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), false, true);
1541*c8dee2aaSAndroid Build Coastguard Worker 
1542*c8dee2aaSAndroid Build Coastguard Worker         const char* text =  "Manage your google account";
1543*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1544*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setEllipsis(u"\u2026");
1545*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setMaxLines(1);
1546*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
1547*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1548*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
1549*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
1550*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(50);
1551*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
1552*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
1553*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
1554*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
1555*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
1556*c8dee2aaSAndroid Build Coastguard Worker     }
1557*c8dee2aaSAndroid Build Coastguard Worker };
1558*c8dee2aaSAndroid Build Coastguard Worker 
1559*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide21 : public ParagraphSlide_Base {
1560*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide21()1561*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide21() { fName = "Paragraph21"; }
1562*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1563*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1564*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1565*c8dee2aaSAndroid Build Coastguard Worker 
1566*c8dee2aaSAndroid Build Coastguard Worker         const char* text =  "Referral Code";
1567*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1568*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, getFontCollection(), get_unicode());
1569*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1570*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
1571*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Google Sans")});
1572*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(24);
1573*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
1574*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
1575*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
1576*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(0);
1577*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
1578*c8dee2aaSAndroid Build Coastguard Worker     }
1579*c8dee2aaSAndroid Build Coastguard Worker };
1580*c8dee2aaSAndroid Build Coastguard Worker 
1581*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide22 : public ParagraphSlide_Base {
1582*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide22()1583*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide22() { fName = "Paragraph22"; }
1584*c8dee2aaSAndroid Build Coastguard Worker 
onChar(SkUnichar uni)1585*c8dee2aaSAndroid Build Coastguard Worker     bool onChar(SkUnichar uni) override {
1586*c8dee2aaSAndroid Build Coastguard Worker             switch (uni) {
1587*c8dee2aaSAndroid Build Coastguard Worker                 case 'l':
1588*c8dee2aaSAndroid Build Coastguard Worker                     direction = true;
1589*c8dee2aaSAndroid Build Coastguard Worker                     return true;
1590*c8dee2aaSAndroid Build Coastguard Worker                 case 'r':
1591*c8dee2aaSAndroid Build Coastguard Worker                     direction = false;
1592*c8dee2aaSAndroid Build Coastguard Worker                     return true;
1593*c8dee2aaSAndroid Build Coastguard Worker                 default:
1594*c8dee2aaSAndroid Build Coastguard Worker                     break;
1595*c8dee2aaSAndroid Build Coastguard Worker             }
1596*c8dee2aaSAndroid Build Coastguard Worker             return false;
1597*c8dee2aaSAndroid Build Coastguard Worker     }
1598*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1599*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1600*c8dee2aaSAndroid Build Coastguard Worker 
1601*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1602*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1603*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextDirection(direction ? TextDirection::kLtr : TextDirection::kRtl);
1604*c8dee2aaSAndroid Build Coastguard Worker         auto collection = getFontCollection();
1605*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, collection, get_unicode());
1606*c8dee2aaSAndroid Build Coastguard Worker         collection->getParagraphCache()->reset();
1607*c8dee2aaSAndroid Build Coastguard Worker         collection->getParagraphCache()->turnOn(false);
1608*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1609*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
1610*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
1611*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(12);
1612*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
1613*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("I have got a ");
1614*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontStyle(SkFontStyle::Bold());
1615*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
1616*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("lovely bunch");
1617*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontStyle(SkFontStyle::Normal());
1618*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
1619*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(" of coconuts.");
1620*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
1621*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
1622*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
1623*c8dee2aaSAndroid Build Coastguard Worker         collection->getParagraphCache()->turnOn(true);
1624*c8dee2aaSAndroid Build Coastguard Worker     }
1625*c8dee2aaSAndroid Build Coastguard Worker 
1626*c8dee2aaSAndroid Build Coastguard Worker private:
1627*c8dee2aaSAndroid Build Coastguard Worker     bool direction = false;
1628*c8dee2aaSAndroid Build Coastguard Worker };
1629*c8dee2aaSAndroid Build Coastguard Worker 
1630*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide23 : public ParagraphSlide_Base {
1631*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide23()1632*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide23() { fName = "Paragraph23"; }
1633*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1634*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1635*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1636*c8dee2aaSAndroid Build Coastguard Worker 
1637*c8dee2aaSAndroid Build Coastguard Worker         const char* text =  "Text with shadow";
1638*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1639*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1640*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
1641*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Google Sans")});
1642*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(24);
1643*c8dee2aaSAndroid Build Coastguard Worker 
1644*c8dee2aaSAndroid Build Coastguard Worker         auto draw = [&](SkScalar h, SkScalar v, SkScalar b) {
1645*c8dee2aaSAndroid Build Coastguard Worker             text_style.resetShadows();
1646*c8dee2aaSAndroid Build Coastguard Worker             text_style.addShadow(TextShadow(SK_ColorBLACK, SkPoint::Make(h, v), b));
1647*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, getFontCollection(), get_unicode());
1648*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
1649*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text);
1650*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
1651*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(300);
1652*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
1653*c8dee2aaSAndroid Build Coastguard Worker 
1654*c8dee2aaSAndroid Build Coastguard Worker             auto rect = SkRect::MakeXYWH(0, 0, paragraph->getMaxWidth(), paragraph->getHeight());
1655*c8dee2aaSAndroid Build Coastguard Worker             SkPaint paint;
1656*c8dee2aaSAndroid Build Coastguard Worker             paint.setColor(SK_ColorRED);
1657*c8dee2aaSAndroid Build Coastguard Worker             paint.setStyle(SkPaint::kStroke_Style);
1658*c8dee2aaSAndroid Build Coastguard Worker             paint.setAntiAlias(true);
1659*c8dee2aaSAndroid Build Coastguard Worker             paint.setStrokeWidth(1);
1660*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRect(rect, paint);
1661*c8dee2aaSAndroid Build Coastguard Worker         };
1662*c8dee2aaSAndroid Build Coastguard Worker 
1663*c8dee2aaSAndroid Build Coastguard Worker         draw(10, 10, 5);
1664*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 100);
1665*c8dee2aaSAndroid Build Coastguard Worker 
1666*c8dee2aaSAndroid Build Coastguard Worker         draw(10, -10, 5);
1667*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 100);
1668*c8dee2aaSAndroid Build Coastguard Worker 
1669*c8dee2aaSAndroid Build Coastguard Worker         draw(-10, -10, 5);
1670*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 100);
1671*c8dee2aaSAndroid Build Coastguard Worker 
1672*c8dee2aaSAndroid Build Coastguard Worker         draw(-10, 10, 5);
1673*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 100);
1674*c8dee2aaSAndroid Build Coastguard Worker     }
1675*c8dee2aaSAndroid Build Coastguard Worker };
1676*c8dee2aaSAndroid Build Coastguard Worker 
1677*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide24 : public ParagraphSlide_Base {
1678*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide24()1679*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide24() { fName = "Paragraph24"; }
1680*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1681*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1682*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1683*c8dee2aaSAndroid Build Coastguard Worker 
1684*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1685*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextDirection(TextDirection::kRtl);
1686*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1687*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
1688*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Google Sans")});
1689*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(24);
1690*c8dee2aaSAndroid Build Coastguard Worker         {
1691*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, getFontCollection(), get_unicode());
1692*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
1693*c8dee2aaSAndroid Build Coastguard Worker             builder.addText("Right_to_left:");
1694*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
1695*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(this->size().width());
1696*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
1697*c8dee2aaSAndroid Build Coastguard Worker         }
1698*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 200);
1699*c8dee2aaSAndroid Build Coastguard Worker         {
1700*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, getFontCollection(), get_unicode());
1701*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
1702*c8dee2aaSAndroid Build Coastguard Worker             builder.addText("Right_to_left+");
1703*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
1704*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(this->size().width());
1705*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
1706*c8dee2aaSAndroid Build Coastguard Worker         }
1707*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 200);
1708*c8dee2aaSAndroid Build Coastguard Worker         {
1709*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, getFontCollection(), get_unicode());
1710*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
1711*c8dee2aaSAndroid Build Coastguard Worker             builder.addText("Right_to_left.");
1712*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
1713*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(this->size().width());
1714*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
1715*c8dee2aaSAndroid Build Coastguard Worker         }
1716*c8dee2aaSAndroid Build Coastguard Worker     }
1717*c8dee2aaSAndroid Build Coastguard Worker };
1718*c8dee2aaSAndroid Build Coastguard Worker 
1719*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide25 : public ParagraphSlide_Base {
1720*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide25()1721*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide25() { fName = "Paragraph25"; }
1722*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1723*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1724*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1725*c8dee2aaSAndroid Build Coastguard Worker /*
1726*c8dee2aaSAndroid Build Coastguard Worker  * Shell: ParagraphStyle: 1.000000 1
1727*c8dee2aaSAndroid Build Coastguard Worker Shell: Strut enabled: 0 1.000000 14.000000 400 5 0
1728*c8dee2aaSAndroid Build Coastguard Worker Shell: Font Families: 0
1729*c8dee2aaSAndroid Build Coastguard Worker Shell: DefaultTextStyle: 16.000000 500 5 0
1730*c8dee2aaSAndroid Build Coastguard Worker Shell: Font Families: 1 Roboto
1731*c8dee2aaSAndroid Build Coastguard Worker Shell: Font Features: 0
1732*c8dee2aaSAndroid Build Coastguard Worker Shell: TextStyle#0: [0:22) 16.000000 500 5 0
1733*c8dee2aaSAndroid Build Coastguard Worker Shell: Font Families: 1 Roboto
1734*c8dee2aaSAndroid Build Coastguard Worker Shell: Font Features: 0
1735*c8dee2aaSAndroid Build Coastguard Worker Shell: TextStyle#1: [25:49) 16.000000 500 5 0
1736*c8dee2aaSAndroid Build Coastguard Worker Shell: Font Families: 1 Roboto
1737*c8dee2aaSAndroid Build Coastguard Worker Shell: Font Features: 0
1738*c8dee2aaSAndroid Build Coastguard Worker Shell: Placeholder#0: [22:25) 32.000000 32.000000 32.000000 0 5
1739*c8dee2aaSAndroid Build Coastguard Worker Shell: Placeholder#1: [49:52) 19.000000 41.000000 19.000000 0 4
1740*c8dee2aaSAndroid Build Coastguard Worker Shell: Placeholder#2: [52:52) 0.000000 0.000000 0.000000 0 5
1741*c8dee2aaSAndroid Build Coastguard Worker Shell: layout('Go to device settings  and set up a passcode. ', 280.000000): 280.000000 * 38.000000
1742*c8dee2aaSAndroid Build Coastguard Worker  */
1743*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
1744*c8dee2aaSAndroid Build Coastguard Worker         //fontCollection->getParagraphCache()->turnOn(false);
1745*c8dee2aaSAndroid Build Coastguard Worker         const char* text1 =  "Go to device settings ";
1746*c8dee2aaSAndroid Build Coastguard Worker         const char* text2 = "and set up a passcode.";
1747*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1748*c8dee2aaSAndroid Build Coastguard Worker         StrutStyle strut_style;
1749*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setStrutEnabled(false);
1750*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setFontSize(14);
1751*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setForceStrutHeight(false);
1752*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setHeight(14);
1753*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setStrutStyle(strut_style);
1754*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1755*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
1756*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
1757*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(16);
1758*c8dee2aaSAndroid Build Coastguard Worker         PlaceholderStyle placeholder_style;
1759*c8dee2aaSAndroid Build Coastguard Worker         {
1760*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
1761*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
1762*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text1);
1763*c8dee2aaSAndroid Build Coastguard Worker             placeholder_style.fHeight = 32;
1764*c8dee2aaSAndroid Build Coastguard Worker             placeholder_style.fWidth = 32;
1765*c8dee2aaSAndroid Build Coastguard Worker             placeholder_style.fBaselineOffset = 32;
1766*c8dee2aaSAndroid Build Coastguard Worker             placeholder_style.fBaseline = TextBaseline::kAlphabetic;
1767*c8dee2aaSAndroid Build Coastguard Worker             placeholder_style.fAlignment = PlaceholderAlignment::kMiddle;
1768*c8dee2aaSAndroid Build Coastguard Worker             builder.addPlaceholder(placeholder_style);
1769*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text2);
1770*c8dee2aaSAndroid Build Coastguard Worker             placeholder_style.fHeight = 19;
1771*c8dee2aaSAndroid Build Coastguard Worker             placeholder_style.fWidth = 41;
1772*c8dee2aaSAndroid Build Coastguard Worker             placeholder_style.fBaselineOffset = 19;
1773*c8dee2aaSAndroid Build Coastguard Worker             placeholder_style.fBaseline = TextBaseline::kAlphabetic;
1774*c8dee2aaSAndroid Build Coastguard Worker             placeholder_style.fAlignment = PlaceholderAlignment::kTop;
1775*c8dee2aaSAndroid Build Coastguard Worker             builder.addPlaceholder(placeholder_style);
1776*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
1777*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(280);
1778*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
1779*c8dee2aaSAndroid Build Coastguard Worker         }
1780*c8dee2aaSAndroid Build Coastguard Worker     }
1781*c8dee2aaSAndroid Build Coastguard Worker };
1782*c8dee2aaSAndroid Build Coastguard Worker 
1783*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide26 : public ParagraphSlide_Base {
1784*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide26()1785*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide26() { fName = "Paragraph26"; }
1786*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1787*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1788*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
1789*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
1790*c8dee2aaSAndroid Build Coastguard Worker         //fontCollection->enableFontFallback();
1791*c8dee2aaSAndroid Build Coastguard Worker 
1792*c8dee2aaSAndroid Build Coastguard Worker         canvas->clear(SK_ColorWHITE);
1793*c8dee2aaSAndroid Build Coastguard Worker 
1794*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
1795*c8dee2aaSAndroid Build Coastguard Worker         paint.setAntiAlias(true);
1796*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(SK_ColorBLACK);
1797*c8dee2aaSAndroid Build Coastguard Worker 
1798*c8dee2aaSAndroid Build Coastguard Worker         TextStyle textStyle;
1799*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setForegroundColor(paint);
1800*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setFontFamilies({ SkString("Roboto") });
1801*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setFontSize(42.0f);
1802*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setLetterSpacing(-0.05f);
1803*c8dee2aaSAndroid Build Coastguard Worker         textStyle.setHeightOverride(true);
1804*c8dee2aaSAndroid Build Coastguard Worker 
1805*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraphStyle;
1806*c8dee2aaSAndroid Build Coastguard Worker         paragraphStyle.setTextStyle(textStyle);
1807*c8dee2aaSAndroid Build Coastguard Worker         paragraphStyle.setTextAlign(TextAlign::kLeft);
1808*c8dee2aaSAndroid Build Coastguard Worker 
1809*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraphStyle, fontCollection, get_unicode());
1810*c8dee2aaSAndroid Build Coastguard Worker         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");
1811*c8dee2aaSAndroid Build Coastguard Worker 
1812*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
1813*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width() / 2);
1814*c8dee2aaSAndroid Build Coastguard Worker 
1815*c8dee2aaSAndroid Build Coastguard Worker         std::vector<LineMetrics> lines;
1816*c8dee2aaSAndroid Build Coastguard Worker         paragraph->getLineMetrics(lines); // <-- error happens here
1817*c8dee2aaSAndroid Build Coastguard Worker 
1818*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(10, 10);
1819*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
1820*c8dee2aaSAndroid Build Coastguard Worker     }
1821*c8dee2aaSAndroid Build Coastguard Worker };
1822*c8dee2aaSAndroid Build Coastguard Worker 
1823*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide27 : public ParagraphSlide_Base {
1824*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide27()1825*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide27() { fName = "Paragraph27"; }
1826*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1827*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1828*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
1829*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
1830*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
1831*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->getParagraphCache()->turnOn(false);
1832*c8dee2aaSAndroid Build Coastguard Worker 
1833*c8dee2aaSAndroid Build Coastguard Worker         SkPaint red;
1834*c8dee2aaSAndroid Build Coastguard Worker         red.setColor(SK_ColorRED);
1835*c8dee2aaSAndroid Build Coastguard Worker         red.setStyle(SkPaint::kStroke_Style);
1836*c8dee2aaSAndroid Build Coastguard Worker         red.setAntiAlias(true);
1837*c8dee2aaSAndroid Build Coastguard Worker         red.setStrokeWidth(1);
1838*c8dee2aaSAndroid Build Coastguard Worker 
1839*c8dee2aaSAndroid Build Coastguard Worker         SkPaint blue;
1840*c8dee2aaSAndroid Build Coastguard Worker         blue.setColor(SK_ColorRED);
1841*c8dee2aaSAndroid Build Coastguard Worker         blue.setStyle(SkPaint::kStroke_Style);
1842*c8dee2aaSAndroid Build Coastguard Worker         blue.setAntiAlias(true);
1843*c8dee2aaSAndroid Build Coastguard Worker         blue.setStrokeWidth(1);
1844*c8dee2aaSAndroid Build Coastguard Worker 
1845*c8dee2aaSAndroid Build Coastguard Worker         SkPaint black;
1846*c8dee2aaSAndroid Build Coastguard Worker         black.setColor(SK_ColorBLACK);
1847*c8dee2aaSAndroid Build Coastguard Worker         black.setStyle(SkPaint::kStroke_Style);
1848*c8dee2aaSAndroid Build Coastguard Worker         black.setAntiAlias(true);
1849*c8dee2aaSAndroid Build Coastguard Worker         black.setStrokeWidth(1);
1850*c8dee2aaSAndroid Build Coastguard Worker 
1851*c8dee2aaSAndroid Build Coastguard Worker         SkPaint whiteSpaces;
1852*c8dee2aaSAndroid Build Coastguard Worker         whiteSpaces.setColor(SK_ColorLTGRAY);
1853*c8dee2aaSAndroid Build Coastguard Worker 
1854*c8dee2aaSAndroid Build Coastguard Worker         SkPaint breakingSpace;
1855*c8dee2aaSAndroid Build Coastguard Worker         breakingSpace.setColor(SK_ColorYELLOW);
1856*c8dee2aaSAndroid Build Coastguard Worker 
1857*c8dee2aaSAndroid Build Coastguard Worker         SkPaint text;
1858*c8dee2aaSAndroid Build Coastguard Worker         text.setColor(SK_ColorWHITE);
1859*c8dee2aaSAndroid Build Coastguard Worker 
1860*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1861*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextAlign(TextAlign::kRight);
1862*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1863*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
1864*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
1865*c8dee2aaSAndroid Build Coastguard Worker 
1866*c8dee2aaSAndroid Build Coastguard Worker         // RTL + right align + arabic
1867*c8dee2aaSAndroid Build Coastguard Worker         // RTL + right align + latin
1868*c8dee2aaSAndroid Build Coastguard Worker         // LTR + right align + arabic
1869*c8dee2aaSAndroid Build Coastguard Worker         // LTR + right align + latin
1870*c8dee2aaSAndroid Build Coastguard Worker         // RTL + left align + arabic
1871*c8dee2aaSAndroid Build Coastguard Worker         // RTL + left align + latin
1872*c8dee2aaSAndroid Build Coastguard Worker         // arabic and latin should not differ at all
1873*c8dee2aaSAndroid Build Coastguard Worker         // check: line breaking and trailing spaces
1874*c8dee2aaSAndroid Build Coastguard Worker 
1875*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1876*c8dee2aaSAndroid Build Coastguard Worker         auto h = 60;
1877*c8dee2aaSAndroid Build Coastguard Worker         auto w = 300;
1878*c8dee2aaSAndroid Build Coastguard Worker 
1879*c8dee2aaSAndroid Build Coastguard Worker         auto draw = [&](SkScalar width, SkScalar height, TextDirection td, TextAlign ta, const char* t) {
1880*c8dee2aaSAndroid Build Coastguard Worker             if (this->isVerbose()) {
1881*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("draw '%s' dir:%s align:%s\n", t,
1882*c8dee2aaSAndroid Build Coastguard Worker                          td == TextDirection::kLtr ? "left" : "right",
1883*c8dee2aaSAndroid Build Coastguard Worker                          ta == TextAlign::kLeft ? "left" : "right");
1884*c8dee2aaSAndroid Build Coastguard Worker             }
1885*c8dee2aaSAndroid Build Coastguard Worker             paragraph_style.setTextDirection(td);
1886*c8dee2aaSAndroid Build Coastguard Worker             paragraph_style.setTextAlign(ta);
1887*c8dee2aaSAndroid Build Coastguard Worker             text_style.setFontSize(20);
1888*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
1889*c8dee2aaSAndroid Build Coastguard Worker             text_style.setBackgroundColor(whiteSpaces);
1890*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
1891*c8dee2aaSAndroid Build Coastguard Worker             builder.addText("   ");
1892*c8dee2aaSAndroid Build Coastguard Worker             text_style.setBackgroundColor(text);
1893*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
1894*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(t);
1895*c8dee2aaSAndroid Build Coastguard Worker             text_style.setBackgroundColor(breakingSpace);
1896*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
1897*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(" ");
1898*c8dee2aaSAndroid Build Coastguard Worker             text_style.setBackgroundColor(text);
1899*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
1900*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(t);
1901*c8dee2aaSAndroid Build Coastguard Worker             text_style.setBackgroundColor(whiteSpaces);
1902*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
1903*c8dee2aaSAndroid Build Coastguard Worker             builder.addText("   ");
1904*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
1905*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(width);
1906*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
1907*c8dee2aaSAndroid Build Coastguard Worker             auto impl = static_cast<ParagraphImpl*>(paragraph.get());
1908*c8dee2aaSAndroid Build Coastguard Worker             for (auto& line : impl->lines()) {
1909*c8dee2aaSAndroid Build Coastguard Worker                 if (this->isVerbose()) {
1910*c8dee2aaSAndroid Build Coastguard Worker                     SkDebugf("line[%d]: %f\n", (int)(&line - impl->lines().begin()),
1911*c8dee2aaSAndroid Build Coastguard Worker                                                     line.offset().fX);
1912*c8dee2aaSAndroid Build Coastguard Worker                 }
1913*c8dee2aaSAndroid Build Coastguard Worker                 line.iterateThroughVisualRuns(true,
1914*c8dee2aaSAndroid Build Coastguard Worker                     [&](const Run* run, SkScalar runOffset, TextRange textRange, SkScalar* width) {
1915*c8dee2aaSAndroid Build Coastguard Worker                     *width = line.measureTextInsideOneRun(textRange, run, runOffset, 0, true, TextLine::TextAdjustment::GlyphCluster).clip.width();
1916*c8dee2aaSAndroid Build Coastguard Worker                     if (this->isVerbose()) {
1917*c8dee2aaSAndroid Build Coastguard Worker                         SkDebugf("%zu[%zu: %zu) @%f + %f %s\n",
1918*c8dee2aaSAndroid Build Coastguard Worker                                  run->index(), textRange.start, textRange.end, runOffset, *width,
1919*c8dee2aaSAndroid Build Coastguard Worker                                  run->leftToRight() ? "left" : "right");
1920*c8dee2aaSAndroid Build Coastguard Worker                     }
1921*c8dee2aaSAndroid Build Coastguard Worker                     return true;
1922*c8dee2aaSAndroid Build Coastguard Worker                 });
1923*c8dee2aaSAndroid Build Coastguard Worker             }
1924*c8dee2aaSAndroid Build Coastguard Worker             auto boxes = paragraph->getRectsForRange(0, 100, RectHeightStyle::kTight, RectWidthStyle::kTight);
1925*c8dee2aaSAndroid Build Coastguard Worker             bool even = true;
1926*c8dee2aaSAndroid Build Coastguard Worker             for (auto& box : boxes) {
1927*c8dee2aaSAndroid Build Coastguard Worker                 if (this->isVerbose()) {
1928*c8dee2aaSAndroid Build Coastguard Worker                     SkDebugf("[%f:%f,%f:%f] %s\n",
1929*c8dee2aaSAndroid Build Coastguard Worker                              box.rect.fLeft, box.rect.fRight, box.rect.fTop, box.rect.fBottom,
1930*c8dee2aaSAndroid Build Coastguard Worker                              box.direction == TextDirection::kLtr ? "left" : "right");
1931*c8dee2aaSAndroid Build Coastguard Worker                 }
1932*c8dee2aaSAndroid Build Coastguard Worker                 canvas->drawRect(box.rect, even ? red : blue);
1933*c8dee2aaSAndroid Build Coastguard Worker                 even = !even;
1934*c8dee2aaSAndroid Build Coastguard Worker             }
1935*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(0, height);
1936*c8dee2aaSAndroid Build Coastguard Worker         };
1937*c8dee2aaSAndroid Build Coastguard Worker 
1938*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawRect(SkRect::MakeXYWH(0, 0, w, h * 8), black);
1939*c8dee2aaSAndroid Build Coastguard Worker 
1940*c8dee2aaSAndroid Build Coastguard Worker         draw(w, h, TextDirection::kRtl, TextAlign::kRight, "RTL+RIGHT#1234567890");
1941*c8dee2aaSAndroid Build Coastguard Worker         draw(w, h, TextDirection::kRtl, TextAlign::kRight, "قففغغغغقففغغغغقففغغغ");
1942*c8dee2aaSAndroid Build Coastguard Worker 
1943*c8dee2aaSAndroid Build Coastguard Worker         draw(w, h, TextDirection::kLtr, TextAlign::kRight, "LTR+RIGHT#1234567890");
1944*c8dee2aaSAndroid Build Coastguard Worker         draw(w, h, TextDirection::kLtr, TextAlign::kRight, "قففغغغغقففغغغغقففغغغ");
1945*c8dee2aaSAndroid Build Coastguard Worker 
1946*c8dee2aaSAndroid Build Coastguard Worker         draw(w, h, TextDirection::kRtl, TextAlign::kLeft, "RTL+LEFT##1234567890");
1947*c8dee2aaSAndroid Build Coastguard Worker         draw(w, h, TextDirection::kRtl, TextAlign::kLeft, "قففغغغغقففغغغغقففغغغ");
1948*c8dee2aaSAndroid Build Coastguard Worker 
1949*c8dee2aaSAndroid Build Coastguard Worker         draw(w, h, TextDirection::kLtr, TextAlign::kLeft, "LTR+LEFT##1234567890");
1950*c8dee2aaSAndroid Build Coastguard Worker         draw(w, h, TextDirection::kLtr, TextAlign::kLeft, "قففغغغغقففغغغغقففغغغ");
1951*c8dee2aaSAndroid Build Coastguard Worker     }
1952*c8dee2aaSAndroid Build Coastguard Worker };
1953*c8dee2aaSAndroid Build Coastguard Worker 
1954*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide28 : public ParagraphSlide_Base {
1955*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide28()1956*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide28() { fName = "Paragraph28"; }
1957*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1958*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1959*c8dee2aaSAndroid Build Coastguard Worker 
1960*c8dee2aaSAndroid Build Coastguard Worker         const char* text = "AAAAA BBBBB CCCCC DDDDD EEEEE FFFFF GGGGG HHHHH IIIII JJJJJ KKKKK LLLLL MMMMM NNNNN OOOOO PPPPP QQQQQ";
1961*c8dee2aaSAndroid Build Coastguard Worker 
1962*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1963*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1964*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextAlign(TextAlign::kJustify);
1965*c8dee2aaSAndroid Build Coastguard Worker         auto collection = getFontCollection();
1966*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, collection, get_unicode());
1967*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
1968*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
1969*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
1970*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(40);
1971*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
1972*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
1973*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
1974*c8dee2aaSAndroid Build Coastguard Worker         auto s = 186;
1975*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(360 - s);
1976*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
1977*c8dee2aaSAndroid Build Coastguard Worker         /*
1978*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(360);
1979*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
1980*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 400);
1981*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(354.333);
1982*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
1983*c8dee2aaSAndroid Build Coastguard Worker         */
1984*c8dee2aaSAndroid Build Coastguard Worker     }
1985*c8dee2aaSAndroid Build Coastguard Worker };
1986*c8dee2aaSAndroid Build Coastguard Worker 
1987*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide29 : public ParagraphSlide_Base {
1988*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide29()1989*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide29() { fName = "Paragraph29"; }
1990*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)1991*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
1992*c8dee2aaSAndroid Build Coastguard Worker 
1993*c8dee2aaSAndroid Build Coastguard Worker         const char* text = "ffi";
1994*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
1995*c8dee2aaSAndroid Build Coastguard Worker 
1996*c8dee2aaSAndroid Build Coastguard Worker         auto collection = getFontCollection();
1997*c8dee2aaSAndroid Build Coastguard Worker 
1998*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
1999*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, collection, get_unicode());
2000*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2001*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2002*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
2003*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(60);
2004*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2005*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
2006*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2007*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
2008*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2009*c8dee2aaSAndroid Build Coastguard Worker         auto width = paragraph->getLongestLine();
2010*c8dee2aaSAndroid Build Coastguard Worker         auto height = paragraph->getHeight();
2011*c8dee2aaSAndroid Build Coastguard Worker         if (this->isVerbose()) {
2012*c8dee2aaSAndroid Build Coastguard Worker             auto f1Pos = paragraph->getGlyphPositionAtCoordinate(width/6, height/2);
2013*c8dee2aaSAndroid Build Coastguard Worker             auto f2Pos = paragraph->getGlyphPositionAtCoordinate(width/2, height/2);
2014*c8dee2aaSAndroid Build Coastguard Worker             auto iPos = paragraph->getGlyphPositionAtCoordinate(width*5/6, height/2);
2015*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("%d(%s) %d(%s) %d(%s)\n",
2016*c8dee2aaSAndroid Build Coastguard Worker                      f1Pos.position, f1Pos.affinity == Affinity::kUpstream ? "up" : "down",
2017*c8dee2aaSAndroid Build Coastguard Worker                      f2Pos.position, f2Pos.affinity == Affinity::kUpstream ? "up" : "down",
2018*c8dee2aaSAndroid Build Coastguard Worker                      iPos.position, iPos.affinity == Affinity::kUpstream ? "up" : "down");
2019*c8dee2aaSAndroid Build Coastguard Worker 
2020*c8dee2aaSAndroid Build Coastguard Worker             auto f1 = paragraph->getRectsForRange(0, 1, RectHeightStyle::kTight,
2021*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
2022*c8dee2aaSAndroid Build Coastguard Worker             if (f1.empty()) {
2023*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("F1 is empty\n");
2024*c8dee2aaSAndroid Build Coastguard Worker             } else {
2025*c8dee2aaSAndroid Build Coastguard Worker                 auto rf1 = f1[0];
2026*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("f1: [%f:%f] %s\n", rf1.rect.fLeft, rf1.rect.fRight,
2027*c8dee2aaSAndroid Build Coastguard Worker                                              rf1.direction == TextDirection::kRtl ? "rtl" : "ltr");
2028*c8dee2aaSAndroid Build Coastguard Worker             }
2029*c8dee2aaSAndroid Build Coastguard Worker 
2030*c8dee2aaSAndroid Build Coastguard Worker             auto f2 = paragraph->getRectsForRange(1, 2, RectHeightStyle::kTight,
2031*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
2032*c8dee2aaSAndroid Build Coastguard Worker             if (f2.empty()) {
2033*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("F2 is empty\n");
2034*c8dee2aaSAndroid Build Coastguard Worker             } else {
2035*c8dee2aaSAndroid Build Coastguard Worker                 auto rf2 = f2[0];
2036*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("f2: [%f:%f] %s\n", rf2.rect.fLeft, rf2.rect.fRight,
2037*c8dee2aaSAndroid Build Coastguard Worker                                              rf2.direction == TextDirection::kRtl ? "rtl" : "ltr");
2038*c8dee2aaSAndroid Build Coastguard Worker             }
2039*c8dee2aaSAndroid Build Coastguard Worker 
2040*c8dee2aaSAndroid Build Coastguard Worker             auto fi = paragraph->getRectsForRange(2, 3, RectHeightStyle::kTight,
2041*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
2042*c8dee2aaSAndroid Build Coastguard Worker             if (fi.empty()) {
2043*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("FI is empty\n");
2044*c8dee2aaSAndroid Build Coastguard Worker             } else {
2045*c8dee2aaSAndroid Build Coastguard Worker                 auto rfi = fi[0];
2046*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("i:  [%f:%f] %s\n", rfi.rect.fLeft, rfi.rect.fRight,
2047*c8dee2aaSAndroid Build Coastguard Worker                                              rfi.direction == TextDirection::kRtl ? "rtl" : "ltr");
2048*c8dee2aaSAndroid Build Coastguard Worker             }
2049*c8dee2aaSAndroid Build Coastguard Worker         }
2050*c8dee2aaSAndroid Build Coastguard Worker     }
2051*c8dee2aaSAndroid Build Coastguard Worker };
2052*c8dee2aaSAndroid Build Coastguard Worker 
2053*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide30 : public ParagraphSlide_Base {
2054*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide30()2055*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide30() { fName = "Paragraph30"; }
2056*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2057*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2058*c8dee2aaSAndroid Build Coastguard Worker 
2059*c8dee2aaSAndroid Build Coastguard Worker         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";
2060*c8dee2aaSAndroid Build Coastguard Worker         u"\U0001f469\u200D\U0001f469\u200D\U0001f466\U0001f469\u200D\U0001f469\u200D\U0001f467\u200D\U0001f467\U0001f1fa\U0001f1f8";
2061*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2062*c8dee2aaSAndroid Build Coastguard Worker 
2063*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2064*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2065*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2066*c8dee2aaSAndroid Build Coastguard Worker 
2067*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2068*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2069*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2070*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2071*c8dee2aaSAndroid Build Coastguard Worker         //text_style.setFontFamilies({SkString("Noto Color Emoji")});
2072*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Ahem")});
2073*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(14);
2074*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2075*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
2076*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2077*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
2078*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2079*c8dee2aaSAndroid Build Coastguard Worker         std::pair<size_t, size_t> rects[] = {
2080*c8dee2aaSAndroid Build Coastguard Worker             { 0, 2}, { 0, 4}, {0, 8},
2081*c8dee2aaSAndroid Build Coastguard Worker             {23, 25}, {23, 27}, {23, 31}, {23, 39}, {23, 55}, {21, 23},
2082*c8dee2aaSAndroid Build Coastguard Worker             {1, 3}, {1, 5}, {1, 9}, {1, 17}, {1, 33},
2083*c8dee2aaSAndroid Build Coastguard Worker             { 2, 4}, {2, 6}, {2, 10}, {2, 18}, {2, 34},
2084*c8dee2aaSAndroid Build Coastguard Worker             {3, 5}, {3, 7}, {3, 11}, {3, 19},
2085*c8dee2aaSAndroid Build Coastguard Worker             {4, 6}, {4, 8}, {4, 12}, {4, 20},
2086*c8dee2aaSAndroid Build Coastguard Worker             {5, 7}, {5, 9}, {5, 13}, {5, 21},
2087*c8dee2aaSAndroid Build Coastguard Worker             {6, 8}, {6, 10}, {6, 14}, {6, 22},
2088*c8dee2aaSAndroid Build Coastguard Worker             {7, 9}, {7, 11}, {7, 15}, {7, 23},
2089*c8dee2aaSAndroid Build Coastguard Worker             {8, 10}, {8, 12}, {8, 16}, {8,24},
2090*c8dee2aaSAndroid Build Coastguard Worker             {9, 11}, {9, 13}, {9, 17}, {9, 25},
2091*c8dee2aaSAndroid Build Coastguard Worker             {10, 12}, {10, 14}, {10, 18}, {10, 26},
2092*c8dee2aaSAndroid Build Coastguard Worker             {11, 13}, {11, 15}, {11, 19}, {11, 27},
2093*c8dee2aaSAndroid Build Coastguard Worker             {12, 14}, {12, 16}, {12, 20}, {12, 28},
2094*c8dee2aaSAndroid Build Coastguard Worker             {13, 15}, {13, 17}, {13, 21},
2095*c8dee2aaSAndroid Build Coastguard Worker             {14, 16}, {14, 18}, {14, 22},
2096*c8dee2aaSAndroid Build Coastguard Worker             {15, 17}, {15, 19}, {15, 23},
2097*c8dee2aaSAndroid Build Coastguard Worker             {16, 18}, {16, 20}, {16, 24},
2098*c8dee2aaSAndroid Build Coastguard Worker             {17, 19}, {17, 21},
2099*c8dee2aaSAndroid Build Coastguard Worker             {18, 20}, {18, 22},
2100*c8dee2aaSAndroid Build Coastguard Worker             {19, 21},
2101*c8dee2aaSAndroid Build Coastguard Worker             {20, 22}, {20, 24},
2102*c8dee2aaSAndroid Build Coastguard Worker             {21, 23},
2103*c8dee2aaSAndroid Build Coastguard Worker             {22, 24}, {22, 26}, {22, 30}, {22, 38}, {22, 54},
2104*c8dee2aaSAndroid Build Coastguard Worker             {20, 22},
2105*c8dee2aaSAndroid Build Coastguard Worker             {18, 22},
2106*c8dee2aaSAndroid Build Coastguard Worker         };
2107*c8dee2aaSAndroid Build Coastguard Worker         for (auto rect: rects) {
2108*c8dee2aaSAndroid Build Coastguard Worker             auto results = paragraph->getRectsForRange(
2109*c8dee2aaSAndroid Build Coastguard Worker                     rect.first, rect.second, RectHeightStyle::kTight, RectWidthStyle::kTight);
2110*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("[%zu : %zu) ", rect.first, rect.second);
2111*c8dee2aaSAndroid Build Coastguard Worker             if (!results.empty()) {
2112*c8dee2aaSAndroid Build Coastguard Worker                 SkASSERT(results.size() == 1);
2113*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("[%f : %f]\n", results[0].rect.fLeft,results[0].rect.fRight);
2114*c8dee2aaSAndroid Build Coastguard Worker             }
2115*c8dee2aaSAndroid Build Coastguard Worker         }
2116*c8dee2aaSAndroid Build Coastguard Worker     }
2117*c8dee2aaSAndroid Build Coastguard Worker };
2118*c8dee2aaSAndroid Build Coastguard Worker 
2119*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide31 : public ParagraphSlide_Base {
2120*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide31()2121*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide31() { fName = "Paragraph31"; }
2122*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2123*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2124*c8dee2aaSAndroid Build Coastguard Worker 
2125*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2126*c8dee2aaSAndroid Build Coastguard Worker 
2127*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2128*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2129*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2130*c8dee2aaSAndroid Build Coastguard Worker 
2131*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2132*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2133*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2134*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2135*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
2136*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(40);
2137*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2138*c8dee2aaSAndroid Build Coastguard Worker         auto s = u"েن েূথ";
2139*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(s);
2140*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2141*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
2142*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2143*c8dee2aaSAndroid Build Coastguard Worker     }
2144*c8dee2aaSAndroid Build Coastguard Worker };
2145*c8dee2aaSAndroid Build Coastguard Worker 
2146*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide32 : public ParagraphSlide_Base {
2147*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide32()2148*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide32() { fName = "Paragraph32"; }
2149*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2150*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2151*c8dee2aaSAndroid Build Coastguard Worker 
2152*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2153*c8dee2aaSAndroid Build Coastguard Worker 
2154*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2155*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2156*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2157*c8dee2aaSAndroid Build Coastguard Worker 
2158*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2159*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2160*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2161*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2162*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
2163*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(40);
2164*c8dee2aaSAndroid Build Coastguard Worker         text_style.setLocale(SkString("ko"));
2165*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2166*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(u"\u904d ko ");
2167*c8dee2aaSAndroid Build Coastguard Worker         text_style.setLocale(SkString("zh_Hant"));
2168*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2169*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(u"\u904d zh-Hant ");
2170*c8dee2aaSAndroid Build Coastguard Worker         text_style.setLocale(SkString("zh_Hans"));
2171*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2172*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(u"\u904d zh-Hans ");
2173*c8dee2aaSAndroid Build Coastguard Worker         text_style.setLocale(SkString("zh_HK"));
2174*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2175*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(u"\u904d zh-HK ");
2176*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2177*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
2178*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2179*c8dee2aaSAndroid Build Coastguard Worker     }
2180*c8dee2aaSAndroid Build Coastguard Worker };
2181*c8dee2aaSAndroid Build Coastguard Worker 
2182*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide33 : public ParagraphSlide_Base {
2183*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide33()2184*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide33() { fName = "Paragraph33"; }
2185*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2186*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2187*c8dee2aaSAndroid Build Coastguard Worker 
2188*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2189*c8dee2aaSAndroid Build Coastguard Worker 
2190*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2191*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2192*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2193*c8dee2aaSAndroid Build Coastguard Worker 
2194*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2195*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextAlign(TextAlign::kJustify);
2196*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2197*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2198*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2199*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto"), SkString("Noto Color Emoji")});
2200*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(36);
2201*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2202*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(u"AAAAA \U0001f600 BBBBB CCCCC DDDDD EEEEE");
2203*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2204*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width() / 2);
2205*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
2206*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(SK_ColorLTGRAY);
2207*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawRect(SkRect::MakeXYWH(0, 0, this->size().width()/2, paragraph->getHeight()),
2208*c8dee2aaSAndroid Build Coastguard Worker                          paint);
2209*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2210*c8dee2aaSAndroid Build Coastguard Worker     }
2211*c8dee2aaSAndroid Build Coastguard Worker };
2212*c8dee2aaSAndroid Build Coastguard Worker 
2213*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide34 : public ParagraphSlide_Base {
2214*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide34()2215*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide34() { fName = "Paragraph34"; }
2216*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2217*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2218*c8dee2aaSAndroid Build Coastguard Worker 
2219*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2220*c8dee2aaSAndroid Build Coastguard Worker         auto text = "ضخمة ص ،������ضضض ؤ،،��������شسي،������ؤرى،��������ببب،����������ثيلااتن";
2221*c8dee2aaSAndroid Build Coastguard Worker         //auto text = "ى،��������بب";
2222*c8dee2aaSAndroid Build Coastguard Worker         //auto text1 = "World domination is such an ugly phrase - I prefer to call it world optimisation";
2223*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2224*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2225*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2226*c8dee2aaSAndroid Build Coastguard Worker 
2227*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2228*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2229*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2230*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2231*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Noto Color Emoji")});
2232*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(50);
2233*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2234*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
2235*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2236*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(1041); // 1041
2237*c8dee2aaSAndroid Build Coastguard Worker 
2238*c8dee2aaSAndroid Build Coastguard Worker         SkColor colors[] = {SK_ColorBLUE, SK_ColorCYAN,  SK_ColorLTGRAY, SK_ColorGREEN,
2239*c8dee2aaSAndroid Build Coastguard Worker                             SK_ColorRED,  SK_ColorWHITE, SK_ColorYELLOW, SK_ColorMAGENTA };
2240*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
2241*c8dee2aaSAndroid Build Coastguard Worker         size_t wordPos = 0;
2242*c8dee2aaSAndroid Build Coastguard Worker         size_t index = 0;
2243*c8dee2aaSAndroid Build Coastguard Worker         while (wordPos < 72) {
2244*c8dee2aaSAndroid Build Coastguard Worker             auto res2 = paragraph->getWordBoundary(wordPos);
2245*c8dee2aaSAndroid Build Coastguard Worker             if (res2.width() == 0) {
2246*c8dee2aaSAndroid Build Coastguard Worker                 break;
2247*c8dee2aaSAndroid Build Coastguard Worker             }
2248*c8dee2aaSAndroid Build Coastguard Worker             wordPos = res2.end;
2249*c8dee2aaSAndroid Build Coastguard Worker             auto res3 = paragraph->getRectsForRange(
2250*c8dee2aaSAndroid Build Coastguard Worker                     res2.start, res2.end,
2251*c8dee2aaSAndroid Build Coastguard Worker                     RectHeightStyle::kTight, RectWidthStyle::kTight);
2252*c8dee2aaSAndroid Build Coastguard Worker             paint.setColor(colors[index % 8]);
2253*c8dee2aaSAndroid Build Coastguard Worker             ++index;
2254*c8dee2aaSAndroid Build Coastguard Worker             if (!res3.empty()) {
2255*c8dee2aaSAndroid Build Coastguard Worker                 canvas->drawRect(res3[0].rect, paint);
2256*c8dee2aaSAndroid Build Coastguard Worker             }
2257*c8dee2aaSAndroid Build Coastguard Worker         }
2258*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2259*c8dee2aaSAndroid Build Coastguard Worker     }
2260*c8dee2aaSAndroid Build Coastguard Worker };
2261*c8dee2aaSAndroid Build Coastguard Worker 
2262*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide35 : public ParagraphSlide_Base {
2263*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide35()2264*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide35() { fName = "Paragraph35"; }
2265*c8dee2aaSAndroid Build Coastguard Worker 
onFindClickHandler(SkScalar x,SkScalar y,skui::ModifierKey modi)2266*c8dee2aaSAndroid Build Coastguard Worker     Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
2267*c8dee2aaSAndroid Build Coastguard Worker         return new Click;
2268*c8dee2aaSAndroid Build Coastguard Worker     }
2269*c8dee2aaSAndroid Build Coastguard Worker 
onClick(Click * click)2270*c8dee2aaSAndroid Build Coastguard Worker     bool onClick(Click* click) override {
2271*c8dee2aaSAndroid Build Coastguard Worker         fPoint = click->fCurr;
2272*c8dee2aaSAndroid Build Coastguard Worker         return true;
2273*c8dee2aaSAndroid Build Coastguard Worker     }
2274*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2275*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2276*c8dee2aaSAndroid Build Coastguard Worker 
2277*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2278*c8dee2aaSAndroid Build Coastguard Worker 
2279*c8dee2aaSAndroid Build Coastguard Worker         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";
2280*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2281*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2282*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2283*c8dee2aaSAndroid Build Coastguard Worker 
2284*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2285*c8dee2aaSAndroid Build Coastguard Worker         //paragraph_style.setTextAlign(TextAlign::kJustify);
2286*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2287*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2288*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2289*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto"), SkString("Noto Color Emoji")});
2290*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(40);
2291*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2292*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
2293*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2294*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());//758
2295*c8dee2aaSAndroid Build Coastguard Worker 
2296*c8dee2aaSAndroid Build Coastguard Worker         //auto res1 = paragraph->getGlyphPositionAtCoordinate(line.width() + line.spacesWidth() / 2, line.offset().fY + 10);
2297*c8dee2aaSAndroid Build Coastguard Worker         //auto res2 = paragraph->getWordBoundary(res1.position);
2298*c8dee2aaSAndroid Build Coastguard Worker         auto res1 = paragraph->getRectsForRange(360, 361, RectHeightStyle::kTight, RectWidthStyle::kTight);
2299*c8dee2aaSAndroid Build Coastguard Worker         auto res2 = paragraph->getRectsForRange(359, 360, RectHeightStyle::kTight, RectWidthStyle::kTight);
2300*c8dee2aaSAndroid Build Coastguard Worker         auto res3 = paragraph->getRectsForRange(358, 359, RectHeightStyle::kTight, RectWidthStyle::kTight);
2301*c8dee2aaSAndroid Build Coastguard Worker 
2302*c8dee2aaSAndroid Build Coastguard Worker         auto draw = [&](const std::vector<TextBox>& res, SkColor color) {
2303*c8dee2aaSAndroid Build Coastguard Worker             SkPaint paint;
2304*c8dee2aaSAndroid Build Coastguard Worker             paint.setColor(color);
2305*c8dee2aaSAndroid Build Coastguard Worker             for (auto& r : res) {
2306*c8dee2aaSAndroid Build Coastguard Worker                 canvas->drawRect(r.rect, paint);
2307*c8dee2aaSAndroid Build Coastguard Worker             }
2308*c8dee2aaSAndroid Build Coastguard Worker         };
2309*c8dee2aaSAndroid Build Coastguard Worker 
2310*c8dee2aaSAndroid Build Coastguard Worker         draw(res1, SK_ColorRED);
2311*c8dee2aaSAndroid Build Coastguard Worker         draw(res2, SK_ColorGREEN);
2312*c8dee2aaSAndroid Build Coastguard Worker         draw(res3, SK_ColorBLUE);
2313*c8dee2aaSAndroid Build Coastguard Worker 
2314*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2315*c8dee2aaSAndroid Build Coastguard Worker     }
2316*c8dee2aaSAndroid Build Coastguard Worker 
2317*c8dee2aaSAndroid Build Coastguard Worker private:
2318*c8dee2aaSAndroid Build Coastguard Worker     SkPoint fPoint;
2319*c8dee2aaSAndroid Build Coastguard Worker };
2320*c8dee2aaSAndroid Build Coastguard Worker 
2321*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide36 : public ParagraphSlide_Base {
2322*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide36()2323*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide36() { fName = "Paragraph36"; }
2324*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2325*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2326*c8dee2aaSAndroid Build Coastguard Worker 
2327*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2328*c8dee2aaSAndroid Build Coastguard Worker         auto text = "String is too big for WinMSVC";
2329*c8dee2aaSAndroid Build Coastguard Worker         //"সৢ৭ঙ া 七七去关谢都四先么见香认东 غلضينخي 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 字弟是去妈京学地";
2330*c8dee2aaSAndroid Build Coastguard Worker         //"ي ز";
2331*c8dee2aaSAndroid Build Coastguard Worker         //"৪৮ু৸ধ maar";
2332*c8dee2aaSAndroid Build Coastguard Worker         //"四的 ذخص  ৢঙ";
2333*c8dee2aaSAndroid Build Coastguard Worker         //"ذخص  ৢঙ";
2334*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2335*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2336*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2337*c8dee2aaSAndroid Build Coastguard Worker 
2338*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2339*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2340*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2341*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2342*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto"), SkString("Noto Serif CJK JP")});
2343*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(10);
2344*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2345*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
2346*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2347*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
2348*c8dee2aaSAndroid Build Coastguard Worker 
2349*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2350*c8dee2aaSAndroid Build Coastguard Worker     }
2351*c8dee2aaSAndroid Build Coastguard Worker };
2352*c8dee2aaSAndroid Build Coastguard Worker 
2353*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide37 : public ParagraphSlide_Base {
2354*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide37()2355*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide37() { fName = "Paragraph37"; }
2356*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2357*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2358*c8dee2aaSAndroid Build Coastguard Worker         const char* text = "String is too big for WinMSVC";
2359*c8dee2aaSAndroid Build Coastguard Worker                 // "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaয়ৠঝোণ৺ঢ়মৈবৗৗঘথফড়৭২খসঢ়ৃঢ়ঁ৷থডঈঽলবনদ২ৢৃঀজঝ৩ঠ৪৫৯০ঌয়্মওৗ৲গখদ৹ঈ৴৹ঢ়ৄএৡফণহলঈ৲থজোৱে ঀকৰঀষজঝঃাখশঽএমংি";
2360*c8dee2aaSAndroid Build Coastguard Worker                 //"ৎৣ়ৎঽতঃ৳্ৱব৴ৣঈ৷ূঁঢঢ়শটডৎ৵৵ৰৃ্দংঊাথৗদঊউদ৯ঐৃধা৬হওধি়৭ঽম৯স০ঢফৈঢ়কষঁছফীআে৶ৰ৶ঌৌঊ্ঊঝএঀঃদঞ৮তব৬ৄঊঙঢ়ৡগ৶৹৹ঌড়ঘৄ৷লপ১ভড়৶েঢ়৯ৎকনংট২ংএঢৌৌঐনো০টঽুৠগআ৷৭৩৬তো৻ঈ০ূসষঅঝআমণঔা১ণৈো৵চঽ৩বমৎঙঘ২ঠৠৈী৫তঌণচ৲ঔী৮ঘৰঔ";
2361*c8dee2aaSAndroid Build Coastguard Worker          canvas->drawColor(SK_ColorWHITE);
2362*c8dee2aaSAndroid Build Coastguard Worker 
2363*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2364*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2365*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2366*c8dee2aaSAndroid Build Coastguard Worker 
2367*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2368*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2369*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2370*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2371*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
2372*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(20);
2373*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2374*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
2375*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2376*c8dee2aaSAndroid Build Coastguard Worker         auto w = this->size().width() / 2;
2377*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(w);
2378*c8dee2aaSAndroid Build Coastguard Worker         auto impl = static_cast<ParagraphImpl*>(paragraph.get());
2379*c8dee2aaSAndroid Build Coastguard Worker 
2380*c8dee2aaSAndroid Build Coastguard Worker         auto clusters = impl->clusters();
2381*c8dee2aaSAndroid Build Coastguard Worker         if (this->isVerbose()) {
2382*c8dee2aaSAndroid Build Coastguard Worker             size_t c = 0;
2383*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("clusters\n");
2384*c8dee2aaSAndroid Build Coastguard Worker             for (auto& cluster: clusters) {
2385*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("%zu: [%zu:%zu) %s\n", c++,
2386*c8dee2aaSAndroid Build Coastguard Worker                          cluster.textRange().start, cluster.textRange().end,
2387*c8dee2aaSAndroid Build Coastguard Worker                          cluster.isSoftBreak() ? "soft" :
2388*c8dee2aaSAndroid Build Coastguard Worker                          cluster.isHardBreak() ? "hard" :
2389*c8dee2aaSAndroid Build Coastguard Worker                          cluster.isWhitespaceBreak() ? "spaces" : "");
2390*c8dee2aaSAndroid Build Coastguard Worker             }
2391*c8dee2aaSAndroid Build Coastguard Worker 
2392*c8dee2aaSAndroid Build Coastguard Worker             auto lines = impl->lines();
2393*c8dee2aaSAndroid Build Coastguard Worker             size_t i = 0;
2394*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("lines\n");
2395*c8dee2aaSAndroid Build Coastguard Worker             for (auto& line : lines) {
2396*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("%zu: [%zu:%zu)\n", i++, line.trimmedText().start, line.trimmedText().end);
2397*c8dee2aaSAndroid Build Coastguard Worker             }
2398*c8dee2aaSAndroid Build Coastguard Worker         }
2399*c8dee2aaSAndroid Build Coastguard Worker 
2400*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2401*c8dee2aaSAndroid Build Coastguard Worker     }
2402*c8dee2aaSAndroid Build Coastguard Worker };
2403*c8dee2aaSAndroid Build Coastguard Worker 
2404*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide38 : public ParagraphSlide_Base {
2405*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide38()2406*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide38() { fName = "Paragraph38"; }
2407*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2408*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2409*c8dee2aaSAndroid Build Coastguard Worker 
2410*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2411*c8dee2aaSAndroid Build Coastguard Worker 
2412*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2413*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2414*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2415*c8dee2aaSAndroid Build Coastguard Worker 
2416*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2417*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextAlign(TextAlign::kLeft);
2418*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2419*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2420*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorDKGRAY);
2421*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
2422*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(40);
2423*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecoration(TextDecoration::kUnderline);
2424*c8dee2aaSAndroid Build Coastguard Worker 
2425*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationMode(TextDecorationMode::kThrough);
2426*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationStyle(TextDecorationStyle::kDouble);
2427*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationColor(SK_ColorBLUE);
2428*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2429*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("Double underline: {opopo}\n");
2430*c8dee2aaSAndroid Build Coastguard Worker 
2431*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationMode(TextDecorationMode::kGaps);
2432*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationStyle(TextDecorationStyle::kDouble);
2433*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationColor(SK_ColorBLUE);
2434*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2435*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("Double underline: {opopo}\n");
2436*c8dee2aaSAndroid Build Coastguard Worker 
2437*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationStyle(TextDecorationStyle::kDotted);
2438*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationColor(SK_ColorRED);
2439*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2440*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("Dotted underline: {ijiji}\n");
2441*c8dee2aaSAndroid Build Coastguard Worker 
2442*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationStyle(TextDecorationStyle::kSolid);
2443*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationColor(SK_ColorGREEN);
2444*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2445*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("Solid underline: {rqrqr}\n");
2446*c8dee2aaSAndroid Build Coastguard Worker 
2447*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationStyle(TextDecorationStyle::kDashed);
2448*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationColor(SK_ColorMAGENTA);
2449*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2450*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("Dashed underline: {zyzyz}\n");
2451*c8dee2aaSAndroid Build Coastguard Worker 
2452*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationStyle(TextDecorationStyle::kWavy);
2453*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationColor(SK_ColorCYAN);
2454*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2455*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("Wavy underline: {does not skip}\n");
2456*c8dee2aaSAndroid Build Coastguard Worker 
2457*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2458*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
2459*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2460*c8dee2aaSAndroid Build Coastguard Worker     }
2461*c8dee2aaSAndroid Build Coastguard Worker };
2462*c8dee2aaSAndroid Build Coastguard Worker 
2463*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide39 : public ParagraphSlide_Base {
2464*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide39()2465*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide39() { fName = "Paragraph39"; }
2466*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2467*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2468*c8dee2aaSAndroid Build Coastguard Worker 
2469*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2470*c8dee2aaSAndroid Build Coastguard Worker 
2471*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2472*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2473*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2474*c8dee2aaSAndroid Build Coastguard Worker 
2475*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2476*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextAlign(TextAlign::kJustify);
2477*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2478*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2479*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2480*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
2481*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(40);
2482*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2483*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(
2484*c8dee2aaSAndroid Build Coastguard Worker             "text1 with line break\n"
2485*c8dee2aaSAndroid Build Coastguard Worker             "text2 without line break text without line break text without line break text without line break text without line break text without line break "
2486*c8dee2aaSAndroid Build Coastguard Worker             "text3 with line break\n"
2487*c8dee2aaSAndroid Build Coastguard Worker             "text4 without line break text without line break text without line break text without line break text without line break text without line break "
2488*c8dee2aaSAndroid Build Coastguard Worker             "text5 with line break\n"
2489*c8dee2aaSAndroid Build Coastguard Worker         );
2490*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2491*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
2492*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2493*c8dee2aaSAndroid Build Coastguard Worker     }
2494*c8dee2aaSAndroid Build Coastguard Worker };
2495*c8dee2aaSAndroid Build Coastguard Worker 
2496*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide41 : public ParagraphSlide_Base {
2497*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide41()2498*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide41() { fName = "Paragraph41"; }
2499*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2500*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2501*c8dee2aaSAndroid Build Coastguard Worker 
2502*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2503*c8dee2aaSAndroid Build Coastguard Worker 
2504*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2505*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2506*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2507*c8dee2aaSAndroid Build Coastguard Worker 
2508*c8dee2aaSAndroid Build Coastguard Worker         SkPaint line;
2509*c8dee2aaSAndroid Build Coastguard Worker         line.setColor(SK_ColorRED);
2510*c8dee2aaSAndroid Build Coastguard Worker         line.setStyle(SkPaint::kStroke_Style);
2511*c8dee2aaSAndroid Build Coastguard Worker         line.setAntiAlias(true);
2512*c8dee2aaSAndroid Build Coastguard Worker         line.setStrokeWidth(1);
2513*c8dee2aaSAndroid Build Coastguard Worker 
2514*c8dee2aaSAndroid Build Coastguard Worker         auto draw = [&](SkColor color, TextHeightBehavior thb) {
2515*c8dee2aaSAndroid Build Coastguard Worker             ParagraphStyle paragraph_style;
2516*c8dee2aaSAndroid Build Coastguard Worker             paragraph_style.setTextHeightBehavior(thb);
2517*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2518*c8dee2aaSAndroid Build Coastguard Worker             TextStyle text_style;
2519*c8dee2aaSAndroid Build Coastguard Worker             text_style.setColor(SK_ColorBLACK);
2520*c8dee2aaSAndroid Build Coastguard Worker             SkPaint paint;
2521*c8dee2aaSAndroid Build Coastguard Worker             paint.setColor(color);
2522*c8dee2aaSAndroid Build Coastguard Worker             text_style.setBackgroundColor(paint);
2523*c8dee2aaSAndroid Build Coastguard Worker             text_style.setFontFamilies({SkString("Roboto")});
2524*c8dee2aaSAndroid Build Coastguard Worker             text_style.setFontSize(20);
2525*c8dee2aaSAndroid Build Coastguard Worker             text_style.setHeight(5);
2526*c8dee2aaSAndroid Build Coastguard Worker             text_style.setHeightOverride(true);
2527*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
2528*c8dee2aaSAndroid Build Coastguard Worker             builder.addText("World domination is such an ugly phrase - I prefer to call it world optimisation");
2529*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
2530*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(this->size().width());
2531*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
2532*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawLine(0, paragraph->getHeight(), paragraph->getMaxWidth(), paragraph->getHeight(), line);
2533*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(0, paragraph->getHeight());
2534*c8dee2aaSAndroid Build Coastguard Worker         };
2535*c8dee2aaSAndroid Build Coastguard Worker 
2536*c8dee2aaSAndroid Build Coastguard Worker         draw(SK_ColorLTGRAY, TextHeightBehavior::kDisableFirstAscent);
2537*c8dee2aaSAndroid Build Coastguard Worker         draw(SK_ColorYELLOW, TextHeightBehavior::kDisableLastDescent);
2538*c8dee2aaSAndroid Build Coastguard Worker         draw(SK_ColorGRAY, TextHeightBehavior::kDisableAll);
2539*c8dee2aaSAndroid Build Coastguard Worker 
2540*c8dee2aaSAndroid Build Coastguard Worker     }
2541*c8dee2aaSAndroid Build Coastguard Worker };
2542*c8dee2aaSAndroid Build Coastguard Worker 
2543*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide42 : public ParagraphSlide_Base {
2544*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide42()2545*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide42() { fName = "Paragraph42"; }
2546*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2547*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2548*c8dee2aaSAndroid Build Coastguard Worker 
2549*c8dee2aaSAndroid Build Coastguard Worker         SkString text("Atwater Peel Sherbrooke Bonaventure\nhi\nwasssup!");
2550*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2551*c8dee2aaSAndroid Build Coastguard Worker 
2552*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), true, true);
2553*c8dee2aaSAndroid Build Coastguard Worker 
2554*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2555*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2556*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2557*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2558*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Ahem")});
2559*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(16);
2560*c8dee2aaSAndroid Build Coastguard Worker         text_style.setHeight(4);
2561*c8dee2aaSAndroid Build Coastguard Worker         text_style.setHeightOverride(true);
2562*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2563*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text.c_str());
2564*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2565*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
2566*c8dee2aaSAndroid Build Coastguard Worker 
2567*c8dee2aaSAndroid Build Coastguard Worker         auto boxes = paragraph->getRectsForRange(0, 7, RectHeightStyle::kIncludeLineSpacingTop, RectWidthStyle::kMax);
2568*c8dee2aaSAndroid Build Coastguard Worker         for (auto& box : boxes) {
2569*c8dee2aaSAndroid Build Coastguard Worker             SkPaint paint;
2570*c8dee2aaSAndroid Build Coastguard Worker             paint.setColor(SK_ColorGRAY);
2571*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRect(box.rect, paint);
2572*c8dee2aaSAndroid Build Coastguard Worker         }
2573*c8dee2aaSAndroid Build Coastguard Worker 
2574*c8dee2aaSAndroid Build Coastguard Worker         auto boxes2 = paragraph->getRectsForRange(0, 7, RectHeightStyle::kTight, RectWidthStyle::kMax);
2575*c8dee2aaSAndroid Build Coastguard Worker         for (auto& box : boxes2) {
2576*c8dee2aaSAndroid Build Coastguard Worker             SkPaint paint;
2577*c8dee2aaSAndroid Build Coastguard Worker             paint.setColor(SK_ColorRED);
2578*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRect(box.rect, paint);
2579*c8dee2aaSAndroid Build Coastguard Worker         }
2580*c8dee2aaSAndroid Build Coastguard Worker 
2581*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2582*c8dee2aaSAndroid Build Coastguard Worker     }
2583*c8dee2aaSAndroid Build Coastguard Worker };
2584*c8dee2aaSAndroid Build Coastguard Worker 
2585*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide43 : public ParagraphSlide_Base {
2586*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide43()2587*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide43() { fName = "Paragraph43"; }
2588*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2589*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2590*c8dee2aaSAndroid Build Coastguard Worker 
2591*c8dee2aaSAndroid Build Coastguard Worker         SkString text("World domination is such an ugly phrase - I prefer to call it world optimisation");
2592*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2593*c8dee2aaSAndroid Build Coastguard Worker 
2594*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2595*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2596*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2597*c8dee2aaSAndroid Build Coastguard Worker 
2598*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2599*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextAlign(TextAlign::kJustify);
2600*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setEllipsis(u"\u2026");
2601*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setMaxLines(2);
2602*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2603*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2604*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2605*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
2606*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(40);
2607*c8dee2aaSAndroid Build Coastguard Worker         text_style.setHeightOverride(true);
2608*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2609*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text.c_str());
2610*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2611*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width() / 4);
2612*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2613*c8dee2aaSAndroid Build Coastguard Worker     }
2614*c8dee2aaSAndroid Build Coastguard Worker };
2615*c8dee2aaSAndroid Build Coastguard Worker 
2616*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide44 : public ParagraphSlide_Base {
2617*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide44()2618*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide44() { fName = "Paragraph44"; }
2619*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2620*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2621*c8dee2aaSAndroid Build Coastguard Worker 
2622*c8dee2aaSAndroid Build Coastguard Worker         const std::u16string text = u"The quick brown fox \U0001f98a ate a zesty ham burger fons \U0001f354."
2623*c8dee2aaSAndroid Build Coastguard Worker                                     "The \U0001f469\u200D\U0001f469\u200D\U0001f467\u200D\U0001f467 laughed.";
2624*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2625*c8dee2aaSAndroid Build Coastguard Worker 
2626*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2627*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2628*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2629*c8dee2aaSAndroid Build Coastguard Worker 
2630*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2631*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setMaxLines(7);
2632*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setEllipsis(u"\u2026");
2633*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2634*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2635*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2636*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto"), SkString("Noto Color Emoji")});
2637*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(60);
2638*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2639*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
2640*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2641*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(305);//width());
2642*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2643*c8dee2aaSAndroid Build Coastguard Worker     }
2644*c8dee2aaSAndroid Build Coastguard Worker };
2645*c8dee2aaSAndroid Build Coastguard Worker 
2646*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide45 : public ParagraphSlide_Base {
2647*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide45()2648*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide45() { fName = "Paragraph45"; }
2649*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2650*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2651*c8dee2aaSAndroid Build Coastguard Worker 
2652*c8dee2aaSAndroid Build Coastguard Worker       // This test crashed when resources/fonts directory had only 5 fonts listed below
2653*c8dee2aaSAndroid Build Coastguard Worker       std::string fonts = GetResourcePath("fonts/").c_str();
2654*c8dee2aaSAndroid Build Coastguard Worker       std::set<std::pair<std::string, std::string>> font_paths = {
2655*c8dee2aaSAndroid Build Coastguard Worker           {"Roboto", "Roboto-Regular.ttf"},
2656*c8dee2aaSAndroid Build Coastguard Worker           {"Roboto", "Roboto-Bold.ttf"},
2657*c8dee2aaSAndroid Build Coastguard Worker           {"Noto","NotoSansCJK-Regular.ttc"},
2658*c8dee2aaSAndroid Build Coastguard Worker           {"Noto", "NotoSansCJK-Bold.ttc"},
2659*c8dee2aaSAndroid Build Coastguard Worker           {"Emoji","NotoColorEmoji.ttf"}};
2660*c8dee2aaSAndroid Build Coastguard Worker 
2661*c8dee2aaSAndroid Build Coastguard Worker       sk_sp<TypefaceFontProvider> font_provider = sk_make_sp<TypefaceFontProvider>();
2662*c8dee2aaSAndroid Build Coastguard Worker 
2663*c8dee2aaSAndroid Build Coastguard Worker       for (auto& pair : font_paths) {
2664*c8dee2aaSAndroid Build Coastguard Worker         SkString family_name = SkString(pair.first.c_str());
2665*c8dee2aaSAndroid Build Coastguard Worker         std::string path = fonts;
2666*c8dee2aaSAndroid Build Coastguard Worker         path += pair.second;
2667*c8dee2aaSAndroid Build Coastguard Worker 
2668*c8dee2aaSAndroid Build Coastguard Worker         auto data = SkData::MakeFromFileName(path.c_str());
2669*c8dee2aaSAndroid Build Coastguard Worker         font_provider->registerTypeface(ToolUtils::TestFontMgr()->makeFromData(std::move(data)),
2670*c8dee2aaSAndroid Build Coastguard Worker                                         family_name);
2671*c8dee2aaSAndroid Build Coastguard Worker       }
2672*c8dee2aaSAndroid Build Coastguard Worker 
2673*c8dee2aaSAndroid Build Coastguard Worker       sk_sp<FontCollection> font_collection = sk_make_sp<FontCollection>();
2674*c8dee2aaSAndroid Build Coastguard Worker       font_collection->setAssetFontManager(std::move(font_provider));
2675*c8dee2aaSAndroid Build Coastguard Worker       font_collection->getParagraphCache()->turnOn(false);
2676*c8dee2aaSAndroid Build Coastguard Worker 
2677*c8dee2aaSAndroid Build Coastguard Worker         const std::u16string text = u"❤️����‍♀️ ���� ����‍⚕️ ����‍⚕️ ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍�� ����‍✈️ ����‍✈️ ����‍�� ����‍�� ����‍⚖️ ����‍⚖️ ���� ����";
2678*c8dee2aaSAndroid Build Coastguard Worker             //u"\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC66\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC67\u200D\uD83D\uDC67\uD83C\uDDFA\uD83C\uDDF8";
2679*c8dee2aaSAndroid Build Coastguard Worker 
2680*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2681*c8dee2aaSAndroid Build Coastguard Worker 
2682*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2683*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setMaxLines(1);
2684*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setHeight(0);
2685*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setEllipsis(u"\u2026");
2686*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, font_collection, get_unicode());
2687*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2688*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2689*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto"), SkString("Noto"), SkString("Emoji")});
2690*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(20);
2691*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontStyle(SkFontStyle::Bold());
2692*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2693*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
2694*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2695*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
2696*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2697*c8dee2aaSAndroid Build Coastguard Worker     }
2698*c8dee2aaSAndroid Build Coastguard Worker };
2699*c8dee2aaSAndroid Build Coastguard Worker 
2700*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide46 : public ParagraphSlide_Base {
2701*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide46()2702*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide46() { fName = "Paragraph46"; }
2703*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2704*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2705*c8dee2aaSAndroid Build Coastguard Worker 
2706*c8dee2aaSAndroid Build Coastguard Worker         auto text = "XXXXXXXXXX\nYYYYYYYYYY\nZZZZZZZZZZ";
2707*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2708*c8dee2aaSAndroid Build Coastguard Worker 
2709*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2710*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2711*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2712*c8dee2aaSAndroid Build Coastguard Worker 
2713*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2714*c8dee2aaSAndroid Build Coastguard Worker 
2715*c8dee2aaSAndroid Build Coastguard Worker         auto column = this->size().width()/3;
2716*c8dee2aaSAndroid Build Coastguard Worker         auto draw = [&](SkScalar x) {
2717*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2718*c8dee2aaSAndroid Build Coastguard Worker             TextStyle text_style;
2719*c8dee2aaSAndroid Build Coastguard Worker             text_style.setColor(SK_ColorBLACK);
2720*c8dee2aaSAndroid Build Coastguard Worker             text_style.setFontFamilies({SkString("Roboto")});
2721*c8dee2aaSAndroid Build Coastguard Worker             text_style.setFontSize(20);
2722*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
2723*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text);
2724*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
2725*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(column);
2726*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, x, 000);
2727*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, x, 200);
2728*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, x, 400);
2729*c8dee2aaSAndroid Build Coastguard Worker         };
2730*c8dee2aaSAndroid Build Coastguard Worker 
2731*c8dee2aaSAndroid Build Coastguard Worker         draw(column*0);
2732*c8dee2aaSAndroid Build Coastguard Worker     }
2733*c8dee2aaSAndroid Build Coastguard Worker };
2734*c8dee2aaSAndroid Build Coastguard Worker 
2735*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide47 : public ParagraphSlide_Base {
2736*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide47()2737*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide47() { fName = "Paragraph47"; }
2738*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2739*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2740*c8dee2aaSAndroid Build Coastguard Worker 
2741*c8dee2aaSAndroid Build Coastguard Worker     canvas->clear(SK_ColorWHITE);
2742*c8dee2aaSAndroid Build Coastguard Worker 
2743*c8dee2aaSAndroid Build Coastguard Worker     SkPaint paint;
2744*c8dee2aaSAndroid Build Coastguard Worker     paint.setColor(SK_ColorRED);
2745*c8dee2aaSAndroid Build Coastguard Worker 
2746*c8dee2aaSAndroid Build Coastguard Worker     auto fontCollection = sk_make_sp<FontCollection>();
2747*c8dee2aaSAndroid Build Coastguard Worker     fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2748*c8dee2aaSAndroid Build Coastguard Worker 
2749*c8dee2aaSAndroid Build Coastguard Worker     TextStyle defaultStyle;
2750*c8dee2aaSAndroid Build Coastguard Worker     defaultStyle.setForegroundColor(paint);
2751*c8dee2aaSAndroid Build Coastguard Worker 
2752*c8dee2aaSAndroid Build Coastguard Worker     ParagraphStyle paraStyle;
2753*c8dee2aaSAndroid Build Coastguard Worker     paraStyle.setTextStyle(defaultStyle);
2754*c8dee2aaSAndroid Build Coastguard Worker     paraStyle.setMaxLines(1);
2755*c8dee2aaSAndroid Build Coastguard Worker     paraStyle.setEllipsis(SkString("..."));
2756*c8dee2aaSAndroid Build Coastguard Worker 
2757*c8dee2aaSAndroid Build Coastguard Worker     const char* hello = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do";
2758*c8dee2aaSAndroid Build Coastguard Worker     auto builder = ParagraphBuilder::make(paraStyle, fontCollection, get_unicode());
2759*c8dee2aaSAndroid Build Coastguard Worker     builder->addText(hello, strlen(hello));
2760*c8dee2aaSAndroid Build Coastguard Worker 
2761*c8dee2aaSAndroid Build Coastguard Worker     auto paragraph = builder->Build();
2762*c8dee2aaSAndroid Build Coastguard Worker     paragraph->layout(100);
2763*c8dee2aaSAndroid Build Coastguard Worker     paragraph->paint(canvas, 200, 200);
2764*c8dee2aaSAndroid Build Coastguard Worker 
2765*c8dee2aaSAndroid Build Coastguard Worker     paragraph->layout(200);
2766*c8dee2aaSAndroid Build Coastguard Worker     paragraph->paint(canvas, 200, 300);
2767*c8dee2aaSAndroid Build Coastguard Worker 
2768*c8dee2aaSAndroid Build Coastguard Worker     ParagraphStyle paraStyle2;
2769*c8dee2aaSAndroid Build Coastguard Worker     paraStyle2.setTextStyle(defaultStyle);
2770*c8dee2aaSAndroid Build Coastguard Worker     paraStyle2.setMaxLines(1);
2771*c8dee2aaSAndroid Build Coastguard Worker     paraStyle.setEllipsis(SkString(""));
2772*c8dee2aaSAndroid Build Coastguard Worker 
2773*c8dee2aaSAndroid Build Coastguard Worker     auto builder2 = ParagraphBuilder::make(paraStyle, fontCollection, get_unicode());
2774*c8dee2aaSAndroid Build Coastguard Worker     builder2->addText(hello, strlen(hello));
2775*c8dee2aaSAndroid Build Coastguard Worker 
2776*c8dee2aaSAndroid Build Coastguard Worker     auto paragraph2 = builder2->Build();
2777*c8dee2aaSAndroid Build Coastguard Worker     paragraph2->layout(100);
2778*c8dee2aaSAndroid Build Coastguard Worker     paragraph2->paint(canvas, 200, 400);
2779*c8dee2aaSAndroid Build Coastguard Worker 
2780*c8dee2aaSAndroid Build Coastguard Worker     paragraph2->layout(200);
2781*c8dee2aaSAndroid Build Coastguard Worker     paragraph2->paint(canvas, 200, 500);
2782*c8dee2aaSAndroid Build Coastguard Worker     canvas->restore();
2783*c8dee2aaSAndroid Build Coastguard Worker     }
2784*c8dee2aaSAndroid Build Coastguard Worker };
2785*c8dee2aaSAndroid Build Coastguard Worker 
2786*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide48 : public ParagraphSlide_Base {
2787*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide48()2788*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide48() { fName = "Paragraph48"; }
2789*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2790*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2791*c8dee2aaSAndroid Build Coastguard Worker         canvas->clear(SK_ColorGRAY);
2792*c8dee2aaSAndroid Build Coastguard Worker 
2793*c8dee2aaSAndroid Build Coastguard Worker         // To reproduce the client problem set DEFAULT_FONT_FAMILY to something
2794*c8dee2aaSAndroid Build Coastguard Worker         // non-existing: "sans-serif1", for instance
2795*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
2796*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(SK_ColorRED);
2797*c8dee2aaSAndroid Build Coastguard Worker 
2798*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2799*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2800*c8dee2aaSAndroid Build Coastguard Worker 
2801*c8dee2aaSAndroid Build Coastguard Worker         TextStyle defaultStyle;
2802*c8dee2aaSAndroid Build Coastguard Worker         defaultStyle.setForegroundColor(paint);
2803*c8dee2aaSAndroid Build Coastguard Worker 
2804*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paraStyle;
2805*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setTextStyle(defaultStyle);
2806*c8dee2aaSAndroid Build Coastguard Worker 
2807*c8dee2aaSAndroid Build Coastguard Worker         const char* hello = "�� 487";
2808*c8dee2aaSAndroid Build Coastguard Worker         auto builder = ParagraphBuilder::make(paraStyle, fontCollection, get_unicode());
2809*c8dee2aaSAndroid Build Coastguard Worker         builder->addText(hello, strlen(hello));
2810*c8dee2aaSAndroid Build Coastguard Worker 
2811*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder->Build();
2812*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(200);
2813*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 200, 200);
2814*c8dee2aaSAndroid Build Coastguard Worker 
2815*c8dee2aaSAndroid Build Coastguard Worker         const char* hello2 = "487";
2816*c8dee2aaSAndroid Build Coastguard Worker         auto builder2 = ParagraphBuilder::make(paraStyle, fontCollection, get_unicode());
2817*c8dee2aaSAndroid Build Coastguard Worker         builder2->addText(hello2, strlen(hello2));
2818*c8dee2aaSAndroid Build Coastguard Worker 
2819*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph2 = builder2->Build();
2820*c8dee2aaSAndroid Build Coastguard Worker         paragraph2->layout(200);
2821*c8dee2aaSAndroid Build Coastguard Worker         paragraph2->paint(canvas, 200, 300);
2822*c8dee2aaSAndroid Build Coastguard Worker 
2823*c8dee2aaSAndroid Build Coastguard Worker         const char* hello3 = " �� 487";
2824*c8dee2aaSAndroid Build Coastguard Worker         auto builder3 = ParagraphBuilder::make(paraStyle, fontCollection, get_unicode());
2825*c8dee2aaSAndroid Build Coastguard Worker         builder3->addText(hello3, strlen(hello3));
2826*c8dee2aaSAndroid Build Coastguard Worker 
2827*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph3 = builder3->Build();
2828*c8dee2aaSAndroid Build Coastguard Worker         paragraph3->layout(200);
2829*c8dee2aaSAndroid Build Coastguard Worker         paragraph3->paint(canvas, 200, 400);
2830*c8dee2aaSAndroid Build Coastguard Worker         canvas->restore();
2831*c8dee2aaSAndroid Build Coastguard Worker     }
2832*c8dee2aaSAndroid Build Coastguard Worker };
2833*c8dee2aaSAndroid Build Coastguard Worker 
2834*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide49 : public ParagraphSlide_Base {
2835*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide49()2836*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide49() { fName = "Paragraph49"; }
2837*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2838*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2839*c8dee2aaSAndroid Build Coastguard Worker         canvas->clear(SK_ColorGRAY);
2840*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
2841*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->disableFontFallback();
2842*c8dee2aaSAndroid Build Coastguard Worker         const char* text =  "AAAAAAAAA\n";
2843*c8dee2aaSAndroid Build Coastguard Worker 
2844*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2845*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2846*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2847*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto"), SkString("Noto Serif CJK JP")});
2848*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(16);
2849*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2850*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2851*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
2852*c8dee2aaSAndroid Build Coastguard Worker         PlaceholderStyle placeholder_style;
2853*c8dee2aaSAndroid Build Coastguard Worker         placeholder_style.fHeight = 42;
2854*c8dee2aaSAndroid Build Coastguard Worker         placeholder_style.fWidth = 45;
2855*c8dee2aaSAndroid Build Coastguard Worker         placeholder_style.fBaselineOffset = 42;
2856*c8dee2aaSAndroid Build Coastguard Worker         placeholder_style.fBaseline = TextBaseline::kAlphabetic;
2857*c8dee2aaSAndroid Build Coastguard Worker         placeholder_style.fAlignment = PlaceholderAlignment::kBottom;
2858*c8dee2aaSAndroid Build Coastguard Worker         builder.addPlaceholder(placeholder_style);
2859*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2860*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(360);
2861*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2862*c8dee2aaSAndroid Build Coastguard Worker     }
2863*c8dee2aaSAndroid Build Coastguard Worker };
2864*c8dee2aaSAndroid Build Coastguard Worker 
2865*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide50 : public ParagraphSlide_Base {
2866*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide50()2867*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide50() { fName = "Paragraph50"; }
2868*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2869*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2870*c8dee2aaSAndroid Build Coastguard Worker         canvas->clear(SK_ColorWHITE);
2871*c8dee2aaSAndroid Build Coastguard Worker 
2872*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2873*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2874*c8dee2aaSAndroid Build Coastguard Worker 
2875*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2876*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2877*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2878*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
2879*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(16);
2880*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationStyle(TextDecorationStyle::kSolid);
2881*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationMode(TextDecorationMode::kGaps);
2882*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecorationColor(SK_ColorRED);
2883*c8dee2aaSAndroid Build Coastguard Worker         text_style.setDecoration(TextDecoration::kUnderline);
2884*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2885*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2886*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("\n\n");
2887*c8dee2aaSAndroid Build Coastguard Worker         builder.pop();
2888*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2889*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(360);
2890*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2891*c8dee2aaSAndroid Build Coastguard Worker     }
2892*c8dee2aaSAndroid Build Coastguard Worker };
2893*c8dee2aaSAndroid Build Coastguard Worker 
2894*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide51 : public ParagraphSlide_Base {
2895*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide51()2896*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide51() { fName = "Paragraph51"; }
2897*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2898*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2899*c8dee2aaSAndroid Build Coastguard Worker         canvas->clear(SK_ColorWHITE);
2900*c8dee2aaSAndroid Build Coastguard Worker 
2901*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2902*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2903*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2904*c8dee2aaSAndroid Build Coastguard Worker 
2905*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2906*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2907*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2908*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
2909*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(16);
2910*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2911*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2912*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(u"\u0e41\u0e2a\u0e19\u0e2a\u0e31\nabc");
2913*c8dee2aaSAndroid Build Coastguard Worker         builder.pop();
2914*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2915*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(1000);
2916*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2917*c8dee2aaSAndroid Build Coastguard Worker     }
2918*c8dee2aaSAndroid Build Coastguard Worker };
2919*c8dee2aaSAndroid Build Coastguard Worker 
2920*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide52 : public ParagraphSlide_Base {
2921*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide52()2922*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide52() { fName = "Paragraph52"; }
2923*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2924*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2925*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2926*c8dee2aaSAndroid Build Coastguard Worker         //const char* text = "������ ABC ������ DEF GHI";
2927*c8dee2aaSAndroid Build Coastguard Worker 
2928*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2929*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2930*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2931*c8dee2aaSAndroid Build Coastguard Worker 
2932*c8dee2aaSAndroid Build Coastguard Worker 
2933*c8dee2aaSAndroid Build Coastguard Worker         {
2934*c8dee2aaSAndroid Build Coastguard Worker         const char* text = " �� ��";
2935*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2936*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.turnHintingOff();
2937*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2938*c8dee2aaSAndroid Build Coastguard Worker 
2939*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2940*c8dee2aaSAndroid Build Coastguard Worker         //text_style.setFontFamilies({SkString("sans-serif")});
2941*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto"), SkString("Noto Color Emoji")});
2942*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(40);
2943*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2944*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2945*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text, strlen(text));
2946*c8dee2aaSAndroid Build Coastguard Worker         builder.pop();
2947*c8dee2aaSAndroid Build Coastguard Worker 
2948*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2949*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
2950*c8dee2aaSAndroid Build Coastguard Worker 
2951*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
2952*c8dee2aaSAndroid Build Coastguard Worker         }
2953*c8dee2aaSAndroid Build Coastguard Worker 
2954*c8dee2aaSAndroid Build Coastguard Worker         {
2955*c8dee2aaSAndroid Build Coastguard Worker         const char* text = " �� A";
2956*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2957*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.turnHintingOff();
2958*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2959*c8dee2aaSAndroid Build Coastguard Worker 
2960*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2961*c8dee2aaSAndroid Build Coastguard Worker         //text_style.setFontFamilies({SkString("sans-serif")});
2962*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto"), SkString("Noto Color Emoji")});
2963*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(40);
2964*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2965*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
2966*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text, strlen(text));
2967*c8dee2aaSAndroid Build Coastguard Worker         builder.pop();
2968*c8dee2aaSAndroid Build Coastguard Worker 
2969*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
2970*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
2971*c8dee2aaSAndroid Build Coastguard Worker 
2972*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 400);
2973*c8dee2aaSAndroid Build Coastguard Worker         }
2974*c8dee2aaSAndroid Build Coastguard Worker 
2975*c8dee2aaSAndroid Build Coastguard Worker     }
2976*c8dee2aaSAndroid Build Coastguard Worker };
2977*c8dee2aaSAndroid Build Coastguard Worker 
2978*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide53 : public ParagraphSlide_Base {
2979*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide53()2980*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide53() { fName = "Paragraph53"; }
2981*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)2982*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
2983*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
2984*c8dee2aaSAndroid Build Coastguard Worker         const char* text1 = "אאא בבב גגג דדד ההה";
2985*c8dee2aaSAndroid Build Coastguard Worker         const char* text2 = "ששש תתת";
2986*c8dee2aaSAndroid Build Coastguard Worker         //const char* text3 = "אאא בבב גגג דדד הההששש תתת";
2987*c8dee2aaSAndroid Build Coastguard Worker 
2988*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
2989*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
2990*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
2991*c8dee2aaSAndroid Build Coastguard Worker 
2992*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
2993*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextDirection(TextDirection::kRtl);
2994*c8dee2aaSAndroid Build Coastguard Worker         {
2995*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
2996*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
2997*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(30);
2998*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
2999*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3000*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text1);
3001*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text2);
3002*c8dee2aaSAndroid Build Coastguard Worker         builder.pop();
3003*c8dee2aaSAndroid Build Coastguard Worker 
3004*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3005*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
3006*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3007*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, paragraph->getHeight() + 20);
3008*c8dee2aaSAndroid Build Coastguard Worker         }
3009*c8dee2aaSAndroid Build Coastguard Worker 
3010*c8dee2aaSAndroid Build Coastguard Worker         {
3011*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3012*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3013*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(30);
3014*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3015*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3016*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text1);
3017*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorRED);
3018*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3019*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text2);
3020*c8dee2aaSAndroid Build Coastguard Worker         builder.pop();
3021*c8dee2aaSAndroid Build Coastguard Worker 
3022*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3023*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
3024*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3025*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, paragraph->getHeight() + 20);
3026*c8dee2aaSAndroid Build Coastguard Worker         }
3027*c8dee2aaSAndroid Build Coastguard Worker 
3028*c8dee2aaSAndroid Build Coastguard Worker     }
3029*c8dee2aaSAndroid Build Coastguard Worker };
3030*c8dee2aaSAndroid Build Coastguard Worker 
3031*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide54 : public ParagraphSlide_Base {
3032*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide54()3033*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide54() { fName = "Paragraph54"; }
3034*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)3035*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3036*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3037*c8dee2aaSAndroid Build Coastguard Worker         //std::string text("يَهْدِيْكُمُ اللَّهُ وَيُصْلِحُ بَالَكُمُ");
3038*c8dee2aaSAndroid Build Coastguard Worker         //auto text = "ד��‍��‍��‍����";
3039*c8dee2aaSAndroid Build Coastguard Worker         auto text = "��‍��‍��‍����";
3040*c8dee2aaSAndroid Build Coastguard Worker 
3041*c8dee2aaSAndroid Build Coastguard Worker         //auto fontCollection = sk_make_sp<FontCollection>();
3042*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
3043*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
3044*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
3045*c8dee2aaSAndroid Build Coastguard Worker         //fontCollection->disableFontFallback();
3046*c8dee2aaSAndroid Build Coastguard Worker 
3047*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3048*c8dee2aaSAndroid Build Coastguard Worker         //paragraph_style.setTextDirection(TextDirection::kRtl);
3049*c8dee2aaSAndroid Build Coastguard Worker 
3050*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3051*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3052*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Noto Naskh Arabic")});
3053*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(36);
3054*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3055*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3056*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
3057*c8dee2aaSAndroid Build Coastguard Worker 
3058*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3059*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(/*360*/this->size().width());
3060*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3061*c8dee2aaSAndroid Build Coastguard Worker     }
3062*c8dee2aaSAndroid Build Coastguard Worker };
3063*c8dee2aaSAndroid Build Coastguard Worker 
3064*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide55 : public ParagraphSlide_Base {
3065*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide55()3066*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide55() { fName = "Paragraph55"; }
3067*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)3068*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3069*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3070*c8dee2aaSAndroid Build Coastguard Worker         std::string text("يَهْدِيْكُمُ اللَّهُ وَيُصْلِحُ بَالَكُمُ");
3071*c8dee2aaSAndroid Build Coastguard Worker 
3072*c8dee2aaSAndroid Build Coastguard Worker         // auto fontCollection = sk_make_sp<FontCollection>();
3073*c8dee2aaSAndroid Build Coastguard Worker         // fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
3074*c8dee2aaSAndroid Build Coastguard Worker         // fontCollection->enableFontFallback();
3075*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
3076*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->disableFontFallback();
3077*c8dee2aaSAndroid Build Coastguard Worker 
3078*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3079*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextDirection(TextDirection::kRtl);
3080*c8dee2aaSAndroid Build Coastguard Worker 
3081*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3082*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3083*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Noto Naskh Arabic")});
3084*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(64);
3085*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3086*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3087*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text.substr(0, 10).data());
3088*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorRED);
3089*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3090*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text.substr(10, 20).data());
3091*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3092*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3093*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text.substr(30, 50).data());
3094*c8dee2aaSAndroid Build Coastguard Worker 
3095*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3096*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(/*360*/this->size().width());
3097*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3098*c8dee2aaSAndroid Build Coastguard Worker     }
3099*c8dee2aaSAndroid Build Coastguard Worker };
3100*c8dee2aaSAndroid Build Coastguard Worker 
3101*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide56 : public ParagraphSlide_Base {
3102*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide56()3103*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide56() { fName = "Paragraph56"; }
3104*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)3105*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3106*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3107*c8dee2aaSAndroid Build Coastguard Worker         auto text = "BAM BAM BAM by Jade Baraldo\n"
3108*c8dee2aaSAndroid Build Coastguard Worker                     "Now on Top 100 Music Videos United States";
3109*c8dee2aaSAndroid Build Coastguard Worker 
3110*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), false);
3111*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->addFontFromFile("music/Roboto-Regular.ttf", "roboto");
3112*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->addFontFromFile("music/NotoSansCJK-Regular.ttc", "noto");
3113*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->addFontFromFile("music/NotoColorEmoji.ttf", "emoji");
3114*c8dee2aaSAndroid Build Coastguard Worker 
3115*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3116*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3117*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3118*c8dee2aaSAndroid Build Coastguard Worker         //text_style.setFontFamilies({SkString("Noto Naskh Arabic")});
3119*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("roboto"),
3120*c8dee2aaSAndroid Build Coastguard Worker                                     SkString("noto"),
3121*c8dee2aaSAndroid Build Coastguard Worker                                     SkString("emoji")});
3122*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(20);
3123*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3124*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3125*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(text);
3126*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3127*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
3128*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3129*c8dee2aaSAndroid Build Coastguard Worker     }
3130*c8dee2aaSAndroid Build Coastguard Worker };
3131*c8dee2aaSAndroid Build Coastguard Worker 
3132*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide57 : public ParagraphSlide_Base {
3133*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide57()3134*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide57() { fName = "Paragraph57"; }
3135*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)3136*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3137*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3138*c8dee2aaSAndroid Build Coastguard Worker 
3139*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
3140*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
3141*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
3142*c8dee2aaSAndroid Build Coastguard Worker 
3143*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3144*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextDirection(TextDirection::kRtl);
3145*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3146*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3147*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto") });
3148*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(20);
3149*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3150*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3151*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("בבבב\n\nאאאא");
3152*c8dee2aaSAndroid Build Coastguard Worker         builder.pop();
3153*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3154*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
3155*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3156*c8dee2aaSAndroid Build Coastguard Worker 
3157*c8dee2aaSAndroid Build Coastguard Worker         auto height = paragraph->getHeight();
3158*c8dee2aaSAndroid Build Coastguard Worker         auto res1 = paragraph->getGlyphPositionAtCoordinate(0,0);
3159*c8dee2aaSAndroid Build Coastguard Worker         auto res2 = paragraph->getGlyphPositionAtCoordinate(0,height / 2);
3160*c8dee2aaSAndroid Build Coastguard Worker         auto res3 = paragraph->getGlyphPositionAtCoordinate(0,height);
3161*c8dee2aaSAndroid Build Coastguard Worker         SkDebugf("res1: %d %s\n", res1.position, res1.affinity == Affinity::kDownstream ? "D" : "U");
3162*c8dee2aaSAndroid Build Coastguard Worker         SkDebugf("res2: %d %s\n", res2.position, res2.affinity == Affinity::kDownstream ? "D" : "U");
3163*c8dee2aaSAndroid Build Coastguard Worker         SkDebugf("res3: %d %s\n", res3.position, res3.affinity == Affinity::kDownstream ? "D" : "U");
3164*c8dee2aaSAndroid Build Coastguard Worker     }
3165*c8dee2aaSAndroid Build Coastguard Worker };
3166*c8dee2aaSAndroid Build Coastguard Worker 
3167*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide58 : public ParagraphSlide_Base {
3168*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide58()3169*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide58() { fName = "Paragraph58"; }
3170*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)3171*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3172*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3173*c8dee2aaSAndroid Build Coastguard Worker 
3174*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
3175*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
3176*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
3177*c8dee2aaSAndroid Build Coastguard Worker 
3178*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3179*c8dee2aaSAndroid Build Coastguard Worker 
3180*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3181*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3182*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
3183*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(40);
3184*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3185*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3186*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(u"Text1 Google\u00A0Pay Text2");
3187*c8dee2aaSAndroid Build Coastguard Worker 
3188*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3189*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
3190*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3191*c8dee2aaSAndroid Build Coastguard Worker     }
3192*c8dee2aaSAndroid Build Coastguard Worker };
3193*c8dee2aaSAndroid Build Coastguard Worker 
3194*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide59 : public ParagraphSlide_Base {
3195*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide59()3196*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide59() { fName = "Paragraph59"; }
3197*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)3198*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3199*c8dee2aaSAndroid Build Coastguard Worker 
3200*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
3201*c8dee2aaSAndroid Build Coastguard Worker         // fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
3202*c8dee2aaSAndroid Build Coastguard Worker         // fontCollection->enableFontFallback();
3203*c8dee2aaSAndroid Build Coastguard Worker 
3204*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3205*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3206*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3207*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
3208*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3209*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(14);
3210*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3211*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("The quick brown fox ate a hamburgerfons and got sick.");
3212*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3213*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
3214*c8dee2aaSAndroid Build Coastguard Worker 
3215*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3216*c8dee2aaSAndroid Build Coastguard Worker 
3217*c8dee2aaSAndroid Build Coastguard Worker         paragraph->visit([&](int, const skia::textlayout::Paragraph::VisitorInfo* info) {
3218*c8dee2aaSAndroid Build Coastguard Worker             if (!info) {
3219*c8dee2aaSAndroid Build Coastguard Worker                 return;
3220*c8dee2aaSAndroid Build Coastguard Worker             }
3221*c8dee2aaSAndroid Build Coastguard Worker             SkFontMetrics metrics;
3222*c8dee2aaSAndroid Build Coastguard Worker             info->font.getMetrics(&metrics);
3223*c8dee2aaSAndroid Build Coastguard Worker 
3224*c8dee2aaSAndroid Build Coastguard Worker             auto first = info->positions[0]; first.offset(info->origin.fX, info->origin.fY);
3225*c8dee2aaSAndroid Build Coastguard Worker             SkRect rect = SkRect::MakeXYWH(first.fX,
3226*c8dee2aaSAndroid Build Coastguard Worker                                            first.fY + metrics.fAscent,
3227*c8dee2aaSAndroid Build Coastguard Worker                                            info->advanceX - first.fX,
3228*c8dee2aaSAndroid Build Coastguard Worker                                            metrics.fDescent - metrics.fAscent);
3229*c8dee2aaSAndroid Build Coastguard Worker             SkPaint paint;
3230*c8dee2aaSAndroid Build Coastguard Worker             paint.setColor(SK_ColorLTGRAY);
3231*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRect(rect, paint);
3232*c8dee2aaSAndroid Build Coastguard Worker         });
3233*c8dee2aaSAndroid Build Coastguard Worker 
3234*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3235*c8dee2aaSAndroid Build Coastguard Worker     }
3236*c8dee2aaSAndroid Build Coastguard Worker };
3237*c8dee2aaSAndroid Build Coastguard Worker 
3238*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide60 : public ParagraphSlide_Base {
3239*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide60()3240*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide60() { fName = "Paragraph60"; }
3241*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)3242*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3243*c8dee2aaSAndroid Build Coastguard Worker 
3244*c8dee2aaSAndroid Build Coastguard Worker         SkString text("");
3245*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3246*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), true, true);
3247*c8dee2aaSAndroid Build Coastguard Worker 
3248*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3249*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3250*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Ahem")});
3251*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(10.0f);
3252*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3253*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
3254*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3255*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3256*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("    ");
3257*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3258*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
3259*c8dee2aaSAndroid Build Coastguard Worker         auto result = paragraph->getGlyphPositionAtCoordinate(20, 2); // "hello    " 60,2
3260*c8dee2aaSAndroid Build Coastguard Worker         SkDebugf("getGlyphPositionAtCoordinate(20,2)=%d %s\n", result.position, result.affinity == Affinity::kDownstream ? "D" : "U");
3261*c8dee2aaSAndroid Build Coastguard Worker     }
3262*c8dee2aaSAndroid Build Coastguard Worker };
3263*c8dee2aaSAndroid Build Coastguard Worker 
3264*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide61 : public ParagraphSlide_Base {
3265*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide61()3266*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide61() { fName = "Paragraph61"; }
3267*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)3268*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3269*c8dee2aaSAndroid Build Coastguard Worker 
3270*c8dee2aaSAndroid Build Coastguard Worker         SkString text("");
3271*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3272*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), true, true);
3273*c8dee2aaSAndroid Build Coastguard Worker 
3274*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3275*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3276*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Ahem")});
3277*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(12.0f);
3278*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3279*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
3280*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3281*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3282*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("______________________");
3283*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3284*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(132.0f);
3285*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3286*c8dee2aaSAndroid Build Coastguard Worker         std::vector<LineMetrics> metrics;
3287*c8dee2aaSAndroid Build Coastguard Worker         paragraph->getLineMetrics(metrics);
3288*c8dee2aaSAndroid Build Coastguard Worker         for (auto& metric : metrics) {
3289*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("Line[%zu:%zu <= %zu <= %zu)\n", metric.fStartIndex, metric.fEndExcludingWhitespaces, metric.fEndIndex, metric.fEndIncludingNewline);
3290*c8dee2aaSAndroid Build Coastguard Worker         }
3291*c8dee2aaSAndroid Build Coastguard Worker     }
3292*c8dee2aaSAndroid Build Coastguard Worker };
3293*c8dee2aaSAndroid Build Coastguard Worker 
3294*c8dee2aaSAndroid Build Coastguard Worker // Selection jumping back and forth on Chinese text
3295*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide62 : public ParagraphSlide_Base {
3296*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide62()3297*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide62() { fName = "Paragraph62"; }
3298*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)3299*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3300*c8dee2aaSAndroid Build Coastguard Worker 
3301*c8dee2aaSAndroid Build Coastguard Worker         SkString text("");
3302*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3303*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
3304*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
3305*c8dee2aaSAndroid Build Coastguard Worker 
3306*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3307*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3308*c8dee2aaSAndroid Build Coastguard Worker         //text_style.setFontFamilies({SkString("")});
3309*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(24.0f);
3310*c8dee2aaSAndroid Build Coastguard Worker         text_style.setHeight(12.0f);
3311*c8dee2aaSAndroid Build Coastguard Worker         //text_style.setHeightOverride(true);
3312*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3313*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
3314*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3315*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3316*c8dee2aaSAndroid Build Coastguard Worker         //builder.addText("helloworld你好");
3317*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("你好你好你好你好");
3318*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3319*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(SK_ScalarInfinity);
3320*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3321*c8dee2aaSAndroid Build Coastguard Worker 
3322*c8dee2aaSAndroid Build Coastguard Worker         for (auto x = 0.0f; x < paragraph->getMaxIntrinsicWidth(); x += 5.0f) {
3323*c8dee2aaSAndroid Build Coastguard Worker             auto pos = paragraph->getGlyphPositionAtCoordinate(x, paragraph->getHeight() / 2);
3324*c8dee2aaSAndroid Build Coastguard Worker             auto p = pos.position + (pos.affinity == Affinity::kDownstream ? 1 : 0);
3325*c8dee2aaSAndroid Build Coastguard Worker             auto rects = paragraph->getRectsForRange(0, p,RectHeightStyle::kTight, RectWidthStyle::kTight);
3326*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("@x=%f [0:%d%s=%d) ",
3327*c8dee2aaSAndroid Build Coastguard Worker                      x, pos.position,
3328*c8dee2aaSAndroid Build Coastguard Worker                      pos.affinity == Affinity::kDownstream ? "D" : "U",
3329*c8dee2aaSAndroid Build Coastguard Worker                      p);
3330*c8dee2aaSAndroid Build Coastguard Worker             for (auto& rect : rects) {
3331*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("[%f:%f) ", rect.rect.left(), rect.rect.right());
3332*c8dee2aaSAndroid Build Coastguard Worker             }
3333*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("\n");
3334*c8dee2aaSAndroid Build Coastguard Worker         }
3335*c8dee2aaSAndroid Build Coastguard Worker 
3336*c8dee2aaSAndroid Build Coastguard Worker         //auto rects130 = paragraph->getRectsForRange(0.0f, 130.0f, RectHeightStyle::kTight, RectWidthStyle::kTight);
3337*c8dee2aaSAndroid Build Coastguard Worker         //auto rects140 = paragraph->getRectsForRange(0.0f, 140.0f, RectHeightStyle::kTight, RectWidthStyle::kTight);
3338*c8dee2aaSAndroid Build Coastguard Worker     }
3339*c8dee2aaSAndroid Build Coastguard Worker };
3340*c8dee2aaSAndroid Build Coastguard Worker 
3341*c8dee2aaSAndroid Build Coastguard Worker // Baseline shift
3342*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide63 : public ParagraphSlide_Base {
3343*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide63()3344*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide63() { fName = "Paragraph63"; }
3345*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)3346*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3347*c8dee2aaSAndroid Build Coastguard Worker 
3348*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3349*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
3350*c8dee2aaSAndroid Build Coastguard Worker 
3351*c8dee2aaSAndroid Build Coastguard Worker         StrutStyle strut_style;
3352*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setFontFamilies({SkString("Roboto")});
3353*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setStrutEnabled(true);
3354*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setFontSize(8);
3355*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setForceStrutHeight(true);
3356*c8dee2aaSAndroid Build Coastguard Worker 
3357*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3358*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
3359*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(14);
3360*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3361*c8dee2aaSAndroid Build Coastguard Worker 
3362*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3363*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
3364*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setStrutStyle(strut_style);
3365*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3366*c8dee2aaSAndroid Build Coastguard Worker 
3367*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3368*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("something");
3369*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3370*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(SK_ScalarInfinity);
3371*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3372*c8dee2aaSAndroid Build Coastguard Worker         SkDebugf("height=%f\n", paragraph->getHeight());
3373*c8dee2aaSAndroid Build Coastguard Worker         /*
3374*c8dee2aaSAndroid Build Coastguard Worker         auto boxes =
3375*c8dee2aaSAndroid Build Coastguard Worker                 paragraph->getRectsForRange(0, 1, RectHeightStyle::kTight, RectWidthStyle::kTight);
3376*c8dee2aaSAndroid Build Coastguard Worker         for (auto& box : boxes) {
3377*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("[%f,%f:%f,%f]\n",
3378*c8dee2aaSAndroid Build Coastguard Worker                      box.rect.fLeft, box.rect.fTop, box.rect.fRight, box.rect.fBottom);
3379*c8dee2aaSAndroid Build Coastguard Worker         }
3380*c8dee2aaSAndroid Build Coastguard Worker         */
3381*c8dee2aaSAndroid Build Coastguard Worker     }
3382*c8dee2aaSAndroid Build Coastguard Worker };
3383*c8dee2aaSAndroid Build Coastguard Worker 
3384*c8dee2aaSAndroid Build Coastguard Worker // Non-monotonic glyph placement
3385*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide64 : public ParagraphSlide_Base {
3386*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide64()3387*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide64() { fName = "Paragraph64"; }
draw(SkCanvas * canvas)3388*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3389*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3390*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
3391*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
3392*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
3393*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3394*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Google Sans"), SkString("Noto Naskh Arabic")});
3395*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(48);
3396*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3397*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3398*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
3399*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3400*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3401*c8dee2aaSAndroid Build Coastguard Worker         //builder.addText("ٱلْرَّحْمَـانُ");
3402*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("حَاوِلْ نُطْقَ \"كَيْفَ حَالُكَ؟\"");
3403*c8dee2aaSAndroid Build Coastguard Worker         //  لْرَّحْمَـان
3404*c8dee2aaSAndroid Build Coastguard Worker         //builder.addText("ُُُُُُٱٱٱٱٱُ");
3405*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3406*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(SK_ScalarInfinity);
3407*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(paragraph->getMaxIntrinsicWidth() + 1);
3408*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3409*c8dee2aaSAndroid Build Coastguard Worker     }
3410*c8dee2aaSAndroid Build Coastguard Worker };
3411*c8dee2aaSAndroid Build Coastguard Worker 
3412*c8dee2aaSAndroid Build Coastguard Worker // Non-monotonic glyph placement
3413*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide66 : public ParagraphSlide_Base {
3414*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide66()3415*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide66() { fName = "Paragraph66"; }
draw(SkCanvas * canvas)3416*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3417*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3418*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), true);
3419*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->disableFontFallback();
3420*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->addFontFromFile("abc/abc.ttf", "abc");
3421*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3422*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("abc"), SkString("Roboto")});
3423*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(20);
3424*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3425*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3426*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setMaxLines(1);
3427*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setEllipsis(u"\u2026");
3428*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
3429*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
3430*c8dee2aaSAndroid Build Coastguard Worker 
3431*c8dee2aaSAndroid Build Coastguard Worker         auto draw = [&](bool fallback, const SkString& font) {
3432*c8dee2aaSAndroid Build Coastguard Worker             if(fallback) {
3433*c8dee2aaSAndroid Build Coastguard Worker                 fontCollection->enableFontFallback();
3434*c8dee2aaSAndroid Build Coastguard Worker             } else {
3435*c8dee2aaSAndroid Build Coastguard Worker                 fontCollection->disableFontFallback();
3436*c8dee2aaSAndroid Build Coastguard Worker             }
3437*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3438*c8dee2aaSAndroid Build Coastguard Worker             text_style.setFontFamilies({SkString("abc"), font});
3439*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
3440*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(u"abc \u2026 abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc");
3441*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
3442*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(this->size().width());
3443*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
3444*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(0, paragraph->getHeight());
3445*c8dee2aaSAndroid Build Coastguard Worker         };
3446*c8dee2aaSAndroid Build Coastguard Worker 
3447*c8dee2aaSAndroid Build Coastguard Worker         draw(true, SkString("Roboto"));
3448*c8dee2aaSAndroid Build Coastguard Worker         draw(true, SkString("Roboto1"));
3449*c8dee2aaSAndroid Build Coastguard Worker         draw(false, SkString("Roboto"));
3450*c8dee2aaSAndroid Build Coastguard Worker         draw(false, SkString("Roboto1"));
3451*c8dee2aaSAndroid Build Coastguard Worker     }
3452*c8dee2aaSAndroid Build Coastguard Worker };
3453*c8dee2aaSAndroid Build Coastguard Worker 
3454*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide67 : public ParagraphSlide_Base {
3455*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide67()3456*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide67() { fName = "Paragraph67"; }
draw(SkCanvas * canvas)3457*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3458*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3459*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
3460*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
3461*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
3462*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3463*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextDirection(TextDirection::kLtr);
3464*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3465*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3466*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
3467*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(14.0);
3468*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
3469*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(SK_ColorBLUE);
3470*c8dee2aaSAndroid Build Coastguard Worker         //text_style.setBackgroundColor(paint);
3471*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style1;
3472*c8dee2aaSAndroid Build Coastguard Worker         text_style1.setColor(SK_ColorBLACK);
3473*c8dee2aaSAndroid Build Coastguard Worker         text_style1.setFontFamilies({SkString("Roboto")});
3474*c8dee2aaSAndroid Build Coastguard Worker         text_style1.setFontSize(30);
3475*c8dee2aaSAndroid Build Coastguard Worker         text_style1.setHeight(2.0);
3476*c8dee2aaSAndroid Build Coastguard Worker         text_style1.setHeightOverride(true);
3477*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(SK_ColorRED);
3478*c8dee2aaSAndroid Build Coastguard Worker         text_style1.setDecorationStyle(TextDecorationStyle::kSolid);
3479*c8dee2aaSAndroid Build Coastguard Worker         text_style1.setDecorationColor(SK_ColorRED);
3480*c8dee2aaSAndroid Build Coastguard Worker         text_style1.setBackgroundColor(paint);
3481*c8dee2aaSAndroid Build Coastguard Worker         StrutStyle strut_style;
3482*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setFontSize(30);
3483*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setHeight(3.0);
3484*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setHeightOverride(true);
3485*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setFontFamilies({SkString("Roboto")});
3486*c8dee2aaSAndroid Build Coastguard Worker 
3487*c8dee2aaSAndroid Build Coastguard Worker         auto draw = [&](const char* text, bool test = false) {
3488*c8dee2aaSAndroid Build Coastguard Worker             if (test) {
3489*c8dee2aaSAndroid Build Coastguard Worker                 paragraph_style.setTextHeightBehavior(TextHeightBehavior::kDisableAll);
3490*c8dee2aaSAndroid Build Coastguard Worker                 strut_style.setStrutEnabled(true);
3491*c8dee2aaSAndroid Build Coastguard Worker                 paragraph_style.setStrutStyle(strut_style);
3492*c8dee2aaSAndroid Build Coastguard Worker             } else {
3493*c8dee2aaSAndroid Build Coastguard Worker                 paragraph_style.setTextHeightBehavior(TextHeightBehavior::kAll);
3494*c8dee2aaSAndroid Build Coastguard Worker                 strut_style.setStrutEnabled(false);
3495*c8dee2aaSAndroid Build Coastguard Worker                 paragraph_style.setStrutStyle(strut_style);
3496*c8dee2aaSAndroid Build Coastguard Worker             }
3497*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3498*c8dee2aaSAndroid Build Coastguard Worker             if (test) {
3499*c8dee2aaSAndroid Build Coastguard Worker                 if (text[0] == 'u') {
3500*c8dee2aaSAndroid Build Coastguard Worker                     text_style1.setDecoration(TextDecoration::kUnderline);
3501*c8dee2aaSAndroid Build Coastguard Worker                 } else if (text[0] == 'o') {
3502*c8dee2aaSAndroid Build Coastguard Worker                     text_style1.setDecoration(TextDecoration::kOverline);
3503*c8dee2aaSAndroid Build Coastguard Worker                     text_style1.setDecorationColor(SK_ColorGREEN);
3504*c8dee2aaSAndroid Build Coastguard Worker                 } else if (text[0] == 's') {
3505*c8dee2aaSAndroid Build Coastguard Worker                     text_style1.setDecoration(TextDecoration::kLineThrough);
3506*c8dee2aaSAndroid Build Coastguard Worker                 } else {
3507*c8dee2aaSAndroid Build Coastguard Worker                     text_style1.setDecoration(TextDecoration::kNoDecoration);
3508*c8dee2aaSAndroid Build Coastguard Worker                 }
3509*c8dee2aaSAndroid Build Coastguard Worker                 builder.pushStyle(text_style1);
3510*c8dee2aaSAndroid Build Coastguard Worker             } else {
3511*c8dee2aaSAndroid Build Coastguard Worker                 builder.pushStyle(text_style);
3512*c8dee2aaSAndroid Build Coastguard Worker             }
3513*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text);
3514*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
3515*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
3516*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(this->size().width());
3517*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
3518*c8dee2aaSAndroid Build Coastguard Worker             if (test) {
3519*c8dee2aaSAndroid Build Coastguard Worker                 /*
3520*c8dee2aaSAndroid Build Coastguard Worker                 auto boxes = paragraph->getRectsForRange(0, 12, RectHeightStyle::kMax, RectWidthStyle::kTight);
3521*c8dee2aaSAndroid Build Coastguard Worker                 for (auto& box : boxes) {
3522*c8dee2aaSAndroid Build Coastguard Worker                     SkPaint paint;
3523*c8dee2aaSAndroid Build Coastguard Worker                     paint.setColor(SK_ColorGREEN);
3524*c8dee2aaSAndroid Build Coastguard Worker                     paint.setStyle(SkPaint::kStroke_Style);
3525*c8dee2aaSAndroid Build Coastguard Worker                     paint.setAntiAlias(true);
3526*c8dee2aaSAndroid Build Coastguard Worker                     paint.setStrokeWidth(2);
3527*c8dee2aaSAndroid Build Coastguard Worker                     canvas->drawRect(box.rect, paint);
3528*c8dee2aaSAndroid Build Coastguard Worker                 }
3529*c8dee2aaSAndroid Build Coastguard Worker                 */
3530*c8dee2aaSAndroid Build Coastguard Worker             }
3531*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(0, paragraph->getHeight());
3532*c8dee2aaSAndroid Build Coastguard Worker         };
3533*c8dee2aaSAndroid Build Coastguard Worker 
3534*c8dee2aaSAndroid Build Coastguard Worker         draw("+++++++++++++++++++");
3535*c8dee2aaSAndroid Build Coastguard Worker         draw("AAA\nBBB\nCCC", true);
3536*c8dee2aaSAndroid Build Coastguard Worker         draw("===================");
3537*c8dee2aaSAndroid Build Coastguard Worker         draw("underline\nBBB\nCCC", true);
3538*c8dee2aaSAndroid Build Coastguard Worker         draw("===================");
3539*c8dee2aaSAndroid Build Coastguard Worker         draw("strike\nBBB\nCCC", true);
3540*c8dee2aaSAndroid Build Coastguard Worker         draw("===================");
3541*c8dee2aaSAndroid Build Coastguard Worker         draw("overline\nBBB\nCCC", true);
3542*c8dee2aaSAndroid Build Coastguard Worker         draw("===================");
3543*c8dee2aaSAndroid Build Coastguard Worker     }
3544*c8dee2aaSAndroid Build Coastguard Worker };
3545*c8dee2aaSAndroid Build Coastguard Worker 
3546*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide68 : public ParagraphSlide_Base {
3547*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide68()3548*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide68() { fName = "Paragraph68"; }
draw(SkCanvas * canvas)3549*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3550*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3551*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
3552*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
3553*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
3554*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3555*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextDirection(TextDirection::kLtr);
3556*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3557*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3558*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
3559*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(14.0);
3560*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
3561*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(SK_ColorBLUE);
3562*c8dee2aaSAndroid Build Coastguard Worker         text_style.setBackgroundColor(paint);
3563*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style1;
3564*c8dee2aaSAndroid Build Coastguard Worker         text_style1.setColor(SK_ColorBLACK);
3565*c8dee2aaSAndroid Build Coastguard Worker         text_style1.setFontFamilies({SkString("Roboto")});
3566*c8dee2aaSAndroid Build Coastguard Worker         text_style1.setFontSize(7);
3567*c8dee2aaSAndroid Build Coastguard Worker         text_style1.setHeight(11.0);
3568*c8dee2aaSAndroid Build Coastguard Worker         text_style1.setHeightOverride(true);
3569*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(SK_ColorRED);
3570*c8dee2aaSAndroid Build Coastguard Worker         text_style1.setBackgroundColor(paint);
3571*c8dee2aaSAndroid Build Coastguard Worker         StrutStyle strut_style;
3572*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setFontSize(7);
3573*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setHeight(11.0);
3574*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setHeightOverride(true);
3575*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setFontFamilies({SkString("Roboto")});
3576*c8dee2aaSAndroid Build Coastguard Worker 
3577*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextHeightBehavior(TextHeightBehavior::kDisableAll);
3578*c8dee2aaSAndroid Build Coastguard Worker         strut_style.setStrutEnabled(true);
3579*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setStrutStyle(strut_style);
3580*c8dee2aaSAndroid Build Coastguard Worker 
3581*c8dee2aaSAndroid Build Coastguard Worker         auto draw = [&](const char* text) {
3582*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3583*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style1);
3584*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text);
3585*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
3586*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
3587*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(this->size().width());
3588*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
3589*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("paragraph='%s' %f\n", text, paragraph->getHeight());
3590*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(0, paragraph->getHeight() + 20);
3591*c8dee2aaSAndroid Build Coastguard Worker         };
3592*c8dee2aaSAndroid Build Coastguard Worker         draw("x");
3593*c8dee2aaSAndroid Build Coastguard Worker         draw("");
3594*c8dee2aaSAndroid Build Coastguard Worker     }
3595*c8dee2aaSAndroid Build Coastguard Worker };
3596*c8dee2aaSAndroid Build Coastguard Worker 
3597*c8dee2aaSAndroid Build Coastguard Worker // Google logo is shown in one style (the first one)
3598*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide_MultiStyle_Logo : public ParagraphSlide_Base {
3599*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide_MultiStyle_Logo()3600*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide_MultiStyle_Logo() { fName = SkString("ParagraphSlide_MultiStyle_Logo"); }
3601*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)3602*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3603*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3604*c8dee2aaSAndroid Build Coastguard Worker         SkScalar width = this->size().width();
3605*c8dee2aaSAndroid Build Coastguard Worker         SkScalar height = this->size().height()/2;
3606*c8dee2aaSAndroid Build Coastguard Worker 
3607*c8dee2aaSAndroid Build Coastguard Worker         SkAutoCanvasRestore acr(canvas, true);
3608*c8dee2aaSAndroid Build Coastguard Worker         canvas->clipRect(SkRect::MakeWH(width, height));
3609*c8dee2aaSAndroid Build Coastguard Worker 
3610*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style;
3611*c8dee2aaSAndroid Build Coastguard Worker         style.setFontFamilies({SkString("Google Sans")});
3612*c8dee2aaSAndroid Build Coastguard Worker         style.setFontSize(30);
3613*c8dee2aaSAndroid Build Coastguard Worker 
3614*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style0(style);
3615*c8dee2aaSAndroid Build Coastguard Worker         style0.setDecoration(TextDecoration::kUnderline);
3616*c8dee2aaSAndroid Build Coastguard Worker         style0.setDecorationColor(SK_ColorBLACK);
3617*c8dee2aaSAndroid Build Coastguard Worker 
3618*c8dee2aaSAndroid Build Coastguard Worker         TextStyle style1(style);
3619*c8dee2aaSAndroid Build Coastguard Worker         style1.setDecoration(TextDecoration::kOverline);
3620*c8dee2aaSAndroid Build Coastguard Worker         style1.setDecorationColor(SK_ColorBLACK);
3621*c8dee2aaSAndroid Build Coastguard Worker 
3622*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paraStyle;
3623*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setTextStyle(style);
3624*c8dee2aaSAndroid Build Coastguard Worker         paraStyle.setMaxLines(std::numeric_limits<size_t>::max());
3625*c8dee2aaSAndroid Build Coastguard Worker 
3626*c8dee2aaSAndroid Build Coastguard Worker         const char* logo1 = "google_";
3627*c8dee2aaSAndroid Build Coastguard Worker         const char* logo2 = "logo";
3628*c8dee2aaSAndroid Build Coastguard Worker         const char* logo3 = "go";
3629*c8dee2aaSAndroid Build Coastguard Worker         const char* logo4 = "ogle_logo";
3630*c8dee2aaSAndroid Build Coastguard Worker         const char* logo5 = "google_lo";
3631*c8dee2aaSAndroid Build Coastguard Worker         const char* logo6 = "go";
3632*c8dee2aaSAndroid Build Coastguard Worker         {
3633*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paraStyle, getFontCollection(), get_unicode());
3634*c8dee2aaSAndroid Build Coastguard Worker             style0.setDecorationStyle(TextDecorationStyle::kDouble);
3635*c8dee2aaSAndroid Build Coastguard Worker             style0.setForegroundColor(SkPaint(SkColors::kBlack));
3636*c8dee2aaSAndroid Build Coastguard Worker             style0.setBackgroundColor(SkPaint(SkColors::kLtGray));
3637*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style0);
3638*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo1, strlen(logo1));
3639*c8dee2aaSAndroid Build Coastguard Worker             style1.setDecorationStyle(TextDecorationStyle::kWavy);
3640*c8dee2aaSAndroid Build Coastguard Worker             style1.setForegroundColor(SkPaint(SkColors::kBlue));
3641*c8dee2aaSAndroid Build Coastguard Worker             style1.setBackgroundColor(SkPaint(SkColors::kYellow));
3642*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style1);
3643*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo2, strlen(logo2));
3644*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(" ", 1);
3645*c8dee2aaSAndroid Build Coastguard Worker 
3646*c8dee2aaSAndroid Build Coastguard Worker             style0.setDecorationStyle(TextDecorationStyle::kSolid);
3647*c8dee2aaSAndroid Build Coastguard Worker             style0.setForegroundColor(SkPaint(SkColors::kBlue));
3648*c8dee2aaSAndroid Build Coastguard Worker             style0.setBackgroundColor(SkPaint(SkColors::kWhite));
3649*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style0);
3650*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo3, strlen(logo3));
3651*c8dee2aaSAndroid Build Coastguard Worker             style1.setDecorationStyle(TextDecorationStyle::kDotted);
3652*c8dee2aaSAndroid Build Coastguard Worker             style1.setForegroundColor(SkPaint(SkColors::kBlack));
3653*c8dee2aaSAndroid Build Coastguard Worker             style1.setBackgroundColor(SkPaint(SkColors::kMagenta));
3654*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style1);
3655*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo4, strlen(logo4));
3656*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(" ", 1);
3657*c8dee2aaSAndroid Build Coastguard Worker 
3658*c8dee2aaSAndroid Build Coastguard Worker             style0.setDecorationStyle(TextDecorationStyle::kDashed);
3659*c8dee2aaSAndroid Build Coastguard Worker             style0.setForegroundColor(SkPaint(SkColors::kGreen));
3660*c8dee2aaSAndroid Build Coastguard Worker             style0.setBackgroundColor(SkPaint(SkColors::kGray));
3661*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style0);
3662*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo5, strlen(logo5));
3663*c8dee2aaSAndroid Build Coastguard Worker             style1.setDecorationStyle(TextDecorationStyle::kDouble);
3664*c8dee2aaSAndroid Build Coastguard Worker             style1.setForegroundColor(SkPaint(SkColors::kBlue));
3665*c8dee2aaSAndroid Build Coastguard Worker             style1.setBackgroundColor(SkPaint(SkColors::kCyan));
3666*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(style1);
3667*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(logo6, strlen(logo6));
3668*c8dee2aaSAndroid Build Coastguard Worker 
3669*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
3670*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(width - 40);
3671*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 20, 20);
3672*c8dee2aaSAndroid Build Coastguard Worker         }
3673*c8dee2aaSAndroid Build Coastguard Worker     }
3674*c8dee2aaSAndroid Build Coastguard Worker };
3675*c8dee2aaSAndroid Build Coastguard Worker 
3676*c8dee2aaSAndroid Build Coastguard Worker // Ligature FFI should allow painting and querying by codepoints
3677*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide_MultiStyle_FFI : public ParagraphSlide_Base {
3678*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide_MultiStyle_FFI()3679*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide_MultiStyle_FFI() { fName = SkString("ParagraphSlide_MultiStyle_FFI"); }
3680*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)3681*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3682*c8dee2aaSAndroid Build Coastguard Worker 
3683*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3684*c8dee2aaSAndroid Build Coastguard Worker 
3685*c8dee2aaSAndroid Build Coastguard Worker         auto collection = getFontCollection();
3686*c8dee2aaSAndroid Build Coastguard Worker 
3687*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3688*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, collection, get_unicode());
3689*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3690*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3691*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
3692*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(60);
3693*c8dee2aaSAndroid Build Coastguard Worker         text_style.setBackgroundColor(SkPaint(SkColors::kGray));
3694*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3695*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("f");
3696*c8dee2aaSAndroid Build Coastguard Worker         text_style.setBackgroundColor(SkPaint(SkColors::kYellow));
3697*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3698*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("f");
3699*c8dee2aaSAndroid Build Coastguard Worker         text_style.setBackgroundColor(SkPaint(SkColors::kLtGray));
3700*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3701*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("i");
3702*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3703*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
3704*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3705*c8dee2aaSAndroid Build Coastguard Worker         auto width = paragraph->getLongestLine();
3706*c8dee2aaSAndroid Build Coastguard Worker         auto height = paragraph->getHeight();
3707*c8dee2aaSAndroid Build Coastguard Worker         if (this->isVerbose()) {
3708*c8dee2aaSAndroid Build Coastguard Worker             auto f1Pos = paragraph->getGlyphPositionAtCoordinate(width/3 * 0 + 5, height/2);
3709*c8dee2aaSAndroid Build Coastguard Worker             auto f2Pos = paragraph->getGlyphPositionAtCoordinate(width/3 * 1 + 5, height/2);
3710*c8dee2aaSAndroid Build Coastguard Worker             auto iPos = paragraph->getGlyphPositionAtCoordinate(width/3 * 2 + 5, height/2);
3711*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("%d(%s) %d(%s) %d(%s)\n",
3712*c8dee2aaSAndroid Build Coastguard Worker                      f1Pos.position, f1Pos.affinity == Affinity::kUpstream ? "up" : "down",
3713*c8dee2aaSAndroid Build Coastguard Worker                      f2Pos.position, f2Pos.affinity == Affinity::kUpstream ? "up" : "down",
3714*c8dee2aaSAndroid Build Coastguard Worker                      iPos.position, iPos.affinity == Affinity::kUpstream ? "up" : "down");
3715*c8dee2aaSAndroid Build Coastguard Worker 
3716*c8dee2aaSAndroid Build Coastguard Worker             auto f1 = paragraph->getRectsForRange(0, 1, RectHeightStyle::kTight,
3717*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
3718*c8dee2aaSAndroid Build Coastguard Worker             if (f1.empty()) {
3719*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("F1 is empty\n");
3720*c8dee2aaSAndroid Build Coastguard Worker             } else {
3721*c8dee2aaSAndroid Build Coastguard Worker                 auto rf1 = f1[0];
3722*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("f1: [%f:%f] %s\n", rf1.rect.fLeft, rf1.rect.fRight,
3723*c8dee2aaSAndroid Build Coastguard Worker                                              rf1.direction == TextDirection::kRtl ? "rtl" : "ltr");
3724*c8dee2aaSAndroid Build Coastguard Worker             }
3725*c8dee2aaSAndroid Build Coastguard Worker 
3726*c8dee2aaSAndroid Build Coastguard Worker             auto f2 = paragraph->getRectsForRange(1, 2, RectHeightStyle::kTight,
3727*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
3728*c8dee2aaSAndroid Build Coastguard Worker             if (f2.empty()) {
3729*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("F2 is empty\n");
3730*c8dee2aaSAndroid Build Coastguard Worker             } else {
3731*c8dee2aaSAndroid Build Coastguard Worker                 auto rf2 = f2[0];
3732*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("f2: [%f:%f] %s\n", rf2.rect.fLeft, rf2.rect.fRight,
3733*c8dee2aaSAndroid Build Coastguard Worker                                              rf2.direction == TextDirection::kRtl ? "rtl" : "ltr");
3734*c8dee2aaSAndroid Build Coastguard Worker             }
3735*c8dee2aaSAndroid Build Coastguard Worker 
3736*c8dee2aaSAndroid Build Coastguard Worker             auto fi = paragraph->getRectsForRange(2, 3, RectHeightStyle::kTight,
3737*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
3738*c8dee2aaSAndroid Build Coastguard Worker             if (fi.empty()) {
3739*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("FI is empty\n");
3740*c8dee2aaSAndroid Build Coastguard Worker             } else {
3741*c8dee2aaSAndroid Build Coastguard Worker                 auto rfi = fi[0];
3742*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("i:  [%f:%f] %s\n", rfi.rect.fLeft, rfi.rect.fRight,
3743*c8dee2aaSAndroid Build Coastguard Worker                                              rfi.direction == TextDirection::kRtl ? "rtl" : "ltr");
3744*c8dee2aaSAndroid Build Coastguard Worker             }
3745*c8dee2aaSAndroid Build Coastguard Worker         }
3746*c8dee2aaSAndroid Build Coastguard Worker     }
3747*c8dee2aaSAndroid Build Coastguard Worker };
3748*c8dee2aaSAndroid Build Coastguard Worker 
3749*c8dee2aaSAndroid Build Coastguard Worker // Multiple code points/single glyph emoji family should be treated as a single glyph
3750*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide_MultiStyle_EmojiFamily : public ParagraphSlide_Base {
3751*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide_MultiStyle_EmojiFamily()3752*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide_MultiStyle_EmojiFamily() { fName = SkString("ParagraphSlide_MultiStyle_EmojiFamily"); }
3753*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)3754*c8dee2aaSAndroid Build Coastguard Worker     void draw (SkCanvas* canvas) override {
3755*c8dee2aaSAndroid Build Coastguard Worker 
3756*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3757*c8dee2aaSAndroid Build Coastguard Worker 
3758*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
3759*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
3760*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
3761*c8dee2aaSAndroid Build Coastguard Worker 
3762*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3763*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3764*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3765*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3766*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Noto Color Emoji")});
3767*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(40);
3768*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3769*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(u"\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466");
3770*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3771*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
3772*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
3773*c8dee2aaSAndroid Build Coastguard Worker         paint.setStyle(SkPaint::kStroke_Style);
3774*c8dee2aaSAndroid Build Coastguard Worker         paint.setAntiAlias(true);
3775*c8dee2aaSAndroid Build Coastguard Worker         paint.setStrokeWidth(1);
3776*c8dee2aaSAndroid Build Coastguard Worker         paint.setColor(SK_ColorLTGRAY);
3777*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawRect(SkRect::MakeXYWH(0, 0, paragraph->getLongestLine(), paragraph->getHeight()), paint);
3778*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3779*c8dee2aaSAndroid Build Coastguard Worker         auto width = paragraph->getLongestLine();
3780*c8dee2aaSAndroid Build Coastguard Worker         auto height = paragraph->getHeight();
3781*c8dee2aaSAndroid Build Coastguard Worker         if (this->isVerbose()) {
3782*c8dee2aaSAndroid Build Coastguard Worker             auto pos00 = paragraph->getGlyphPositionAtCoordinate(width/4, height/4);
3783*c8dee2aaSAndroid Build Coastguard Worker             auto pos10 = paragraph->getGlyphPositionAtCoordinate(width*3/4, height/2);
3784*c8dee2aaSAndroid Build Coastguard Worker             auto pos01 = paragraph->getGlyphPositionAtCoordinate(width/4, height/2);
3785*c8dee2aaSAndroid Build Coastguard Worker             auto pos11 = paragraph->getGlyphPositionAtCoordinate(width*3/4, height*3/4);
3786*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("%d(%s) %d(%s) %d(%s) %d(%s)\n",
3787*c8dee2aaSAndroid Build Coastguard Worker                      pos00.position, pos00.affinity == Affinity::kUpstream ? "up" : "down",
3788*c8dee2aaSAndroid Build Coastguard Worker                      pos01.position, pos01.affinity == Affinity::kUpstream ? "up" : "down",
3789*c8dee2aaSAndroid Build Coastguard Worker                      pos10.position, pos10.affinity == Affinity::kUpstream ? "up" : "down",
3790*c8dee2aaSAndroid Build Coastguard Worker                      pos11.position, pos11.affinity == Affinity::kUpstream ? "up" : "down");
3791*c8dee2aaSAndroid Build Coastguard Worker 
3792*c8dee2aaSAndroid Build Coastguard Worker             auto f1 = paragraph->getRectsForRange(0, 2, RectHeightStyle::kTight,
3793*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
3794*c8dee2aaSAndroid Build Coastguard Worker             if (f1.empty()) {
3795*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("F1 is empty\n");
3796*c8dee2aaSAndroid Build Coastguard Worker             } else {
3797*c8dee2aaSAndroid Build Coastguard Worker                 auto rf1 = f1[0];
3798*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("f1: [%f:%f] %s\n", rf1.rect.fLeft, rf1.rect.fRight,
3799*c8dee2aaSAndroid Build Coastguard Worker                                              rf1.direction == TextDirection::kRtl ? "rtl" : "ltr");
3800*c8dee2aaSAndroid Build Coastguard Worker             }
3801*c8dee2aaSAndroid Build Coastguard Worker 
3802*c8dee2aaSAndroid Build Coastguard Worker             auto f2 = paragraph->getRectsForRange(4, 6, RectHeightStyle::kTight,
3803*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
3804*c8dee2aaSAndroid Build Coastguard Worker             if (f2.empty()) {
3805*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("F2 is empty\n");
3806*c8dee2aaSAndroid Build Coastguard Worker             } else {
3807*c8dee2aaSAndroid Build Coastguard Worker                 auto rf2 = f2[0];
3808*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("f2: [%f:%f] %s\n", rf2.rect.fLeft, rf2.rect.fRight,
3809*c8dee2aaSAndroid Build Coastguard Worker                                              rf2.direction == TextDirection::kRtl ? "rtl" : "ltr");
3810*c8dee2aaSAndroid Build Coastguard Worker             }
3811*c8dee2aaSAndroid Build Coastguard Worker 
3812*c8dee2aaSAndroid Build Coastguard Worker             auto f3 = paragraph->getRectsForRange(8, 10, RectHeightStyle::kTight,
3813*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
3814*c8dee2aaSAndroid Build Coastguard Worker             if (f3.empty()) {
3815*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("F3 is empty\n");
3816*c8dee2aaSAndroid Build Coastguard Worker             } else {
3817*c8dee2aaSAndroid Build Coastguard Worker                 auto rf3 = f3[0];
3818*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("i:  [%f:%f] %s\n", rf3.rect.fLeft, rf3.rect.fRight,
3819*c8dee2aaSAndroid Build Coastguard Worker                                              rf3.direction == TextDirection::kRtl ? "rtl" : "ltr");
3820*c8dee2aaSAndroid Build Coastguard Worker             }
3821*c8dee2aaSAndroid Build Coastguard Worker 
3822*c8dee2aaSAndroid Build Coastguard Worker             auto f4 = paragraph->getRectsForRange(8, 10, RectHeightStyle::kTight,
3823*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
3824*c8dee2aaSAndroid Build Coastguard Worker             if (f4.empty()) {
3825*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("F4 is empty\n");
3826*c8dee2aaSAndroid Build Coastguard Worker             } else {
3827*c8dee2aaSAndroid Build Coastguard Worker                 auto rf4 = f4[0];
3828*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("i:  [%f:%f] %s\n", rf4.rect.fLeft, rf4.rect.fRight,
3829*c8dee2aaSAndroid Build Coastguard Worker                                              rf4.direction == TextDirection::kRtl ? "rtl" : "ltr");
3830*c8dee2aaSAndroid Build Coastguard Worker             }
3831*c8dee2aaSAndroid Build Coastguard Worker         }
3832*c8dee2aaSAndroid Build Coastguard Worker     }
3833*c8dee2aaSAndroid Build Coastguard Worker };
3834*c8dee2aaSAndroid Build Coastguard Worker 
3835*c8dee2aaSAndroid Build Coastguard Worker // Arabic Ligature case should be painted into multi styles but queried as a single glyph
3836*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide_MultiStyle_Arabic1 : public ParagraphSlide_Base {
3837*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide_MultiStyle_Arabic1()3838*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide_MultiStyle_Arabic1() { fName = "SkStringParagraphSlide_MultiStyle_Arabic1"; }
3839*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)3840*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3841*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3842*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
3843*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
3844*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
3845*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3846*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Noto Naskh Arabic")});
3847*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(50);
3848*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3849*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3850*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
3851*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextDirection(TextDirection::kRtl);
3852*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3853*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLUE);
3854*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3855*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("ك");
3856*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorRED);
3857*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3858*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("ِّ");
3859*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLUE);
3860*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3861*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("ـ");
3862*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3863*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
3864*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3865*c8dee2aaSAndroid Build Coastguard Worker 
3866*c8dee2aaSAndroid Build Coastguard Worker         auto width = paragraph->getLongestLine();
3867*c8dee2aaSAndroid Build Coastguard Worker         auto height = paragraph->getHeight();
3868*c8dee2aaSAndroid Build Coastguard Worker         if (this->isVerbose()) {
3869*c8dee2aaSAndroid Build Coastguard Worker             auto f1Pos = paragraph->getGlyphPositionAtCoordinate(width/6, height/2);
3870*c8dee2aaSAndroid Build Coastguard Worker             auto f2Pos = paragraph->getGlyphPositionAtCoordinate(width/2, height/2);
3871*c8dee2aaSAndroid Build Coastguard Worker             auto iPos = paragraph->getGlyphPositionAtCoordinate(width*5/6, height/2);
3872*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("%d(%s) %d(%s) %d(%s)\n",
3873*c8dee2aaSAndroid Build Coastguard Worker                      f1Pos.position, f1Pos.affinity == Affinity::kUpstream ? "up" : "down",
3874*c8dee2aaSAndroid Build Coastguard Worker                      f2Pos.position, f2Pos.affinity == Affinity::kUpstream ? "up" : "down",
3875*c8dee2aaSAndroid Build Coastguard Worker                      iPos.position, iPos.affinity == Affinity::kUpstream ? "up" : "down");
3876*c8dee2aaSAndroid Build Coastguard Worker 
3877*c8dee2aaSAndroid Build Coastguard Worker             auto f1 = paragraph->getRectsForRange(0, 1, RectHeightStyle::kTight,
3878*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
3879*c8dee2aaSAndroid Build Coastguard Worker             if (f1.empty()) {
3880*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("F1 is empty\n");
3881*c8dee2aaSAndroid Build Coastguard Worker             } else {
3882*c8dee2aaSAndroid Build Coastguard Worker                 auto rf1 = f1[0];
3883*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("f1: [%f:%f] %s\n", rf1.rect.fLeft, rf1.rect.fRight,
3884*c8dee2aaSAndroid Build Coastguard Worker                                              rf1.direction == TextDirection::kRtl ? "rtl" : "ltr");
3885*c8dee2aaSAndroid Build Coastguard Worker             }
3886*c8dee2aaSAndroid Build Coastguard Worker 
3887*c8dee2aaSAndroid Build Coastguard Worker             auto f2 = paragraph->getRectsForRange(1, 2, RectHeightStyle::kTight,
3888*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
3889*c8dee2aaSAndroid Build Coastguard Worker             if (f2.empty()) {
3890*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("F2 is empty\n");
3891*c8dee2aaSAndroid Build Coastguard Worker             } else {
3892*c8dee2aaSAndroid Build Coastguard Worker                 auto rf2 = f2[0];
3893*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("f2: [%f:%f] %s\n", rf2.rect.fLeft, rf2.rect.fRight,
3894*c8dee2aaSAndroid Build Coastguard Worker                                              rf2.direction == TextDirection::kRtl ? "rtl" : "ltr");
3895*c8dee2aaSAndroid Build Coastguard Worker             }
3896*c8dee2aaSAndroid Build Coastguard Worker 
3897*c8dee2aaSAndroid Build Coastguard Worker             auto fi = paragraph->getRectsForRange(2, 3, RectHeightStyle::kTight,
3898*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
3899*c8dee2aaSAndroid Build Coastguard Worker             if (fi.empty()) {
3900*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("FI is empty\n");
3901*c8dee2aaSAndroid Build Coastguard Worker             } else {
3902*c8dee2aaSAndroid Build Coastguard Worker                 auto rfi = fi[0];
3903*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("i:  [%f:%f] %s\n", rfi.rect.fLeft, rfi.rect.fRight,
3904*c8dee2aaSAndroid Build Coastguard Worker                                              rfi.direction == TextDirection::kRtl ? "rtl" : "ltr");
3905*c8dee2aaSAndroid Build Coastguard Worker             }
3906*c8dee2aaSAndroid Build Coastguard Worker         }
3907*c8dee2aaSAndroid Build Coastguard Worker     }
3908*c8dee2aaSAndroid Build Coastguard Worker };
3909*c8dee2aaSAndroid Build Coastguard Worker 
3910*c8dee2aaSAndroid Build Coastguard Worker // Zalgo text should be painted into multi styles but queried as a single glyph
3911*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide_MultiStyle_Zalgo : public ParagraphSlide_Base {
3912*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide_MultiStyle_Zalgo()3913*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide_MultiStyle_Zalgo() { fName = SkString("ParagraphSlide_MultiStyle_Zalgo"); }
3914*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)3915*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3916*c8dee2aaSAndroid Build Coastguard Worker 
3917*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3918*c8dee2aaSAndroid Build Coastguard Worker 
3919*c8dee2aaSAndroid Build Coastguard Worker         std::u16string text = u">S͛ͭ̋͆̈̔̇͗̍͑̎ͪͮͧͣ̽ͫͣ́ͬ̀͌͑͂͗͒̍̔̄ͧ̏̉̌̊̊̿̀̌̃̄͐̓̓̚̚҉̵̡͜͟͝͠͏̸̵̡̧͜҉̷̡͇̜̘̻̺̘̟̝͙̬̘̩͇̭̼̥̖̤̦͎k͉̩̘͚̜̹̗̗͍̤̥̱͉̳͕͖̤̲̣͚̮̞̬̲͍͔̯̻̮̞̭͈̗̫͓̂ͨ̉ͪ̒͋͛̀̍͊ͧ̿̅͆̓̔̔ͬ̇̑̿ͩ͗ͮ̎͌̿̄ͅP̴̵̡̡̛̪͙̼̣̟̩̭̫̱͙̬͔͉͍̘̠͉̦̝̘̥̟̗͖̫̤͕̙̬̦͍̱̖̮̱͑͐̎̃̒͐͋̚͘͞a̶̶̵̵̵̶̶̡̧̢̢̺͔̣͖̭̺͍̤͚̱̜̰̥͕̬̥̲̞̥̘͇͚̺̰͚̪̺͔̤͍̓̿͆̎͋̓ͦ̈́ͦ̌́̄͗̌̓͌̕͜͜͟͢͝͡ŕ͎̝͕͉̻͎̤̭͚̗̳̖̙̘͚̫͖͓͚͉͔͈̟̰̟̬̗͓̟͚̱̕͡ͅͅͅa̸̶̢̛̛̽ͮͩ̅͒ͫ͗͂̎ͦ̈́̓̚͘͜͢͡҉̷̵̶̢̡̜̮̦̜̥̜̯̙͓͔̼̗̻͜͜ͅḡ̢̛͕̗͖̖̤̦̘͔ͨͨ̊͒ͩͭͤ̍̅̃ͪ̋̏̓̍̋͗̋ͨ̏̽̈́̔̀̋̉ͫ̅̂ͭͫ̏͒͋ͥ̚͜r̶̢̧̧̥̤̼̀̂̒ͪ͌̿͌̅͛ͨͪ͒̍ͥ̉ͤ̌̿̆́ͭ͆̃̒ͤ͛̊ͧ̽͘͝͠a̧̢̧̢͑͑̓͑ͮ̃͂̄͛́̈́͋̂͌̽̄͒̔́̇ͨͧͭ͐ͦ̋ͨ̍ͦ̍̋͆̔ͧ͑͋͌̈̓͛͛̚͢͜͜͏̴̢̧̛̳͍̹͚̰̹̻͔p̨̡͆ͦͣ͊̽̔͂̉ͣ̔ͣ̌̌̉̃̋̂͒ͫ̄̎̐͗̉̌̃̽̽́̀̚͘͜͟҉̱͉h̭̮̘̗͔̜̯͔͈̯̺͔̗̣̭͚̱̰̙̼̹͚̣̻̥̲̮͍̤͜͝<";
3920*c8dee2aaSAndroid Build Coastguard Worker         auto K = text.find(u"k");
3921*c8dee2aaSAndroid Build Coastguard Worker         auto P = text.find(u"P");
3922*c8dee2aaSAndroid Build Coastguard Worker         auto h = text.find(u"h");
3923*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
3924*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
3925*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
3926*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
3927*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
3928*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
3929*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
3930*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(20);
3931*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorRED);
3932*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3933*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(std::u16string(text.data(), K + 3));
3934*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLUE);
3935*c8dee2aaSAndroid Build Coastguard Worker         text_style.setBackgroundColor(SkPaint(SkColors::kYellow));
3936*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3937*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(std::u16string(text.data() + K + 3, P - K - 3 + 6));
3938*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorGREEN);
3939*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3940*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(std::u16string(text.data() + P + 6, h - P - 6));
3941*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
3942*c8dee2aaSAndroid Build Coastguard Worker         text_style.setBackgroundColor(SkPaint(SkColors::kLtGray));
3943*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
3944*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(std::u16string(text.data() + h, text.size() - h));
3945*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
3946*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
3947*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
3948*c8dee2aaSAndroid Build Coastguard Worker         auto height = paragraph->getHeight();
3949*c8dee2aaSAndroid Build Coastguard Worker         if (this->isVerbose()) {
3950*c8dee2aaSAndroid Build Coastguard Worker             auto resSK = paragraph->getRectsForRange(0, K, RectHeightStyle::kTight,
3951*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
3952*c8dee2aaSAndroid Build Coastguard Worker             TextBox rectSK(SkRect::MakeEmpty(), TextDirection::kLtr);
3953*c8dee2aaSAndroid Build Coastguard Worker             if (resSK.empty()) {
3954*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("rectSk is empty\n");
3955*c8dee2aaSAndroid Build Coastguard Worker             } else {
3956*c8dee2aaSAndroid Build Coastguard Worker                 rectSK = resSK[0];
3957*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("rectSk: [%f:%f] %s\n", rectSK.rect.fLeft, rectSK.rect.fRight,
3958*c8dee2aaSAndroid Build Coastguard Worker                                              rectSK.direction == TextDirection::kRtl ? "rtl" : "ltr");
3959*c8dee2aaSAndroid Build Coastguard Worker             }
3960*c8dee2aaSAndroid Build Coastguard Worker 
3961*c8dee2aaSAndroid Build Coastguard Worker             auto resKP = paragraph->getRectsForRange(K, P, RectHeightStyle::kTight,
3962*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
3963*c8dee2aaSAndroid Build Coastguard Worker             TextBox rectKP(SkRect::MakeEmpty(), TextDirection::kLtr);
3964*c8dee2aaSAndroid Build Coastguard Worker             if (resKP.empty()) {
3965*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("rectkP is empty\n");
3966*c8dee2aaSAndroid Build Coastguard Worker             } else {
3967*c8dee2aaSAndroid Build Coastguard Worker                 rectKP = resKP[0];
3968*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("rectkP: [%f:%f] %s\n", rectKP.rect.fLeft, rectKP.rect.fRight,
3969*c8dee2aaSAndroid Build Coastguard Worker                                              rectKP.direction == TextDirection::kRtl ? "rtl" : "ltr");
3970*c8dee2aaSAndroid Build Coastguard Worker             }
3971*c8dee2aaSAndroid Build Coastguard Worker 
3972*c8dee2aaSAndroid Build Coastguard Worker             auto resPh = paragraph->getRectsForRange(P, h, RectHeightStyle::kTight,
3973*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle::kTight);
3974*c8dee2aaSAndroid Build Coastguard Worker             TextBox rectPh(SkRect::MakeEmpty(), TextDirection::kLtr);
3975*c8dee2aaSAndroid Build Coastguard Worker             if (resPh.empty()) {
3976*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("rectPh is empty\n");
3977*c8dee2aaSAndroid Build Coastguard Worker             } else {
3978*c8dee2aaSAndroid Build Coastguard Worker                 rectPh = resPh[0];
3979*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("rectPh:  [%f:%f] %s\n", rectPh.rect.fLeft, rectPh.rect.fRight,
3980*c8dee2aaSAndroid Build Coastguard Worker                                                   rectPh.direction == TextDirection::kRtl ? "rtl" : "ltr");
3981*c8dee2aaSAndroid Build Coastguard Worker             }
3982*c8dee2aaSAndroid Build Coastguard Worker             auto posK = paragraph->getGlyphPositionAtCoordinate(rectSK.rect.center().fX, height/2);
3983*c8dee2aaSAndroid Build Coastguard Worker             auto posP = paragraph->getGlyphPositionAtCoordinate(rectKP.rect.center().fX, height/2);
3984*c8dee2aaSAndroid Build Coastguard Worker             auto posH = paragraph->getGlyphPositionAtCoordinate(rectPh.rect.center().fX, height/2);
3985*c8dee2aaSAndroid Build Coastguard Worker 
3986*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("%d(%s) %d(%s) %d(%s)\n",
3987*c8dee2aaSAndroid Build Coastguard Worker                      posK.position, posK.affinity == Affinity::kUpstream ? "up" : "down",
3988*c8dee2aaSAndroid Build Coastguard Worker                      posP.position, posP.affinity == Affinity::kUpstream ? "up" : "down",
3989*c8dee2aaSAndroid Build Coastguard Worker                      posH.position, posH.affinity == Affinity::kUpstream ? "up" : "down");
3990*c8dee2aaSAndroid Build Coastguard Worker         }
3991*c8dee2aaSAndroid Build Coastguard Worker     }
3992*c8dee2aaSAndroid Build Coastguard Worker };
3993*c8dee2aaSAndroid Build Coastguard Worker 
3994*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlide_MultiStyle_Arabic2 : public ParagraphSlide_Base {
3995*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlide_MultiStyle_Arabic2()3996*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlide_MultiStyle_Arabic2() { fName = SkString("ParagraphSlide_MultiStyle_Arabic2"); }
draw(SkCanvas * canvas)3997*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
3998*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
3999*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
4000*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
4001*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
4002*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
4003*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Noto Naskh Arabic")});
4004*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(50);
4005*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
4006*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
4007*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
4008*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextDirection(TextDirection::kRtl);
4009*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
4010*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorRED);
4011*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
4012*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(u"\u062c\u064e\u0627\u0653");
4013*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLUE);
4014*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
4015*c8dee2aaSAndroid Build Coastguard Worker         builder.addText(u"\u064e\u0647\u064f");
4016*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
4017*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
4018*c8dee2aaSAndroid Build Coastguard Worker         paragraph->paint(canvas, 0, 0);
4019*c8dee2aaSAndroid Build Coastguard Worker     }
4020*c8dee2aaSAndroid Build Coastguard Worker };
4021*c8dee2aaSAndroid Build Coastguard Worker 
4022*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlideMixedTextDirection : public ParagraphSlide_Base {
4023*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlideMixedTextDirection()4024*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlideMixedTextDirection() { fName = "ParagraphSlideMixedTextDirection"; }
draw(SkCanvas * canvas)4025*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
4026*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
4027*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
4028*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
4029*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
4030*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
4031*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Noto Naskh Arabic")});
4032*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(100);
4033*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
4034*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
4035*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
4036*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextAlign(TextAlign::kStart);
4037*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setEllipsis(u"\u2026");
4038*c8dee2aaSAndroid Build Coastguard Worker         auto draw = [&](const std::u16string& text, size_t lines, TextDirection dir) {
4039*c8dee2aaSAndroid Build Coastguard Worker             paragraph_style.setMaxLines(lines);
4040*c8dee2aaSAndroid Build Coastguard Worker             paragraph_style.setTextDirection(dir);
4041*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
4042*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
4043*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text);
4044*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
4045*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(this->size().width()); // 841 474 953
4046*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
4047*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(0, paragraph->getHeight() + 10);
4048*c8dee2aaSAndroid Build Coastguard Worker         };
4049*c8dee2aaSAndroid Build Coastguard Worker 
4050*c8dee2aaSAndroid Build Coastguard Worker         draw(u"English text (defalt LTR)", 1, TextDirection::kLtr);
4051*c8dee2aaSAndroid Build Coastguard Worker         draw(u"English text (defalt RTL)", 1, TextDirection::kRtl);
4052*c8dee2aaSAndroid Build Coastguard Worker         draw(u"تظاهرات و(defalt LTR) تجمعات اعتراضی در سراسر کشور ۲۳ مهر", 2, TextDirection::kLtr);
4053*c8dee2aaSAndroid Build Coastguard Worker         draw(u"تظاهرات و(defalt RTL) تجمعات اعتراضی در سراسر کشور ۲۳ مهر", 2, TextDirection::kRtl);
4054*c8dee2aaSAndroid Build Coastguard Worker     }
4055*c8dee2aaSAndroid Build Coastguard Worker };
4056*c8dee2aaSAndroid Build Coastguard Worker 
4057*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlideGetPath : public ParagraphSlide_Base {
4058*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlideGetPath()4059*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlideGetPath() { fName = "ParagraphSlideGetPath"; }
draw(SkCanvas * canvas)4060*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
4061*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
4062*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
4063*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
4064*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
4065*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
4066*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
4067*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(50);
4068*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
4069*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
4070*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
4071*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextAlign(TextAlign::kStart);
4072*c8dee2aaSAndroid Build Coastguard Worker 
4073*c8dee2aaSAndroid Build Coastguard Worker         ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
4074*c8dee2aaSAndroid Build Coastguard Worker         builder.pushStyle(text_style);
4075*c8dee2aaSAndroid Build Coastguard Worker         builder.addText("Multi lined sticky notes drawn as paths");
4076*c8dee2aaSAndroid Build Coastguard Worker         auto paragraph = builder.Build();
4077*c8dee2aaSAndroid Build Coastguard Worker         paragraph->layout(this->size().width());
4078*c8dee2aaSAndroid Build Coastguard Worker 
4079*c8dee2aaSAndroid Build Coastguard Worker         auto impl = static_cast<ParagraphImpl*>(paragraph.get());
4080*c8dee2aaSAndroid Build Coastguard Worker         SkPath fullPath;
4081*c8dee2aaSAndroid Build Coastguard Worker         SkScalar height = 0;
4082*c8dee2aaSAndroid Build Coastguard Worker         for (auto& line : impl->lines()) {
4083*c8dee2aaSAndroid Build Coastguard Worker             line.ensureTextBlobCachePopulated();
4084*c8dee2aaSAndroid Build Coastguard Worker             for (auto& rec : line.fTextBlobCache) {
4085*c8dee2aaSAndroid Build Coastguard Worker                 auto paths = Paragraph::GetPath(rec.fBlob.get());
4086*c8dee2aaSAndroid Build Coastguard Worker                 paths.offset(0, height);
4087*c8dee2aaSAndroid Build Coastguard Worker                 fullPath.addPath(paths);
4088*c8dee2aaSAndroid Build Coastguard Worker                 height += line.height();
4089*c8dee2aaSAndroid Build Coastguard Worker             }
4090*c8dee2aaSAndroid Build Coastguard Worker         }
4091*c8dee2aaSAndroid Build Coastguard Worker         SkRect rect = SkRect::MakeXYWH(100, 100 + paragraph->getHeight(), this->size().width(), paragraph->getHeight());
4092*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
4093*c8dee2aaSAndroid Build Coastguard Worker         paint.setShader(setgrad(rect, SK_ColorBLUE, SK_ColorLTGRAY));
4094*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawPath(fullPath, paint);
4095*c8dee2aaSAndroid Build Coastguard Worker     }
4096*c8dee2aaSAndroid Build Coastguard Worker };
4097*c8dee2aaSAndroid Build Coastguard Worker 
4098*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlideExperiment : public ParagraphSlide_Base {
4099*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlideExperiment()4100*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlideExperiment() { fName = "ParagraphSlideExperiment"; }
draw(SkCanvas * canvas)4101*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
4102*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
4103*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
4104*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
4105*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->disableFontFallback();
4106*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
4107*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto")});
4108*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(50);
4109*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
4110*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
4111*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
4112*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextAlign(TextAlign::kStart);
4113*c8dee2aaSAndroid Build Coastguard Worker 
4114*c8dee2aaSAndroid Build Coastguard Worker         {
4115*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
4116*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
4117*c8dee2aaSAndroid Build Coastguard Worker             builder.addText("Sticky notes\non multple lines\nwith bounds around glyphs");
4118*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
4119*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(this->size().width());
4120*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
4121*c8dee2aaSAndroid Build Coastguard Worker             paragraph->extendedVisit([&](int, const skia::textlayout::Paragraph::ExtendedVisitorInfo* info) {
4122*c8dee2aaSAndroid Build Coastguard Worker                 if (!info) {
4123*c8dee2aaSAndroid Build Coastguard Worker                     return;
4124*c8dee2aaSAndroid Build Coastguard Worker                 }
4125*c8dee2aaSAndroid Build Coastguard Worker                 SkPaint paint;
4126*c8dee2aaSAndroid Build Coastguard Worker                 paint.setStyle(SkPaint::kStroke_Style);
4127*c8dee2aaSAndroid Build Coastguard Worker                 paint.setAntiAlias(true);
4128*c8dee2aaSAndroid Build Coastguard Worker                 paint.setStrokeWidth(1);
4129*c8dee2aaSAndroid Build Coastguard Worker                 for (auto i = 0; i < info->count; ++i) {
4130*c8dee2aaSAndroid Build Coastguard Worker                     paint.setColor(SK_ColorDKGRAY);
4131*c8dee2aaSAndroid Build Coastguard Worker                     SkRect rect(info->bounds[i]);
4132*c8dee2aaSAndroid Build Coastguard Worker                     rect.offset(info->positions[i]);
4133*c8dee2aaSAndroid Build Coastguard Worker                     rect.offset(info->origin);
4134*c8dee2aaSAndroid Build Coastguard Worker                     canvas->drawRect(rect, paint);
4135*c8dee2aaSAndroid Build Coastguard Worker                 }
4136*c8dee2aaSAndroid Build Coastguard Worker             });
4137*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(0, paragraph->getHeight() + 20);
4138*c8dee2aaSAndroid Build Coastguard Worker         }
4139*c8dee2aaSAndroid Build Coastguard Worker 
4140*c8dee2aaSAndroid Build Coastguard Worker         {
4141*c8dee2aaSAndroid Build Coastguard Worker           ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
4142*c8dee2aaSAndroid Build Coastguard Worker           builder.pushStyle(text_style);
4143*c8dee2aaSAndroid Build Coastguard Worker           builder.addText("Sticky notes with glyphs changing position");
4144*c8dee2aaSAndroid Build Coastguard Worker           auto paragraph = builder.Build();
4145*c8dee2aaSAndroid Build Coastguard Worker           paragraph->layout(this->size().width());
4146*c8dee2aaSAndroid Build Coastguard Worker           paragraph->paint(canvas, 0, 0);
4147*c8dee2aaSAndroid Build Coastguard Worker           paragraph->extendedVisit([&](int, const skia::textlayout::Paragraph::ExtendedVisitorInfo* info) {
4148*c8dee2aaSAndroid Build Coastguard Worker               if (!info) {
4149*c8dee2aaSAndroid Build Coastguard Worker                   return;
4150*c8dee2aaSAndroid Build Coastguard Worker               }
4151*c8dee2aaSAndroid Build Coastguard Worker               SkScalar offset = 0;
4152*c8dee2aaSAndroid Build Coastguard Worker               for (auto i = 0; i < info->count; ++i) {
4153*c8dee2aaSAndroid Build Coastguard Worker                   info->positions[i].fY += offset;
4154*c8dee2aaSAndroid Build Coastguard Worker                   if (i % 3 == 0) {
4155*c8dee2aaSAndroid Build Coastguard Worker                       offset = 20;
4156*c8dee2aaSAndroid Build Coastguard Worker                   } else if (i % 3 == 1) {
4157*c8dee2aaSAndroid Build Coastguard Worker                       offset = -20;
4158*c8dee2aaSAndroid Build Coastguard Worker                   } else {
4159*c8dee2aaSAndroid Build Coastguard Worker                       offset = 0;
4160*c8dee2aaSAndroid Build Coastguard Worker                   }
4161*c8dee2aaSAndroid Build Coastguard Worker               }
4162*c8dee2aaSAndroid Build Coastguard Worker           });
4163*c8dee2aaSAndroid Build Coastguard Worker           paragraph->paint(canvas, 0, 0);
4164*c8dee2aaSAndroid Build Coastguard Worker           canvas->translate(0, paragraph->getHeight() + 40);
4165*c8dee2aaSAndroid Build Coastguard Worker         }
4166*c8dee2aaSAndroid Build Coastguard Worker 
4167*c8dee2aaSAndroid Build Coastguard Worker         {
4168*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
4169*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
4170*c8dee2aaSAndroid Build Coastguard Worker             builder.addText("Multi �� lined sticky notes drawn as paths");
4171*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
4172*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(300);
4173*c8dee2aaSAndroid Build Coastguard Worker             SkPaint paint;
4174*c8dee2aaSAndroid Build Coastguard Worker             std::vector<LineMetrics> metrics;
4175*c8dee2aaSAndroid Build Coastguard Worker             paragraph->getLineMetrics(metrics);
4176*c8dee2aaSAndroid Build Coastguard Worker             SkScalar height = 0;
4177*c8dee2aaSAndroid Build Coastguard Worker             for (size_t lineNum = 0; lineNum < paragraph->lineNumber(); ++lineNum) {
4178*c8dee2aaSAndroid Build Coastguard Worker                 SkPath paths;
4179*c8dee2aaSAndroid Build Coastguard Worker                 paragraph->getPath(lineNum, &paths);
4180*c8dee2aaSAndroid Build Coastguard Worker                 auto& line = metrics[lineNum];
4181*c8dee2aaSAndroid Build Coastguard Worker                 SkRect rect = SkRect::MakeXYWH(line.fLeft, height, line.fWidth, line.fHeight);
4182*c8dee2aaSAndroid Build Coastguard Worker                 height += line.fHeight;
4183*c8dee2aaSAndroid Build Coastguard Worker                 paint.setShader(setgrad(rect, SK_ColorBLUE, SK_ColorLTGRAY));
4184*c8dee2aaSAndroid Build Coastguard Worker                 canvas->drawPath(paths, paint);
4185*c8dee2aaSAndroid Build Coastguard Worker             }
4186*c8dee2aaSAndroid Build Coastguard Worker         }
4187*c8dee2aaSAndroid Build Coastguard Worker     }
4188*c8dee2aaSAndroid Build Coastguard Worker };
4189*c8dee2aaSAndroid Build Coastguard Worker 
4190*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlideGlyphs : public ParagraphSlide_Base {
4191*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlideGlyphs()4192*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlideGlyphs() { fName = "ParagraphSlideGlyphs"; }
draw(SkCanvas * canvas)4193*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
4194*c8dee2aaSAndroid Build Coastguard Worker 
4195*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
4196*c8dee2aaSAndroid Build Coastguard Worker         const char* text1 = "World    domination is     such an ugly phrase - I     prefer to call it    world optimisation";
4197*c8dee2aaSAndroid Build Coastguard Worker         const char* text2 =
4198*c8dee2aaSAndroid Build Coastguard Worker                 "左線読設重説切abc後碁給能上目秘使約。満毎冠行   来昼本可   def   必図将発確年。今属場育"
4199*c8dee2aaSAndroid Build Coastguard Worker                 "図情闘陰野高備込制詩西校客。審対江置講今固残必託地集済決維駆年策。立得庭"
4200*c8dee2aaSAndroid Build Coastguard Worker                 "際輝求佐抗蒼提夜合逃表。注統天言件自謙雅載報紙喪。作画稿愛器灯女書利変探"
4201*c8dee2aaSAndroid Build Coastguard Worker                 "訃第金線朝開化建。子戦年帝励害表月幕株漠新期刊人秘。図的海力生禁挙保天戦"
4202*c8dee2aaSAndroid Build Coastguard Worker                 "聞条年所在口。";
4203*c8dee2aaSAndroid Build Coastguard Worker         const char* text3 = "من أسر وإعلان الخاصّة وهولندا،, عل def    قائمة الضغوط بالمabcطالبة تلك. الصفحة "
4204*c8dee2aaSAndroid Build Coastguard Worker             "بمباركة التقليدية قام عن. تصفح";
4205*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
4206*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
4207*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
4208*c8dee2aaSAndroid Build Coastguard Worker 
4209*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
4210*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextAlign(TextAlign::kJustify);
4211*c8dee2aaSAndroid Build Coastguard Worker 
4212*c8dee2aaSAndroid Build Coastguard Worker         auto draw = [&](const char* text, TextDirection textDirection) {
4213*c8dee2aaSAndroid Build Coastguard Worker             paragraph_style.setTextDirection(textDirection);
4214*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
4215*c8dee2aaSAndroid Build Coastguard Worker             TextStyle text_style;
4216*c8dee2aaSAndroid Build Coastguard Worker             text_style.setFontFamilies({SkString("Katibeh"), SkString("Roboto"), SkString("Source Han Serif CN")});
4217*c8dee2aaSAndroid Build Coastguard Worker             text_style.setFontSize(40);
4218*c8dee2aaSAndroid Build Coastguard Worker             text_style.setColor(SK_ColorBLACK);
4219*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
4220*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text);
4221*c8dee2aaSAndroid Build Coastguard Worker 
4222*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
4223*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(this->size().width()); // 497
4224*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
4225*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(0, paragraph->getHeight() + 20);
4226*c8dee2aaSAndroid Build Coastguard Worker         };
4227*c8dee2aaSAndroid Build Coastguard Worker 
4228*c8dee2aaSAndroid Build Coastguard Worker         draw(text1, TextDirection::kLtr);
4229*c8dee2aaSAndroid Build Coastguard Worker         draw(text2, TextDirection::kLtr);
4230*c8dee2aaSAndroid Build Coastguard Worker         draw(text3, TextDirection::kLtr);
4231*c8dee2aaSAndroid Build Coastguard Worker     }
4232*c8dee2aaSAndroid Build Coastguard Worker };
4233*c8dee2aaSAndroid Build Coastguard Worker 
4234*c8dee2aaSAndroid Build Coastguard Worker 
4235*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlideEllipsisInRTL : public ParagraphSlide_Base {
4236*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlideEllipsisInRTL()4237*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlideEllipsisInRTL() { fName = "ParagraphSlideEllipsisInRTL"; }
draw(SkCanvas * canvas)4238*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
4239*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
4240*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = getFontCollection();
4241*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
4242*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
4243*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
4244*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Noto Naskh Arabic")});
4245*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(100);
4246*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
4247*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
4248*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
4249*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextAlign(TextAlign::kStart);
4250*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setEllipsis(u"\u2026");
4251*c8dee2aaSAndroid Build Coastguard Worker         auto draw = [&](const std::u16string& text) {
4252*c8dee2aaSAndroid Build Coastguard Worker             paragraph_style.setMaxLines(1);
4253*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
4254*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
4255*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text);
4256*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
4257*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(this->size().width());
4258*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
4259*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(0, paragraph->getHeight() + 10);
4260*c8dee2aaSAndroid Build Coastguard Worker         };
4261*c8dee2aaSAndroid Build Coastguard Worker 
4262*c8dee2aaSAndroid Build Coastguard Worker         draw(u"你abcdefsdasdsasas");
4263*c8dee2aaSAndroid Build Coastguard Worker         draw(u"한111111111111111111");
4264*c8dee2aaSAndroid Build Coastguard Worker         draw(u"abcdefsdasds1112222");
4265*c8dee2aaSAndroid Build Coastguard Worker     }
4266*c8dee2aaSAndroid Build Coastguard Worker };
4267*c8dee2aaSAndroid Build Coastguard Worker 
4268*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlideEmojiSequence : public ParagraphSlide_Base {
4269*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlideEmojiSequence()4270*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlideEmojiSequence() { fName = "ParagraphSlideEmojiSequence"; }
draw(SkCanvas * canvas)4271*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
4272*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
4273*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
4274*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr(), std::vector<SkString>());
4275*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
4276*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
4277*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("")});
4278*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(20);
4279*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
4280*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
4281*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
4282*c8dee2aaSAndroid Build Coastguard Worker 
4283*c8dee2aaSAndroid Build Coastguard Worker         auto test = [&](const char* text) {
4284*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
4285*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
4286*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text);
4287*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
4288*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(this->size().width());
4289*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
4290*c8dee2aaSAndroid Build Coastguard Worker             if ((false)) {
4291*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("Paragraph '%s'\n", text);
4292*c8dee2aaSAndroid Build Coastguard Worker                 auto impl = static_cast<ParagraphImpl*>(paragraph.get());
4293*c8dee2aaSAndroid Build Coastguard Worker                 for (auto& run: impl->runs()) {
4294*c8dee2aaSAndroid Build Coastguard Worker                     SkString ff;
4295*c8dee2aaSAndroid Build Coastguard Worker                     run.font().getTypeface()->getFamilyName(&ff);
4296*c8dee2aaSAndroid Build Coastguard Worker                     SkDebugf("'%s': [%zu:%zu)\n", ff.c_str(), run.textRange().start, run.textRange().end);
4297*c8dee2aaSAndroid Build Coastguard Worker                 }
4298*c8dee2aaSAndroid Build Coastguard Worker             }
4299*c8dee2aaSAndroid Build Coastguard Worker         };
4300*c8dee2aaSAndroid Build Coastguard Worker         test("2nd");
4301*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 50);
4302*c8dee2aaSAndroid Build Coastguard Worker         test("99");
4303*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 50);
4304*c8dee2aaSAndroid Build Coastguard Worker         test("999");
4305*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 50);
4306*c8dee2aaSAndroid Build Coastguard Worker         /*
4307*c8dee2aaSAndroid Build Coastguard Worker         test("��");
4308*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 50);
4309*c8dee2aaSAndroid Build Coastguard Worker         test("0️⃣");
4310*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 50);
4311*c8dee2aaSAndroid Build Coastguard Worker         test("0️⃣��");
4312*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 50);
4313*c8dee2aaSAndroid Build Coastguard Worker         test("0");
4314*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 50);
4315*c8dee2aaSAndroid Build Coastguard Worker         test("0️");
4316*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 50);
4317*c8dee2aaSAndroid Build Coastguard Worker         test("♻️");
4318*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 50);
4319*c8dee2aaSAndroid Build Coastguard Worker         test("������������������������♻️");
4320*c8dee2aaSAndroid Build Coastguard Worker         */
4321*c8dee2aaSAndroid Build Coastguard Worker     }
4322*c8dee2aaSAndroid Build Coastguard Worker };
4323*c8dee2aaSAndroid Build Coastguard Worker 
4324*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlideWordSpacing : public ParagraphSlide_Base {
4325*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlideWordSpacing()4326*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlideWordSpacing() { fName = "ParagraphWordSpacing"; }
4327*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)4328*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
4329*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
4330*c8dee2aaSAndroid Build Coastguard Worker 
4331*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
4332*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr());
4333*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
4334*c8dee2aaSAndroid Build Coastguard Worker 
4335*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
4336*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
4337*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
4338*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({});
4339*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(20.0);
4340*c8dee2aaSAndroid Build Coastguard Worker 
4341*c8dee2aaSAndroid Build Coastguard Worker         auto draw = [&](TextDirection direction, SkScalar spacing, const char* text) {
4342*c8dee2aaSAndroid Build Coastguard Worker             paragraph_style.setTextDirection(direction);
4343*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
4344*c8dee2aaSAndroid Build Coastguard Worker             text_style.setWordSpacing(spacing);
4345*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
4346*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text);
4347*c8dee2aaSAndroid Build Coastguard Worker             builder.pop();
4348*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
4349*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(this->size().width());
4350*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
4351*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(0, paragraph->getHeight() + 20);
4352*c8dee2aaSAndroid Build Coastguard Worker         };
4353*c8dee2aaSAndroid Build Coastguard Worker 
4354*c8dee2aaSAndroid Build Coastguard Worker         draw(TextDirection::kLtr, 20, "Lorem ipsum dolor sit amet");
4355*c8dee2aaSAndroid Build Coastguard Worker         draw(TextDirection::kRtl, 20, "Lorem ipsum dolor sit amet");
4356*c8dee2aaSAndroid Build Coastguard Worker 
4357*c8dee2aaSAndroid Build Coastguard Worker         draw(TextDirection::kLtr, 20, "טקסט ללא רווח בין מילים");
4358*c8dee2aaSAndroid Build Coastguard Worker         draw(TextDirection::kRtl, 20, "טקסט ללא רווח בין מילים");
4359*c8dee2aaSAndroid Build Coastguard Worker 
4360*c8dee2aaSAndroid Build Coastguard Worker         draw(TextDirection::kLtr, 20, "نص مع عدم وجود مسافات بين الكلمات");
4361*c8dee2aaSAndroid Build Coastguard Worker         draw(TextDirection::kRtl, 20, "نص مع عدم وجود مسافات بين الكلمات");
4362*c8dee2aaSAndroid Build Coastguard Worker     }
4363*c8dee2aaSAndroid Build Coastguard Worker };
4364*c8dee2aaSAndroid Build Coastguard Worker 
4365*c8dee2aaSAndroid Build Coastguard Worker class ParagraphSlideLast : public ParagraphSlide_Base {
4366*c8dee2aaSAndroid Build Coastguard Worker public:
ParagraphSlideLast()4367*c8dee2aaSAndroid Build Coastguard Worker     ParagraphSlideLast() { fName = "ParagraphSlideLast"; }
draw(SkCanvas * canvas)4368*c8dee2aaSAndroid Build Coastguard Worker     void draw(SkCanvas* canvas) override {
4369*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SK_ColorWHITE);
4370*c8dee2aaSAndroid Build Coastguard Worker         auto fontCollection = sk_make_sp<FontCollection>();
4371*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr(), std::vector<SkString>());
4372*c8dee2aaSAndroid Build Coastguard Worker         fontCollection->enableFontFallback();
4373*c8dee2aaSAndroid Build Coastguard Worker         TextStyle text_style;
4374*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontFamilies({SkString("Roboto"), SkString("Noto Color Emoji")});
4375*c8dee2aaSAndroid Build Coastguard Worker         text_style.setFontSize(20);
4376*c8dee2aaSAndroid Build Coastguard Worker         text_style.setColor(SK_ColorBLACK);
4377*c8dee2aaSAndroid Build Coastguard Worker         ParagraphStyle paragraph_style;
4378*c8dee2aaSAndroid Build Coastguard Worker         paragraph_style.setTextStyle(text_style);
4379*c8dee2aaSAndroid Build Coastguard Worker 
4380*c8dee2aaSAndroid Build Coastguard Worker         auto test = [&](const char* text) {
4381*c8dee2aaSAndroid Build Coastguard Worker             ParagraphBuilderImpl builder(paragraph_style, fontCollection, get_unicode());
4382*c8dee2aaSAndroid Build Coastguard Worker             builder.pushStyle(text_style);
4383*c8dee2aaSAndroid Build Coastguard Worker             builder.addText(text);
4384*c8dee2aaSAndroid Build Coastguard Worker             auto paragraph = builder.Build();
4385*c8dee2aaSAndroid Build Coastguard Worker             paragraph->layout(this->size().width());
4386*c8dee2aaSAndroid Build Coastguard Worker             paragraph->paint(canvas, 0, 0);
4387*c8dee2aaSAndroid Build Coastguard Worker             if ((false)) {
4388*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("Paragraph '%s'\n", text);
4389*c8dee2aaSAndroid Build Coastguard Worker                 auto impl = static_cast<ParagraphImpl*>(paragraph.get());
4390*c8dee2aaSAndroid Build Coastguard Worker                 for (auto& run: impl->runs()) {
4391*c8dee2aaSAndroid Build Coastguard Worker                     SkString ff;
4392*c8dee2aaSAndroid Build Coastguard Worker                     run.font().getTypeface()->getFamilyName(&ff);
4393*c8dee2aaSAndroid Build Coastguard Worker                     SkDebugf("'%s': [%zu:%zu)\n", ff.c_str(), run.textRange().start, run.textRange().end);
4394*c8dee2aaSAndroid Build Coastguard Worker                 }
4395*c8dee2aaSAndroid Build Coastguard Worker             }
4396*c8dee2aaSAndroid Build Coastguard Worker         };
4397*c8dee2aaSAndroid Build Coastguard Worker 
4398*c8dee2aaSAndroid Build Coastguard Worker         test("​��​������⃢");
4399*c8dee2aaSAndroid Build Coastguard Worker     }
4400*c8dee2aaSAndroid Build Coastguard Worker };
4401*c8dee2aaSAndroid Build Coastguard Worker 
4402*c8dee2aaSAndroid Build Coastguard Worker }  // namespace
4403*c8dee2aaSAndroid Build Coastguard Worker 
4404*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
4405*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide1();)
4406*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide2();)
4407*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide3();)
4408*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide5();)
4409*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide6();)
4410*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide7();)
4411*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide8();)
4412*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide9();)
4413*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide10();)
4414*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide11();)
4415*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide12();)
4416*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide14();)
4417*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide15();)
4418*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide16();)
4419*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide17();)
4420*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide18();)
4421*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide19();)
4422*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide20();)
4423*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide21();)
4424*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide22();)
4425*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide23();)
4426*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide24();)
4427*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide25();)
4428*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide26();)
4429*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide27();)
4430*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide28();)
4431*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide29();)
4432*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide30();)
4433*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide31();)
4434*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide32();)
4435*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide33();)
4436*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide34();)
4437*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide35();)
4438*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide36();)
4439*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide37();)
4440*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide38();)
4441*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide39();)
4442*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide41();)
4443*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide42();)
4444*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide43();)
4445*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide44();)
4446*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide45();)
4447*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide46();)
4448*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide47();)
4449*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide48();)
4450*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide49();)
4451*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide50();)
4452*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide51();)
4453*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide52();)
4454*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide53();)
4455*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide54();)
4456*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide55();)
4457*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide56();)
4458*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide57();)
4459*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide58();)
4460*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide59();)
4461*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide60();)
4462*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide61();)
4463*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide62();)
4464*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide63();)
4465*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide64();)
4466*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide66();)
4467*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide67();)
4468*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide68();)
4469*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide_MultiStyle_Logo();)
4470*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide_MultiStyle_FFI();)
4471*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide_MultiStyle_EmojiFamily();)
4472*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide_MultiStyle_Arabic1();)
4473*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide_MultiStyle_Zalgo();)
4474*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlide_MultiStyle_Arabic2();)
4475*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlideMixedTextDirection();)
4476*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlideGetPath();)
4477*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlideExperiment();)
4478*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlideGlyphs();)
4479*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlideEllipsisInRTL();)
4480*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlideEmojiSequence();)
4481*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlideWordSpacing();)
4482*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new ParagraphSlideLast();)
4483