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