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 "SkCanvas.h" 10 #include "SkConfig8888.h" 11 #include "SkString.h" 12 #include "sk_tool_utils.h" 13 14 class PremulAndUnpremulAlphaOpsBench : public Benchmark { 15 enum { 16 W = 256, 17 H = 256, 18 }; 19 SkBitmap fBmp1, fBmp2; 20 21 public: PremulAndUnpremulAlphaOpsBench(SkColorType ct)22 PremulAndUnpremulAlphaOpsBench(SkColorType ct) { 23 fColorType = ct; 24 fName.printf("premul_and_unpremul_alpha_%s", sk_tool_utils::colortype_name(ct)); 25 } 26 27 protected: onGetName()28 const char* onGetName() override { 29 return fName.c_str(); 30 } 31 onDelayedSetup()32 void onDelayedSetup() override { 33 SkImageInfo info = SkImageInfo::Make(W, H, fColorType, kUnpremul_SkAlphaType); 34 fBmp1.allocPixels(info); // used in writePixels 35 36 for (int h = 0; h < H; ++h) { 37 for (int w = 0; w < W; ++w) { 38 // SkColor places A in the right slot for either RGBA or BGRA 39 *fBmp1.getAddr32(w, h) = SkColorSetARGB(h & 0xFF, w & 0xFF, w & 0xFF, w & 0xFF); 40 } 41 } 42 43 fBmp2.allocPixels(info); // used in readPixels() 44 } 45 onDraw(int loops,SkCanvas * canvas)46 void onDraw(int loops, SkCanvas* canvas) override { 47 canvas->clear(SK_ColorBLACK); 48 49 for (int loop = 0; loop < loops; ++loop) { 50 // Unpremul -> Premul 51 canvas->writePixels(fBmp1.info(), fBmp1.getPixels(), fBmp1.rowBytes(), 0, 0); 52 // Premul -> Unpremul 53 canvas->readPixels(fBmp2.info(), fBmp2.getPixels(), fBmp2.rowBytes(), 0, 0); 54 } 55 } 56 57 private: 58 SkColorType fColorType; 59 SkString fName; 60 61 typedef Benchmark INHERITED; 62 }; 63 64 65 DEF_BENCH(return new PremulAndUnpremulAlphaOpsBench(kRGBA_8888_SkColorType)); 66 DEF_BENCH(return new PremulAndUnpremulAlphaOpsBench(kBGRA_8888_SkColorType)); 67