1 /* 2 * Copyright 2015 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "SKPAnimationBench.h" 9 #include "SkCommandLineFlags.h" 10 #include "SkMultiPictureDraw.h" 11 #include "SkSurface.h" 12 13 SKPAnimationBench::SKPAnimationBench(const char* name, const SkPicture* pic, const SkIRect& clip, 14 Animation* animation, bool doLooping) 15 : INHERITED(name, pic, clip, 1.0, false, doLooping) 16 , fAnimation(SkRef(animation)) { 17 fUniqueName.printf("%s_%s", name, fAnimation->getTag()); 18 } 19 20 const char* SKPAnimationBench::onGetUniqueName() { 21 return fUniqueName.c_str(); 22 } 23 24 void SKPAnimationBench::onPerCanvasPreDraw(SkCanvas* canvas) { 25 INHERITED::onPerCanvasPreDraw(canvas); 26 SkAssertResult(canvas->getClipDeviceBounds(&fDevBounds)); 27 fAnimationTimer.start(); 28 } 29 30 void SKPAnimationBench::drawPicture() { 31 fAnimationTimer.end(); 32 33 for (int j = 0; j < this->tileRects().count(); ++j) { 34 SkMatrix trans = SkMatrix::MakeTrans(-1.f * this->tileRects()[j].fLeft, 35 -1.f * this->tileRects()[j].fTop); 36 fAnimation->preConcatFrameMatrix(fAnimationTimer.fWall, fDevBounds, &trans); 37 this->surfaces()[j]->getCanvas()->drawPicture(this->picture(), &trans, nullptr); 38 } 39 40 for (int j = 0; j < this->tileRects().count(); ++j) { 41 this->surfaces()[j]->getCanvas()->flush(); 42 } 43 } 44 45 class ZoomAnimation : public SKPAnimationBench::Animation { 46 public: 47 ZoomAnimation(SkScalar zoomMax, double zoomPeriodMs) 48 : fZoomMax(zoomMax) 49 , fZoomPeriodMs(zoomPeriodMs) { 50 } 51 52 virtual const char* getTag() { return "zoom"; } 53 54 virtual void preConcatFrameMatrix(double animationTimeMs, const SkIRect& devBounds, 55 SkMatrix* drawMatrix) { 56 double t = fmod(animationTimeMs / fZoomPeriodMs, 1.0); // t is in [0, 1). 57 t = fabs(2 * t - 1); // Make t ping-pong between 0 and 1 58 SkScalar zoom = static_cast<SkScalar>(pow(fZoomMax, t)); 59 60 SkPoint center = SkPoint::Make((devBounds.fLeft + devBounds.fRight) / 2.0f, 61 (devBounds.fTop + devBounds.fBottom) / 2.0f); 62 drawMatrix->preTranslate(center.fX, center.fY); 63 drawMatrix->preScale(zoom, zoom); 64 drawMatrix->preTranslate(-center.fX, -center.fY); 65 } 66 67 private: 68 double fZoomMax; 69 double fZoomPeriodMs; 70 }; 71 72 SKPAnimationBench::Animation* SKPAnimationBench::CreateZoomAnimation(SkScalar zoomMax, 73 double zoomPeriodMs) { 74 return new ZoomAnimation(zoomMax, zoomPeriodMs); 75 } 76