1fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth/* 2fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth * Copyright 2018 Google Inc. 3fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth * 4fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth * Use of this source code is governed by a BSD-style license that can be 5fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth * found in the LICENSE file. 6fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth */ 7fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 8fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth#include "SampleCode.h" 9fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth#include "SkAnimTimer.h" 10fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth#include "SkView.h" 11fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth#include "SkCanvas.h" 12fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth#include "SkUtils.h" 13fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth#include "SkColorPriv.h" 14fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth#include "SkColorFilter.h" 15fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth#include "SkImage.h" 16fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth#include "SkRandom.h" 17fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth#include "SkTime.h" 18fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth#include "SkTypeface.h" 19fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth#include "Timer.h" 20fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 21fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth#if SK_SUPPORT_GPU 22fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth#include "GrContext.h" 23fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth#endif 24fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 25fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth// Create an animation of a bunch of letters that rotate in place. This is intended to stress 26fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth// the glyph atlas and test that we don't see corruption or bad slowdowns. 27fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verthclass FlutterAnimateView : public SampleView { 28fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verthpublic: 29fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth FlutterAnimateView() : fCurrTime(0), fResetTime(0) {} 30fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 31fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verthprotected: 32fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth void onOnceBeforeDraw() override { 33fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth fTypeface = SkTypeface::MakeFromFile("/skimages/samplefont.ttf"); 34fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth initChars(); 35fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth } 36fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 37fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth // overrides from SkEventSink 38fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth bool onQuery(SkEvent* evt) override { 39fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth if (SampleCode::TitleQ(*evt)) { 40fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth SampleCode::TitleR(evt, "FlutterAnimate"); 41fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth return true; 42fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth } 43fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 44fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth return this->INHERITED::onQuery(evt); 45fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth } 46fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 47fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth void onDrawContent(SkCanvas* canvas) override { 48fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth SkPaint paint; 49fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth paint.setTypeface(fTypeface); 50fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth paint.setAntiAlias(true); 51fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth paint.setFilterQuality(kMedium_SkFilterQuality); 52fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth paint.setTextSize(50); 53fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 54fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth // rough center of each glyph 55fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth static constexpr auto kMidX = 35; 56fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth static constexpr auto kMidY = 50; 57fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 58fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth canvas->clear(SK_ColorWHITE); 59fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth for (int i = 0; i < kNumChars; ++i) { 60fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth canvas->save(); 61fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth double rot = SkScalarInterp(fChars[i].fStartRotation, fChars[i].fEndRotation, 62fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth fCurrTime/kDuration); 63fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth canvas->translate(fChars[i].fPosition.fX + kMidX, fChars[i].fPosition.fY - kMidY); 64fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth canvas->rotate(SkRadiansToDegrees(rot)); 65fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth canvas->translate(-35,+50); 66fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth canvas->drawString(fChars[i].fChar, 0, 0, paint); 67fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth canvas->restore(); 68fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth } 69fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth } 70fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 71fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth bool onAnimate(const SkAnimTimer& timer) override { 72fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth fCurrTime = timer.secs() - fResetTime; 73fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth if (fCurrTime > kDuration) { 74fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth this->initChars(); 75fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth fResetTime = timer.secs(); 76fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth fCurrTime = 0; 77fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth } 78fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 79fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth return true; 80fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth } 81fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 82fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verthprivate: 83fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth void initChars() { 84fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth for (int i = 0; i < kNumChars; ++i) { 85fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth char c = fRand.nextULessThan(26) + 65; 86fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth fChars[i].fChar[0] = c; 87fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth fChars[i].fChar[1] = '\0'; 88fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth fChars[i].fPosition = SkPoint::Make(fRand.nextF()*748 + 10, fRand.nextF()*1004 + 10); 89fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth fChars[i].fStartRotation = fRand.nextF(); 90fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth fChars[i].fEndRotation = fRand.nextF() * 20 - 10; 91fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth } 92fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth } 93fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 94fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth static constexpr double kDuration = 5.0; 95fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth double fCurrTime; 96fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth double fResetTime; 97fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth SkRandom fRand; 98fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 99fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth struct AnimatedChar { 100fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth char fChar[2]; 101fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth SkPoint fPosition; 102fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth SkScalar fStartRotation; 103fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth SkScalar fEndRotation; 104fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth }; 105fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth sk_sp<SkTypeface> fTypeface; 106fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth static constexpr int kNumChars = 40; 107fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth AnimatedChar fChars[kNumChars]; 108fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 109fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth typedef SampleView INHERITED; 110fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth}; 111fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 112fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth////////////////////////////////////////////////////////////////////////////// 113fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verth 114fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verthstatic SkView* MyFactory() { return new FlutterAnimateView; } 115fc4f768e5aaf8efdd112f38295a35de83a0f9a55Jim Van Verthstatic SkViewRegister reg(MyFactory); 116