Home | History | Annotate | Download | only in bench
      1 /*
      2  * Copyright 2013 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 
      8 #include "Benchmark.h"
      9 #include "SkBitmap.h"
     10 #include "SkCanvas.h"
     11 #include "SkShader.h"
     12 #include "SkString.h"
     13 
     14 static void create_gradient(SkBitmap* bm) {
     15     SkASSERT(1 == bm->width());
     16     const int height = bm->height();
     17 
     18     float deltaB = 255.0f / height;
     19     float blue = 255.0f;
     20 
     21     SkAutoLockPixels lock(*bm);
     22     for (int y = 0; y < height; y++) {
     23         *bm->getAddr32(0, y) = SkColorSetRGB(0, 0, (U8CPU) blue);
     24         blue -= deltaB;
     25     }
     26 }
     27 
     28 // Test out the special case of a tiled 1xN texture. Test out opacity,
     29 // filtering and the different tiling modes
     30 class ConstXTileBench : public Benchmark {
     31     SkPaint             fPaint;
     32     SkString            fName;
     33     bool                fDoFilter;
     34     bool                fDoTrans;
     35     bool                fDoScale;
     36     static const int kWidth = 1;
     37     static const int kHeight = 300;
     38 
     39 public:
     40     ConstXTileBench(SkShader::TileMode xTile,
     41                     SkShader::TileMode yTile,
     42                     bool doFilter,
     43                     bool doTrans,
     44                     bool doScale)
     45         : fDoFilter(doFilter)
     46         , fDoTrans(doTrans)
     47         , fDoScale(doScale) {
     48         SkBitmap bm;
     49 
     50         bm.allocN32Pixels(kWidth, kHeight, true);
     51         bm.eraseColor(SK_ColorWHITE);
     52 
     53         create_gradient(&bm);
     54 
     55         fPaint.setShader(SkShader::MakeBitmapShader(bm, xTile, yTile));
     56 
     57         fName.printf("constXTile_");
     58 
     59         static const char* gTileModeStr[SkShader::kTileModeCount] = { "C", "R", "M" };
     60         fName.append(gTileModeStr[xTile]);
     61         fName.append(gTileModeStr[yTile]);
     62 
     63         if (doFilter) {
     64             fName.append("_filter");
     65         }
     66 
     67         if (doTrans) {
     68             fName.append("_trans");
     69         }
     70 
     71         if (doScale) {
     72             fName.append("_scale");
     73         }
     74     }
     75 
     76 protected:
     77     virtual const char* onGetName() {
     78         return fName.c_str();
     79     }
     80 
     81     virtual void onDraw(int loops, SkCanvas* canvas) {
     82         SkPaint paint(fPaint);
     83         this->setupPaint(&paint);
     84         paint.setFilterQuality(fDoFilter ? kLow_SkFilterQuality
     85                                          : kNone_SkFilterQuality);
     86         if (fDoTrans) {
     87             paint.setColor(SkColorSetARGBMacro(0x80, 0xFF, 0xFF, 0xFF));
     88         }
     89 
     90         SkRect r;
     91 
     92         if (fDoScale) {
     93             r = SkRect::MakeWH(SkIntToScalar(2 * 640), SkIntToScalar(2 * 480));
     94             canvas->scale(SK_ScalarHalf, SK_ScalarHalf);
     95         } else {
     96             r = SkRect::MakeWH(SkIntToScalar(640), SkIntToScalar(480));
     97         }
     98 
     99         SkPaint bgPaint;
    100         bgPaint.setColor(SK_ColorWHITE);
    101 
    102         for (int i = 0; i < loops; i++) {
    103             if (fDoTrans) {
    104                 canvas->drawRect(r, bgPaint);
    105             }
    106 
    107             canvas->drawRect(r, paint);
    108         }
    109     }
    110 
    111 private:
    112     typedef Benchmark INHERITED;
    113 };
    114 
    115 // Scaled benches are trending towards free.  Seems like caching.
    116 // TODO(mtklein, reed): fix and reenable
    117 
    118 //DEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, false, false, true))
    119 DEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, false, false, false))
    120 //DEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, false, false, true))
    121 
    122 DEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, true, false, false))
    123 //DEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, true, false, true))
    124 DEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, true, false, false))
    125 
    126 //DEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, false, true, true))
    127 DEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, false, true, false))
    128 //DEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, false, true, true))
    129 
    130 DEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, true, true, false))
    131 //DEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, true, true, true))
    132 DEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, true, true, false))
    133