• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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