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