18e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
28e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com/*
38e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com * Copyright 2013 Google Inc.
48e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com *
58e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com * Use of this source code is governed by a BSD-style license that can be
68e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com * found in the LICENSE file.
78e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com */
88e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
9f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
108e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com#include "SkBitmap.h"
118e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com#include "SkCanvas.h"
128e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com#include "SkShader.h"
138e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com#include "SkString.h"
148e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
158e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.comstatic void create_gradient(SkBitmap* bm) {
168e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    SkASSERT(1 == bm->width());
178e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    const int height = bm->height();
188e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
198e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    float deltaB = 255.0f / height;
208e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    float blue = 255.0f;
218e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
228e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    SkAutoLockPixels lock(*bm);
238e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    for (int y = 0; y < height; y++) {
248e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        *bm->getAddr32(0, y) = SkColorSetRGB(0, 0, (U8CPU) blue);
258e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        blue -= deltaB;
268e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    }
278e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com}
288e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
298e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com// Test out the special case of a tiled 1xN texture. Test out opacity,
308e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com// filtering and the different tiling modes
31f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConstXTileBench : public Benchmark {
328e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    SkPaint             fPaint;
338e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    SkString            fName;
348e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    bool                fDoFilter;
358e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    bool                fDoTrans;
361e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com    bool                fDoScale;
378e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    static const int kWidth = 1;
388e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    static const int kHeight = 300;
398e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
408e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.compublic:
41410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConstXTileBench(SkShader::TileMode xTile,
428e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com                    SkShader::TileMode yTile,
438e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com                    bool doFilter,
441e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com                    bool doTrans,
451e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com                    bool doScale)
46410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com        : fDoFilter(doFilter)
471e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com        , fDoTrans(doTrans)
481e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com        , fDoScale(doScale) {
498e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        SkBitmap bm;
508e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
516c22573edb234ad14df947278cfed010669a39a7reed        bm.allocN32Pixels(kWidth, kHeight, true);
528e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        bm.eraseColor(SK_ColorWHITE);
538e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
548e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        create_gradient(&bm);
558e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
568e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        SkShader* s = SkShader::CreateBitmapShader(bm, xTile, yTile);
578e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        fPaint.setShader(s)->unref();
588e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
598e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        fName.printf("constXTile_");
608e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
618e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        static const char* gTileModeStr[SkShader::kTileModeCount] = { "C", "R", "M" };
628e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        fName.append(gTileModeStr[xTile]);
638e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        fName.append(gTileModeStr[yTile]);
648e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
658e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        if (doFilter) {
668e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com            fName.append("_filter");
678e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        }
688e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
698e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        if (doTrans) {
708e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com            fName.append("_trans");
718e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        }
721e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com
731e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com        if (doScale) {
741e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com            fName.append("_scale");
751e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com        }
768e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    }
778e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
788e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.comprotected:
798e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    virtual const char* onGetName() {
808e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        return fName.c_str();
818e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    }
828e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
833361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) {
848e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        SkPaint paint(fPaint);
858e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        this->setupPaint(&paint);
864469938e92d779dff05e745559e67907bbf21e78reed@google.com        paint.setFilterLevel(fDoFilter ? SkPaint::kLow_FilterLevel
874469938e92d779dff05e745559e67907bbf21e78reed@google.com                                       : SkPaint::kNone_FilterLevel);
888e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        if (fDoTrans) {
898e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com            paint.setColor(SkColorSetARGBMacro(0x80, 0xFF, 0xFF, 0xFF));
908e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        }
918e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
928e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        SkRect r;
938e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
941e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com        if (fDoScale) {
958e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com            r = SkRect::MakeWH(SkIntToScalar(2 * 640), SkIntToScalar(2 * 480));
968e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com            canvas->scale(SK_ScalarHalf, SK_ScalarHalf);
978e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        } else {
988e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com            r = SkRect::MakeWH(SkIntToScalar(640), SkIntToScalar(480));
998e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        }
1008e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
1018e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        SkPaint bgPaint;
1028e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        bgPaint.setColor(SK_ColorWHITE);
1038e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
1043361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
1058e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com            if (fDoTrans) {
1068e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com                canvas->drawRect(r, bgPaint);
1078e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com            }
1088e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
1098e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com            canvas->drawRect(r, paint);
1108e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com        }
1118e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com    }
1128e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
1138e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.comprivate:
114f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
1158e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com};
1168e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
117474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein// Scaled benches are trending towards free.  Seems like caching.
118474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein// TODO(mtklein, reed): fix and reenable
119474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein
120474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein//DEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, false, false, true))
121410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, false, false, false))
122474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein//DEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, false, false, true))
1238e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
124410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, true, false, false))
125474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein//DEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, true, false, true))
126410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, true, false, false))
1278e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
128474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein//DEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, false, true, true))
129410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, false, true, false))
130474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein//DEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, false, true, true))
1318e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com
132410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, true, true, false))
133474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein//DEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, true, true, true))
134410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, true, true, false))
135