Home | History | Annotate | Download | only in bench
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 #include "Benchmark.h"
      9 #include "SkCanvas.h"
     10 #include "SkColorShader.h"
     11 #include "SkFontHost.h"
     12 #include "SkPaint.h"
     13 #include "SkRandom.h"
     14 #include "SkString.h"
     15 #include "SkTemplates.h"
     16 
     17 #define STR     "Hamburgefons"
     18 
     19 enum FontQuality {
     20     kBW,
     21     kAA,
     22     kLCD
     23 };
     24 
     25 static const char* fontQualityName(const SkPaint& paint) {
     26     if (!paint.isAntiAlias()) {
     27         return "BW";
     28     }
     29     if (paint.isLCDRenderText()) {
     30         return "LCD";
     31     }
     32     return "AA";
     33 }
     34 
     35 class ShaderMaskBench : public Benchmark {
     36     SkPaint     fPaint;
     37     SkString    fText;
     38     SkString    fName;
     39     FontQuality fFQ;
     40 public:
     41     ShaderMaskBench(bool isOpaque, FontQuality fq)  {
     42         fFQ = fq;
     43         fText.set(STR);
     44 
     45         fPaint.setAntiAlias(kBW != fq);
     46         fPaint.setLCDRenderText(kLCD == fq);
     47         fPaint.setShader(new SkColorShader(isOpaque ? 0xFFFFFFFF : 0x80808080))->unref();
     48     }
     49 
     50 protected:
     51     virtual const char* onGetName() {
     52         fName.printf("shadermask");
     53         fName.appendf("_%s", fontQualityName(fPaint));
     54         fName.appendf("_%02X", fPaint.getAlpha());
     55         return fName.c_str();
     56     }
     57 
     58     virtual void onDraw(const int loops, SkCanvas* canvas) {
     59         const SkIPoint dim = this->getSize();
     60         SkRandom rand;
     61 
     62         SkPaint paint(fPaint);
     63         this->setupPaint(&paint);
     64         // explicitly need these
     65         paint.setAlpha(fPaint.getAlpha());
     66         paint.setAntiAlias(kBW != fFQ);
     67         paint.setLCDRenderText(kLCD == fFQ);
     68 
     69         const SkScalar x0 = SkIntToScalar(-10);
     70         const SkScalar y0 = SkIntToScalar(-10);
     71 
     72         paint.setTextSize(SkIntToScalar(12));
     73         for (int i = 0; i < loops; i++) {
     74             SkScalar x = x0 + rand.nextUScalar1() * dim.fX;
     75             SkScalar y = y0 + rand.nextUScalar1() * dim.fY;
     76             canvas->drawText(fText.c_str(), fText.size(), x, y, paint);
     77         }
     78 
     79         paint.setTextSize(SkIntToScalar(48));
     80         for (int i = 0; i < loops / 4 ; i++) {
     81             SkScalar x = x0 + rand.nextUScalar1() * dim.fX;
     82             SkScalar y = y0 + rand.nextUScalar1() * dim.fY;
     83             canvas->drawText(fText.c_str(), fText.size(), x, y, paint);
     84         }
     85     }
     86 
     87 private:
     88     typedef Benchmark INHERITED;
     89 };
     90 
     91 ///////////////////////////////////////////////////////////////////////////////
     92 
     93 DEF_BENCH( return new ShaderMaskBench(true,  kBW); )
     94 DEF_BENCH( return new ShaderMaskBench(false, kBW); )
     95 DEF_BENCH( return new ShaderMaskBench(true,  kAA); )
     96 DEF_BENCH( return new ShaderMaskBench(false, kAA); )
     97 DEF_BENCH( return new ShaderMaskBench(true,  kLCD); )
     98 DEF_BENCH( return new ShaderMaskBench(false, kLCD); )
     99