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(©, 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