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