aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/atlastext.cpp
diff options
context:
space:
mode:
authorGravatar Brian Salomon <bsalomon@google.com>2017-11-19 13:20:13 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-11-19 18:55:18 +0000
commitcbcb0a12ad0068b820c28178e8aa141166febd1f (patch)
tree120917b5961b8a043894b95811eec1f8f6379b25 /gm/atlastext.cpp
parentb07b06e14819c7bfb9da87dd754aca1239045af4 (diff)
Revert "Revert "Add Atlas Text interface for rendering SDF glyphs.""
This reverts commit 9c2202ffc22b4293b48a4edeafa1b5d2bab8bb83. Bug: skia: Change-Id: I482ddf74f8e40d3d0908c840ba5c6ff981ccefbd Reviewed-on: https://skia-review.googlesource.com/73345 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'gm/atlastext.cpp')
-rw-r--r--gm/atlastext.cpp123
1 files changed, 123 insertions, 0 deletions
diff --git a/gm/atlastext.cpp b/gm/atlastext.cpp
new file mode 100644
index 0000000000..b8acb0fcc7
--- /dev/null
+++ b/gm/atlastext.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 "gm.h"
+
+#if SK_SUPPORT_ATLAS_TEXT
+
+#include "SkAtlasTextContext.h"
+#include "SkAtlasTextFont.h"
+#include "SkAtlasTextTarget.h"
+#include "SkBitmap.h"
+#include "SkCanvas.h"
+#include "SkTypeface.h"
+#include "gpu/TestContext.h"
+#include "gpu/atlastext/GLTestAtlasTextRenderer.h"
+#include "gpu/atlastext/TestAtlasTextRenderer.h"
+#include "sk_tool_utils.h"
+
+// GM that draws text using the Atlas Text interface offscreen and then blits that to the canvas.
+
+static SkScalar draw_string(SkAtlasTextTarget* target, const SkString& text, SkScalar x, SkScalar y,
+ uint32_t color, sk_sp<SkTypeface> typeface, float size) {
+ auto font = SkAtlasTextFont::Make(std::move(typeface), size);
+ target->drawText(text.c_str(), text.size(), x, y, color, *font);
+ SkPaint paint;
+ paint.setTextSize(size);
+ return x + paint.measureText(text.c_str(), text.size());
+}
+
+class AtlasTextGM : public skiagm::GM {
+public:
+ AtlasTextGM() = default;
+
+protected:
+ SkString onShortName() override { return SkString("atlastext"); }
+
+ SkISize onISize() override { return SkISize::Make(kSize, kSize); }
+
+ void onOnceBeforeDraw() override {
+ fRenderer = sk_gpu_test::MakeGLTestAtlasTextRenderer();
+ if (!fRenderer) {
+ return;
+ }
+ fContext = SkAtlasTextContext::Make(fRenderer);
+ auto targetHandle = fRenderer->makeTargetHandle(kSize, kSize);
+ fTarget = SkAtlasTextTarget::Make(fContext, kSize, kSize, targetHandle);
+
+ fTypefaces[0] = sk_tool_utils::create_portable_typeface("serif", SkFontStyle::Italic());
+ fTypefaces[1] =
+ sk_tool_utils::create_portable_typeface("sans-serif", SkFontStyle::Italic());
+ fTypefaces[2] = sk_tool_utils::create_portable_typeface("serif", SkFontStyle::Normal());
+ fTypefaces[3] =
+ sk_tool_utils::create_portable_typeface("sans-serif", SkFontStyle::Normal());
+ fTypefaces[4] = sk_tool_utils::create_portable_typeface("serif", SkFontStyle::Bold());
+ fTypefaces[5] = sk_tool_utils::create_portable_typeface("sans-serif", SkFontStyle::Bold());
+ }
+
+ void onDraw(SkCanvas* canvas) override {
+ if (!fRenderer) {
+ canvas->clear(SK_ColorRED);
+ return;
+ }
+ auto bmp = this->drawText();
+ SkPaint paint;
+ paint.setBlendMode(SkBlendMode::kSrc);
+ canvas->drawBitmap(bmp, 0, 0);
+ }
+
+private:
+ SkBitmap drawText() {
+ static const int kSizes[] = {8, 13, 18, 23, 30};
+
+ static const SkString kTexts[] = {SkString("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),
+ SkString("abcdefghijklmnopqrstuvwxyz"),
+ SkString("0123456789"),
+ SkString("!@#$%^&*()<>[]{}")};
+ SkScalar x = 0;
+ SkScalar y = 10;
+
+ SkRandom random;
+ do {
+ for (auto s : kSizes) {
+ auto size = 2 * s;
+ for (const auto& typeface : fTypefaces) {
+ for (const auto& text : kTexts) {
+ uint32_t color = random.nextU();
+ x = size + draw_string(fTarget.get(), text, x, y, color, typeface, size);
+ x = SkScalarCeilToScalar(x);
+ if (x + 100 > kSize) {
+ x = 0;
+ y += SkScalarCeilToScalar(size + 3);
+ if (y > kSize) {
+ fTarget->flush();
+ return fRenderer->readTargetHandle(fTarget->handle());
+ }
+ }
+ }
+ }
+ }
+ } while (true);
+ }
+
+ static constexpr int kSize = 1280;
+
+ sk_sp<SkTypeface> fTypefaces[6];
+ sk_sp<sk_gpu_test::TestAtlasTextRenderer> fRenderer;
+ std::unique_ptr<SkAtlasTextTarget> fTarget;
+ sk_sp<SkAtlasTextContext> fContext;
+
+ typedef GM INHERITED;
+};
+
+constexpr int AtlasTextGM::kSize;
+
+//////////////////////////////////////////////////////////////////////////////
+
+DEF_GM(return new AtlasTextGM;)
+
+#endif