aboutsummaryrefslogtreecommitdiffhomepage
path: root/samplecode
diff options
context:
space:
mode:
authorGravatar Jim Van Verth <jvanverth@google.com>2018-01-25 16:26:25 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-01-26 13:54:54 +0000
commitfc4f768e5aaf8efdd112f38295a35de83a0f9a55 (patch)
tree64571d9e826dd917299fd4973111732dd76ddcb1 /samplecode
parentfc807c885b3cce6252cc1d057098d96f8e14eadc (diff)
Use int when possible to calculate atlas indices in shaders.
On certain iOS devices half has a mantissa of only 10 bits, which is not enough to perform the floating point trickery to get the lower bits out of the "texture coordinates". Instead we use int if available, and float if not available. Also re-enables multitexturing for iOS and adds a sample which stresses the issue, and a version of fontcache that tests multitexturing. Bug: skia:7285 Change-Id: Ia541b6a418c1860c941071750ceb26459eb846ea Reviewed-on: https://skia-review.googlesource.com/99800 Reviewed-by: Brian Salomon <bsalomon@google.com> Reviewed-by: Robert Phillips <robertphillips@google.com> Commit-Queue: Jim Van Verth <jvanverth@google.com>
Diffstat (limited to 'samplecode')
-rw-r--r--samplecode/SampleFlutterAnimate.cpp115
1 files changed, 115 insertions, 0 deletions
diff --git a/samplecode/SampleFlutterAnimate.cpp b/samplecode/SampleFlutterAnimate.cpp
new file mode 100644
index 0000000000..813572934e
--- /dev/null
+++ b/samplecode/SampleFlutterAnimate.cpp
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SampleCode.h"
+#include "SkAnimTimer.h"
+#include "SkView.h"
+#include "SkCanvas.h"
+#include "SkUtils.h"
+#include "SkColorPriv.h"
+#include "SkColorFilter.h"
+#include "SkImage.h"
+#include "SkRandom.h"
+#include "SkTime.h"
+#include "SkTypeface.h"
+#include "Timer.h"
+
+#if SK_SUPPORT_GPU
+#include "GrContext.h"
+#endif
+
+// Create an animation of a bunch of letters that rotate in place. This is intended to stress
+// the glyph atlas and test that we don't see corruption or bad slowdowns.
+class FlutterAnimateView : public SampleView {
+public:
+ FlutterAnimateView() : fCurrTime(0), fResetTime(0) {}
+
+protected:
+ void onOnceBeforeDraw() override {
+ fTypeface = SkTypeface::MakeFromFile("/skimages/samplefont.ttf");
+ initChars();
+ }
+
+ // overrides from SkEventSink
+ bool onQuery(SkEvent* evt) override {
+ if (SampleCode::TitleQ(*evt)) {
+ SampleCode::TitleR(evt, "FlutterAnimate");
+ return true;
+ }
+
+ return this->INHERITED::onQuery(evt);
+ }
+
+ void onDrawContent(SkCanvas* canvas) override {
+ SkPaint paint;
+ paint.setTypeface(fTypeface);
+ paint.setAntiAlias(true);
+ paint.setFilterQuality(kMedium_SkFilterQuality);
+ paint.setTextSize(50);
+
+ // rough center of each glyph
+ static constexpr auto kMidX = 35;
+ static constexpr auto kMidY = 50;
+
+ canvas->clear(SK_ColorWHITE);
+ for (int i = 0; i < kNumChars; ++i) {
+ canvas->save();
+ double rot = SkScalarInterp(fChars[i].fStartRotation, fChars[i].fEndRotation,
+ fCurrTime/kDuration);
+ canvas->translate(fChars[i].fPosition.fX + kMidX, fChars[i].fPosition.fY - kMidY);
+ canvas->rotate(SkRadiansToDegrees(rot));
+ canvas->translate(-35,+50);
+ canvas->drawString(fChars[i].fChar, 0, 0, paint);
+ canvas->restore();
+ }
+ }
+
+ bool onAnimate(const SkAnimTimer& timer) override {
+ fCurrTime = timer.secs() - fResetTime;
+ if (fCurrTime > kDuration) {
+ this->initChars();
+ fResetTime = timer.secs();
+ fCurrTime = 0;
+ }
+
+ return true;
+ }
+
+private:
+ void initChars() {
+ for (int i = 0; i < kNumChars; ++i) {
+ char c = fRand.nextULessThan(26) + 65;
+ fChars[i].fChar[0] = c;
+ fChars[i].fChar[1] = '\0';
+ fChars[i].fPosition = SkPoint::Make(fRand.nextF()*748 + 10, fRand.nextF()*1004 + 10);
+ fChars[i].fStartRotation = fRand.nextF();
+ fChars[i].fEndRotation = fRand.nextF() * 20 - 10;
+ }
+ }
+
+ static constexpr double kDuration = 5.0;
+ double fCurrTime;
+ double fResetTime;
+ SkRandom fRand;
+
+ struct AnimatedChar {
+ char fChar[2];
+ SkPoint fPosition;
+ SkScalar fStartRotation;
+ SkScalar fEndRotation;
+ };
+ sk_sp<SkTypeface> fTypeface;
+ static constexpr int kNumChars = 40;
+ AnimatedChar fChars[kNumChars];
+
+ typedef SampleView INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+static SkView* MyFactory() { return new FlutterAnimateView; }
+static SkViewRegister reg(MyFactory);