Home | History | Annotate | Download | only in gm
      1 /*
      2  * Copyright 2013 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 #include "SkCanvas.h"
     10 
     11 static void make_bm(SkBitmap* bm) {
     12     bm->allocN32Pixels(60, 60);
     13     bm->eraseColor(0);
     14 
     15     SkCanvas canvas(*bm);
     16     SkPaint paint;
     17 
     18     SkPath path;
     19     path.moveTo(6, 6);
     20     path.lineTo(6, 54);
     21     path.lineTo(30, 54);
     22     canvas.drawPath(path, paint);
     23 
     24     paint.setStyle(SkPaint::kStroke_Style);
     25     canvas.drawRect(SkRect::MakeLTRB(0.5f, 0.5f, 59.5f, 59.5f), paint);
     26 }
     27 
     28 // This creates a close, but imperfect concatenation of
     29 //      scaling the image up by its dst-rect
     30 //      scaling the image down by the matrix' scale
     31 //  The bug was that for cases like this, we were incorrectly trying to take a
     32 //  fast-path in the bitmapshader, but ended up drawing the last col of pixels
     33 //  twice. The fix resulted in (a) not taking the fast-path, but (b) drawing
     34 //  the image correctly.
     35 //
     36 static void test_bitmaprect(SkCanvas* canvas) {
     37     SkBitmap bm;
     38     make_bm(&bm);
     39 
     40     canvas->drawBitmap(bm, 150, 45, NULL);
     41 
     42     SkScalar scale = 0.472560018f;
     43     canvas->save();
     44     canvas->scale(scale, scale);
     45     canvas->drawBitmapRectToRect(bm, NULL, SkRect::MakeXYWH(100, 100, 128, 128), NULL);
     46     canvas->restore();
     47 
     48     canvas->scale(-1, 1);
     49     canvas->drawBitmap(bm, -310, 45, NULL);
     50 }
     51 
     52 class BitmapRectTestGM : public skiagm::GM {
     53 public:
     54     BitmapRectTestGM() {
     55 
     56     }
     57 
     58 protected:
     59     virtual uint32_t onGetFlags() const SK_OVERRIDE {
     60         return kSkipTiled_Flag;
     61     }
     62 
     63     virtual SkString onShortName() {
     64         return SkString("bitmaprecttest");
     65     }
     66 
     67     virtual SkISize onISize() {
     68         return SkISize::Make(320, 240);
     69     }
     70 
     71     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
     72         test_bitmaprect(canvas);
     73     }
     74 
     75 private:
     76     typedef skiagm::GM INHERITED;
     77 };
     78 
     79 //////////////////////////////////////////////////////////////////////////////
     80 
     81 DEF_GM( return new BitmapRectTestGM; )
     82