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
14class PremulAndUnpremulAlphaOpsBench : public Benchmark {
15    enum {
16        W = 256,
17        H = 256,
18    };
19    SkBitmap fBmp1, fBmp2;
20
21public:
22    PremulAndUnpremulAlphaOpsBench(SkColorType ct) {
23        fColorType = ct;
24        fName.printf("premul_and_unpremul_alpha_%s", sk_tool_utils::colortype_name(ct));
25    }
26
27protected:
28    virtual const char* onGetName() SK_OVERRIDE {
29        return fName.c_str();
30    }
31
32    virtual void onPreDraw() {
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    virtual void onDraw(const int loops, SkCanvas* canvas) SK_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
57private:
58    SkColorType fColorType;
59    SkString fName;
60
61    typedef Benchmark INHERITED;
62};
63
64
65DEF_BENCH(return new PremulAndUnpremulAlphaOpsBench(kRGBA_8888_SkColorType));
66DEF_BENCH(return new PremulAndUnpremulAlphaOpsBench(kBGRA_8888_SkColorType));
67