diff options
author | Robert Phillips <robertphillips@google.com> | 2017-08-15 13:28:42 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-08-16 13:45:57 +0000 |
commit | 4c72b266da265d5d31096997ca2d11b4171ec240 (patch) | |
tree | ea509c8d694a22130db719cc8690d47e02d4c3a3 | |
parent | 7bfca07bcaa271827459b3610f0743f24306944b (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.gni | 1 | ||||
-rw-r--r-- | samplecode/SampleChineseFling.cpp | 123 | ||||
-rw-r--r-- | tools/sk_tool_utils.cpp | 10 | ||||
-rw-r--r-- | tools/sk_tool_utils.h | 7 |
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); |