• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 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 
9 #include "src/core/SkStrike.h"
10 
11 #include "bench/Benchmark.h"
12 #include "include/core/SkCanvas.h"
13 #include "include/core/SkGraphics.h"
14 #include "include/core/SkTypeface.h"
15 #include "src/core/SkStrikeCache.h"
16 #include "src/core/SkStrikeSpec.h"
17 #include "src/core/SkTaskGroup.h"
18 #include "tools/ToolUtils.h"
19 
do_font_stuff(SkFont * font)20 static void do_font_stuff(SkFont* font) {
21     SkPaint defaultPaint;
22     for (SkScalar i = 8; i < 64; i++) {
23         font->setSize(i);
24         auto strikeSpec = SkStrikeSpec::MakeMask(
25                 *font,  defaultPaint, SkSurfaceProps(0, kUnknown_SkPixelGeometry),
26                 SkScalerContextFlags::kNone, SkMatrix::I());
27         SkPackedGlyphID glyphs['z'];
28         for (int c = ' '; c < 'z'; c++) {
29             glyphs[c] = SkPackedGlyphID{font->unicharToGlyph(c)};
30         }
31         constexpr size_t glyphCount = 'z' - ' ';
32         SkSpan<const SkPackedGlyphID> glyphIDs{&glyphs[SkTo<int>(' ')], glyphCount};
33         SkBulkGlyphMetricsAndImages images{strikeSpec};
34         for (int lookups = 0; lookups < 10; lookups++) {
35             (void)images.glyphs(glyphIDs);
36         }
37     }
38 }
39 
40 class SkGlyphCacheBasic : public Benchmark {
41 public:
SkGlyphCacheBasic(size_t cacheSize)42     explicit SkGlyphCacheBasic(size_t cacheSize) : fCacheSize(cacheSize) { }
43 
44 protected:
onGetName()45     const char* onGetName() override {
46         fName.printf("SkGlyphCacheBasic%dK", (int)(fCacheSize >> 10));
47         return fName.c_str();
48     }
49 
isSuitableFor(Backend backend)50     bool isSuitableFor(Backend backend) override {
51         return backend == kNonRendering_Backend;
52     }
53 
onDraw(int loops,SkCanvas *)54     void onDraw(int loops, SkCanvas*) override {
55         size_t oldCacheLimitSize = SkGraphics::GetFontCacheLimit();
56         SkGraphics::SetFontCacheLimit(fCacheSize);
57         SkFont font;
58         font.setEdging(SkFont::Edging::kAntiAlias);
59         font.setSubpixel(true);
60         font.setTypeface(ToolUtils::create_portable_typeface("serif", SkFontStyle::Italic()));
61 
62         for (int work = 0; work < loops; work++) {
63             do_font_stuff(&font);
64         }
65         SkGraphics::SetFontCacheLimit(oldCacheLimitSize);
66     }
67 
68 private:
69     typedef Benchmark INHERITED;
70     const size_t fCacheSize;
71     SkString fName;
72 };
73 
74 class SkGlyphCacheStressTest : public Benchmark {
75 public:
SkGlyphCacheStressTest(int cacheSize)76     explicit SkGlyphCacheStressTest(int cacheSize) : fCacheSize(cacheSize) { }
77 
78 protected:
onGetName()79     const char* onGetName() override {
80         fName.printf("SkGlyphCacheStressTest%dK", (int)(fCacheSize >> 10));
81         return fName.c_str();
82     }
83 
isSuitableFor(Backend backend)84     bool isSuitableFor(Backend backend) override {
85         return backend == kNonRendering_Backend;
86     }
87 
onDraw(int loops,SkCanvas *)88     void onDraw(int loops, SkCanvas*) override {
89         size_t oldCacheLimitSize = SkGraphics::GetFontCacheLimit();
90         SkGraphics::SetFontCacheLimit(fCacheSize);
91         sk_sp<SkTypeface> typefaces[] = {
92                 ToolUtils::create_portable_typeface("serif", SkFontStyle::Italic()),
93                 ToolUtils::create_portable_typeface("sans-serif", SkFontStyle::Italic())};
94 
95         for (int work = 0; work < loops; work++) {
96             SkTaskGroup().batch(16, [&](int threadIndex) {
97                 SkFont font;
98                 font.setEdging(SkFont::Edging::kAntiAlias);
99                 font.setSubpixel(true);
100                 font.setTypeface(typefaces[threadIndex % 2]);
101                 do_font_stuff(&font);
102             });
103         }
104         SkGraphics::SetFontCacheLimit(oldCacheLimitSize);
105     }
106 
107 private:
108     typedef Benchmark INHERITED;
109     const size_t fCacheSize;
110     SkString fName;
111 };
112 
113 DEF_BENCH( return new SkGlyphCacheBasic(256 * 1024); )
114 DEF_BENCH( return new SkGlyphCacheBasic(32 * 1024 * 1024); )
115 DEF_BENCH( return new SkGlyphCacheStressTest(256 * 1024); )
116 DEF_BENCH( return new SkGlyphCacheStressTest(32 * 1024 * 1024); )
117