blob: 721ad0c789b40cdb0b6bfeafaadcc2e19876e5f8 [file] [log] [blame]
Jim Van Verth753403c2018-12-18 11:04:37 -05001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -050016#include "gm/gm.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050017#include "include/core/SkCanvas.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040018#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"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050028#include "include/core/SkTypeface.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040029#include "include/core/SkTypes.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050030#include "include/gpu/GrContext.h"
31#include "include/gpu/GrContextOptions.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040032#include "include/private/GrTypesPriv.h"
33#include "include/private/SkTemplates.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050034#include "src/gpu/GrContextPriv.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050035#include "tools/ToolUtils.h"
Jim Van Verth753403c2018-12-18 11:04:37 -050036
Ben Wagner7fde8e12019-05-01 17:28:53 -040037class GrRenderTargetContext;
38
Jim Van Verth753403c2018-12-18 11:04:37 -050039static 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
Chris Dalton3a778372019-02-07 15:23:36 -070049class FontRegenGM : public skiagm::GpuGM {
Jim Van Verth753403c2018-12-18 11:04:37 -050050public:
51 FontRegenGM() {
52 this->setBGColor(SK_ColorLTGRAY);
53 }
54
55 void modifyGrContextOptions(GrContextOptions* options) override {
56 options->fGlyphCacheTextureMaximumBytes = 0;
57 options->fAllowMultipleGlyphCacheTextures = GrContextOptions::Enable::kNo;
58 }
59
60protected:
61 SkString onShortName() override {
62 SkString name("fontregen");
63 return name;
64 }
65
66 SkISize onISize() override { return SkISize::Make(kSize, kSize); }
67
68 void onOnceBeforeDraw() override {
Mike Kleinea3f0142019-03-20 11:12:10 -050069 auto tf = ToolUtils::create_portable_typeface("sans-serif", SkFontStyle::Normal());
Jim Van Verth753403c2018-12-18 11:04:37 -050070
71 static const SkString kTexts[] = {
72 SkString("abcdefghijklmnopqrstuvwxyz"),
73 SkString("ABCDEFGHI"),
74 SkString("NOPQRSTUV")
75 };
76
77 SkFont font;
78 font.setEdging(SkFont::Edging::kAntiAlias);
79 font.setSubpixel(false);
80 font.setSize(80);
81 font.setTypeface(tf);
82
83 fBlobs[0] = make_blob(kTexts[0], font);
84 font.setSize(162);
85 fBlobs[1] = make_blob(kTexts[1], font);
86 fBlobs[2] = make_blob(kTexts[2], font);
87 }
88
Robert Phillips9882dae2019-03-04 11:00:10 -050089 void onDraw(GrContext* context, GrRenderTargetContext*, SkCanvas* canvas) override {
Jim Van Verth753403c2018-12-18 11:04:37 -050090 SkPaint paint;
91 paint.setColor(SK_ColorBLACK);
92 canvas->drawTextBlob(fBlobs[0], 10, 80, paint);
93 canvas->drawTextBlob(fBlobs[1], 10, 225, paint);
Robert Phillips9882dae2019-03-04 11:00:10 -050094 context->flush();
Jim Van Verth753403c2018-12-18 11:04:37 -050095
96 paint.setColor(0xFF010101);
97 canvas->drawTextBlob(fBlobs[0], 10, 305, paint);
98 canvas->drawTextBlob(fBlobs[2], 10, 465, paint);
99
100 // Debugging tool for GPU.
101 static const bool kShowAtlas = false;
102 if (kShowAtlas) {
Robert Phillips19104af2019-03-05 12:51:52 -0500103 auto img = context->priv().testingOnly_getFontAtlasImage(kA8_GrMaskFormat);
104 canvas->drawImage(img, 200, 0);
Jim Van Verth753403c2018-12-18 11:04:37 -0500105 }
106 }
107
108private:
109 static constexpr SkScalar kSize = 512;
110
111 sk_sp<SkTextBlob> fBlobs[3];
112 typedef GM INHERITED;
113};
114
115constexpr SkScalar FontRegenGM::kSize;
116
117//////////////////////////////////////////////////////////////////////////////
118
119DEF_GM(return new FontRegenGM())