1cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com
2cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com/*
3cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com * Copyright 2011 Google Inc.
4cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com *
5cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com * Use of this source code is governed by a BSD-style license that can be
6cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com * found in the LICENSE file.
7cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com */
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
9cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com#include "SkCanvas.h"
10cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com#include "SkColorShader.h"
11cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com#include "SkFontHost.h"
12cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com#include "SkPaint.h"
13cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com#include "SkRandom.h"
14cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com#include "SkString.h"
15cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com#include "SkTemplates.h"
16cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com
17cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com#define STR     "Hamburgefons"
18cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com
19cc586511839400941420160b1ef2bf19a7f7f2dereed@google.comenum FontQuality {
20cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    kBW,
21cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    kAA,
22cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    kLCD
23cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com};
24cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com
25cc586511839400941420160b1ef2bf19a7f7f2dereed@google.comstatic const char* fontQualityName(const SkPaint& paint) {
26cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    if (!paint.isAntiAlias()) {
27cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        return "BW";
28cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    }
29cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    if (paint.isLCDRenderText()) {
30cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        return "LCD";
31cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    }
32cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    return "AA";
33cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com}
34cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com
35f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ShaderMaskBench : public Benchmark {
36cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    SkPaint     fPaint;
37cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    SkString    fText;
38cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    SkString    fName;
39cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    FontQuality fFQ;
40cc586511839400941420160b1ef2bf19a7f7f2dereed@google.compublic:
41410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ShaderMaskBench(bool isOpaque, FontQuality fq)  {
42cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        fFQ = fq;
43cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        fText.set(STR);
44cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com
45cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        fPaint.setAntiAlias(kBW != fq);
46cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        fPaint.setLCDRenderText(kLCD == fq);
4776a3b2abd02841c4ae786ac4cf59c3a51c545f73commit-bot@chromium.org        fPaint.setShader(new SkColorShader(isOpaque ? 0xFFFFFFFF : 0x80808080))->unref();
48cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    }
49cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com
50cc586511839400941420160b1ef2bf19a7f7f2dereed@google.comprotected:
51cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    virtual const char* onGetName() {
528afae61a57f87e4a50578effce6c428031499301tomhudson@google.com        fName.printf("shadermask");
53cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        fName.appendf("_%s", fontQualityName(fPaint));
54cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        fName.appendf("_%02X", fPaint.getAlpha());
55cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        return fName.c_str();
56cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    }
57cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com
583361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) {
59cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        const SkIPoint dim = this->getSize();
60e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
61cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com
62cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        SkPaint paint(fPaint);
63cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        this->setupPaint(&paint);
64cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        // explicitly need these
65cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        paint.setAlpha(fPaint.getAlpha());
66cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        paint.setAntiAlias(kBW != fFQ);
67cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        paint.setLCDRenderText(kLCD == fFQ);
68cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com
69cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        const SkScalar x0 = SkIntToScalar(-10);
70cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        const SkScalar y0 = SkIntToScalar(-10);
71fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
72cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        paint.setTextSize(SkIntToScalar(12));
733361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
74cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com            SkScalar x = x0 + rand.nextUScalar1() * dim.fX;
75cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com            SkScalar y = y0 + rand.nextUScalar1() * dim.fY;
76cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com            canvas->drawText(fText.c_str(), fText.size(), x, y, paint);
77cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        }
78fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
79cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        paint.setTextSize(SkIntToScalar(48));
803361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops / 4 ; i++) {
81cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com            SkScalar x = x0 + rand.nextUScalar1() * dim.fX;
82cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com            SkScalar y = y0 + rand.nextUScalar1() * dim.fY;
83cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com            canvas->drawText(fText.c_str(), fText.size(), x, y, paint);
84cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com        }
85cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com    }
86cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com
87cc586511839400941420160b1ef2bf19a7f7f2dereed@google.comprivate:
88f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
89cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com};
90cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com
91cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com///////////////////////////////////////////////////////////////////////////////
92cc586511839400941420160b1ef2bf19a7f7f2dereed@google.com
93410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ShaderMaskBench(true,  kBW); )
94410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ShaderMaskBench(false, kBW); )
95410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ShaderMaskBench(true,  kAA); )
96410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ShaderMaskBench(false, kAA); )
97410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ShaderMaskBench(true,  kLCD); )
98410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ShaderMaskBench(false, kLCD); )
99