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