benchmain.cpp revision 387359e3483056a7ae7e4cf50347b71b4e3b2d60
1bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com#include "SkCanvas.h"
2f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com#include "SkColorPriv.h"
33a859a00342ed078af683fd1901fd26c93dd40f0reed@android.com#include "SkGraphics.h"
4b398fe863860b072306b5297c8095c6d973aba06reed@android.com#include "SkImageEncoder.h"
56c924ad46c89955e78e071c792ef00df9910b42freed@android.com#include "SkNWayCanvas.h"
66c924ad46c89955e78e071c792ef00df9910b42freed@android.com#include "SkPicture.h"
7bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com#include "SkString.h"
84bc1983e01d756ae9c91fd380758457f579d26eareed@android.com#include "SkTime.h"
9bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
10bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com#include "SkBenchmark.h"
11bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
126c924ad46c89955e78e071c792ef00df9910b42freed@android.comstatic void erase(SkBitmap& bm) {
136c924ad46c89955e78e071c792ef00df9910b42freed@android.com    if (bm.config() == SkBitmap::kA8_Config) {
146c924ad46c89955e78e071c792ef00df9910b42freed@android.com        bm.eraseColor(0);
156c924ad46c89955e78e071c792ef00df9910b42freed@android.com    } else {
166c924ad46c89955e78e071c792ef00df9910b42freed@android.com        bm.eraseColor(SK_ColorWHITE);
176c924ad46c89955e78e071c792ef00df9910b42freed@android.com    }
186c924ad46c89955e78e071c792ef00df9910b42freed@android.com}
196c924ad46c89955e78e071c792ef00df9910b42freed@android.com
206c924ad46c89955e78e071c792ef00df9910b42freed@android.comstatic bool equal(const SkBitmap& bm1, const SkBitmap& bm2) {
216c924ad46c89955e78e071c792ef00df9910b42freed@android.com    if (bm1.width() != bm2.width() ||
226c924ad46c89955e78e071c792ef00df9910b42freed@android.com        bm1.height() != bm2.height() ||
236c924ad46c89955e78e071c792ef00df9910b42freed@android.com        bm1.config() != bm2.config()) {
246c924ad46c89955e78e071c792ef00df9910b42freed@android.com        return false;
256c924ad46c89955e78e071c792ef00df9910b42freed@android.com    }
266c924ad46c89955e78e071c792ef00df9910b42freed@android.com
276c924ad46c89955e78e071c792ef00df9910b42freed@android.com    size_t pixelBytes = bm1.width() * bm1.bytesPerPixel();
286c924ad46c89955e78e071c792ef00df9910b42freed@android.com    for (int y = 0; y < bm1.height(); y++) {
296c924ad46c89955e78e071c792ef00df9910b42freed@android.com        if (memcmp(bm1.getAddr(0, y), bm2.getAddr(0, y), pixelBytes)) {
306c924ad46c89955e78e071c792ef00df9910b42freed@android.com            return false;
316c924ad46c89955e78e071c792ef00df9910b42freed@android.com        }
326c924ad46c89955e78e071c792ef00df9910b42freed@android.com    }
336c924ad46c89955e78e071c792ef00df9910b42freed@android.com
346c924ad46c89955e78e071c792ef00df9910b42freed@android.com    return true;
356c924ad46c89955e78e071c792ef00df9910b42freed@android.com}
366c924ad46c89955e78e071c792ef00df9910b42freed@android.com
37bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comclass Iter {
38bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.compublic:
39bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    Iter() {
40bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        fBench = BenchRegistry::Head();
41bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
42bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
43bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    SkBenchmark* next() {
44bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        if (fBench) {
45bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            BenchRegistry::Factory f = fBench->factory();
46bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            fBench = fBench->next();
47a70ba36c97b4c0e12f1a5ed5b80d7bd31e5cb6ffreed@android.com            return f(0);
48bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        }
49bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        return NULL;
50bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
51bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
52bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comprivate:
53bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    const BenchRegistry* fBench;
54bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com};
55bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
56bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comstatic void make_filename(const char name[], SkString* path) {
57bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    path->set(name);
58bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    for (int i = 0; name[i]; i++) {
59bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        switch (name[i]) {
60bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            case '/':
61bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            case '\\':
62bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            case ' ':
63bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            case ':':
64bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com                path->writable_str()[i] = '-';
65bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com                break;
66bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            default:
67bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com                break;
68bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        }
69bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
70bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com}
71bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
724c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.comstatic void saveFile(const char name[], const char config[], const char dir[],
734c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com                     const SkBitmap& bm) {
744c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    SkBitmap copy;
754c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    if (!bm.copyTo(&copy, SkBitmap::kARGB_8888_Config)) {
764c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com        return;
774c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    }
78f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com
79f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com    if (bm.config() == SkBitmap::kA8_Config) {
80f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com        // turn alpha into gray-scale
81f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com        size_t size = copy.getSize() >> 2;
82f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com        SkPMColor* p = copy.getAddr32(0, 0);
83f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com        for (size_t i = 0; i < size; i++) {
84f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com            int c = (*p >> SK_A32_SHIFT) & 0xFF;
85f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com            c = 255 - c;
86f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com            c |= (c << 24) | (c << 16) | (c << 8);
87f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com            *p++ = c | (SK_A32_MASK << SK_A32_SHIFT);
88f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com        }
89f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com    }
904c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com
914c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    SkString str;
924c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    make_filename(name, &str);
934c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    str.appendf("_%s.png", config);
944c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    str.prepend(dir);
954c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    ::remove(str.c_str());
964c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    SkImageEncoder::EncodeFile(str.c_str(), copy, SkImageEncoder::kPNG_Type,
974c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com                               100);
984c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com}
994c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com
1004c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.comstatic void performClip(SkCanvas* canvas, int w, int h) {
1014c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    SkRect r;
1024c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com
1034c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    r.set(SkIntToScalar(10), SkIntToScalar(10),
1044c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com          SkIntToScalar(w*2/3), SkIntToScalar(h*2/3));
1054c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    canvas->clipRect(r, SkRegion::kIntersect_Op);
1064c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com
1074c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    r.set(SkIntToScalar(w/3), SkIntToScalar(h/3),
1084c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com          SkIntToScalar(w-10), SkIntToScalar(h-10));
1094c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    canvas->clipRect(r, SkRegion::kXOR_Op);
1104c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com}
1114c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com
1124c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.comstatic void performRotate(SkCanvas* canvas, int w, int h) {
1134c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    const SkScalar x = SkIntToScalar(w) / 2;
1144c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    const SkScalar y = SkIntToScalar(h) / 2;
1154c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com
1164c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    canvas->translate(x, y);
1174c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    canvas->rotate(SkIntToScalar(35));
1184c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    canvas->translate(-x, -y);
1194c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com}
1204c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com
121387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.comstatic void performScale(SkCanvas* canvas, int w, int h) {
122387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    const SkScalar x = SkIntToScalar(w) / 2;
123387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    const SkScalar y = SkIntToScalar(h) / 2;
124387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com
125387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    canvas->translate(x, y);
126387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    // just enough so we can't take the sprite case
127387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    canvas->scale(SK_Scalar1 * 99/100, SK_Scalar1 * 99/100);
128387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    canvas->translate(-x, -y);
129387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com}
130387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com
1316c924ad46c89955e78e071c792ef00df9910b42freed@android.comstatic void compare_pict_to_bitmap(SkPicture* pict, const SkBitmap& bm) {
1326c924ad46c89955e78e071c792ef00df9910b42freed@android.com    SkBitmap bm2;
1336c924ad46c89955e78e071c792ef00df9910b42freed@android.com
1346c924ad46c89955e78e071c792ef00df9910b42freed@android.com    bm2.setConfig(bm.config(), bm.width(), bm.height());
1356c924ad46c89955e78e071c792ef00df9910b42freed@android.com    bm2.allocPixels();
1366c924ad46c89955e78e071c792ef00df9910b42freed@android.com    erase(bm2);
1376c924ad46c89955e78e071c792ef00df9910b42freed@android.com
1386c924ad46c89955e78e071c792ef00df9910b42freed@android.com    SkCanvas canvas(bm2);
1396c924ad46c89955e78e071c792ef00df9910b42freed@android.com    canvas.drawPicture(*pict);
1406c924ad46c89955e78e071c792ef00df9910b42freed@android.com
1416c924ad46c89955e78e071c792ef00df9910b42freed@android.com    if (!equal(bm, bm2)) {
1426c924ad46c89955e78e071c792ef00df9910b42freed@android.com        SkDebugf("----- compare_pict_to_bitmap failed\n");
1436c924ad46c89955e78e071c792ef00df9910b42freed@android.com    }
1446c924ad46c89955e78e071c792ef00df9910b42freed@android.com}
1456c924ad46c89955e78e071c792ef00df9910b42freed@android.com
1464bc1983e01d756ae9c91fd380758457f579d26eareed@android.comstatic const struct {
1474bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    SkBitmap::Config    fConfig;
1484bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    const char*         fName;
1494bc1983e01d756ae9c91fd380758457f579d26eareed@android.com} gConfigs[] = {
1504bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    { SkBitmap::kARGB_8888_Config,  "8888" },
1514bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    { SkBitmap::kRGB_565_Config,    "565",  },
1524bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    { SkBitmap::kARGB_4444_Config,  "4444", },
1534bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    { SkBitmap::kA8_Config,         "A8",   }
1544bc1983e01d756ae9c91fd380758457f579d26eareed@android.com};
1554bc1983e01d756ae9c91fd380758457f579d26eareed@android.com
1564c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.comstatic int findConfig(const char config[]) {
1574c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    for (size_t i = 0; i < SK_ARRAY_COUNT(gConfigs); i++) {
1584c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com        if (!strcmp(config, gConfigs[i].fName)) {
1594c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            return i;
1604c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com        }
1614c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    }
1624c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    return -1;
1634c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com}
1644c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com
165bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comint main (int argc, char * const argv[]) {
1663a859a00342ed078af683fd1901fd26c93dd40f0reed@android.com    SkAutoGraphics ag;
1673a859a00342ed078af683fd1901fd26c93dd40f0reed@android.com
1684bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    int repeatDraw = 1;
1694bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    int forceAlpha = 0xFF;
1704bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    bool forceAA = true;
171387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    bool doScale = false;
1724c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    bool doRotate = false;
1734c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com    bool doClip = false;
1746c924ad46c89955e78e071c792ef00df9910b42freed@android.com    bool doPict = false;
175387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    const char* matchStr = NULL;
1764bc1983e01d756ae9c91fd380758457f579d26eareed@android.com
177b398fe863860b072306b5297c8095c6d973aba06reed@android.com    SkString outDir;
178387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    SkBitmap::Config outConfig = SkBitmap::kNo_Config;
179387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    const char* configName = "";
180387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com    int configCount = SK_ARRAY_COUNT(gConfigs);
181b398fe863860b072306b5297c8095c6d973aba06reed@android.com
182b398fe863860b072306b5297c8095c6d973aba06reed@android.com    char* const* stop = argv + argc;
183b398fe863860b072306b5297c8095c6d973aba06reed@android.com    for (++argv; argv < stop; ++argv) {
184b398fe863860b072306b5297c8095c6d973aba06reed@android.com        if (strcmp(*argv, "-o") == 0) {
185b398fe863860b072306b5297c8095c6d973aba06reed@android.com            argv++;
186b398fe863860b072306b5297c8095c6d973aba06reed@android.com            if (argv < stop && **argv) {
187b398fe863860b072306b5297c8095c6d973aba06reed@android.com                outDir.set(*argv);
188b398fe863860b072306b5297c8095c6d973aba06reed@android.com                if (outDir.c_str()[outDir.size() - 1] != '/') {
189b398fe863860b072306b5297c8095c6d973aba06reed@android.com                    outDir.append("/");
190b398fe863860b072306b5297c8095c6d973aba06reed@android.com                }
191b398fe863860b072306b5297c8095c6d973aba06reed@android.com            }
1926c924ad46c89955e78e071c792ef00df9910b42freed@android.com        } else if (strcmp(*argv, "-pict") == 0) {
1936c924ad46c89955e78e071c792ef00df9910b42freed@android.com            doPict = true;
1944bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        } else if (strcmp(*argv, "-repeat") == 0) {
1954bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            argv++;
1964bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            if (argv < stop) {
1974bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                repeatDraw = atoi(*argv);
1984bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                if (repeatDraw < 1) {
1994bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                    repeatDraw = 1;
2004bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                }
2014bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            } else {
2024bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                fprintf(stderr, "missing arg for -repeat\n");
2034bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                return -1;
2044bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            }
2054c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com        } else if (!strcmp(*argv, "-rotate")) {
2064c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            doRotate = true;
207387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com        } else if (!strcmp(*argv, "-scale")) {
208387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            doScale = true;
2094c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com        } else if (!strcmp(*argv, "-clip")) {
2104c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            doClip = true;
2114bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        } else if (strcmp(*argv, "-forceAA") == 0) {
2124bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            forceAA = true;
2134bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        } else if (strcmp(*argv, "-forceBW") == 0) {
2144bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            forceAA = false;
2154bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        } else if (strcmp(*argv, "-forceBlend") == 0) {
2164bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            forceAlpha = 0x80;
2174bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        } else if (strcmp(*argv, "-forceOpaque") == 0) {
2184bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            forceAlpha = 0xFF;
219387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com        } else if (strcmp(*argv, "-match") == 0) {
220387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            argv++;
221387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            if (argv < stop) {
222387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                matchStr = *argv;
223387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            } else {
224387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                fprintf(stderr, "missing arg for -match\n");
225387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                return -1;
226387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            }
227387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com        } else if (strcmp(*argv, "-config") == 0) {
228387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            argv++;
229387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            if (argv < stop) {
230387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                int index = findConfig(*argv);
231387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                if (index >= 0) {
232387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                    outConfig = gConfigs[index].fConfig;
233387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                    configName = gConfigs[index].fName;
234387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                    configCount = 1;
235387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                } else {
236387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                    fprintf(stderr, "unrecognized config %s\n", *argv);
237387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                    return -1;
238387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                }
239387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            } else {
240387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                fprintf(stderr, "missing arg for -config\n");
241387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                return -1;
2424c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            }
243387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com        } else {
244387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            fprintf(stderr, "unrecognized arg %s\n", *argv);
245387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            return -1;
246b398fe863860b072306b5297c8095c6d973aba06reed@android.com        }
247b398fe863860b072306b5297c8095c6d973aba06reed@android.com    }
248387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com
249bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    Iter iter;
250bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    SkBenchmark* bench;
251bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    while ((bench = iter.next()) != NULL) {
252b398fe863860b072306b5297c8095c6d973aba06reed@android.com        SkIPoint dim = bench->getSize();
253b398fe863860b072306b5297c8095c6d973aba06reed@android.com        if (dim.fX <= 0 || dim.fY <= 0) {
254b398fe863860b072306b5297c8095c6d973aba06reed@android.com            continue;
255b398fe863860b072306b5297c8095c6d973aba06reed@android.com        }
256b398fe863860b072306b5297c8095c6d973aba06reed@android.com
2574bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        bench->setForceAlpha(forceAlpha);
2584bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        bench->setForceAA(forceAA);
2594bc1983e01d756ae9c91fd380758457f579d26eareed@android.com
260387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com        // only run benchmarks if their name contains matchStr
261387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com        if (matchStr && strstr(bench->getName(), matchStr) == NULL) {
262387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            continue;
263387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com        }
264387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com
265f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com        printf("running bench %16s", bench->getName());
2664bc1983e01d756ae9c91fd380758457f579d26eareed@android.com
2674bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        for (int configIndex = 0; configIndex < configCount; configIndex++) {
2684bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            if (configCount > 1) {
2694bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                outConfig = gConfigs[configIndex].fConfig;
2704bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                configName = gConfigs[configIndex].fName;
2714bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            }
2724bc1983e01d756ae9c91fd380758457f579d26eareed@android.com
2734bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            SkBitmap bm;
2744bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            bm.setConfig(outConfig, dim.fX, dim.fY);
2754bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            bm.allocPixels();
2766c924ad46c89955e78e071c792ef00df9910b42freed@android.com            erase(bm);
277f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com
2784bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            SkCanvas canvas(bm);
279f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com
2804c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            if (doClip) {
2814c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com                performClip(&canvas, dim.fX, dim.fY);
2824c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            }
283387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            if (doScale) {
284387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com                performScale(&canvas, dim.fX, dim.fY);
285387359e3483056a7ae7e4cf50347b71b4e3b2d60reed@android.com            }
2864c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            if (doRotate) {
2874c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com                performRotate(&canvas, dim.fX, dim.fY);
2884c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            }
2894c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com
2904bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            SkMSec now = SkTime::GetMSecs();
2914bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            for (int i = 0; i < repeatDraw; i++) {
2926c924ad46c89955e78e071c792ef00df9910b42freed@android.com                SkCanvas* c = &canvas;
2936c924ad46c89955e78e071c792ef00df9910b42freed@android.com
2946c924ad46c89955e78e071c792ef00df9910b42freed@android.com                SkNWayCanvas nway;
2956c924ad46c89955e78e071c792ef00df9910b42freed@android.com                SkPicture* pict = NULL;
2966c924ad46c89955e78e071c792ef00df9910b42freed@android.com                if (doPict) {
2976c924ad46c89955e78e071c792ef00df9910b42freed@android.com                    pict = new SkPicture;
2986c924ad46c89955e78e071c792ef00df9910b42freed@android.com                    nway.addCanvas(pict->beginRecording(bm.width(), bm.height()));
2996c924ad46c89955e78e071c792ef00df9910b42freed@android.com                    nway.addCanvas(&canvas);
3006c924ad46c89955e78e071c792ef00df9910b42freed@android.com                    c = &nway;
3016c924ad46c89955e78e071c792ef00df9910b42freed@android.com                }
3026c924ad46c89955e78e071c792ef00df9910b42freed@android.com
3036c924ad46c89955e78e071c792ef00df9910b42freed@android.com                SkAutoCanvasRestore acr(c, true);
3046c924ad46c89955e78e071c792ef00df9910b42freed@android.com                bench->draw(c);
3056c924ad46c89955e78e071c792ef00df9910b42freed@android.com
3066c924ad46c89955e78e071c792ef00df9910b42freed@android.com                if (pict) {
3076c924ad46c89955e78e071c792ef00df9910b42freed@android.com                    compare_pict_to_bitmap(pict, bm);
3086c924ad46c89955e78e071c792ef00df9910b42freed@android.com                    pict->unref();
3096c924ad46c89955e78e071c792ef00df9910b42freed@android.com                }
3104bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            }
3114bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            if (repeatDraw > 1) {
3124bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                printf("  %4s:%7.2f", configName,
3134bc1983e01d756ae9c91fd380758457f579d26eareed@android.com                       (SkTime::GetMSecs() - now) / (double)repeatDraw);
3144bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            }
3154c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            if (outDir.size() > 0) {
3164c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com                saveFile(bench->getName(), configName, outDir.c_str(), bm);
3174c7d3d6828b103ada10201608bd6e116d0ac7e61reed@android.com            }
3184bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        }
3194bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        printf("\n");
320bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
321bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
322bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    return 0;
323bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com}
324