xref: /third_party/skia/gm/giantbitmap.cpp (revision cb93a386)
1/*
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
8#include "gm/gm.h"
9#include "include/core/SkBitmap.h"
10#include "include/core/SkCanvas.h"
11#include "include/core/SkColor.h"
12#include "include/core/SkMatrix.h"
13#include "include/core/SkPaint.h"
14#include "include/core/SkScalar.h"
15#include "include/core/SkShader.h"
16#include "include/core/SkSize.h"
17#include "include/core/SkString.h"
18#include "include/core/SkTileMode.h"
19
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
25#define W   257
26#define H   161
27
28class GiantBitmapGM : public skiagm::GM {
29    SkBitmap* fBM;
30    SkTileMode fMode;
31    bool fDoFilter;
32    bool fDoRotate;
33
34    const SkBitmap& getBitmap() {
35        if (nullptr == fBM) {
36            fBM = new SkBitmap;
37            fBM->allocN32Pixels(W, H);
38            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);
47            paint.setStrokeWidth(SkIntToScalar(20));
48
49#if 0
50            for (int y = -H*2; y < H; y += 50) {
51                SkScalar yy = SkIntToScalar(y);
52                paint.setColor(colors[y/50 & 0x3]);
53                canvas.drawLine(0, yy, SkIntToScalar(W), yy + SkIntToScalar(W),
54                                paint);
55            }
56#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
65        }
66        return *fBM;
67    }
68
69public:
70    GiantBitmapGM(SkTileMode mode, bool doFilter, bool doRotate) : fBM(nullptr) {
71        fMode = mode;
72        fDoFilter = doFilter;
73        fDoRotate = doRotate;
74    }
75
76    ~GiantBitmapGM() override { delete fBM; }
77
78protected:
79
80    SkString onShortName() override {
81        SkString str("giantbitmap_");
82        switch (fMode) {
83            case SkTileMode::kClamp:
84                str.append("clamp");
85                break;
86            case SkTileMode::kRepeat:
87                str.append("repeat");
88                break;
89            case SkTileMode::kMirror:
90                str.append("mirror");
91                break;
92            case SkTileMode::kDecal:
93                str.append("decal");
94                break;
95            default:
96                break;
97        }
98        str.append(fDoFilter ? "_bilerp" : "_point");
99        str.append(fDoRotate ? "_rotate" : "_scale");
100        return str;
101    }
102
103    SkISize onISize() override { return SkISize::Make(640, 480); }
104
105    void onDraw(SkCanvas* canvas) override {
106        SkPaint paint;
107
108        SkMatrix m;
109        if (fDoRotate) {
110            m.setSkew(SK_Scalar1, 0, 0, 0);
111        } else {
112            SkScalar scale = 11*SK_Scalar1/12;
113            m.setScale(scale, scale);
114        }
115        paint.setShader(getBitmap().makeShader(
116                                           fMode, fMode,
117                                           SkSamplingOptions(fDoFilter ? SkFilterMode::kLinear
118                                                                       : SkFilterMode::kNearest),
119                                           m));
120
121        canvas->translate(50, 50);
122
123        canvas->drawPaint(paint);
124    }
125
126private:
127    using INHERITED = GM;
128};
129
130///////////////////////////////////////////////////////////////////////////////
131
132DEF_GM( return new GiantBitmapGM(SkTileMode::kClamp, false, false); )
133DEF_GM( return new GiantBitmapGM(SkTileMode::kRepeat, false, false); )
134DEF_GM( return new GiantBitmapGM(SkTileMode::kMirror, false, false); )
135DEF_GM( return new GiantBitmapGM(SkTileMode::kClamp, true, false); )
136DEF_GM( return new GiantBitmapGM(SkTileMode::kRepeat, true, false); )
137DEF_GM( return new GiantBitmapGM(SkTileMode::kMirror, true, false); )
138
139DEF_GM( return new GiantBitmapGM(SkTileMode::kClamp, false, true); )
140DEF_GM( return new GiantBitmapGM(SkTileMode::kRepeat, false, true); )
141DEF_GM( return new GiantBitmapGM(SkTileMode::kMirror, false, true); )
142DEF_GM( return new GiantBitmapGM(SkTileMode::kClamp, true, true); )
143DEF_GM( return new GiantBitmapGM(SkTileMode::kRepeat, true, true); )
144DEF_GM( return new GiantBitmapGM(SkTileMode::kMirror, true, true); )
145