Home | History | Annotate | Download | only in bench
      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:
     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:
     28     const char* onGetName() override {
     29         return fName.c_str();
     30     }
     31 
     32     void onPreDraw() 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 
     46     void onDraw(const 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