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 "SkString.h"
11
12class WritePixelsBench : public Benchmark {
13public:
14    WritePixelsBench(SkColorType ct, SkAlphaType at)
15        : fColorType(ct)
16        , fAlphaType(at)
17        , fName("writepix")
18    {
19        switch (ct) {
20            case kRGBA_8888_SkColorType:
21                fName.append("_RGBA");
22                break;
23            case kBGRA_8888_SkColorType:
24                fName.append("_BGRA");
25                break;
26            default:
27                SkASSERT(0);
28                break;
29        }
30        switch (at) {
31            case kPremul_SkAlphaType:
32                fName.append("_PM");
33                break;
34            case kUnpremul_SkAlphaType:
35                fName.append("_UPM");
36                break;
37            default:
38                SkASSERT(0);
39                break;
40        }
41    }
42
43protected:
44    virtual const char* onGetName() SK_OVERRIDE {
45        return fName.c_str();
46    }
47
48    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
49        SkISize size = canvas->getDeviceSize();
50
51        canvas->clear(0xFFFF0000);
52
53        SkBitmap bmp;
54        bmp.allocN32Pixels(size.width(), size.height());
55        canvas->readPixels(&bmp, 0, 0);
56
57        SkImageInfo info = SkImageInfo::Make(bmp.width(), bmp.height(), fColorType, fAlphaType);
58
59        for (int loop = 0; loop < loops; ++loop) {
60            canvas->writePixels(info, bmp.getPixels(), bmp.rowBytes(), 0, 0);
61        }
62    }
63
64private:
65    SkColorType fColorType;
66    SkAlphaType fAlphaType;
67    SkString    fName;
68
69    typedef Benchmark INHERITED;
70};
71
72//////////////////////////////////////////////////////////////////////////////
73
74DEF_BENCH( return SkNEW_ARGS(WritePixelsBench, (kRGBA_8888_SkColorType, kPremul_SkAlphaType)); )
75DEF_BENCH( return SkNEW_ARGS(WritePixelsBench, (kRGBA_8888_SkColorType, kUnpremul_SkAlphaType)); )
76