180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBenchmark.h"
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBitmap.h"
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPaint.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkCanvas.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkColorPriv.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkRandom.h"
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* gConfigName[] = {
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    "ERROR", "a1", "a8", "index8", "565", "4444", "8888"
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic int conv6ToByte(int x) {
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return x * 0xFF / 5;
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic int convByteTo6(int x) {
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return x * 5 / 255;
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint8_t compute666Index(SkPMColor c) {
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int r = SkGetPackedR32(c);
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int g = SkGetPackedG32(c);
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int b = SkGetPackedB32(c);
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return convByteTo6(r) * 36 + convByteTo6(g) * 6 + convByteTo6(b);
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void convertToIndex666(const SkBitmap& src, SkBitmap* dst) {
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkColorTable* ctable = new SkColorTable(216);
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPMColor* colors = ctable->lockColors();
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // rrr ggg bbb
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (int r = 0; r < 6; r++) {
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        int rr = conv6ToByte(r);
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (int g = 0; g < 6; g++) {
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            int gg = conv6ToByte(g);
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            for (int b = 0; b < 6; b++) {
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                int bb = conv6ToByte(b);
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                *colors++ = SkPreMultiplyARGB(0xFF, rr, gg, bb);
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    ctable->unlockColors(true);
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dst->setConfig(SkBitmap::kIndex8_Config, src.width(), src.height());
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dst->allocPixels(ctable);
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    ctable->unref();
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAutoLockPixels alps(src);
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAutoLockPixels alpd(*dst);
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (int y = 0; y < src.height(); y++) {
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const SkPMColor* srcP = src.getAddr32(0, y);
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        uint8_t* dstP = dst->getAddr8(0, y);
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (int x = src.width() - 1; x >= 0; --x) {
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            *dstP++ = compute666Index(*srcP++);
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*  Variants for bitmaps
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    - src depth (32 w+w/o alpha), 565, 4444, index, a8
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    - paint options: filtering, dither, alpha
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    - matrix options: translate, scale, rotate, persp
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    - tiling: none, repeat, mirror, clamp
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass BitmapBench : public SkBenchmark {
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBitmap    fBitmap;
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPaint     fPaint;
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool        fIsOpaque;
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool        fForceUpdate; //bitmap marked as dirty before each draw. forces bitmap to be updated on device cache
817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    bool        fIsVolatile;
827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkBitmap::Config fConfig;
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString    fName;
8458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    enum { BICUBIC_DUR_SCALE = 20 };
8558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    enum { N = SkBENCHLOOP(15 * BICUBIC_DUR_SCALE) };
867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    enum { W = 128 };
877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    enum { H = 128 };
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    BitmapBench(void* param, bool isOpaque, SkBitmap::Config c,
9058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                bool forceUpdate = false, bool bitmapVolatile = false)
917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        : INHERITED(param)
927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        , fIsOpaque(isOpaque)
937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        , fForceUpdate(forceUpdate)
947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        , fIsVolatile(bitmapVolatile)
957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        , fConfig(c) {
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual const char* onGetName() {
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fName.set("bitmap");
1017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fName.appendf("_%s%s", gConfigName[fConfig],
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                      fIsOpaque ? "" : "_A");
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (fForceUpdate)
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fName.append("_update");
1057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (fIsVolatile)
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fName.append("_volatile");
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return fName.c_str();
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual void onPreDraw() {
1127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkBitmap bm;
1137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (SkBitmap::kIndex8_Config == fConfig) {
1157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            bm.setConfig(SkBitmap::kARGB_8888_Config, W, H);
1167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        } else {
1177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            bm.setConfig(fConfig, W, H);
1187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        bm.allocPixels();
1217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        bm.eraseColor(fIsOpaque ? SK_ColorBLACK : 0);
1227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        onDrawIntoBitmap(bm);
1247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (SkBitmap::kIndex8_Config == fConfig) {
1267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            convertToIndex666(bm, &fBitmap);
1277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        } else {
1287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fBitmap = bm;
1297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (fBitmap.getColorTable()) {
1327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fBitmap.getColorTable()->setIsOpaque(fIsOpaque);
1337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fBitmap.setIsOpaque(fIsOpaque);
1357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fBitmap.setIsVolatile(fIsVolatile);
1367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onDraw(SkCanvas* canvas) {
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkIPoint dim = this->getSize();
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkRandom rand;
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkPaint paint(fPaint);
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->setupPaint(&paint);
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const SkBitmap& bitmap = fBitmap;
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const SkScalar x0 = SkIntToScalar(-bitmap.width() / 2);
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const SkScalar y0 = SkIntToScalar(-bitmap.height() / 2);
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        int count = N;
15058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#ifdef SK_RELEASE
15158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        // in DEBUG, N is always 1
15258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (SkPaint::kHigh_FilterLevel == paint.getFilterLevel()) {
15358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            count /= BICUBIC_DUR_SCALE;
15458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        }
15558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#endif
15658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        for (int i = 0; i < count; i++) {
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkScalar x = x0 + rand.nextUScalar1() * dim.fX;
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkScalar y = y0 + rand.nextUScalar1() * dim.fY;
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (fForceUpdate)
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                bitmap.notifyPixelsChanged();
16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            canvas->drawBitmap(bitmap, x, y, &paint);
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual float onGetDurationScale() SK_OVERRIDE {
16858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        SkPaint paint;
16958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        this->setupPaint(&paint);
17058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#ifdef SK_DEBUG
17158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        return 1;
17258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#else
17358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        return SkPaint::kHigh_FilterLevel == paint.getFilterLevel() ?
17458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                (float)BICUBIC_DUR_SCALE : 1;
17558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#endif
17658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
17758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
1787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual void onDrawIntoBitmap(const SkBitmap& bm) {
1797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        const int w = bm.width();
1807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        const int h = bm.height();
1817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkCanvas canvas(bm);
1837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint p;
1847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        p.setAntiAlias(true);
1857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        p.setColor(SK_ColorRED);
1867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        canvas.drawCircle(SkIntToScalar(w)/2, SkIntToScalar(h)/2,
1877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                          SkIntToScalar(SkMin32(w, h))*3/8, p);
1887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkRect r;
1907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
1917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        p.setStyle(SkPaint::kStroke_Style);
1927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        p.setStrokeWidth(SkIntToScalar(4));
1937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        p.setColor(SK_ColorBLUE);
1947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        canvas.drawRect(r, p);
1957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkBenchmark INHERITED;
19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Explicitly invoke some filter types to improve coverage of acceleration
20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    procs. */
20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
20458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerenum Flags {
20558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    kScale_Flag             = 1 << 0,
20658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    kRotate_Flag            = 1 << 1,
20758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    kBilerp_Flag            = 1 << 2,
20858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    kBicubic_Flag           = 1 << 3,
20958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger};
21058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
21158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic bool isBilerp(uint32_t flags) {
21258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    return (flags & (kBilerp_Flag | kBicubic_Flag)) == (kBilerp_Flag);
21358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
21458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
21558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic bool isBicubic(uint32_t flags) {
21658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    return (flags & (kBilerp_Flag | kBicubic_Flag)) == (kBilerp_Flag | kBicubic_Flag);
21758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
21858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass FilterBitmapBench : public BitmapBench {
22058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    uint32_t    fFlags;
22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString    fFullName;
22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    enum { N = SkBENCHLOOP(300) };
22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    FilterBitmapBench(void* param, bool isOpaque, SkBitmap::Config c,
22558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                      bool forceUpdate, bool isVolitile, uint32_t flags)
22658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        : INHERITED(param, isOpaque, c, forceUpdate, isVolitile)
22758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        , fFlags(flags) {
22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual const char* onGetName() {
23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fFullName.set(INHERITED::onGetName());
23358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (fFlags & kScale_Flag) {
23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fFullName.append("_scale");
23558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        }
23658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (fFlags & kRotate_Flag) {
23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fFullName.append("_rotate");
23858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        }
23958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (isBilerp(fFlags)) {
24058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            fFullName.append("_bilerp");
24158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        } else if (isBicubic(fFlags)) {
24258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            fFullName.append("_bicubic");
24358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        }
24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return fFullName.c_str();
24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onDraw(SkCanvas* canvas) {
24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkISize dim = canvas->getDeviceSize();
25058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (fFlags & kScale_Flag) {
25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            const SkScalar x = SkIntToScalar(dim.fWidth) / 2;
25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            const SkScalar y = SkIntToScalar(dim.fHeight) / 2;
25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            canvas->translate(x, y);
25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            // just enough so we can't take the sprite case
25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            canvas->scale(SK_Scalar1 * 99/100, SK_Scalar1 * 99/100);
25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            canvas->translate(-x, -y);
25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
25958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (fFlags & kRotate_Flag) {
26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            const SkScalar x = SkIntToScalar(dim.fWidth) / 2;
26180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            const SkScalar y = SkIntToScalar(dim.fHeight) / 2;
26280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            canvas->translate(x, y);
26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            canvas->rotate(SkIntToScalar(35));
26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            canvas->translate(-x, -y);
26680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        INHERITED::onDraw(canvas);
26880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
26980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
27058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual void setupPaint(SkPaint* paint) SK_OVERRIDE {
27158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        this->INHERITED::setupPaint(paint);
27258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
27358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        int index = 0;
27458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (fFlags & kBilerp_Flag) {
27558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            index |= 1;
27658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        }
27758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (fFlags & kBicubic_Flag) {
27858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            index |= 2;
27958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        }
28058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        static const SkPaint::FilterLevel gLevels[] = {
28158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            SkPaint::kNone_FilterLevel,
28258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            SkPaint::kLow_FilterLevel,
28358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            SkPaint::kMedium_FilterLevel,
28458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            SkPaint::kHigh_FilterLevel
28558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        };
28658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        paint->setFilterLevel(gLevels[index]);
28758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
28858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
28980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
29080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef BitmapBench INHERITED;
29180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
29280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/** Verify optimizations that test source alpha values. */
2947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass SourceAlphaBitmapBench : public BitmapBench {
2967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
2977839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    enum SourceAlpha { kOpaque_SourceAlpha, kTransparent_SourceAlpha,
2987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                       kTwoStripes_SourceAlpha, kThreeStripes_SourceAlpha};
2997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
3007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkString    fFullName;
3017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SourceAlpha fSourceAlpha;
3027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
3037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SourceAlphaBitmapBench(void* param, SourceAlpha alpha, SkBitmap::Config c,
30458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                bool forceUpdate = false, bool bitmapVolatile = false)
30558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        : INHERITED(param, false, c, forceUpdate, bitmapVolatile)
3067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        , fSourceAlpha(alpha) {
3077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
3087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprotected:
3107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual const char* onGetName() {
3117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fFullName.set(INHERITED::onGetName());
3127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (fSourceAlpha == kOpaque_SourceAlpha) {
3147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                fFullName.append("_source_opaque");
3157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        } else if (fSourceAlpha == kTransparent_SourceAlpha) {
3167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                fFullName.append("_source_transparent");
3177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        } else if (fSourceAlpha == kTwoStripes_SourceAlpha) {
3187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                fFullName.append("_source_stripes_two");
3197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        } else if (fSourceAlpha == kThreeStripes_SourceAlpha) {
3207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                fFullName.append("_source_stripes_three");
3217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
3227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return fFullName.c_str();
3247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
3257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual void onDrawIntoBitmap(const SkBitmap& bm) SK_OVERRIDE {
3277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        const int w = bm.width();
3287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        const int h = bm.height();
3297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (kOpaque_SourceAlpha == fSourceAlpha) {
3317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            bm.eraseColor(SK_ColorBLACK);
3327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        } else if (kTransparent_SourceAlpha == fSourceAlpha) {
3337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            bm.eraseColor(0);
3347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        } else if (kTwoStripes_SourceAlpha == fSourceAlpha) {
3357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            bm.eraseColor(0);
3367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkCanvas canvas(bm);
3387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkPaint p;
3397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            p.setAntiAlias(false);
3407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            p.setStyle(SkPaint::kFill_Style);
3417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            p.setColor(SK_ColorRED);
3427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            // Draw red vertical stripes on transparent background
3447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkRect r;
3457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            for (int x = 0; x < w; x+=2)
3467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            {
3477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                r.set(SkIntToScalar(x), 0, SkIntToScalar(x+1), SkIntToScalar(h));
3487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                canvas.drawRect(r, p);
3497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            }
3507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        } else if (kThreeStripes_SourceAlpha == fSourceAlpha) {
3527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            bm.eraseColor(0);
3537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkCanvas canvas(bm);
3557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkPaint p;
3567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            p.setAntiAlias(false);
3577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            p.setStyle(SkPaint::kFill_Style);
3587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            // Draw vertical stripes on transparent background with a pattern
3607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            // where the first pixel is fully transparent, the next is semi-transparent
3617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            // and the third is fully opaque.
3627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkRect r;
3637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            for (int x = 0; x < w; x++)
3647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            {
3657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                if (x % 3 == 0) {
3667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                    continue; // Keep transparent
3677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                } else if (x % 3 == 1) {
3687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                    p.setColor(SkColorSetARGB(127, 127, 127, 127)); // Semi-transparent
3697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                } else if (x % 3 == 2) {
3707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                    p.setColor(SK_ColorRED); // Opaque
3717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                }
3727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                r.set(SkIntToScalar(x), 0, SkIntToScalar(x+1), SkIntToScalar(h));
3737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                canvas.drawRect(r, p);
3747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            }
3757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
3767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
3777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
3797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    typedef BitmapBench INHERITED;
3807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
38158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
38258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new BitmapBench(p, false, SkBitmap::kARGB_8888_Config); )
38358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new BitmapBench(p, true, SkBitmap::kARGB_8888_Config); )
38458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new BitmapBench(p, true, SkBitmap::kRGB_565_Config); )
38558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new BitmapBench(p, false, SkBitmap::kIndex8_Config); )
38658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new BitmapBench(p, true, SkBitmap::kIndex8_Config); )
38758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new BitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, true); )
38858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new BitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, false); )
38980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
39080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// scale filter -> S32_opaque_D32_filter_DX_{SSE2,SSSE3} and Fact9 is also for S32_D16_filter_DX_SSE2
39158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, false, false, kScale_Flag | kBilerp_Flag); )
39258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, false, false, kScale_Flag | kBilerp_Flag); )
39358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, true, kScale_Flag | kBilerp_Flag); )
39458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, false, kScale_Flag | kBilerp_Flag); )
39580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
39680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// scale rotate filter -> S32_opaque_D32_filter_DXDY_{SSE2,SSSE3}
39758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, false, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
39858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, false, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
39958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, true, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
40058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new FilterBitmapBench(p, true, SkBitmap::kARGB_8888_Config, true, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); )
40158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
40258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, false, false, kScale_Flag | kBilerp_Flag | kBicubic_Flag); )
40358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new FilterBitmapBench(p, false, SkBitmap::kARGB_8888_Config, false, false, kScale_Flag | kRotate_Flag | kBilerp_Flag | kBicubic_Flag); )
40480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// source alpha tests -> S32A_Opaque_BlitRow32_{arm,neon}
40658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kOpaque_SourceAlpha, SkBitmap::kARGB_8888_Config); )
40758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kTransparent_SourceAlpha, SkBitmap::kARGB_8888_Config); )
40858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kTwoStripes_SourceAlpha, SkBitmap::kARGB_8888_Config); )
40958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEF_BENCH( return new SourceAlphaBitmapBench(p, SourceAlphaBitmapBench::kThreeStripes_SourceAlpha, SkBitmap::kARGB_8888_Config); )
410