1261c3ad7fde95748da92550735decc949dc73bf2joshualitt/*
2261c3ad7fde95748da92550735decc949dc73bf2joshualitt * Copyright 2015 Google Inc.
3261c3ad7fde95748da92550735decc949dc73bf2joshualitt *
4261c3ad7fde95748da92550735decc949dc73bf2joshualitt * Use of this source code is governed by a BSD-style license that can be
5261c3ad7fde95748da92550735decc949dc73bf2joshualitt * found in the LICENSE file.
6261c3ad7fde95748da92550735decc949dc73bf2joshualitt */
7261c3ad7fde95748da92550735decc949dc73bf2joshualitt
8261c3ad7fde95748da92550735decc949dc73bf2joshualitt#include "SKPAnimationBench.h"
9261c3ad7fde95748da92550735decc949dc73bf2joshualitt#include "SkCommandLineFlags.h"
10261c3ad7fde95748da92550735decc949dc73bf2joshualitt#include "SkMultiPictureDraw.h"
11261c3ad7fde95748da92550735decc949dc73bf2joshualitt#include "SkSurface.h"
12261c3ad7fde95748da92550735decc949dc73bf2joshualitt
13261c3ad7fde95748da92550735decc949dc73bf2joshualittSKPAnimationBench::SKPAnimationBench(const char* name, const SkPicture* pic,
14261c3ad7fde95748da92550735decc949dc73bf2joshualitt                                     const SkIRect& clip, SkMatrix animationMatrix, int steps)
15261c3ad7fde95748da92550735decc949dc73bf2joshualitt    : INHERITED(name, pic, clip, 1.0, false)
16261c3ad7fde95748da92550735decc949dc73bf2joshualitt    , fSteps(steps)
17261c3ad7fde95748da92550735decc949dc73bf2joshualitt    , fAnimationMatrix(animationMatrix)
18261c3ad7fde95748da92550735decc949dc73bf2joshualitt    , fName(name) {
19261c3ad7fde95748da92550735decc949dc73bf2joshualitt    fUniqueName.printf("%s_animation", name);
20261c3ad7fde95748da92550735decc949dc73bf2joshualitt}
21261c3ad7fde95748da92550735decc949dc73bf2joshualitt
22261c3ad7fde95748da92550735decc949dc73bf2joshualittconst char* SKPAnimationBench::onGetName() {
23261c3ad7fde95748da92550735decc949dc73bf2joshualitt    return fName.c_str();
24261c3ad7fde95748da92550735decc949dc73bf2joshualitt}
25261c3ad7fde95748da92550735decc949dc73bf2joshualitt
26261c3ad7fde95748da92550735decc949dc73bf2joshualittconst char* SKPAnimationBench::onGetUniqueName() {
27261c3ad7fde95748da92550735decc949dc73bf2joshualitt    return fUniqueName.c_str();
28261c3ad7fde95748da92550735decc949dc73bf2joshualitt}
29261c3ad7fde95748da92550735decc949dc73bf2joshualitt
30261c3ad7fde95748da92550735decc949dc73bf2joshualittvoid SKPAnimationBench::onPerCanvasPreDraw(SkCanvas* canvas) {
31261c3ad7fde95748da92550735decc949dc73bf2joshualitt    INHERITED::onPerCanvasPreDraw(canvas);
32261c3ad7fde95748da92550735decc949dc73bf2joshualitt    SkIRect bounds;
33261c3ad7fde95748da92550735decc949dc73bf2joshualitt    SkAssertResult(canvas->getClipDeviceBounds(&bounds));
34261c3ad7fde95748da92550735decc949dc73bf2joshualitt
35261c3ad7fde95748da92550735decc949dc73bf2joshualitt    fCenter.set((bounds.fRight - bounds.fLeft) / 2.0f,
36261c3ad7fde95748da92550735decc949dc73bf2joshualitt                (bounds.fBottom - bounds.fTop) / 2.0f);
37261c3ad7fde95748da92550735decc949dc73bf2joshualitt}
38261c3ad7fde95748da92550735decc949dc73bf2joshualitt
39261c3ad7fde95748da92550735decc949dc73bf2joshualittvoid SKPAnimationBench::drawPicture() {
40261c3ad7fde95748da92550735decc949dc73bf2joshualitt    SkMatrix frameMatrix = SkMatrix::MakeTrans(-fCenter.fX, -fCenter.fY);
41261c3ad7fde95748da92550735decc949dc73bf2joshualitt    frameMatrix.postConcat(fAnimationMatrix);
42261c3ad7fde95748da92550735decc949dc73bf2joshualitt    SkMatrix reverseTranslate = SkMatrix::MakeTrans(fCenter.fX, fCenter.fY);
43261c3ad7fde95748da92550735decc949dc73bf2joshualitt    frameMatrix.postConcat(reverseTranslate);
44261c3ad7fde95748da92550735decc949dc73bf2joshualitt
45261c3ad7fde95748da92550735decc949dc73bf2joshualitt    SkMatrix currentMatrix = frameMatrix;
46261c3ad7fde95748da92550735decc949dc73bf2joshualitt    for (int i = 0; i < fSteps; i++) {
47261c3ad7fde95748da92550735decc949dc73bf2joshualitt        for (int j = 0; j < this->tileRects().count(); ++j) {
48261c3ad7fde95748da92550735decc949dc73bf2joshualitt            SkMatrix trans = SkMatrix::MakeTrans(-1.f * this->tileRects()[j].fLeft,
49261c3ad7fde95748da92550735decc949dc73bf2joshualitt                                                 -1.f * this->tileRects()[j].fTop);
50261c3ad7fde95748da92550735decc949dc73bf2joshualitt            SkMatrix tileMatrix = currentMatrix;
51261c3ad7fde95748da92550735decc949dc73bf2joshualitt            tileMatrix.postConcat(trans);
52261c3ad7fde95748da92550735decc949dc73bf2joshualitt            this->surfaces()[j]->getCanvas()->drawPicture(this->picture(), &tileMatrix, NULL);
53261c3ad7fde95748da92550735decc949dc73bf2joshualitt        }
54261c3ad7fde95748da92550735decc949dc73bf2joshualitt
55261c3ad7fde95748da92550735decc949dc73bf2joshualitt        for (int j = 0; j < this->tileRects().count(); ++j) {
56261c3ad7fde95748da92550735decc949dc73bf2joshualitt           this->surfaces()[j]->getCanvas()->flush();
57261c3ad7fde95748da92550735decc949dc73bf2joshualitt        }
58261c3ad7fde95748da92550735decc949dc73bf2joshualitt        currentMatrix.postConcat(frameMatrix);
59261c3ad7fde95748da92550735decc949dc73bf2joshualitt    }
60261c3ad7fde95748da92550735decc949dc73bf2joshualitt}
61