Home | History | Annotate | Download | only in bench
      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