Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(267)

Side by Side Diff: bench/BitmapBench.cpp

Issue 322963002: hide SkBitmap::setConfig (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | bench/BitmapRectBench.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1
2 /* 1 /*
3 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
4 * 3 *
5 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 5 * found in the LICENSE file.
7 */ 6 */
7
8 #include "SkBenchmark.h" 8 #include "SkBenchmark.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkPaint.h" 10 #include "SkPaint.h"
11 #include "SkCanvas.h" 11 #include "SkCanvas.h"
12 #include "SkColorPriv.h" 12 #include "SkColorPriv.h"
13 #include "SkRandom.h" 13 #include "SkRandom.h"
14 #include "SkString.h" 14 #include "SkString.h"
15 15 #include "sk_tool_utils.h"
16 static const char* gConfigName[] = {
17 "ERROR", "a1", "a8", "index8", "565", "4444", "8888"
18 };
19 16
20 static int conv6ToByte(int x) { 17 static int conv6ToByte(int x) {
21 return x * 0xFF / 5; 18 return x * 0xFF / 5;
22 } 19 }
23 20
24 static int convByteTo6(int x) { 21 static int convByteTo6(int x) {
25 return x * 5 / 255; 22 return x * 5 / 255;
26 } 23 }
27 24
28 static uint8_t compute666Index(SkPMColor c) { 25 static uint8_t compute666Index(SkPMColor c) {
29 int r = SkGetPackedR32(c); 26 int r = SkGetPackedR32(c);
30 int g = SkGetPackedG32(c); 27 int g = SkGetPackedG32(c);
31 int b = SkGetPackedB32(c); 28 int b = SkGetPackedB32(c);
32 29
33 return convByteTo6(r) * 36 + convByteTo6(g) * 6 + convByteTo6(b); 30 return convByteTo6(r) * 36 + convByteTo6(g) * 6 + convByteTo6(b);
34 } 31 }
35 32
36 static void convertToIndex666(const SkBitmap& src, SkBitmap* dst, bool isOpaque) { 33 static void convertToIndex666(const SkBitmap& src, SkBitmap* dst, SkAlphaType aT ype) {
37 SkPMColor storage[216]; 34 SkPMColor storage[216];
38 SkPMColor* colors = storage; 35 SkPMColor* colors = storage;
39 // rrr ggg bbb 36 // rrr ggg bbb
40 for (int r = 0; r < 6; r++) { 37 for (int r = 0; r < 6; r++) {
41 int rr = conv6ToByte(r); 38 int rr = conv6ToByte(r);
42 for (int g = 0; g < 6; g++) { 39 for (int g = 0; g < 6; g++) {
43 int gg = conv6ToByte(g); 40 int gg = conv6ToByte(g);
44 for (int b = 0; b < 6; b++) { 41 for (int b = 0; b < 6; b++) {
45 int bb = conv6ToByte(b); 42 int bb = conv6ToByte(b);
46 *colors++ = SkPreMultiplyARGB(0xFF, rr, gg, bb); 43 *colors++ = SkPreMultiplyARGB(0xFF, rr, gg, bb);
47 } 44 }
48 } 45 }
49 } 46 }
50 SkColorTable* ctable = new SkColorTable(storage, 216, 47 SkColorTable* ctable = new SkColorTable(storage, 216, aType);
51 isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); 48 dst->allocPixels(SkImageInfo::Make(src.width(), src.height(), kIndex_8_SkCol orType, aType),
52 dst->setConfig(SkBitmap::kIndex8_Config, src.width(), src.height()); 49 NULL, ctable);
53 dst->allocPixels(ctable);
54 ctable->unref(); 50 ctable->unref();
55 51
56 SkAutoLockPixels alps(src); 52 SkAutoLockPixels alps(src);
57 SkAutoLockPixels alpd(*dst); 53 SkAutoLockPixels alpd(*dst);
58 54
59 for (int y = 0; y < src.height(); y++) { 55 for (int y = 0; y < src.height(); y++) {
60 const SkPMColor* srcP = src.getAddr32(0, y); 56 const SkPMColor* srcP = src.getAddr32(0, y);
61 uint8_t* dstP = dst->getAddr8(0, y); 57 uint8_t* dstP = dst->getAddr8(0, y);
62 for (int x = src.width() - 1; x >= 0; --x) { 58 for (int x = src.width() - 1; x >= 0; --x) {
63 *dstP++ = compute666Index(*srcP++); 59 *dstP++ = compute666Index(*srcP++);
64 } 60 }
65 } 61 }
66 } 62 }
67 63
68 /* Variants for bitmaps 64 /* Variants for bitmaps
69 65
70 - src depth (32 w+w/o alpha), 565, 4444, index, a8 66 - src depth (32 w+w/o alpha), 565, 4444, index, a8
71 - paint options: filtering, dither, alpha 67 - paint options: filtering, dither, alpha
72 - matrix options: translate, scale, rotate, persp 68 - matrix options: translate, scale, rotate, persp
73 - tiling: none, repeat, mirror, clamp 69 - tiling: none, repeat, mirror, clamp
74 70
75 */ 71 */
76 72
77 class BitmapBench : public SkBenchmark { 73 class BitmapBench : public SkBenchmark {
78 SkBitmap fBitmap; 74 const SkColorType fColorType;
79 SkPaint fPaint; 75 const SkAlphaType fAlphaType;
80 bool fIsOpaque; 76 const bool fForceUpdate; //bitmap marked as dirty before each draw. forces bitmap to be updated on device cache
81 bool fForceUpdate; //bitmap marked as dirty before each draw. forces bitmap to be updated on device cache 77 const bool fIsVolatile;
82 bool fIsVolatile; 78
83 SkBitmap::Config fConfig; 79 SkBitmap fBitmap;
84 SkString fName; 80 SkPaint fPaint;
81 SkString fName;
82
85 enum { W = 128 }; 83 enum { W = 128 };
86 enum { H = 128 }; 84 enum { H = 128 };
87 public: 85 public:
88 BitmapBench(bool isOpaque, SkBitmap::Config c, 86 BitmapBench(SkColorType ct, SkAlphaType at, bool forceUpdate = false, bool i sVolatile = false)
89 bool forceUpdate = false, bool bitmapVolatile = false) 87 : fColorType(ct)
90 : fIsOpaque(isOpaque) 88 , fAlphaType(at)
91 , fForceUpdate(forceUpdate) 89 , fForceUpdate(forceUpdate)
92 , fIsVolatile(bitmapVolatile) 90 , fIsVolatile(isVolatile)
93 , fConfig(c) { 91 {}
94 }
95 92
96 protected: 93 protected:
97 virtual const char* onGetName() { 94 virtual const char* onGetName() {
98 fName.set("bitmap"); 95 fName.set("bitmap");
99 fName.appendf("_%s%s", gConfigName[fConfig], 96 fName.appendf("_%s%s", sk_tool_utils::colortype_name(fColorType),
100 fIsOpaque ? "" : "_A"); 97 kOpaque_SkAlphaType == fAlphaType ? "" : "_A");
101 if (fForceUpdate) 98 if (fForceUpdate)
102 fName.append("_update"); 99 fName.append("_update");
103 if (fIsVolatile) 100 if (fIsVolatile)
104 fName.append("_volatile"); 101 fName.append("_volatile");
105 102
106 return fName.c_str(); 103 return fName.c_str();
107 } 104 }
108 105
109 virtual void onPreDraw() { 106 virtual void onPreDraw() {
110 SkBitmap bm; 107 SkBitmap bm;
111 108
112 if (SkBitmap::kIndex8_Config == fConfig) { 109 if (kIndex_8_SkColorType == fColorType) {
113 bm.setConfig(SkBitmap::kARGB_8888_Config, W, H); 110 bm.setInfo(SkImageInfo::MakeN32(W, H, fAlphaType));
114 } else { 111 } else {
115 bm.setConfig(fConfig, W, H); 112 bm.setInfo(SkImageInfo::Make(W, H, fColorType, fAlphaType));
116 } 113 }
117 114
118 bm.allocPixels(); 115 bm.allocPixels();
119 bm.eraseColor(fIsOpaque ? SK_ColorBLACK : 0); 116 bm.eraseColor(kOpaque_SkAlphaType == fAlphaType ? SK_ColorBLACK : 0);
120 117
121 onDrawIntoBitmap(bm); 118 onDrawIntoBitmap(bm);
122 119
123 if (SkBitmap::kIndex8_Config == fConfig) { 120 if (kIndex_8_SkColorType == fColorType) {
124 convertToIndex666(bm, &fBitmap, fIsOpaque); 121 convertToIndex666(bm, &fBitmap, fAlphaType);
125 } else { 122 } else {
126 fBitmap = bm; 123 fBitmap = bm;
127 } 124 }
128 125
129 fBitmap.setAlphaType(fIsOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaTy pe);
130 fBitmap.setIsVolatile(fIsVolatile); 126 fBitmap.setIsVolatile(fIsVolatile);
131 } 127 }
132 128
133 virtual void onDraw(const int loops, SkCanvas* canvas) { 129 virtual void onDraw(const int loops, SkCanvas* canvas) {
134 SkIPoint dim = this->getSize(); 130 SkIPoint dim = this->getSize();
135 SkRandom rand; 131 SkRandom rand;
136 132
137 SkPaint paint(fPaint); 133 SkPaint paint(fPaint);
138 this->setupPaint(&paint); 134 this->setupPaint(&paint);
139 135
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 } 186 }
191 187
192 static bool isBicubic(uint32_t flags) { 188 static bool isBicubic(uint32_t flags) {
193 return (flags & (kBilerp_Flag | kBicubic_Flag)) == (kBilerp_Flag | kBicubic_ Flag); 189 return (flags & (kBilerp_Flag | kBicubic_Flag)) == (kBilerp_Flag | kBicubic_ Flag);
194 } 190 }
195 191
196 class FilterBitmapBench : public BitmapBench { 192 class FilterBitmapBench : public BitmapBench {
197 uint32_t fFlags; 193 uint32_t fFlags;
198 SkString fFullName; 194 SkString fFullName;
199 public: 195 public:
200 FilterBitmapBench(bool isOpaque, SkBitmap::Config c, 196 FilterBitmapBench(SkColorType ct, SkAlphaType at,
201 bool forceUpdate, bool isVolitile, uint32_t flags) 197 bool forceUpdate, bool isVolitile, uint32_t flags)
202 : INHERITED(isOpaque, c, forceUpdate, isVolitile) 198 : INHERITED(ct, at, forceUpdate, isVolitile)
203 , fFlags(flags) { 199 , fFlags(flags) {
204 } 200 }
205 201
206 protected: 202 protected:
207 virtual const char* onGetName() { 203 virtual const char* onGetName() {
208 fFullName.set(INHERITED::onGetName()); 204 fFullName.set(INHERITED::onGetName());
209 if (fFlags & kScale_Flag) { 205 if (fFlags & kScale_Flag) {
210 fFullName.append("_scale"); 206 fFullName.append("_scale");
211 } 207 }
212 if (fFlags & kRotate_Flag) { 208 if (fFlags & kRotate_Flag) {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 /** Verify optimizations that test source alpha values. */ 265 /** Verify optimizations that test source alpha values. */
270 266
271 class SourceAlphaBitmapBench : public BitmapBench { 267 class SourceAlphaBitmapBench : public BitmapBench {
272 public: 268 public:
273 enum SourceAlpha { kOpaque_SourceAlpha, kTransparent_SourceAlpha, 269 enum SourceAlpha { kOpaque_SourceAlpha, kTransparent_SourceAlpha,
274 kTwoStripes_SourceAlpha, kThreeStripes_SourceAlpha}; 270 kTwoStripes_SourceAlpha, kThreeStripes_SourceAlpha};
275 private: 271 private:
276 SkString fFullName; 272 SkString fFullName;
277 SourceAlpha fSourceAlpha; 273 SourceAlpha fSourceAlpha;
278 public: 274 public:
279 SourceAlphaBitmapBench(SourceAlpha alpha, SkBitmap::Config c, 275 SourceAlphaBitmapBench(SourceAlpha alpha, SkColorType ct,
280 bool forceUpdate = false, bool bitmapVolatile = false) 276 bool forceUpdate = false, bool bitmapVolatile = false)
281 : INHERITED(false, c, forceUpdate, bitmapVolatile) 277 : INHERITED(ct, kPremul_SkAlphaType, forceUpdate, bitmapVolatile)
282 , fSourceAlpha(alpha) { 278 , fSourceAlpha(alpha) {
283 } 279 }
284 280
285 protected: 281 protected:
286 virtual const char* onGetName() { 282 virtual const char* onGetName() {
287 fFullName.set(INHERITED::onGetName()); 283 fFullName.set(INHERITED::onGetName());
288 284
289 if (fSourceAlpha == kOpaque_SourceAlpha) { 285 if (fSourceAlpha == kOpaque_SourceAlpha) {
290 fFullName.append("_source_opaque"); 286 fFullName.append("_source_opaque");
291 } else if (fSourceAlpha == kTransparent_SourceAlpha) { 287 } else if (fSourceAlpha == kTransparent_SourceAlpha) {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
348 r.set(SkIntToScalar(x), 0, SkIntToScalar(x+1), SkIntToScalar(h)) ; 344 r.set(SkIntToScalar(x), 0, SkIntToScalar(x+1), SkIntToScalar(h)) ;
349 canvas.drawRect(r, p); 345 canvas.drawRect(r, p);
350 } 346 }
351 } 347 }
352 } 348 }
353 349
354 private: 350 private:
355 typedef BitmapBench INHERITED; 351 typedef BitmapBench INHERITED;
356 }; 352 };
357 353
358 DEF_BENCH( return new BitmapBench(false, SkBitmap::kARGB_8888_Config); ) 354 DEF_BENCH( return new BitmapBench(kN32_SkColorType, kPremul_SkAlphaType); )
359 DEF_BENCH( return new BitmapBench(true, SkBitmap::kARGB_8888_Config); ) 355 DEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType); )
360 DEF_BENCH( return new BitmapBench(true, SkBitmap::kRGB_565_Config); ) 356 DEF_BENCH( return new BitmapBench(kRGB_565_SkColorType, kOpaque_SkAlphaType); )
361 DEF_BENCH( return new BitmapBench(false, SkBitmap::kIndex8_Config); ) 357 DEF_BENCH( return new BitmapBench(kIndex_8_SkColorType, kPremul_SkAlphaType); )
362 DEF_BENCH( return new BitmapBench(true, SkBitmap::kIndex8_Config); ) 358 DEF_BENCH( return new BitmapBench(kIndex_8_SkColorType, kOpaque_SkAlphaType); )
363 DEF_BENCH( return new BitmapBench(true, SkBitmap::kARGB_8888_Config, true, true) ; ) 359 DEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, t rue); )
364 DEF_BENCH( return new BitmapBench(true, SkBitmap::kARGB_8888_Config, true, false ); ) 360 DEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, f alse); )
365 361
366 // scale filter -> S32_opaque_D32_filter_DX_{SSE2,SSSE3} and Fact9 is also for S 32_D16_filter_DX_SSE2 362 // scale filter -> S32_opaque_D32_filter_DX_{SSE2,SSSE3} and Fact9 is also for S 32_D16_filter_DX_SSE2
367 DEF_BENCH( return new FilterBitmapBench(false, SkBitmap::kARGB_8888_Config, fals e, false, kScale_Flag | kBilerp_Flag); ) 363 DEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kPremul_SkAlphaType, f alse, false, kScale_Flag | kBilerp_Flag); )
368 DEF_BENCH( return new FilterBitmapBench(true, SkBitmap::kARGB_8888_Config, false , false, kScale_Flag | kBilerp_Flag); ) 364 DEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, f alse, false, kScale_Flag | kBilerp_Flag); )
369 DEF_BENCH( return new FilterBitmapBench(true, SkBitmap::kARGB_8888_Config, true, true, kScale_Flag | kBilerp_Flag); ) 365 DEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, t rue, true, kScale_Flag | kBilerp_Flag); )
370 DEF_BENCH( return new FilterBitmapBench(true, SkBitmap::kARGB_8888_Config, true, false, kScale_Flag | kBilerp_Flag); ) 366 DEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, t rue, false, kScale_Flag | kBilerp_Flag); )
371 367
372 // scale rotate filter -> S32_opaque_D32_filter_DXDY_{SSE2,SSSE3} 368 // scale rotate filter -> S32_opaque_D32_filter_DXDY_{SSE2,SSSE3}
373 DEF_BENCH( return new FilterBitmapBench(false, SkBitmap::kARGB_8888_Config, fals e, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); ) 369 DEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kPremul_SkAlphaType, f alse, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
374 DEF_BENCH( return new FilterBitmapBench(true, SkBitmap::kARGB_8888_Config, false , false, kScale_Flag | kRotate_Flag | kBilerp_Flag); ) 370 DEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, f alse, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
375 DEF_BENCH( return new FilterBitmapBench(true, SkBitmap::kARGB_8888_Config, true, true, kScale_Flag | kRotate_Flag | kBilerp_Flag); ) 371 DEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, t rue, true, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
376 DEF_BENCH( return new FilterBitmapBench(true, SkBitmap::kARGB_8888_Config, true, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); ) 372 DEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, t rue, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
377 373
378 DEF_BENCH( return new FilterBitmapBench(false, SkBitmap::kARGB_8888_Config, fals e, false, kScale_Flag | kBilerp_Flag | kBicubic_Flag); ) 374 DEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kPremul_SkAlphaType, f alse, false, kScale_Flag | kBilerp_Flag | kBicubic_Flag); )
379 DEF_BENCH( return new FilterBitmapBench(false, SkBitmap::kARGB_8888_Config, fals e, false, kScale_Flag | kRotate_Flag | kBilerp_Flag | kBicubic_Flag); ) 375 DEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kPremul_SkAlphaType, f alse, false, kScale_Flag | kRotate_Flag | kBilerp_Flag | kBicubic_Flag); )
380 376
381 // source alpha tests -> S32A_Opaque_BlitRow32_{arm,neon} 377 // source alpha tests -> S32A_Opaque_BlitRow32_{arm,neon}
382 DEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kOpaque_Sou rceAlpha, SkBitmap::kARGB_8888_Config); ) 378 DEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kOpaque_Sou rceAlpha, kN32_SkColorType); )
383 DEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kTransparen t_SourceAlpha, SkBitmap::kARGB_8888_Config); ) 379 DEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kTransparen t_SourceAlpha, kN32_SkColorType); )
384 DEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kTwoStripes _SourceAlpha, SkBitmap::kARGB_8888_Config); ) 380 DEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kTwoStripes _SourceAlpha, kN32_SkColorType); )
385 DEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kThreeStrip es_SourceAlpha, SkBitmap::kARGB_8888_Config); ) 381 DEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kThreeStrip es_SourceAlpha, kN32_SkColorType); )
OLDNEW
« no previous file with comments | « no previous file | bench/BitmapRectBench.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698