1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2011 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Benchmark.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBitmap.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorPriv.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRandom.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkString.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "sk_tool_utils.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*  Variants for bitmaps
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    - src depth (32 w+w/o alpha), 565, 4444, index, a8
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    - paint options: filtering, dither, alpha
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    - matrix options: translate, scale, rotate, persp
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    - tiling: none, repeat, mirror, clamp
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass BitmapBench : public Benchmark {
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkColorType   fColorType;
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkAlphaType   fAlphaType;
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const bool          fForceUpdate; //bitmap marked as dirty before each draw. forces bitmap to be updated on device cache
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const bool          fIsVolatile;
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const bool          fDoScale;
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBitmap            fBitmap;
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint             fPaint;
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString            fName;
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum { W = 128 };
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum { H = 128 };
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    BitmapBench(SkColorType ct, SkAlphaType at, bool forceUpdate, bool isVolatile, bool doScale)
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        : fColorType(ct)
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fAlphaType(at)
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fForceUpdate(forceUpdate)
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fIsVolatile(isVolatile)
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fDoScale(doScale)
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    {}
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName.set("bitmap");
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName.appendf("_%s%s", sk_tool_utils::colortype_name(fColorType),
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                      kOpaque_SkAlphaType == fAlphaType ? "" : "_A");
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fDoScale) {
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fName.append("_scale");
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fForceUpdate) {
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fName.append("_update");
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fIsVolatile) {
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fName.append("_volatile");
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fName.c_str();
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDelayedSetup() override {
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkBitmap bm;
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bm.allocPixels(SkImageInfo::Make(W, H, fColorType, fAlphaType));
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bm.eraseColor(kOpaque_SkAlphaType == fAlphaType ? SK_ColorBLACK : 0);
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->onDrawIntoBitmap(bm);
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fBitmap = bm;
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fBitmap.setIsVolatile(fIsVolatile);
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas* canvas) override {
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fDoScale) {
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->scale(.99f, .99f);
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkIPoint dim = this->getSize();
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRandom rand;
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint paint(fPaint);
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->setupPaint(&paint);
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkBitmap& bitmap = fBitmap;
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkScalar x0 = SkIntToScalar(-bitmap.width() / 2);
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkScalar y0 = SkIntToScalar(-bitmap.height() / 2);
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; i++) {
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkScalar x = x0 + rand.nextUScalar1() * dim.fX;
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkScalar y = y0 + rand.nextUScalar1() * dim.fY;
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (fForceUpdate)
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                bitmap.notifyPixelsChanged();
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawBitmap(bitmap, x, y, &paint);
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     virtual void onDrawIntoBitmap(const SkBitmap& bm) {
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const int w = bm.width();
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const int h = bm.height();
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkCanvas canvas(bm);
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint p;
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setAntiAlias(true);
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setColor(SK_ColorRED);
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas.drawCircle(SkIntToScalar(w)/2, SkIntToScalar(h)/2,
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                          SkIntToScalar(SkMin32(w, h))*3/8, p);
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRect r;
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setStyle(SkPaint::kStroke_Style);
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setStrokeWidth(SkIntToScalar(4));
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setColor(SK_ColorBLUE);
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas.drawRect(r, p);
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** Explicitly invoke some filter types to improve coverage of acceleration
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    procs. */
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotenum Flags {
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    kScale_Flag             = 1 << 0,
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    kRotate_Flag            = 1 << 1,
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    kBilerp_Flag            = 1 << 2,
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    kBicubic_Flag           = 1 << 3,
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic bool isBilerp(uint32_t flags) {
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return (flags & (kBilerp_Flag | kBicubic_Flag)) == (kBilerp_Flag);
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic bool isBicubic(uint32_t flags) {
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return (flags & (kBilerp_Flag | kBicubic_Flag)) == (kBilerp_Flag | kBicubic_Flag);
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass FilterBitmapBench : public BitmapBench {
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    uint32_t    fFlags;
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString    fFullName;
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    FilterBitmapBench(SkColorType ct, SkAlphaType at,
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                      bool forceUpdate, bool isVolitile, uint32_t flags)
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        : INHERITED(ct, at, forceUpdate, isVolitile, false)
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fFlags(flags) {
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fFullName.set(INHERITED::onGetName());
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fFlags & kScale_Flag) {
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fFullName.append("_scale");
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fFlags & kRotate_Flag) {
161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fFullName.append("_rotate");
162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (isBilerp(fFlags)) {
164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fFullName.append("_bilerp");
165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else if (isBicubic(fFlags)) {
166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fFullName.append("_bicubic");
167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fFullName.c_str();
170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas* canvas) override {
173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkISize dim = canvas->getBaseLayerSize();
174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fFlags & kScale_Flag) {
175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkScalar x = SkIntToScalar(dim.fWidth) / 2;
176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkScalar y = SkIntToScalar(dim.fHeight) / 2;
177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(x, y);
179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // just enough so we can't take the sprite case
180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->scale(SK_Scalar1 * 99/100, SK_Scalar1 * 99/100);
181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(-x, -y);
182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fFlags & kRotate_Flag) {
184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkScalar x = SkIntToScalar(dim.fWidth) / 2;
185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkScalar y = SkIntToScalar(dim.fHeight) / 2;
186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->rotate(SkIntToScalar(35), x, y);
187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        INHERITED::onDraw(loops, canvas);
189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void setupPaint(SkPaint* paint) override {
192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->INHERITED::setupPaint(paint);
193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        int index = 0;
195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fFlags & kBilerp_Flag) {
196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            index |= 1;
197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fFlags & kBicubic_Flag) {
199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            index |= 2;
200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        static const SkFilterQuality gQualitys[] = {
202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            kNone_SkFilterQuality,
203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            kLow_SkFilterQuality,
204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            kMedium_SkFilterQuality,
205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            kHigh_SkFilterQuality
206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint->setFilterQuality(gQualitys[index]);
208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef BitmapBench INHERITED;
212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** Verify optimizations that test source alpha values. */
215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SourceAlphaBitmapBench : public BitmapBench {
217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum SourceAlpha { kOpaque_SourceAlpha, kTransparent_SourceAlpha,
219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                       kTwoStripes_SourceAlpha, kThreeStripes_SourceAlpha};
220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString    fFullName;
222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SourceAlpha fSourceAlpha;
223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SourceAlphaBitmapBench(SourceAlpha alpha, SkColorType ct,
225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                bool forceUpdate = false, bool bitmapVolatile = false)
226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        : INHERITED(ct, kPremul_SkAlphaType, forceUpdate, bitmapVolatile, false)
227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fSourceAlpha(alpha) {
228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fFullName.set(INHERITED::onGetName());
233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fSourceAlpha == kOpaque_SourceAlpha) {
235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fFullName.append("_source_opaque");
236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else if (fSourceAlpha == kTransparent_SourceAlpha) {
237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fFullName.append("_source_transparent");
238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else if (fSourceAlpha == kTwoStripes_SourceAlpha) {
239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fFullName.append("_source_stripes_two");
240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else if (fSourceAlpha == kThreeStripes_SourceAlpha) {
241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fFullName.append("_source_stripes_three");
242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fFullName.c_str();
245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawIntoBitmap(const SkBitmap& bm) override {
248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const int w = bm.width();
249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const int h = bm.height();
250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (kOpaque_SourceAlpha == fSourceAlpha) {
252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            bm.eraseColor(SK_ColorBLACK);
253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else if (kTransparent_SourceAlpha == fSourceAlpha) {
254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            bm.eraseColor(0);
255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else if (kTwoStripes_SourceAlpha == fSourceAlpha) {
256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            bm.eraseColor(0);
257fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
258fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkCanvas canvas(bm);
259fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkPaint p;
260fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            p.setAntiAlias(false);
261fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            p.setStyle(SkPaint::kFill_Style);
262fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            p.setColor(SK_ColorRED);
263fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
264fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // Draw red vertical stripes on transparent background
265fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkRect r;
266fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int x = 0; x < w; x+=2)
267fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            {
268fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                r.set(SkIntToScalar(x), 0, SkIntToScalar(x+1), SkIntToScalar(h));
269fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas.drawRect(r, p);
270fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
271fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
272fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else if (kThreeStripes_SourceAlpha == fSourceAlpha) {
273fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            bm.eraseColor(0);
274fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
275fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkCanvas canvas(bm);
276fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkPaint p;
277fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            p.setAntiAlias(false);
278fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            p.setStyle(SkPaint::kFill_Style);
279fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
280fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // Draw vertical stripes on transparent background with a pattern
281fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // where the first pixel is fully transparent, the next is semi-transparent
282fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // and the third is fully opaque.
283fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkRect r;
284fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int x = 0; x < w; x++)
285fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            {
286fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                if (x % 3 == 0) {
287fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    continue; // Keep transparent
288fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                } else if (x % 3 == 1) {
289fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    p.setColor(SkColorSetARGB(127, 127, 127, 127)); // Semi-transparent
290fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                } else if (x % 3 == 2) {
291fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    p.setColor(SK_ColorRED); // Opaque
292fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
293fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                r.set(SkIntToScalar(x), 0, SkIntToScalar(x+1), SkIntToScalar(h));
294fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas.drawRect(r, p);
295fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
296fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
297fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
298fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
299fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
300fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef BitmapBench INHERITED;
301fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
302fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
303fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new BitmapBench(kN32_SkColorType, kPremul_SkAlphaType, false, false, false); )
304fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, false, false, false); )
305fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, false, false, true); )
306fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new BitmapBench(kRGB_565_SkColorType, kOpaque_SkAlphaType, false, false, false); )
307fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, true, false); )
308fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, false, false); )
309fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
310fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// scale filter -> S32_opaque_D32_filter_DX_{SSE2,SSSE3} and Fact9 is also for S32_D16_filter_DX_SSE2
311fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kPremul_SkAlphaType, false, false, kScale_Flag | kBilerp_Flag); )
312fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, false, false, kScale_Flag | kBilerp_Flag); )
313fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, true, kScale_Flag | kBilerp_Flag); )
314fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, false, kScale_Flag | kBilerp_Flag); )
315fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
316fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// The following two cases test the performance regression of b/70172912 .
317fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kRGB_565_SkColorType, kOpaque_SkAlphaType, false, false, kScale_Flag | kBilerp_Flag); )
318fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new BitmapBench(kRGB_565_SkColorType, kOpaque_SkAlphaType, false, false, true); )
319fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
320fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// scale rotate filter -> S32_opaque_D32_filter_DXDY_{SSE2,SSSE3}
321fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kPremul_SkAlphaType, false, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
322fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, false, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
323fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, true, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
324fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
325fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
326fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kPremul_SkAlphaType, false, false, kScale_Flag | kBilerp_Flag | kBicubic_Flag); )
327fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kPremul_SkAlphaType, false, false, kScale_Flag | kRotate_Flag | kBilerp_Flag | kBicubic_Flag); )
328fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
329fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// source alpha tests -> S32A_Opaque_BlitRow32_{arm,neon}
330fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kOpaque_SourceAlpha, kN32_SkColorType); )
331fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kTransparent_SourceAlpha, kN32_SkColorType); )
332fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kTwoStripes_SourceAlpha, kN32_SkColorType); )
333fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kThreeStripes_SourceAlpha, kN32_SkColorType); )
334