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
19enum FontQuality {
20    kBW,
21    kAA,
22    kLCD
23};
24
25static 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
35class ShaderMaskBench : public Benchmark {
36    SkPaint     fPaint;
37    SkString    fText;
38    SkString    fName;
39    FontQuality fFQ;
40public:
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
50protected:
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
87private:
88    typedef Benchmark INHERITED;
89};
90
91///////////////////////////////////////////////////////////////////////////////
92
93DEF_BENCH( return new ShaderMaskBench(true,  kBW); )
94DEF_BENCH( return new ShaderMaskBench(false, kBW); )
95DEF_BENCH( return new ShaderMaskBench(true,  kAA); )
96DEF_BENCH( return new ShaderMaskBench(false, kAA); )
97DEF_BENCH( return new ShaderMaskBench(true,  kLCD); )
98DEF_BENCH( return new ShaderMaskBench(false, kLCD); )
99