• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2018 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 // GM to stress TextBlob regeneration and the GPU font cache
9 // It's not necessary to run this with CPU configs
10 //
11 // The point here is to draw a set of text that will fit in one Plot, and then some large
12 // text. After a flush we draw the first set of text again with a slightly different color,
13 // and then enough new large text to spill the entire atlas. What *should* happen is that
14 // the Plot with the first set of text will not get overwritten by the new large text.
15 
16 #include "gm/gm.h"
17 #include "include/core/SkCanvas.h"
18 #include "include/core/SkColor.h"
19 #include "include/core/SkFont.h"
20 #include "include/core/SkFontStyle.h"
21 #include "include/core/SkFontTypes.h"
22 #include "include/core/SkPaint.h"
23 #include "include/core/SkRefCnt.h"
24 #include "include/core/SkScalar.h"
25 #include "include/core/SkSize.h"
26 #include "include/core/SkString.h"
27 #include "include/core/SkTextBlob.h"
28 #include "include/core/SkTypeface.h"
29 #include "include/core/SkTypes.h"
30 #include "include/gpu/GrContext.h"
31 #include "include/gpu/GrContextOptions.h"
32 #include "include/private/GrTypesPriv.h"
33 #include "include/private/SkTemplates.h"
34 #include "src/gpu/GrContextPriv.h"
35 #include "tools/ToolUtils.h"
36 
37 class GrRenderTargetContext;
38 
make_blob(const SkString & text,const SkFont & font)39 static sk_sp<SkTextBlob> make_blob(const SkString& text, const SkFont& font) {
40     size_t len = text.size();
41     SkAutoTArray<SkScalar>  pos(len);
42     SkAutoTArray<SkGlyphID> glyphs(len);
43 
44     font.textToGlyphs(text.c_str(), len, SkTextEncoding::kUTF8, glyphs.get(), len);
45     font.getXPos(glyphs.get(), len, pos.get());
46     return SkTextBlob::MakeFromPosTextH(text.c_str(), len, pos.get(), 0, font);
47 }
48 
49 class FontRegenGM : public skiagm::GpuGM {
50 
modifyGrContextOptions(GrContextOptions * options)51     void modifyGrContextOptions(GrContextOptions* options) override {
52         options->fGlyphCacheTextureMaximumBytes = 0;
53         options->fAllowMultipleGlyphCacheTextures = GrContextOptions::Enable::kNo;
54     }
55 
onShortName()56     SkString onShortName() override { return SkString("fontregen"); }
57 
onISize()58     SkISize onISize() override { return {kSize, kSize}; }
59 
onOnceBeforeDraw()60     void onOnceBeforeDraw() override {
61         this->setBGColor(SK_ColorLTGRAY);
62 
63         auto tf = ToolUtils::create_portable_typeface("sans-serif", SkFontStyle::Normal());
64 
65         static const SkString kTexts[] = {
66             SkString("abcdefghijklmnopqrstuvwxyz"),
67             SkString("ABCDEFGHI"),
68             SkString("NOPQRSTUV")
69         };
70 
71         SkFont font;
72         font.setEdging(SkFont::Edging::kAntiAlias);
73         font.setSubpixel(false);
74         font.setSize(80);
75         font.setTypeface(tf);
76 
77         fBlobs[0] = make_blob(kTexts[0], font);
78         font.setSize(162);
79         fBlobs[1] = make_blob(kTexts[1], font);
80         fBlobs[2] = make_blob(kTexts[2], font);
81     }
82 
onDraw(GrContext * context,GrRenderTargetContext *,SkCanvas * canvas)83     void onDraw(GrContext* context, GrRenderTargetContext*, SkCanvas* canvas) override {
84         SkPaint paint;
85         paint.setColor(SK_ColorBLACK);
86         canvas->drawTextBlob(fBlobs[0], 10, 80, paint);
87         canvas->drawTextBlob(fBlobs[1], 10, 225, paint);
88         context->flush();
89 
90         paint.setColor(0xFF010101);
91         canvas->drawTextBlob(fBlobs[0], 10, 305, paint);
92         canvas->drawTextBlob(fBlobs[2], 10, 465, paint);
93 
94         //  Debugging tool for GPU.
95         static const bool kShowAtlas = false;
96         if (kShowAtlas) {
97             auto img = context->priv().testingOnly_getFontAtlasImage(kA8_GrMaskFormat);
98             canvas->drawImage(img, 200, 0);
99         }
100     }
101 
102 private:
103     static constexpr int kSize = 512;
104 
105     sk_sp<SkTextBlob> fBlobs[3];
106     typedef GM INHERITED;
107 };
108 
109 //////////////////////////////////////////////////////////////////////////////
110 
111 DEF_GM(return new FontRegenGM())
112