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