Respect grapheme clusters when wrapping text
Bug: skia:10075
Change-Id: I52fad5db0944e74c780c1dbfa0c8e6eb7fa42cf1
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/278468
Reviewed-by: Ben Wagner <bungeman@google.com>
Commit-Queue: Julia Lavrova <jlavrova@google.com>
diff --git a/samplecode/SampleParagraph.cpp b/samplecode/SampleParagraph.cpp
index fc04bb2..60d3494 100644
--- a/samplecode/SampleParagraph.cpp
+++ b/samplecode/SampleParagraph.cpp
@@ -2491,8 +2491,8 @@
SkString name() override { return SkString("Paragraph37"); }
void onDrawContent(SkCanvas* canvas) override {
-
- const char* text = "ছোৈূোঌ";
+ const char* text = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaয়ৠঝোণ৺ঢ়মৈবৗৗঘথফড়৭২খসঢ়ৃঢ়ঁ৷থডঈঽলবনদ২ৢৃঀজঝ৩ঠ৪৫৯০ঌয়্মওৗ৲গখদ৹ঈ৴৹ঢ়ৄএৡফণহলঈ৲থজোৱে ঀকৰঀষজঝঃাখশঽএমংি";
+ //"ৎৣ়ৎঽতঃ৳্ৱব৴ৣঈ৷ূঁঢঢ়শটডৎ৵৵ৰৃ্দংঊাথৗদঊউদ৯ঐৃধা৬হওধি়৭ঽম৯স০ঢফৈঢ়কষঁছফীআে৶ৰ৶ঌৌঊ্ঊঝএঀঃদঞ৮তব৬ৄঊঙঢ়ৡগ৶৹৹ঌড়ঘৄ৷লপ১ভড়৶েঢ়৯ৎকনংট২ংএঢৌৌঐনো০টঽুৠগআ৷৭৩৬তো৻ঈ০ূসষঅঝআমণঔা১ণৈো৵চঽ৩বমৎঙঘ২ঠৠৈী৫তঌণচ৲ঔী৮ঘৰঔ";
canvas->drawColor(SK_ColorWHITE);
auto fontCollection = sk_make_sp<FontCollection>();
@@ -2510,6 +2510,27 @@
auto paragraph = builder.Build();
auto w = width() / 2;
paragraph->layout(w);
+ auto impl = static_cast<ParagraphImpl*>(paragraph.get());
+
+ auto clusters = impl->clusters();
+ size_t c = 0;
+ SkDebugf("clusters\n");
+ for (auto& cluster: clusters) {
+ SkDebugf(""
+ "%d: [%d:%d) %s\n", c++,
+ cluster.textRange().start, cluster.textRange().end,
+ cluster.isSoftBreak() ? "soft" :
+ cluster.isHardBreak() ? "hard" :
+ cluster.isWhitespaces() ? "spaces" : ""
+ );
+ }
+ auto lines = impl->lines();
+ size_t i = 0;
+ SkDebugf("lines\n");
+ for (auto& line : lines) {
+ SkDebugf("%d: [%d:%d)\n", i++, line.trimmedText().start, line.trimmedText().end);
+ }
+
paragraph->paint(canvas, 0, 0);
}
@@ -2517,7 +2538,6 @@
typedef Sample INHERITED;
};
-//"\U0001f469\u200D\U0001f469\u200D\U0001f466\U0001f469\u200D\U0001f469\u200D\U0001f467\u200D\U0001f467\U0001f1fa\U0001f1f8"
//////////////////////////////////////////////////////////////////////////////
DEF_SAMPLE(return new ParagraphView1();)
DEF_SAMPLE(return new ParagraphView2();)