blob: 7c6848ef8002ccea5579cfcd1d19c7e941210cdd [file] [log] [blame]
reed@android.combd700c32009-01-05 03:34:50 +00001//#include <iostream>
2#include "SkCanvas.h"
reed@android.comb398fe82009-01-07 11:47:57 +00003#include "SkImageEncoder.h"
reed@android.combd700c32009-01-05 03:34:50 +00004#include "SkString.h"
reed@android.com4bc19832009-01-19 20:08:35 +00005#include "SkTime.h"
reed@android.combd700c32009-01-05 03:34:50 +00006
7#include "SkBenchmark.h"
8
9typedef SkTRegistry<SkBenchmark> BenchRegistry;
10
11class Iter {
12public:
13 Iter() {
14 fBench = BenchRegistry::Head();
15 }
16
17 SkBenchmark* next() {
18 if (fBench) {
19 BenchRegistry::Factory f = fBench->factory();
20 fBench = fBench->next();
21 return f();
22 }
23 return NULL;
24 }
25
26private:
27 const BenchRegistry* fBench;
28};
29
30static void make_filename(const char name[], SkString* path) {
31 path->set(name);
32 for (int i = 0; name[i]; i++) {
33 switch (name[i]) {
34 case '/':
35 case '\\':
36 case ' ':
37 case ':':
38 path->writable_str()[i] = '-';
39 break;
40 default:
41 break;
42 }
43 }
44}
45
reed@android.com4bc19832009-01-19 20:08:35 +000046static const struct {
47 SkBitmap::Config fConfig;
48 const char* fName;
49} gConfigs[] = {
50 { SkBitmap::kARGB_8888_Config, "8888" },
51 { SkBitmap::kRGB_565_Config, "565", },
52 { SkBitmap::kARGB_4444_Config, "4444", },
53 { SkBitmap::kA8_Config, "A8", }
54};
55
reed@android.combd700c32009-01-05 03:34:50 +000056int main (int argc, char * const argv[]) {
reed@android.com4bc19832009-01-19 20:08:35 +000057 int repeatDraw = 1;
58 int forceAlpha = 0xFF;
59 bool forceAA = true;
60
reed@android.comb398fe82009-01-07 11:47:57 +000061 SkString outDir;
62 SkBitmap::Config outConfig = SkBitmap::kARGB_8888_Config;
reed@android.combd700c32009-01-05 03:34:50 +000063
reed@android.comb398fe82009-01-07 11:47:57 +000064 char* const* stop = argv + argc;
65 for (++argv; argv < stop; ++argv) {
66 if (strcmp(*argv, "-o") == 0) {
67 argv++;
68 if (argv < stop && **argv) {
69 outDir.set(*argv);
70 if (outDir.c_str()[outDir.size() - 1] != '/') {
71 outDir.append("/");
72 }
73 }
74 } else if (strcmp(*argv, "-8888") == 0) {
75 outConfig = SkBitmap::kARGB_8888_Config;
76 } else if (strcmp(*argv, "-565") == 0) {
77 outConfig = SkBitmap::kRGB_565_Config;
78 } else if (strcmp(*argv, "-4444") == 0) {
79 outConfig = SkBitmap::kARGB_4444_Config;
80 } else if (strcmp(*argv, "-a8") == 0) {
81 outConfig = SkBitmap::kA8_Config;
reed@android.com4bc19832009-01-19 20:08:35 +000082 } else if (strcmp(*argv, "-repeat") == 0) {
83 argv++;
84 if (argv < stop) {
85 repeatDraw = atoi(*argv);
86 if (repeatDraw < 1) {
87 repeatDraw = 1;
88 }
89 } else {
90 fprintf(stderr, "missing arg for -repeat\n");
91 return -1;
92 }
93 } else if (strcmp(*argv, "-forceAA") == 0) {
94 forceAA = true;
95 } else if (strcmp(*argv, "-forceBW") == 0) {
96 forceAA = false;
97 } else if (strcmp(*argv, "-forceBlend") == 0) {
98 forceAlpha = 0x80;
99 } else if (strcmp(*argv, "-forceOpaque") == 0) {
100 forceAlpha = 0xFF;
reed@android.comb398fe82009-01-07 11:47:57 +0000101 }
102 }
reed@android.com4bc19832009-01-19 20:08:35 +0000103
104 const char* configName = "";
105 int configCount = SK_ARRAY_COUNT(gConfigs);
106
reed@android.combd700c32009-01-05 03:34:50 +0000107 Iter iter;
108 SkBenchmark* bench;
109 while ((bench = iter.next()) != NULL) {
reed@android.comb398fe82009-01-07 11:47:57 +0000110 SkIPoint dim = bench->getSize();
111 if (dim.fX <= 0 || dim.fY <= 0) {
112 continue;
113 }
reed@android.comb398fe82009-01-07 11:47:57 +0000114
reed@android.com4bc19832009-01-19 20:08:35 +0000115 bench->setForceAlpha(forceAlpha);
116 bench->setForceAA(forceAA);
117
118 printf("running bench %16s", bench->getName());
119
120 for (int configIndex = 0; configIndex < configCount; configIndex++) {
121 if (configCount > 1) {
122 outConfig = gConfigs[configIndex].fConfig;
123 configName = gConfigs[configIndex].fName;
124 }
125
126 SkBitmap bm;
127 bm.setConfig(outConfig, dim.fX, dim.fY);
128 bm.allocPixels();
129
130 SkCanvas canvas(bm);
131 canvas.drawColor(SK_ColorWHITE);
132
133 SkMSec now = SkTime::GetMSecs();
134 for (int i = 0; i < repeatDraw; i++) {
135 bench->draw(&canvas);
136 }
137 if (repeatDraw > 1) {
138 printf(" %4s:%7.2f", configName,
139 (SkTime::GetMSecs() - now) / (double)repeatDraw);
140 }
141 }
142 printf("\n");
reed@android.com4cb8bd12009-01-16 16:15:37 +0000143
144#if 0
reed@android.combd700c32009-01-05 03:34:50 +0000145 SkString str;
146 make_filename(bench->getName(), &str);
reed@android.comb398fe82009-01-07 11:47:57 +0000147 str.prepend(outDir);
reed@android.combd700c32009-01-05 03:34:50 +0000148 str.append(".png");
149 ::remove(str.c_str());
reed@android.comb398fe82009-01-07 11:47:57 +0000150 SkImageEncoder::EncodeFile(str.c_str(), bm, SkImageEncoder::kPNG_Type,
151 100);
reed@android.com4cb8bd12009-01-16 16:15:37 +0000152#endif
reed@android.combd700c32009-01-05 03:34:50 +0000153 }
154
155 return 0;
156}