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