blob: daaf66bc1e5a46d15b2b630db6026ed2cd187f71 [file] [log] [blame]
reedd7127e72014-08-12 06:53:09 -07001/*
2 * Copyright 2012 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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkBitmap.h"
10#include "include/core/SkBlurTypes.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkCanvas.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040012#include "include/core/SkColor.h"
13#include "include/core/SkFont.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "include/core/SkMaskFilter.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040015#include "include/core/SkPaint.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050016#include "include/core/SkPath.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040017#include "include/core/SkRect.h"
18#include "include/core/SkRefCnt.h"
19#include "include/core/SkScalar.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050020#include "include/core/SkShader.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040021#include "include/core/SkSize.h"
22#include "include/core/SkString.h"
23#include "include/core/SkTileMode.h"
24#include "include/core/SkTypeface.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050025#include "tools/ToolUtils.h"
Kevin Lubicke836c3a2023-10-20 06:55:35 -040026#include "tools/fonts/FontToolUtils.h"
reedd7127e72014-08-12 06:53:09 -070027
28namespace skiagm {
29
30/**
31 * Stress test the GPU samplers by rendering a textured glyph with a mask and
32 * an AA clip
33 */
34class SamplerStressGM : public GM {
35public:
36 SamplerStressGM()
37 : fTextureCreated(false)
halcanary96fcdcc2015-08-27 07:41:13 -070038 , fMaskFilter(nullptr) {
reedd7127e72014-08-12 06:53:09 -070039 }
40
reedd7127e72014-08-12 06:53:09 -070041protected:
Leandro Lovisolo24fa2112023-08-15 19:05:17 +000042 SkString getName() const override { return SkString("gpusamplerstress"); }
reedd7127e72014-08-12 06:53:09 -070043
Leandro Lovisolo8f023882023-08-15 21:13:52 +000044 SkISize getISize() override { return SkISize::Make(640, 480); }
reedd7127e72014-08-12 06:53:09 -070045
46 /**
47 * Create a red & green stripes on black texture
48 */
49 void createTexture() {
50 if (fTextureCreated) {
51 return;
52 }
53
mtkleindbfd7ab2016-09-01 11:24:54 -070054 constexpr int xSize = 16;
55 constexpr int ySize = 16;
reedd7127e72014-08-12 06:53:09 -070056
57 fTexture.allocN32Pixels(xSize, ySize);
58 SkPMColor* addr = fTexture.getAddr32(0, 0);
59
60 for (int y = 0; y < ySize; ++y) {
61 for (int x = 0; x < xSize; ++x) {
62 addr[y*xSize+x] = SkPreMultiplyColor(SK_ColorBLACK);
63
64 if ((y % 5) == 0) {
65 addr[y*xSize+x] = SkPreMultiplyColor(SK_ColorRED);
66 }
67 if ((x % 7) == 0) {
68 addr[y*xSize+x] = SkPreMultiplyColor(SK_ColorGREEN);
69 }
70 }
71 }
72
73 fTextureCreated = true;
74 }
75
76 void createShader() {
reed1a9b9642016-03-13 14:13:58 -070077 if (fShader) {
reedd7127e72014-08-12 06:53:09 -070078 return;
79 }
80
81 createTexture();
82
Mike Reed057fcbe2020-12-12 14:31:25 -050083 fShader = fTexture.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
84 SkSamplingOptions());
reedd7127e72014-08-12 06:53:09 -070085 }
86
87 void createMaskFilter() {
reedefdfd512016-04-04 10:02:58 -070088 if (fMaskFilter) {
reedd7127e72014-08-12 06:53:09 -070089 return;
90 }
91
92 const SkScalar sigma = 1;
Mike Reed1be1f8d2018-03-14 13:01:17 -040093 fMaskFilter = SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, sigma);
reedd7127e72014-08-12 06:53:09 -070094 }
95
mtklein36352bf2015-03-25 18:17:31 -070096 void onDraw(SkCanvas* canvas) override {
reedd7127e72014-08-12 06:53:09 -070097 createShader();
98 createMaskFilter();
99
100 canvas->save();
101
102 // draw a letter "M" with a green & red striped texture and a
103 // stipple mask with a round rect soft clip
104 SkPaint paint;
105 paint.setAntiAlias(true);
reedfe630452016-03-25 09:08:00 -0700106 paint.setShader(fShader);
reedefdfd512016-04-04 10:02:58 -0700107 paint.setMaskFilter(fMaskFilter);
Kevin Lubicke836c3a2023-10-20 06:55:35 -0400108 SkFont font(ToolUtils::DefaultPortableTypeface(), 72);
reedd7127e72014-08-12 06:53:09 -0700109
110 SkRect temp;
Mike Reed92b33352019-08-24 19:39:13 -0400111 temp.setLTRB(115, 75, 144, 110);
reedd7127e72014-08-12 06:53:09 -0700112
113 SkPath path;
114 path.addRoundRect(temp, SkIntToScalar(5), SkIntToScalar(5));
115
reed66998382016-09-21 11:15:07 -0700116 canvas->clipPath(path, true); // AA is on
reedd7127e72014-08-12 06:53:09 -0700117
Hal Canarydf2d27e2019-01-08 09:38:02 -0500118 canvas->drawString("M", 100.0f, 100.0f, font, paint);
reedd7127e72014-08-12 06:53:09 -0700119
120 canvas->restore();
121
122 // Now draw stroked versions of the "M" and the round rect so we can
123 // see what is going on
124 SkPaint paint2;
125 paint2.setColor(SK_ColorBLACK);
126 paint2.setAntiAlias(true);
reedd7127e72014-08-12 06:53:09 -0700127 paint2.setStyle(SkPaint::kStroke_Style);
128 paint2.setStrokeWidth(1);
Hal Canarydf2d27e2019-01-08 09:38:02 -0500129 canvas->drawString("M", 100.0f, 100.0f, font, paint2);
reedd7127e72014-08-12 06:53:09 -0700130
Mike Kleind46dce32018-08-16 10:17:03 -0400131 paint2.setColor(SK_ColorGRAY);
reedd7127e72014-08-12 06:53:09 -0700132
133 canvas->drawPath(path, paint2);
134 }
135
136private:
reed1a9b9642016-03-13 14:13:58 -0700137 SkBitmap fTexture;
138 bool fTextureCreated;
139 sk_sp<SkShader> fShader;
reedefdfd512016-04-04 10:02:58 -0700140 sk_sp<SkMaskFilter> fMaskFilter;
reedd7127e72014-08-12 06:53:09 -0700141
John Stiles7571f9e2020-09-02 22:42:33 -0400142 using INHERITED = GM;
reedd7127e72014-08-12 06:53:09 -0700143};
144
145//////////////////////////////////////////////////////////////////////////////
146
Hal Canarye964c182019-01-23 10:22:01 -0500147DEF_GM( return new SamplerStressGM; )
reedd7127e72014-08-12 06:53:09 -0700148
John Stilesa6841be2020-08-06 14:11:56 -0400149} // namespace skiagm