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 11static 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// 36static 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 52class BitmapRectTestGM : public skiagm::GM { 53public: 54 BitmapRectTestGM() { 55 56 } 57 58protected: 59 SkString onShortName() override { 60 return SkString("bitmaprecttest"); 61 } 62 63 SkISize onISize() override { 64 return SkISize::Make(320, 240); 65 } 66 67 void onDraw(SkCanvas* canvas) override { 68 test_bitmaprect(canvas); 69 } 70 71private: 72 typedef skiagm::GM INHERITED; 73}; 74 75////////////////////////////////////////////////////////////////////////////// 76 77DEF_GM( return new BitmapRectTestGM; ) 78