1/*
2 * Copyright 2011 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#include "Benchmark.h"
8#include "SkBitmap.h"
9#include "SkCanvas.h"
10#include "SkColorPriv.h"
11#include "SkPaint.h"
12#include "SkRandom.h"
13#include "SkString.h"
14
15static void draw_into_bitmap(const SkBitmap& bm) {
16    const int w = bm.width();
17    const int h = bm.height();
18
19    SkCanvas canvas(bm);
20    SkPaint p;
21    p.setAntiAlias(true);
22    p.setColor(SK_ColorRED);
23    canvas.drawCircle(SkIntToScalar(w)/2, SkIntToScalar(h)/2,
24                      SkIntToScalar(SkMin32(w, h))*3/8, p);
25
26    SkRect r;
27    r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
28    p.setStyle(SkPaint::kStroke_Style);
29    p.setStrokeWidth(SkIntToScalar(4));
30    p.setColor(SK_ColorBLUE);
31    canvas.drawRect(r, p);
32}
33
34/*  Variants for bitmaprect
35    src : entire bitmap, subset, fractional subset
36    dst : same size as src, diff size
37    paint : filter-p
38 */
39
40class BitmapRectBench : public Benchmark {
41    SkBitmap                fBitmap;
42    bool                    fSlightMatrix;
43    uint8_t                 fAlpha;
44    SkFilterQuality         fFilterQuality;
45    SkString                fName;
46    SkRect                  fSrcR, fDstR;
47
48    static const int kWidth = 128;
49    static const int kHeight = 128;
50public:
51    BitmapRectBench(U8CPU alpha, SkFilterQuality filterQuality,
52                    bool slightMatrix)  {
53        fAlpha = SkToU8(alpha);
54        fFilterQuality = filterQuality;
55        fSlightMatrix = slightMatrix;
56
57        fBitmap.setInfo(SkImageInfo::MakeN32Premul(kWidth, kHeight));
58    }
59
60protected:
61    const char* onGetName() override {
62        fName.printf("bitmaprect_%02X_%sfilter_%s",
63                     fAlpha,
64                     kNone_SkFilterQuality == fFilterQuality ? "no" : "",
65                     fSlightMatrix ? "trans" : "identity");
66        return fName.c_str();
67    }
68
69    void onDelayedSetup() override {
70        fBitmap.allocPixels();
71        fBitmap.setAlphaType(kOpaque_SkAlphaType);
72        fBitmap.eraseColor(SK_ColorBLACK);
73        draw_into_bitmap(fBitmap);
74
75        fSrcR.iset(0, 0, kWidth, kHeight);
76        fDstR.iset(0, 0, kWidth, kHeight);
77
78        if (fSlightMatrix) {
79            // want fractional translate
80            fDstR.offset(SK_Scalar1 / 3, SK_Scalar1 * 5 / 7);
81            // want enough to create a scale matrix, but not enough to scare
82            // off our sniffer which tries to see if the matrix is "effectively"
83            // translate-only.
84            fDstR.fRight += SK_Scalar1 / (kWidth * 60);
85        }
86    }
87
88
89    void onDraw(int loops, SkCanvas* canvas) override {
90        SkRandom rand;
91
92        SkPaint paint;
93        this->setupPaint(&paint);
94        paint.setFilterQuality(fFilterQuality);
95        paint.setAlpha(fAlpha);
96
97        for (int i = 0; i < loops; i++) {
98            canvas->drawBitmapRect(fBitmap, fSrcR, fDstR, &paint,
99                                   SkCanvas::kStrict_SrcRectConstraint);
100        }
101    }
102
103private:
104    typedef Benchmark INHERITED;
105};
106
107DEF_BENCH(return new BitmapRectBench(0xFF, kNone_SkFilterQuality, false))
108DEF_BENCH(return new BitmapRectBench(0x80, kNone_SkFilterQuality, false))
109DEF_BENCH(return new BitmapRectBench(0xFF, kLow_SkFilterQuality, false))
110DEF_BENCH(return new BitmapRectBench(0x80, kLow_SkFilterQuality, false))
111
112DEF_BENCH(return new BitmapRectBench(0xFF, kNone_SkFilterQuality, true))
113DEF_BENCH(return new BitmapRectBench(0xFF, kLow_SkFilterQuality, true))
114