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 fDevBounds = canvas->getDeviceClipBounds(); 27 SkAssertResult(!fDevBounds.isEmpty()); 28 fAnimationTimer.start(); 29 } 30 31 void SKPAnimationBench::drawPicture() { 32 fAnimationTimer.end(); 33 34 for (int j = 0; j < this->tileRects().count(); ++j) { 35 SkMatrix trans = SkMatrix::MakeTrans(-1.f * this->tileRects()[j].fLeft, 36 -1.f * this->tileRects()[j].fTop); 37 fAnimation->preConcatFrameMatrix(fAnimationTimer.fWall, fDevBounds, &trans); 38 this->surfaces()[j]->getCanvas()->drawPicture(this->picture(), &trans, nullptr); 39 } 40 41 for (int j = 0; j < this->tileRects().count(); ++j) { 42 this->surfaces()[j]->getCanvas()->flush(); 43 } 44 } 45 46 class ZoomAnimation : public SKPAnimationBench::Animation { 47 public: 48 ZoomAnimation(SkScalar zoomMax, double zoomPeriodMs) 49 : fZoomMax(zoomMax) 50 , fZoomPeriodMs(zoomPeriodMs) { 51 } 52 53 virtual const char* getTag() { return "zoom"; } 54 55 virtual void preConcatFrameMatrix(double animationTimeMs, const SkIRect& devBounds, 56 SkMatrix* drawMatrix) { 57 double t = fmod(animationTimeMs / fZoomPeriodMs, 1.0); // t is in [0, 1). 58 t = fabs(2 * t - 1); // Make t ping-pong between 0 and 1 59 SkScalar zoom = static_cast<SkScalar>(pow(fZoomMax, t)); 60 61 SkPoint center = SkPoint::Make((devBounds.fLeft + devBounds.fRight) / 2.0f, 62 (devBounds.fTop + devBounds.fBottom) / 2.0f); 63 drawMatrix->preTranslate(center.fX, center.fY); 64 drawMatrix->preScale(zoom, zoom); 65 drawMatrix->preTranslate(-center.fX, -center.fY); 66 } 67 68 private: 69 double fZoomMax; 70 double fZoomPeriodMs; 71 }; 72 73 SKPAnimationBench::Animation* SKPAnimationBench::CreateZoomAnimation(SkScalar zoomMax, 74 double zoomPeriodMs) { 75 return new ZoomAnimation(zoomMax, zoomPeriodMs); 76 } 77