1
2/*
3 * Copyright 2012 The Android Open Source Project
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
9#include "Benchmark.h"
10#include "SkCanvas.h"
11
12
13/**
14 * This bench mark tests the use case where the user writes the a canvas
15 * and then reads small chunks from it repeatedly. This can cause trouble
16 * for the GPU as readbacks are very expensive.
17 */
18class ReadPixBench : public Benchmark {
19public:
20    ReadPixBench() {}
21
22protected:
23    virtual const char* onGetName() SK_OVERRIDE {
24        return "readpix";
25    }
26
27    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
28        canvas->clear(SK_ColorBLACK);
29
30        SkISize size = canvas->getDeviceSize();
31
32        int offX = (size.width() - kWindowSize) / kNumStepsX;
33        int offY = (size.height() - kWindowSize) / kNumStepsY;
34
35        SkPaint paint;
36
37        paint.setColor(SK_ColorBLUE);
38
39        canvas->drawCircle(SkIntToScalar(size.width()/2),
40                           SkIntToScalar(size.height()/2),
41                           SkIntToScalar(size.width()/2),
42                           paint);
43
44        SkBitmap bitmap;
45
46        bitmap.setInfo(SkImageInfo::MakeN32Premul(kWindowSize, kWindowSize));
47
48        for (int i = 0; i < loops; i++) {
49            for (int x = 0; x < kNumStepsX; ++x) {
50                for (int y = 0; y < kNumStepsY; ++y) {
51                    canvas->readPixels(&bitmap, x * offX, y * offY);
52                }
53            }
54        }
55    }
56
57private:
58    static const int kNumStepsX = 30;
59    static const int kNumStepsY = 30;
60    static const int kWindowSize = 5;
61
62    typedef Benchmark INHERITED;
63};
64
65////////////////////////////////////////////////////////////////////////////////
66
67DEF_BENCH( return new ReadPixBench(); )
68