1
2/*
3 * Copyright 2014 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8#include "gm.h"
9
10#include "Resources.h"
11#include "SkBitmap.h"
12#include "SkImageDecoder.h"
13#include "SkPaint.h"
14#include "SkShader.h"
15#include "SkStream.h"
16
17
18 /***
19  *
20  * This GM reproduces Skia bug 2904, in which a tiled bitmap shader was failing to draw correctly
21  * when fractional image scaling was ignored by the high quality bitmap scaler.
22  *
23  ***/
24
25namespace skiagm {
26
27class TiledScaledBitmapGM : public GM {
28public:
29
30    TiledScaledBitmapGM() {
31    }
32
33protected:
34    SkString onShortName() override {
35        return SkString("tiledscaledbitmap");
36    }
37
38    SkISize onISize() override {
39        return SkISize::Make(1016, 616);
40    }
41
42    static SkBitmap make_bm(int width, int height) {
43        SkBitmap bm;
44        bm.allocN32Pixels(width, height);
45        bm.eraseColor(SK_ColorTRANSPARENT);
46        SkCanvas canvas(bm);
47        SkPaint paint;
48        paint.setAntiAlias(true);
49        canvas.drawCircle(width/2.f, height/2.f, width/4.f, paint);
50        return bm;
51    }
52
53    void onOnceBeforeDraw() override {
54        fBitmap = make_bm(360, 288);
55    }
56
57    void onDraw(SkCanvas* canvas) override {
58        SkPaint paint;
59
60        paint.setAntiAlias(true);
61        paint.setFilterQuality(kHigh_SkFilterQuality);
62
63        SkMatrix mat;
64        mat.setScale(121.f/360.f, 93.f/288.f);
65        mat.postTranslate(-72, -72);
66
67        SkShader *shader = SkShader::CreateBitmapShader(fBitmap, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, &mat);
68        paint.setShader(shader);
69
70        SkSafeUnref(shader);
71        canvas->drawRectCoords(8,8,1008, 608, paint);
72    }
73
74private:
75    SkBitmap fBitmap;
76
77    typedef GM INHERITED;
78};
79
80//////////////////////////////////////////////////////////////////////////////
81
82DEF_GM(return SkNEW(TiledScaledBitmapGM);)
83
84}
85