aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Robert Phillips <robertphillips@google.com>2017-08-15 13:28:42 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-08-16 13:45:57 +0000
commit4c72b266da265d5d31096997ca2d11b4171ec240 (patch)
treeea509c8d694a22130db719cc8690d47e02d4c3a3
parent7bfca07bcaa271827459b3610f0743f24306944b (diff)
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>
-rw-r--r--gn/samples.gni1
-rw-r--r--samplecode/SampleChineseFling.cpp123
-rw-r--r--tools/sk_tool_utils.cpp10
-rw-r--r--tools/sk_tool_utils.h7
4 files changed, 136 insertions, 5 deletions
diff --git a/gn/samples.gni b/gn/samples.gni
index edb2fe8608..b61ec349ad 100644
--- a/gn/samples.gni
+++ b/gn/samples.gni
@@ -29,6 +29,7 @@ samples_sources = [
"$_samplecode/SampleCCPRGeometry.cpp",
"$_samplecode/SampleCamera.cpp",
"$_samplecode/SampleChart.cpp",
+ "$_samplecode/SampleChineseFling.cpp",
"$_samplecode/SampleCircle.cpp",
"$_samplecode/SampleClip.cpp",
"$_samplecode/SampleClipDrawMatch.cpp",
diff --git a/samplecode/SampleChineseFling.cpp b/samplecode/SampleChineseFling.cpp
new file mode 100644
index 0000000000..036f834931
--- /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);
diff --git a/tools/sk_tool_utils.cpp b/tools/sk_tool_utils.cpp
index 380e1d78bc..f1968742d4 100644
--- a/tools/sk_tool_utils.cpp
+++ b/tools/sk_tool_utils.cpp
@@ -247,12 +247,11 @@ SkBitmap create_string_bitmap(int w, int h, SkColor c, int x, int y,
return result;
}
-void add_to_text_blob(SkTextBlobBuilder* builder, const char* text, const SkPaint& origPaint,
- SkScalar x, SkScalar y) {
+void add_to_text_blob_w_len(SkTextBlobBuilder* builder, const char* text, size_t len,
+ const SkPaint& origPaint, SkScalar x, SkScalar y) {
SkPaint paint(origPaint);
SkTDArray<uint16_t> glyphs;
- size_t len = strlen(text);
glyphs.append(paint.textToGlyphs(text, len, nullptr));
paint.textToGlyphs(text, len, glyphs.begin());
@@ -262,6 +261,11 @@ void add_to_text_blob(SkTextBlobBuilder* builder, const char* text, const SkPain
memcpy(run.glyphs, glyphs.begin(), glyphs.count() * sizeof(uint16_t));
}
+void add_to_text_blob(SkTextBlobBuilder* builder, const char* text,
+ const SkPaint& origPaint, SkScalar x, SkScalar y) {
+ add_to_text_blob_w_len(builder, text, strlen(text), origPaint, x, y);
+}
+
#if !defined(__clang__) && defined(_MSC_VER)
// MSVC takes ~2 minutes to compile this function with optimization.
// We don't really care to wait that long for this function.
diff --git a/tools/sk_tool_utils.h b/tools/sk_tool_utils.h
index dc8c8c10a0..b1bde770ea 100644
--- a/tools/sk_tool_utils.h
+++ b/tools/sk_tool_utils.h
@@ -129,8 +129,11 @@ namespace sk_tool_utils {
int textSize, const char* str);
// A helper for inserting a drawtext call into a SkTextBlobBuilder
- void add_to_text_blob(SkTextBlobBuilder* builder, const char* text, const SkPaint& origPaint,
- SkScalar x, SkScalar y);
+ void add_to_text_blob_w_len(SkTextBlobBuilder* builder, const char* text, size_t len,
+ const SkPaint& origPaint, SkScalar x, SkScalar y);
+
+ void add_to_text_blob(SkTextBlobBuilder* builder, const char* text,
+ const SkPaint& origPaint, SkScalar x, SkScalar y);
void make_big_path(SkPath& path);