1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
93fb5187647397e056843c1f41a508992be22175dreed@google.com#include "SkMatrix.h"
105b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org#include "SkMatrixUtils.h"
117b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com#include "SkRandom.h"
123fb5187647397e056843c1f41a508992be22175dreed@google.com#include "SkString.h"
133fb5187647397e056843c1f41a508992be22175dreed@google.com
14f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass MatrixBench : public Benchmark {
153fb5187647397e056843c1f41a508992be22175dreed@google.com    SkString    fName;
163fb5187647397e056843c1f41a508992be22175dreed@google.compublic:
17410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    MatrixBench(const char name[])  {
183fb5187647397e056843c1f41a508992be22175dreed@google.com        fName.printf("matrix_%s", name);
19644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    }
20644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
2136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
22644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
233fb5187647397e056843c1f41a508992be22175dreed@google.com    }
243fb5187647397e056843c1f41a508992be22175dreed@google.com
253fb5187647397e056843c1f41a508992be22175dreed@google.com    virtual void performTest() = 0;
263fb5187647397e056843c1f41a508992be22175dreed@google.com
273fb5187647397e056843c1f41a508992be22175dreed@google.comprotected:
28cbefd7d842945a8a7cc21770b19f41e0f3f3b205reed@google.com    virtual int mulLoopCount() const { return 1; }
29cbefd7d842945a8a7cc21770b19f41e0f3f3b205reed@google.com
303fb5187647397e056843c1f41a508992be22175dreed@google.com    virtual const char* onGetName() {
313fb5187647397e056843c1f41a508992be22175dreed@google.com        return fName.c_str();
323fb5187647397e056843c1f41a508992be22175dreed@google.com    }
333fb5187647397e056843c1f41a508992be22175dreed@google.com
343361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) {
353361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
363fb5187647397e056843c1f41a508992be22175dreed@google.com            this->performTest();
373fb5187647397e056843c1f41a508992be22175dreed@google.com        }
383fb5187647397e056843c1f41a508992be22175dreed@google.com    }
393fb5187647397e056843c1f41a508992be22175dreed@google.com
403fb5187647397e056843c1f41a508992be22175dreed@google.comprivate:
41f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
423fb5187647397e056843c1f41a508992be22175dreed@google.com};
433fb5187647397e056843c1f41a508992be22175dreed@google.com
443fb5187647397e056843c1f41a508992be22175dreed@google.com
453fb5187647397e056843c1f41a508992be22175dreed@google.comclass EqualsMatrixBench : public MatrixBench {
463fb5187647397e056843c1f41a508992be22175dreed@google.compublic:
47410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    EqualsMatrixBench() : INHERITED("equals") {}
483fb5187647397e056843c1f41a508992be22175dreed@google.comprotected:
493fb5187647397e056843c1f41a508992be22175dreed@google.com    virtual void performTest() {
503fb5187647397e056843c1f41a508992be22175dreed@google.com        SkMatrix m0, m1, m2;
517b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com
523fb5187647397e056843c1f41a508992be22175dreed@google.com        m0.reset();
533fb5187647397e056843c1f41a508992be22175dreed@google.com        m1.reset();
543fb5187647397e056843c1f41a508992be22175dreed@google.com        m2.reset();
55cf44feb0e192f255d598fa9a3f81b70968c98305mtklein
56cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        // xor into a volatile prevents these comparisons from being optimized away.
57cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        volatile bool junk = false;
58cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (m0 == m1);
59cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (m1 == m2);
60cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (m2 == m0);
613fb5187647397e056843c1f41a508992be22175dreed@google.com    }
623fb5187647397e056843c1f41a508992be22175dreed@google.comprivate:
633fb5187647397e056843c1f41a508992be22175dreed@google.com    typedef MatrixBench INHERITED;
643fb5187647397e056843c1f41a508992be22175dreed@google.com};
653fb5187647397e056843c1f41a508992be22175dreed@google.com
663fb5187647397e056843c1f41a508992be22175dreed@google.comclass ScaleMatrixBench : public MatrixBench {
673fb5187647397e056843c1f41a508992be22175dreed@google.compublic:
68410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ScaleMatrixBench() : INHERITED("scale") {
694b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        fSX = fSY = 1.5f;
703fb5187647397e056843c1f41a508992be22175dreed@google.com        fM0.reset();
713fb5187647397e056843c1f41a508992be22175dreed@google.com        fM1.setScale(fSX, fSY);
723fb5187647397e056843c1f41a508992be22175dreed@google.com        fM2.setTranslate(fSX, fSY);
733fb5187647397e056843c1f41a508992be22175dreed@google.com    }
743fb5187647397e056843c1f41a508992be22175dreed@google.comprotected:
753fb5187647397e056843c1f41a508992be22175dreed@google.com    virtual void performTest() {
763fb5187647397e056843c1f41a508992be22175dreed@google.com        SkMatrix m;
773fb5187647397e056843c1f41a508992be22175dreed@google.com        m = fM0; m.preScale(fSX, fSY);
783fb5187647397e056843c1f41a508992be22175dreed@google.com        m = fM1; m.preScale(fSX, fSY);
793fb5187647397e056843c1f41a508992be22175dreed@google.com        m = fM2; m.preScale(fSX, fSY);
803fb5187647397e056843c1f41a508992be22175dreed@google.com    }
813fb5187647397e056843c1f41a508992be22175dreed@google.comprivate:
823fb5187647397e056843c1f41a508992be22175dreed@google.com    SkMatrix fM0, fM1, fM2;
833fb5187647397e056843c1f41a508992be22175dreed@google.com    SkScalar fSX, fSY;
843fb5187647397e056843c1f41a508992be22175dreed@google.com    typedef MatrixBench INHERITED;
853fb5187647397e056843c1f41a508992be22175dreed@google.com};
863fb5187647397e056843c1f41a508992be22175dreed@google.com
87e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com// having unknown values in our arrays can throw off the timing a lot, perhaps
88e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com// handling NaN values is a lot slower. Anyway, this guy is just meant to put
89e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com// reasonable values in our arrays.
90e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.comtemplate <typename T> void init9(T array[9]) {
91e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom rand;
92e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com    for (int i = 0; i < 9; i++) {
93e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com        array[i] = rand.nextSScalar1();
94e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com    }
95e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com}
96e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com
97317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.comclass GetTypeMatrixBench : public MatrixBench {
98317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.compublic:
99410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    GetTypeMatrixBench()
100410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com        : INHERITED("gettype") {
101820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[0] = (float) fRnd.nextS();
102820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[1] = (float) fRnd.nextS();
103820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[2] = (float) fRnd.nextS();
104820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[3] = (float) fRnd.nextS();
105820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[4] = (float) fRnd.nextS();
106820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[5] = (float) fRnd.nextS();
107820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[6] = (float) fRnd.nextS();
108820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[7] = (float) fRnd.nextS();
109820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com        fArray[8] = (float) fRnd.nextS();
110317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    }
111317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.comprotected:
112317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    // Putting random generation of the matrix inside performTest()
113317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    // would help us avoid anomalous runs, but takes up 25% or
114317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    // more of the function time.
115317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    virtual void performTest() {
116317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.setAll(fArray[0], fArray[1], fArray[2],
117317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com                       fArray[3], fArray[4], fArray[5],
118317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com                       fArray[6], fArray[7], fArray[8]);
119cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        // xoring into a volatile prevents the compiler from optimizing these away
120cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        volatile int junk = 0;
121cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
122317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.dirtyMatrixTypeCache();
123cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
124317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.dirtyMatrixTypeCache();
125cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
126317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.dirtyMatrixTypeCache();
127cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
128317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.dirtyMatrixTypeCache();
129cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
130317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.dirtyMatrixTypeCache();
131cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
132317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.dirtyMatrixTypeCache();
133cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
134317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com        fMatrix.dirtyMatrixTypeCache();
135cf44feb0e192f255d598fa9a3f81b70968c98305mtklein        junk ^= (fMatrix.getType());
136317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    }
137317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.comprivate:
138317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    SkMatrix fMatrix;
139317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    float fArray[9];
140e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom fRnd;
141317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com    typedef MatrixBench INHERITED;
142317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com};
143317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com
1445b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.orgclass DecomposeMatrixBench : public MatrixBench {
1455b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.orgpublic:
146410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    DecomposeMatrixBench() : INHERITED("decompose") {}
1475b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org
1485b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.orgprotected:
1495b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org    virtual void onPreDraw() {
1505b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org        for (int i = 0; i < 10; ++i) {
1515b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            SkScalar rot0 = (fRandom.nextBool()) ? fRandom.nextRangeF(-180, 180) : 0.0f;
1525b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            SkScalar sx = fRandom.nextRangeF(-3000.f, 3000.f);
1535b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            SkScalar sy = (fRandom.nextBool()) ? fRandom.nextRangeF(-3000.f, 3000.f) : sx;
1545b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            SkScalar rot1 = fRandom.nextRangeF(-180, 180);
1555b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            fMatrix[i].setRotate(rot0);
1565b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            fMatrix[i].postScale(sx, sy);
1575b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            fMatrix[i].postRotate(rot1);
1585b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org        }
1595b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org    }
1605b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org    virtual void performTest() {
1615b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org        SkPoint rotation1, scale, rotation2;
1625b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org        for (int i = 0; i < 10; ++i) {
1635b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org            (void) SkDecomposeUpper2x2(fMatrix[i], &rotation1, &scale, &rotation2);
1645b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org        }
1655b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org    }
1665b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.orgprivate:
1675b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org    SkMatrix fMatrix[10];
168e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom fRandom;
1695b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org    typedef MatrixBench INHERITED;
1705b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org};
1715b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org
1726fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.orgclass InvertMapRectMatrixBench : public MatrixBench {
1736fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.orgpublic:
174410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    InvertMapRectMatrixBench(const char* name, int flags)
175410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com        : INHERITED(name)
1766fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        , fFlags(flags) {
1776fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        fMatrix.reset();
1786fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        fIteration = 0;
1796fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        if (flags & kScale_Flag) {
1804b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            fMatrix.postScale(1.5f, 2.5f);
1816fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        }
1826fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        if (flags & kTranslate_Flag) {
1834b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            fMatrix.postTranslate(1.5f, 2.5f);
1846fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        }
1856fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        if (flags & kRotate_Flag) {
1864b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            fMatrix.postRotate(45.0f);
1876fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        }
1886fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        if (flags & kPerspective_Flag) {
1894b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            fMatrix.setPerspX(1.5f);
1904b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            fMatrix.setPerspY(2.5f);
1916fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        }
1926fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        if (0 == (flags & kUncachedTypeMask_Flag)) {
1936fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org            fMatrix.getType();
1946fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        }
1956fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    }
1966fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    enum Flag {
1976fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        kScale_Flag             = 0x01,
1986fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        kTranslate_Flag         = 0x02,
1996fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        kRotate_Flag            = 0x04,
2006fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        kPerspective_Flag       = 0x08,
2016fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        kUncachedTypeMask_Flag  = 0x10,
2026fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    };
2036fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.orgprotected:
2046fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    virtual void performTest() {
2056fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        if (fFlags & kUncachedTypeMask_Flag) {
2066fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org            // This will invalidate the typemask without
2076fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org            // changing the matrix.
2086fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org            fMatrix.setPerspX(fMatrix.getPerspX());
2096fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        }
2106fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        SkMatrix inv;
21131f8f73e83fad2241b1350d8d253c170e96e46ffrobertphillips@google.com        bool invertible = fMatrix.invert(&inv);
2126fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        SkASSERT(invertible);
2136fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        SkRect transformedRect;
21431f8f73e83fad2241b1350d8d253c170e96e46ffrobertphillips@google.com        // an arbitrary, small, non-zero rect to transform
21531f8f73e83fad2241b1350d8d253c170e96e46ffrobertphillips@google.com        SkRect srcRect = SkRect::MakeWH(SkIntToScalar(10), SkIntToScalar(10));
2166fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        if (invertible) {
21731f8f73e83fad2241b1350d8d253c170e96e46ffrobertphillips@google.com            inv.mapRect(&transformedRect, srcRect);
2186fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org        }
2196fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    }
2206fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.orgprivate:
2216fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    SkMatrix fMatrix;
2226fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    int fFlags;
2236fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    unsigned fIteration;
2246fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org    typedef MatrixBench INHERITED;
2256fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org};
226288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com
22782bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com///////////////////////////////////////////////////////////////////////////////
228288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com
229410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new EqualsMatrixBench(); )
230410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ScaleMatrixBench(); )
231410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new GetTypeMatrixBench(); )
232410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DecomposeMatrixBench(); )
2335b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org
234410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertMapRectMatrixBench("invert_maprect_identity", 0); )
235288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com
236410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new InvertMapRectMatrixBench(
23790533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com                                  "invert_maprect_rectstaysrect",
23890533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com                                  InvertMapRectMatrixBench::kScale_Flag |
23990533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com                                  InvertMapRectMatrixBench::kTranslate_Flag); )
24090533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com
241410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new InvertMapRectMatrixBench(
24290533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com                                  "invert_maprect_translate",
24390533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com                                  InvertMapRectMatrixBench::kTranslate_Flag); )
2447b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com
245410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new InvertMapRectMatrixBench(
24682bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                                  "invert_maprect_nonpersp",
24782bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                                  InvertMapRectMatrixBench::kScale_Flag |
24882bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                                  InvertMapRectMatrixBench::kRotate_Flag |
24982bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                                  InvertMapRectMatrixBench::kTranslate_Flag); )
25082bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com
251410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertMapRectMatrixBench(
25282bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                               "invert_maprect_persp",
25382bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                               InvertMapRectMatrixBench::kPerspective_Flag); )
25482bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com
255410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertMapRectMatrixBench(
25682bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           "invert_maprect_typemask_rectstaysrect",
25782bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           InvertMapRectMatrixBench::kUncachedTypeMask_Flag |
25882bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           InvertMapRectMatrixBench::kScale_Flag |
25982bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           InvertMapRectMatrixBench::kTranslate_Flag); )
26082bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com
261410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertMapRectMatrixBench(
26282bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           "invert_maprect_typemask_nonpersp",
26382bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           InvertMapRectMatrixBench::kUncachedTypeMask_Flag |
26482bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           InvertMapRectMatrixBench::kScale_Flag |
26582bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           InvertMapRectMatrixBench::kRotate_Flag |
26682bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com                           InvertMapRectMatrixBench::kTranslate_Flag); )
2673fb5187647397e056843c1f41a508992be22175dreed@google.com
2688010632f2408ce9d840c1dcd26a8be0e4967233ereed///////////////////////////////////////////////////////////////////////////////
2698010632f2408ce9d840c1dcd26a8be0e4967233ereed
270d8b34c26c2a2f8e37e0cc9a7910306aecacadd92reedstatic SkMatrix make_trans() { return SkMatrix::MakeTrans(2, 3); }
2718010632f2408ce9d840c1dcd26a8be0e4967233ereedstatic SkMatrix make_scale() { SkMatrix m(make_trans()); m.postScale(1.5f, 0.5f); return m; }
2728010632f2408ce9d840c1dcd26a8be0e4967233ereedstatic SkMatrix make_afine() { SkMatrix m(make_trans()); m.postRotate(15); return m; }
2738010632f2408ce9d840c1dcd26a8be0e4967233ereed
2748010632f2408ce9d840c1dcd26a8be0e4967233ereedclass MapPointsMatrixBench : public MatrixBench {
2758010632f2408ce9d840c1dcd26a8be0e4967233ereedprotected:
2768010632f2408ce9d840c1dcd26a8be0e4967233ereed    SkMatrix fM;
2778010632f2408ce9d840c1dcd26a8be0e4967233ereed    enum {
2788010632f2408ce9d840c1dcd26a8be0e4967233ereed        N = 32
2798010632f2408ce9d840c1dcd26a8be0e4967233ereed    };
2808010632f2408ce9d840c1dcd26a8be0e4967233ereed    SkPoint fSrc[N], fDst[N];
2818010632f2408ce9d840c1dcd26a8be0e4967233ereedpublic:
2827da19014fda527a52381d85cc50b951031fa4754reed    MapPointsMatrixBench(const char name[], const SkMatrix& m)
2837da19014fda527a52381d85cc50b951031fa4754reed        : MatrixBench(name), fM(m)
2848010632f2408ce9d840c1dcd26a8be0e4967233ereed    {
2858010632f2408ce9d840c1dcd26a8be0e4967233ereed        SkRandom rand;
2868010632f2408ce9d840c1dcd26a8be0e4967233ereed        for (int i = 0; i < N; ++i) {
2878010632f2408ce9d840c1dcd26a8be0e4967233ereed            fSrc[i].set(rand.nextSScalar1(), rand.nextSScalar1());
2888010632f2408ce9d840c1dcd26a8be0e4967233ereed        }
2898010632f2408ce9d840c1dcd26a8be0e4967233ereed    }
2908010632f2408ce9d840c1dcd26a8be0e4967233ereed
29136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void performTest() override {
2927da19014fda527a52381d85cc50b951031fa4754reed        for (int i = 0; i < 1000000; ++i) {
2937da19014fda527a52381d85cc50b951031fa4754reed            fM.mapPoints(fDst, fSrc, N);
2948010632f2408ce9d840c1dcd26a8be0e4967233ereed        }
2958010632f2408ce9d840c1dcd26a8be0e4967233ereed    }
2968010632f2408ce9d840c1dcd26a8be0e4967233ereed};
2977da19014fda527a52381d85cc50b951031fa4754reedDEF_BENCH( return new MapPointsMatrixBench("mappoints_identity", SkMatrix::I()); )
2987da19014fda527a52381d85cc50b951031fa4754reedDEF_BENCH( return new MapPointsMatrixBench("mappoints_trans", make_trans()); )
2997da19014fda527a52381d85cc50b951031fa4754reedDEF_BENCH( return new MapPointsMatrixBench("mappoints_scale", make_scale()); )
3007da19014fda527a52381d85cc50b951031fa4754reedDEF_BENCH( return new MapPointsMatrixBench("mappoints_affine", make_afine()); )
3018010632f2408ce9d840c1dcd26a8be0e4967233ereed
302