1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "Benchmark.h" 9 #include "SkBitmap.h" 10 #include "SkCanvas.h" 11 #include "SkShader.h" 12 #include "SkString.h" 13 14 static void create_gradient(SkBitmap* bm) { 15 SkASSERT(1 == bm->width()); 16 const int height = bm->height(); 17 18 float deltaB = 255.0f / height; 19 float blue = 255.0f; 20 21 SkAutoLockPixels lock(*bm); 22 for (int y = 0; y < height; y++) { 23 *bm->getAddr32(0, y) = SkColorSetRGB(0, 0, (U8CPU) blue); 24 blue -= deltaB; 25 } 26 } 27 28 // Test out the special case of a tiled 1xN texture. Test out opacity, 29 // filtering and the different tiling modes 30 class ConstXTileBench : public Benchmark { 31 SkPaint fPaint; 32 SkString fName; 33 bool fDoFilter; 34 bool fDoTrans; 35 bool fDoScale; 36 static const int kWidth = 1; 37 static const int kHeight = 300; 38 39 public: 40 ConstXTileBench(SkShader::TileMode xTile, 41 SkShader::TileMode yTile, 42 bool doFilter, 43 bool doTrans, 44 bool doScale) 45 : fDoFilter(doFilter) 46 , fDoTrans(doTrans) 47 , fDoScale(doScale) { 48 SkBitmap bm; 49 50 bm.allocN32Pixels(kWidth, kHeight, true); 51 bm.eraseColor(SK_ColorWHITE); 52 53 create_gradient(&bm); 54 55 fPaint.setShader(SkShader::MakeBitmapShader(bm, xTile, yTile)); 56 57 fName.printf("constXTile_"); 58 59 static const char* gTileModeStr[SkShader::kTileModeCount] = { "C", "R", "M" }; 60 fName.append(gTileModeStr[xTile]); 61 fName.append(gTileModeStr[yTile]); 62 63 if (doFilter) { 64 fName.append("_filter"); 65 } 66 67 if (doTrans) { 68 fName.append("_trans"); 69 } 70 71 if (doScale) { 72 fName.append("_scale"); 73 } 74 } 75 76 protected: 77 virtual const char* onGetName() { 78 return fName.c_str(); 79 } 80 81 virtual void onDraw(int loops, SkCanvas* canvas) { 82 SkPaint paint(fPaint); 83 this->setupPaint(&paint); 84 paint.setFilterQuality(fDoFilter ? kLow_SkFilterQuality 85 : kNone_SkFilterQuality); 86 if (fDoTrans) { 87 paint.setColor(SkColorSetARGBMacro(0x80, 0xFF, 0xFF, 0xFF)); 88 } 89 90 SkRect r; 91 92 if (fDoScale) { 93 r = SkRect::MakeWH(SkIntToScalar(2 * 640), SkIntToScalar(2 * 480)); 94 canvas->scale(SK_ScalarHalf, SK_ScalarHalf); 95 } else { 96 r = SkRect::MakeWH(SkIntToScalar(640), SkIntToScalar(480)); 97 } 98 99 SkPaint bgPaint; 100 bgPaint.setColor(SK_ColorWHITE); 101 102 for (int i = 0; i < loops; i++) { 103 if (fDoTrans) { 104 canvas->drawRect(r, bgPaint); 105 } 106 107 canvas->drawRect(r, paint); 108 } 109 } 110 111 private: 112 typedef Benchmark INHERITED; 113 }; 114 115 // Scaled benches are trending towards free. Seems like caching. 116 // TODO(mtklein, reed): fix and reenable 117 118 //DEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, false, false, true)) 119 DEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, false, false, false)) 120 //DEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, false, false, true)) 121 122 DEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, true, false, false)) 123 //DEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, true, false, true)) 124 DEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, true, false, false)) 125 126 //DEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, false, true, true)) 127 DEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, false, true, false)) 128 //DEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, false, true, true)) 129 130 DEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, true, true, false)) 131 //DEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, true, true, true)) 132 DEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, true, true, false)) 133