blob: 4a0c24ecb5da675aae52517dfc7bbcb0d40a85f4 [file] [log] [blame]
reed@google.com4bc0a9d2012-03-07 21:47:41 +00001/*
2 * Copyright 2011 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"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050010#include "include/core/SkCanvas.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040011#include "include/core/SkColor.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040012#include "include/core/SkMatrix.h"
13#include "include/core/SkPaint.h"
14#include "include/core/SkScalar.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050015#include "include/core/SkShader.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040016#include "include/core/SkSize.h"
17#include "include/core/SkString.h"
18#include "include/core/SkTileMode.h"
reed@google.com4bc0a9d2012-03-07 21:47:41 +000019
20/*
21 * Want to ensure that our bitmap sampler (in bitmap shader) keeps plenty of
22 * precision when scaling very large images (where the dx might get very small.
23 */
24
reed@google.com6005aeb2012-03-14 20:15:47 +000025#define W 257
26#define H 161
reed@google.com4bc0a9d2012-03-07 21:47:41 +000027
28class GiantBitmapGM : public skiagm::GM {
29 SkBitmap* fBM;
Mike Reedfae8fce2019-04-03 10:27:45 -040030 SkTileMode fMode;
reed@google.comb0b462b2012-03-08 22:13:39 +000031 bool fDoFilter;
32 bool fDoRotate;
rmistry@google.comae933ce2012-08-23 18:19:56 +000033
reed@google.com4bc0a9d2012-03-07 21:47:41 +000034 const SkBitmap& getBitmap() {
halcanary96fcdcc2015-08-27 07:41:13 -070035 if (nullptr == fBM) {
reed@google.com4bc0a9d2012-03-07 21:47:41 +000036 fBM = new SkBitmap;
reed@google.comeb9a46c2014-01-25 16:46:20 +000037 fBM->allocN32Pixels(W, H);
reed@google.com4bc0a9d2012-03-07 21:47:41 +000038 fBM->eraseColor(SK_ColorWHITE);
39
40 const SkColor colors[] = {
41 SK_ColorBLUE, SK_ColorRED, SK_ColorBLACK, SK_ColorGREEN
42 };
43
44 SkCanvas canvas(*fBM);
45 SkPaint paint;
46 paint.setAntiAlias(true);
reed@google.com6005aeb2012-03-14 20:15:47 +000047 paint.setStrokeWidth(SkIntToScalar(20));
rmistry@google.comae933ce2012-08-23 18:19:56 +000048
reed@google.com6005aeb2012-03-14 20:15:47 +000049#if 0
50 for (int y = -H*2; y < H; y += 50) {
reed@google.com4bc0a9d2012-03-07 21:47:41 +000051 SkScalar yy = SkIntToScalar(y);
reed@google.com6005aeb2012-03-14 20:15:47 +000052 paint.setColor(colors[y/50 & 0x3]);
reed@google.com4bc0a9d2012-03-07 21:47:41 +000053 canvas.drawLine(0, yy, SkIntToScalar(W), yy + SkIntToScalar(W),
54 paint);
55 }
reed@google.com6005aeb2012-03-14 20:15:47 +000056#else
57 for (int x = -W; x < W; x += 60) {
58 paint.setColor(colors[x/60 & 0x3]);
59
60 SkScalar xx = SkIntToScalar(x);
61 canvas.drawLine(xx, 0, xx, SkIntToScalar(H),
62 paint);
63 }
64#endif
reed@google.com4bc0a9d2012-03-07 21:47:41 +000065 }
66 return *fBM;
67 }
68
69public:
Mike Reedfae8fce2019-04-03 10:27:45 -040070 GiantBitmapGM(SkTileMode mode, bool doFilter, bool doRotate) : fBM(nullptr) {
reed@google.comb0b462b2012-03-08 22:13:39 +000071 fMode = mode;
72 fDoFilter = doFilter;
73 fDoRotate = doRotate;
74 }
reed@google.com4bc0a9d2012-03-07 21:47:41 +000075
Brian Salomond3b65972017-03-22 12:05:03 -040076 ~GiantBitmapGM() override { delete fBM; }
reed@google.com4bc0a9d2012-03-07 21:47:41 +000077
78protected:
Leandro Lovisolo24fa2112023-08-15 19:05:17 +000079 SkString getName() const override {
reed@google.com4bc0a9d2012-03-07 21:47:41 +000080 SkString str("giantbitmap_");
81 switch (fMode) {
Mike Reedfae8fce2019-04-03 10:27:45 -040082 case SkTileMode::kClamp:
reed@google.com4bc0a9d2012-03-07 21:47:41 +000083 str.append("clamp");
84 break;
Mike Reedfae8fce2019-04-03 10:27:45 -040085 case SkTileMode::kRepeat:
reed@google.com4bc0a9d2012-03-07 21:47:41 +000086 str.append("repeat");
87 break;
Mike Reedfae8fce2019-04-03 10:27:45 -040088 case SkTileMode::kMirror:
reed@google.com4bc0a9d2012-03-07 21:47:41 +000089 str.append("mirror");
90 break;
Mike Reedfae8fce2019-04-03 10:27:45 -040091 case SkTileMode::kDecal:
92 str.append("decal");
93 break;
reed@google.com4bc0a9d2012-03-07 21:47:41 +000094 default:
95 break;
96 }
reed@google.comb0b462b2012-03-08 22:13:39 +000097 str.append(fDoFilter ? "_bilerp" : "_point");
98 str.append(fDoRotate ? "_rotate" : "_scale");
reed@google.com4bc0a9d2012-03-07 21:47:41 +000099 return str;
100 }
101
Leandro Lovisolo8f023882023-08-15 21:13:52 +0000102 SkISize getISize() override { return SkISize::Make(640, 480); }
reed@google.com4bc0a9d2012-03-07 21:47:41 +0000103
mtklein36352bf2015-03-25 18:17:31 -0700104 void onDraw(SkCanvas* canvas) override {
reed@google.com4bc0a9d2012-03-07 21:47:41 +0000105 SkPaint paint;
reed@google.com4bc0a9d2012-03-07 21:47:41 +0000106
reed@google.comb0b462b2012-03-08 22:13:39 +0000107 SkMatrix m;
108 if (fDoRotate) {
reed@google.comb0b462b2012-03-08 22:13:39 +0000109 m.setSkew(SK_Scalar1, 0, 0, 0);
reed@google.comb0b462b2012-03-08 22:13:39 +0000110 } else {
reed@google.com6005aeb2012-03-14 20:15:47 +0000111 SkScalar scale = 11*SK_Scalar1/12;
112 m.setScale(scale, scale);
reed@google.comb0b462b2012-03-08 22:13:39 +0000113 }
Mike Reedc82ab082021-07-16 22:19:26 -0400114 paint.setShader(getBitmap().makeShader(
115 fMode, fMode,
116 SkSamplingOptions(fDoFilter ? SkFilterMode::kLinear
117 : SkFilterMode::kNearest),
118 m));
reed@google.comb0b462b2012-03-08 22:13:39 +0000119
Mike Reed1f261da2021-07-18 10:54:25 -0400120 canvas->translate(50, 50);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000121
reed@google.com4bc0a9d2012-03-07 21:47:41 +0000122 canvas->drawPaint(paint);
123 }
124
125private:
John Stiles7571f9e2020-09-02 22:42:33 -0400126 using INHERITED = GM;
reed@google.com4bc0a9d2012-03-07 21:47:41 +0000127};
128
129///////////////////////////////////////////////////////////////////////////////
130
Mike Reedfae8fce2019-04-03 10:27:45 -0400131DEF_GM( return new GiantBitmapGM(SkTileMode::kClamp, false, false); )
132DEF_GM( return new GiantBitmapGM(SkTileMode::kRepeat, false, false); )
133DEF_GM( return new GiantBitmapGM(SkTileMode::kMirror, false, false); )
134DEF_GM( return new GiantBitmapGM(SkTileMode::kClamp, true, false); )
135DEF_GM( return new GiantBitmapGM(SkTileMode::kRepeat, true, false); )
136DEF_GM( return new GiantBitmapGM(SkTileMode::kMirror, true, false); )
reed@google.com4bc0a9d2012-03-07 21:47:41 +0000137
Mike Reedfae8fce2019-04-03 10:27:45 -0400138DEF_GM( return new GiantBitmapGM(SkTileMode::kClamp, false, true); )
139DEF_GM( return new GiantBitmapGM(SkTileMode::kRepeat, false, true); )
140DEF_GM( return new GiantBitmapGM(SkTileMode::kMirror, false, true); )
141DEF_GM( return new GiantBitmapGM(SkTileMode::kClamp, true, true); )
142DEF_GM( return new GiantBitmapGM(SkTileMode::kRepeat, true, true); )
143DEF_GM( return new GiantBitmapGM(SkTileMode::kMirror, true, true); )