1 /* 2 * Copyright 2011 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 "SkColorPriv.h" 12 #include "SkPaint.h" 13 #include "SkRandom.h" 14 #include "SkString.h" 15 #include "SkTo.h" 16 17 static void draw_into_bitmap(const SkBitmap& bm) { 18 const int w = bm.width(); 19 const int h = bm.height(); 20 21 SkCanvas canvas(bm); 22 SkPaint p; 23 p.setAntiAlias(true); 24 p.setColor(SK_ColorRED); 25 canvas.drawCircle(SkIntToScalar(w)/2, SkIntToScalar(h)/2, 26 SkIntToScalar(SkMin32(w, h))*3/8, p); 27 28 SkRect r; 29 r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h)); 30 p.setStyle(SkPaint::kStroke_Style); 31 p.setStrokeWidth(SkIntToScalar(4)); 32 p.setColor(SK_ColorBLUE); 33 canvas.drawRect(r, p); 34 } 35 36 /* Variants for bitmaprect 37 src : entire bitmap, subset, fractional subset 38 dst : same size as src, diff size 39 paint : filter-p 40 */ 41 42 class BitmapRectBench : public Benchmark { 43 SkBitmap fBitmap; 44 bool fSlightMatrix; 45 uint8_t fAlpha; 46 SkFilterQuality fFilterQuality; 47 SkString fName; 48 SkRect fSrcR, fDstR; 49 50 static const int kWidth = 128; 51 static const int kHeight = 128; 52 public: 53 BitmapRectBench(U8CPU alpha, SkFilterQuality filterQuality, 54 bool slightMatrix) { 55 fAlpha = SkToU8(alpha); 56 fFilterQuality = filterQuality; 57 fSlightMatrix = slightMatrix; 58 59 fBitmap.setInfo(SkImageInfo::MakeN32Premul(kWidth, kHeight)); 60 } 61 62 protected: 63 const char* onGetName() override { 64 fName.printf("bitmaprect_%02X_%sfilter_%s", 65 fAlpha, 66 kNone_SkFilterQuality == fFilterQuality ? "no" : "", 67 fSlightMatrix ? "trans" : "identity"); 68 return fName.c_str(); 69 } 70 71 void onDelayedSetup() override { 72 fBitmap.allocPixels(); 73 fBitmap.setAlphaType(kOpaque_SkAlphaType); 74 fBitmap.eraseColor(SK_ColorBLACK); 75 draw_into_bitmap(fBitmap); 76 77 fSrcR.iset(0, 0, kWidth, kHeight); 78 fDstR.iset(0, 0, kWidth, kHeight); 79 80 if (fSlightMatrix) { 81 // want fractional translate 82 fDstR.offset(SK_Scalar1 / 3, SK_Scalar1 * 5 / 7); 83 // want enough to create a scale matrix, but not enough to scare 84 // off our sniffer which tries to see if the matrix is "effectively" 85 // translate-only. 86 fDstR.fRight += SK_Scalar1 / (kWidth * 60); 87 } 88 } 89 90 91 void onDraw(int loops, SkCanvas* canvas) override { 92 SkRandom rand; 93 94 SkPaint paint; 95 this->setupPaint(&paint); 96 paint.setFilterQuality(fFilterQuality); 97 paint.setAlpha(fAlpha); 98 99 for (int i = 0; i < loops; i++) { 100 canvas->drawBitmapRect(fBitmap, fSrcR, fDstR, &paint, 101 SkCanvas::kStrict_SrcRectConstraint); 102 } 103 } 104 105 private: 106 typedef Benchmark INHERITED; 107 }; 108 109 DEF_BENCH(return new BitmapRectBench(0xFF, kNone_SkFilterQuality, false)) 110 DEF_BENCH(return new BitmapRectBench(0x80, kNone_SkFilterQuality, false)) 111 DEF_BENCH(return new BitmapRectBench(0xFF, kLow_SkFilterQuality, false)) 112 DEF_BENCH(return new BitmapRectBench(0x80, kLow_SkFilterQuality, false)) 113 114 DEF_BENCH(return new BitmapRectBench(0xFF, kNone_SkFilterQuality, true)) 115 DEF_BENCH(return new BitmapRectBench(0xFF, kLow_SkFilterQuality, true)) 116