Home | History | Annotate | Download | only in gm
      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 
     28     TiledScaledBitmapGM() {
     29     }
     30 
     31 protected:
     32     SkString onShortName() override {
     33         return SkString("tiledscaledbitmap");
     34     }
     35 
     36     SkISize onISize() override {
     37         return SkISize::Make(1016, 616);
     38     }
     39 
     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 
     51     void onOnceBeforeDraw() override {
     52         fBitmap = make_bm(360, 288);
     53     }
     54 
     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