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