1bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com/*
2bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com * Copyright 2013 Google Inc.
3bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com *
4bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com * Use of this source code is governed by a BSD-style license that can be
5bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com * found in the LICENSE file.
6bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com */
7bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
9bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com#include "SkCanvas.h"
10bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com#include "SkPaint.h"
11bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com#include "SkTypeface.h"
12bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
13bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.comenum {
14bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    NGLYPHS = 100
15bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com};
16bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
17bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.comstatic SkTypeface::Encoding paint2Encoding(const SkPaint& paint) {
18bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkPaint::TextEncoding enc = paint.getTextEncoding();
19bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkASSERT(SkPaint::kGlyphID_TextEncoding != enc);
20bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    return (SkTypeface::Encoding)enc;
21bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com}
22bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
23c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.comtypedef void (*TypefaceProc)(int loops, const SkPaint&, const void* text, size_t len,
24bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com                             int glyphCount);
25bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
26c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.comstatic void containsText_proc(int loops, const SkPaint& paint, const void* text, size_t len,
27bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com                              int glyphCount) {
28c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    for (int i = 0; i < loops; ++i) {
29bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        paint.containsText(text, len);
30bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    }
31bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com}
32bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
33c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.comstatic void textToGlyphs_proc(int loops, const SkPaint& paint, const void* text, size_t len,
34bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com                              int glyphCount) {
35bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    uint16_t glyphs[NGLYPHS];
36bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkASSERT(glyphCount <= NGLYPHS);
37bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
38c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    for (int i = 0; i < loops; ++i) {
39bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        paint.textToGlyphs(text, len, glyphs);
40bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    }
41bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com}
42bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
43c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.comstatic void charsToGlyphs_proc(int loops, const SkPaint& paint, const void* text,
44bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com                               size_t len, int glyphCount) {
45bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkTypeface::Encoding encoding = paint2Encoding(paint);
46bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    uint16_t glyphs[NGLYPHS];
47bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkASSERT(glyphCount <= NGLYPHS);
4898a196770cc7b9914ad68367c5b06829a5e0b440skia.committer@gmail.com
49bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkTypeface* face = paint.getTypeface();
50c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    for (int i = 0; i < loops; ++i) {
51bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        face->charsToGlyphs(text, encoding, glyphs, glyphCount);
52bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    }
53bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com}
54bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
55c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.comstatic void charsToGlyphsNull_proc(int loops, const SkPaint& paint, const void* text,
56231129753cdbefbfa026d4c14b260aece973b4e9reed@google.com                                   size_t len, int glyphCount) {
57231129753cdbefbfa026d4c14b260aece973b4e9reed@google.com    SkTypeface::Encoding encoding = paint2Encoding(paint);
5898a196770cc7b9914ad68367c5b06829a5e0b440skia.committer@gmail.com
59231129753cdbefbfa026d4c14b260aece973b4e9reed@google.com    SkTypeface* face = paint.getTypeface();
60c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    for (int i = 0; i < loops; ++i) {
61231129753cdbefbfa026d4c14b260aece973b4e9reed@google.com        face->charsToGlyphs(text, encoding, NULL, glyphCount);
62231129753cdbefbfa026d4c14b260aece973b4e9reed@google.com    }
63231129753cdbefbfa026d4c14b260aece973b4e9reed@google.com}
64231129753cdbefbfa026d4c14b260aece973b4e9reed@google.com
65f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass CMAPBench : public Benchmark {
66bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    TypefaceProc fProc;
67bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkString     fName;
68bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    char         fText[NGLYPHS];
69bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkPaint      fPaint;
70bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
71bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.compublic:
72410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    CMAPBench(TypefaceProc proc, const char name[]) {
73bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        fProc = proc;
74bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        fName.printf("cmap_%s", name);
7598a196770cc7b9914ad68367c5b06829a5e0b440skia.committer@gmail.com
76bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        for (int i = 0; i < NGLYPHS; ++i) {
772d903aea532c7103ea0892f8f9d6ab44a2a2b754reed@google.com            // we're jamming values into utf8, so we must keep it legal utf8
782d903aea532c7103ea0892f8f9d6ab44a2a2b754reed@google.com            fText[i] = 'A' + (i & 31);
79bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        }
80bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        fPaint.setTypeface(SkTypeface::RefDefault())->unref();
81bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    }
82bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
83bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.comprotected:
8436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
85bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        return fName.c_str();
86bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    }
87bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
8836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas* canvas) override {
893361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        fProc(loops, fPaint, fText, sizeof(fText), NGLYPHS);
90bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    }
91bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
92bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.comprivate:
93bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
94f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
95bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com};
96bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
97bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com//////////////////////////////////////////////////////////////////////////////
98bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
99410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CMAPBench(containsText_proc, "paint_containsText"); )
100410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CMAPBench(textToGlyphs_proc, "paint_textToGlyphs"); )
101410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CMAPBench(charsToGlyphs_proc, "face_charsToGlyphs"); )
102410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CMAPBench(charsToGlyphsNull_proc, "face_charsToGlyphs_null"); )
103