1 /*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "Benchmark.h"
9 #include "SkCanvas.h"
10 #include "SkFont.h"
11 #include "SkTypeface.h"
12
13 enum {
14 NGLYPHS = 100
15 };
16
17 typedef void (*TypefaceProc)(int loops, const SkFont&, const void* text, size_t len,
18 int glyphCount);
19
textToGlyphs_proc(int loops,const SkFont & font,const void * text,size_t len,int glyphCount)20 static void textToGlyphs_proc(int loops, const SkFont& font, const void* text, size_t len,
21 int glyphCount) {
22 uint16_t glyphs[NGLYPHS];
23 SkASSERT(glyphCount <= NGLYPHS);
24
25 for (int i = 0; i < loops; ++i) {
26 font.textToGlyphs(text, len, kUTF8_SkTextEncoding, glyphs, NGLYPHS);
27 }
28 }
29
charsToGlyphs_proc(int loops,const SkFont & font,const void * text,size_t len,int glyphCount)30 static void charsToGlyphs_proc(int loops, const SkFont& font, const void* text,
31 size_t len, int glyphCount) {
32 uint16_t glyphs[NGLYPHS];
33 SkASSERT(glyphCount <= NGLYPHS);
34
35 SkTypeface* face = font.getTypefaceOrDefault();
36 for (int i = 0; i < loops; ++i) {
37 face->charsToGlyphs(text, SkTypeface::kUTF8_Encoding, glyphs, glyphCount);
38 }
39 }
40
charsToGlyphsNull_proc(int loops,const SkFont & font,const void * text,size_t len,int glyphCount)41 static void charsToGlyphsNull_proc(int loops, const SkFont& font, const void* text,
42 size_t len, int glyphCount) {
43 SkTypeface* face = font.getTypefaceOrDefault();
44 for (int i = 0; i < loops; ++i) {
45 face->charsToGlyphs(text, SkTypeface::kUTF8_Encoding, nullptr, glyphCount);
46 }
47 }
48
49 class CMAPBench : public Benchmark {
50 TypefaceProc fProc;
51 SkString fName;
52 char fText[NGLYPHS];
53 SkFont fFont;
54
55 public:
CMAPBench(TypefaceProc proc,const char name[])56 CMAPBench(TypefaceProc proc, const char name[]) {
57 fProc = proc;
58 fName.printf("cmap_%s", name);
59
60 for (int i = 0; i < NGLYPHS; ++i) {
61 // we're jamming values into utf8, so we must keep it legal utf8
62 fText[i] = 'A' + (i & 31);
63 }
64 fFont.setTypeface(SkTypeface::MakeDefault());
65 }
66
67 protected:
onGetName()68 const char* onGetName() override {
69 return fName.c_str();
70 }
71
onDraw(int loops,SkCanvas * canvas)72 void onDraw(int loops, SkCanvas* canvas) override {
73 fProc(loops, fFont, fText, sizeof(fText), NGLYPHS);
74 }
75
76 private:
77
78 typedef Benchmark INHERITED;
79 };
80
81 //////////////////////////////////////////////////////////////////////////////
82
83 DEF_BENCH( return new CMAPBench(textToGlyphs_proc, "paint_textToGlyphs"); )
84 DEF_BENCH( return new CMAPBench(charsToGlyphs_proc, "face_charsToGlyphs"); )
85 DEF_BENCH( return new CMAPBench(charsToGlyphsNull_proc, "face_charsToGlyphs_null"); )
86