blob: d9bd5774c5fb6b6f84bcd91e8860e526f994c5e9 [file] [log] [blame]
reed@android.com4c7d3d62009-01-21 03:15:13 +00001#define SAVE_FILE
2
reed@android.combd700c32009-01-05 03:34:50 +00003#include "SkCanvas.h"
reed@android.comb398fe82009-01-07 11:47:57 +00004#include "SkImageEncoder.h"
reed@android.combd700c32009-01-05 03:34:50 +00005#include "SkString.h"
reed@android.com4bc19832009-01-19 20:08:35 +00006#include "SkTime.h"
reed@android.combd700c32009-01-05 03:34:50 +00007
8#include "SkBenchmark.h"
9
10typedef SkTRegistry<SkBenchmark> BenchRegistry;
11
12class Iter {
13public:
14 Iter() {
15 fBench = BenchRegistry::Head();
16 }
17
18 SkBenchmark* next() {
19 if (fBench) {
20 BenchRegistry::Factory f = fBench->factory();
21 fBench = fBench->next();
22 return f();
23 }
24 return NULL;
25 }
26
27private:
28 const BenchRegistry* fBench;
29};
30
31static void make_filename(const char name[], SkString* path) {
32 path->set(name);
33 for (int i = 0; name[i]; i++) {
34 switch (name[i]) {
35 case '/':
36 case '\\':
37 case ' ':
38 case ':':
39 path->writable_str()[i] = '-';
40 break;
41 default:
42 break;
43 }
44 }
45}
46
reed@android.com4c7d3d62009-01-21 03:15:13 +000047static void saveFile(const char name[], const char config[], const char dir[],
48 const SkBitmap& bm) {
49#ifdef SAVE_FILE
50 SkBitmap copy;
51 if (!bm.copyTo(&copy, SkBitmap::kARGB_8888_Config)) {
52 return;
53 }
54
55 SkString str;
56 make_filename(name, &str);
57 str.appendf("_%s.png", config);
58 str.prepend(dir);
59 ::remove(str.c_str());
60 SkImageEncoder::EncodeFile(str.c_str(), copy, SkImageEncoder::kPNG_Type,
61 100);
62#endif
63}
64
65static void performClip(SkCanvas* canvas, int w, int h) {
66 SkRect r;
67
68 r.set(SkIntToScalar(10), SkIntToScalar(10),
69 SkIntToScalar(w*2/3), SkIntToScalar(h*2/3));
70 canvas->clipRect(r, SkRegion::kIntersect_Op);
71
72 r.set(SkIntToScalar(w/3), SkIntToScalar(h/3),
73 SkIntToScalar(w-10), SkIntToScalar(h-10));
74 canvas->clipRect(r, SkRegion::kXOR_Op);
75}
76
77static void performRotate(SkCanvas* canvas, int w, int h) {
78 const SkScalar x = SkIntToScalar(w) / 2;
79 const SkScalar y = SkIntToScalar(h) / 2;
80
81 canvas->translate(x, y);
82 canvas->rotate(SkIntToScalar(35));
83 canvas->translate(-x, -y);
84}
85
reed@android.com4bc19832009-01-19 20:08:35 +000086static const struct {
87 SkBitmap::Config fConfig;
88 const char* fName;
89} gConfigs[] = {
90 { SkBitmap::kARGB_8888_Config, "8888" },
91 { SkBitmap::kRGB_565_Config, "565", },
92 { SkBitmap::kARGB_4444_Config, "4444", },
93 { SkBitmap::kA8_Config, "A8", }
94};
95
reed@android.com4c7d3d62009-01-21 03:15:13 +000096static int findConfig(const char config[]) {
97 for (size_t i = 0; i < SK_ARRAY_COUNT(gConfigs); i++) {
98 if (!strcmp(config, gConfigs[i].fName)) {
99 return i;
100 }
101 }
102 return -1;
103}
104
reed@android.combd700c32009-01-05 03:34:50 +0000105int main (int argc, char * const argv[]) {
reed@android.com4bc19832009-01-19 20:08:35 +0000106 int repeatDraw = 1;
107 int forceAlpha = 0xFF;
108 bool forceAA = true;
reed@android.com4c7d3d62009-01-21 03:15:13 +0000109 bool doRotate = false;
110 bool doClip = false;
reed@android.com4bc19832009-01-19 20:08:35 +0000111
reed@android.comb398fe82009-01-07 11:47:57 +0000112 SkString outDir;
113 SkBitmap::Config outConfig = SkBitmap::kARGB_8888_Config;
reed@android.combd700c32009-01-05 03:34:50 +0000114
reed@android.comb398fe82009-01-07 11:47:57 +0000115 char* const* stop = argv + argc;
116 for (++argv; argv < stop; ++argv) {
117 if (strcmp(*argv, "-o") == 0) {
118 argv++;
119 if (argv < stop && **argv) {
120 outDir.set(*argv);
121 if (outDir.c_str()[outDir.size() - 1] != '/') {
122 outDir.append("/");
123 }
124 }
reed@android.com4bc19832009-01-19 20:08:35 +0000125 } else if (strcmp(*argv, "-repeat") == 0) {
126 argv++;
127 if (argv < stop) {
128 repeatDraw = atoi(*argv);
129 if (repeatDraw < 1) {
130 repeatDraw = 1;
131 }
132 } else {
133 fprintf(stderr, "missing arg for -repeat\n");
134 return -1;
135 }
reed@android.com4c7d3d62009-01-21 03:15:13 +0000136 } else if (!strcmp(*argv, "-rotate")) {
137 doRotate = true;
138 } else if (!strcmp(*argv, "-clip")) {
139 doClip = true;
reed@android.com4bc19832009-01-19 20:08:35 +0000140 } else if (strcmp(*argv, "-forceAA") == 0) {
141 forceAA = true;
142 } else if (strcmp(*argv, "-forceBW") == 0) {
143 forceAA = false;
144 } else if (strcmp(*argv, "-forceBlend") == 0) {
145 forceAlpha = 0x80;
146 } else if (strcmp(*argv, "-forceOpaque") == 0) {
147 forceAlpha = 0xFF;
reed@android.com4c7d3d62009-01-21 03:15:13 +0000148 } else {
149 int index = findConfig(*argv);
150 if (index >= 0) {
151 outConfig = gConfigs[index].fConfig;
152 }
reed@android.comb398fe82009-01-07 11:47:57 +0000153 }
154 }
reed@android.com4bc19832009-01-19 20:08:35 +0000155
156 const char* configName = "";
157 int configCount = SK_ARRAY_COUNT(gConfigs);
158
reed@android.combd700c32009-01-05 03:34:50 +0000159 Iter iter;
160 SkBenchmark* bench;
161 while ((bench = iter.next()) != NULL) {
reed@android.comb398fe82009-01-07 11:47:57 +0000162 SkIPoint dim = bench->getSize();
163 if (dim.fX <= 0 || dim.fY <= 0) {
164 continue;
165 }
reed@android.comb398fe82009-01-07 11:47:57 +0000166
reed@android.com4bc19832009-01-19 20:08:35 +0000167 bench->setForceAlpha(forceAlpha);
168 bench->setForceAA(forceAA);
169
reed@android.com4c7d3d62009-01-21 03:15:13 +0000170 printf("running bench %8s", bench->getName());
reed@android.com4bc19832009-01-19 20:08:35 +0000171
172 for (int configIndex = 0; configIndex < configCount; configIndex++) {
173 if (configCount > 1) {
174 outConfig = gConfigs[configIndex].fConfig;
175 configName = gConfigs[configIndex].fName;
176 }
177
178 SkBitmap bm;
179 bm.setConfig(outConfig, dim.fX, dim.fY);
180 bm.allocPixels();
181
182 SkCanvas canvas(bm);
183 canvas.drawColor(SK_ColorWHITE);
184
reed@android.com4c7d3d62009-01-21 03:15:13 +0000185 if (doClip) {
186 performClip(&canvas, dim.fX, dim.fY);
187 }
188 if (doRotate) {
189 performRotate(&canvas, dim.fX, dim.fY);
190 }
191
reed@android.com4bc19832009-01-19 20:08:35 +0000192 SkMSec now = SkTime::GetMSecs();
193 for (int i = 0; i < repeatDraw; i++) {
reed@android.com4c7d3d62009-01-21 03:15:13 +0000194 SkAutoCanvasRestore acr(&canvas, true);
reed@android.com4bc19832009-01-19 20:08:35 +0000195 bench->draw(&canvas);
196 }
197 if (repeatDraw > 1) {
198 printf(" %4s:%7.2f", configName,
199 (SkTime::GetMSecs() - now) / (double)repeatDraw);
200 }
reed@android.com4c7d3d62009-01-21 03:15:13 +0000201 if (outDir.size() > 0) {
202 saveFile(bench->getName(), configName, outDir.c_str(), bm);
203 }
reed@android.com4bc19832009-01-19 20:08:35 +0000204 }
205 printf("\n");
reed@android.combd700c32009-01-05 03:34:50 +0000206 }
207
208 return 0;
209}