• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "SkBenchmark.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 
fontQualityName(const SkPaint & paint)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 SkBenchmark {
36     SkPaint     fPaint;
37     SkString    fText;
38     SkString    fName;
39     FontQuality fFQ;
40 public:
ShaderMaskBench(bool isOpaque,FontQuality fq)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.setAlpha(isOpaque ? 0xFF : 0x80);
48         fPaint.setShader(new SkColorShader)->unref();
49     }
50 
51 protected:
onGetName()52     virtual const char* onGetName() {
53         fName.printf("shadermask");
54         fName.appendf("_%s", fontQualityName(fPaint));
55         fName.appendf("_%02X", fPaint.getAlpha());
56         return fName.c_str();
57     }
58 
onDraw(const int loops,SkCanvas * canvas)59     virtual void onDraw(const int loops, SkCanvas* canvas) {
60         const SkIPoint dim = this->getSize();
61         SkRandom rand;
62 
63         SkPaint paint(fPaint);
64         this->setupPaint(&paint);
65         // explicitly need these
66         paint.setAlpha(fPaint.getAlpha());
67         paint.setAntiAlias(kBW != fFQ);
68         paint.setLCDRenderText(kLCD == fFQ);
69 
70         const SkScalar x0 = SkIntToScalar(-10);
71         const SkScalar y0 = SkIntToScalar(-10);
72 
73         paint.setTextSize(SkIntToScalar(12));
74         for (int i = 0; i < loops; i++) {
75             SkScalar x = x0 + rand.nextUScalar1() * dim.fX;
76             SkScalar y = y0 + rand.nextUScalar1() * dim.fY;
77             canvas->drawText(fText.c_str(), fText.size(), x, y, paint);
78         }
79 
80         paint.setTextSize(SkIntToScalar(48));
81         for (int i = 0; i < loops / 4 ; i++) {
82             SkScalar x = x0 + rand.nextUScalar1() * dim.fX;
83             SkScalar y = y0 + rand.nextUScalar1() * dim.fY;
84             canvas->drawText(fText.c_str(), fText.size(), x, y, paint);
85         }
86     }
87 
88 private:
89     typedef SkBenchmark INHERITED;
90 };
91 
92 ///////////////////////////////////////////////////////////////////////////////
93 
94 DEF_BENCH( return new ShaderMaskBench(true,  kBW); )
95 DEF_BENCH( return new ShaderMaskBench(false, kBW); )
96 DEF_BENCH( return new ShaderMaskBench(true,  kAA); )
97 DEF_BENCH( return new ShaderMaskBench(false, kAA); )
98 DEF_BENCH( return new ShaderMaskBench(true,  kLCD); )
99 DEF_BENCH( return new ShaderMaskBench(false, kLCD); )
100