Add Chinese fling sample

Change-Id: Id27877c4d816ec83460f50a3a0d9cc0299ea6849
Reviewed-on: https://skia-review.googlesource.com/34780
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
diff --git a/samplecode/SampleChineseFling.cpp b/samplecode/SampleChineseFling.cpp
new file mode 100644
index 0000000..036f834
--- /dev/null
+++ b/samplecode/SampleChineseFling.cpp
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "Resources.h"
+#include "SampleCode.h"
+#include "sk_tool_utils.h"
+
+#include "SkCanvas.h"
+#include "SkFontMgr.h"
+#include "SkRandom.h"
+#include "SkTypeface.h"
+#include "SkTextBlob.h"
+
+static void make_paint(SkPaint* paint, sk_sp<SkTypeface> typeface) {
+  static const int kTextSize = 56;
+
+  paint->setAntiAlias(true);
+  paint->setColor(0xDE000000);
+  paint->setTypeface(typeface);
+  paint->setTextSize(kTextSize);
+  paint->setTextEncoding(SkPaint::kUTF32_TextEncoding);
+}
+
+static void get_unicode_row(SkUnichar base, SkUnichar glyphs[16]) {
+    for (int i = 0x0; i <= 0xF; ++i) {
+        glyphs[i] = base;
+        glyphs[i] |= i;
+    }
+}
+
+static sk_sp<SkTypeface> chinese_typeface() {
+#ifdef SK_BUILD_FOR_ANDROID
+    return MakeResourceAsTypeface("/fonts/NotoSansCJK-Regular.ttc");
+#elif defined(SK_BUILD_FOR_WIN32)
+    return SkTypeface::MakeFromName("SimSun", SkFontStyle());
+#elif defined(SK_BUILD_FOR_MAC)
+    return SkTypeface::MakeFromName("Hiragino Sans GB W3", SkFontStyle());
+#elif defined(SK_BUILD_FOR_IOS)
+    return SkTypeface::MakeFromName("Hiragino Sans GB W3", SkFontStyle());
+#elif defined(SK_BUILD_FOR_UNIX)
+    return SkTypeface::MakeFromName("Noto Sans CJK SC", SkFontStyle());
+#else
+    return nullptr;
+#endif
+}
+
+class ChineseFlingView : public SampleView {
+public:
+    ChineseFlingView() {}
+
+protected:
+    bool onQuery(SkEvent* evt) override {
+        if (SampleCode::TitleQ(*evt)) {
+            SampleCode::TitleR(evt, "chinese-fling");
+            return true;
+        }
+        return this->INHERITED::onQuery(evt);
+    }
+
+    void onDrawContent(SkCanvas* canvas) override {
+        if (!fInitialized) {
+            this->init();
+            fInitialized = true;
+        }
+
+        canvas->clear(0xFFDDDDDD);
+
+        SkPaint paint;
+        make_paint(&paint, fTypeface);
+
+        for (SkScalar y = 0.0f; y < 1024.0f; ) {
+            int index = fRand.nextRangeU(0, fBlobs.count()-1);
+
+            y += -fMetrics.fAscent;
+            canvas->drawTextBlob(fBlobs[index], 0, y, paint);
+
+            y += fMetrics.fDescent + fMetrics.fLeading;
+        }
+
+        this->inval(nullptr);
+    }
+
+private:
+    void init() {
+        fTypeface = chinese_typeface();
+
+        SkPaint paint;
+        make_paint(&paint, fTypeface);
+
+        paint.getFontMetrics(&fMetrics);
+
+        SkUnichar glyphs[16];
+
+        for (int32_t i = 0x4F00; i < 0x9FA0; i += 0x10) {
+
+            get_unicode_row(i, glyphs);
+
+            SkTextBlobBuilder builder;
+
+            sk_tool_utils::add_to_text_blob_w_len(&builder, (const char*) glyphs, 16*4, paint,
+                                                  0, 0);
+
+            fBlobs.emplace_back(builder.make());
+        }
+    }
+
+    bool                        fInitialized = false;
+    sk_sp<SkTypeface>           fTypeface;
+    SkPaint::FontMetrics        fMetrics;
+    SkTArray<sk_sp<SkTextBlob>> fBlobs;
+    SkRandom                    fRand;
+
+    typedef SkView INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+static SkView* MyFactory() { return new ChineseFlingView; }
+static SkViewRegister reg(MyFactory);