| /* | |
| * Copyright 2013 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "gm/gm.h" | |
| #include "include/core/SkBitmap.h" | |
| #include "include/core/SkCanvas.h" | |
| #include "include/core/SkImage.h" | |
| #include "include/core/SkPaint.h" | |
| #include "include/core/SkPath.h" | |
| #include "include/core/SkRect.h" | |
| #include "include/core/SkScalar.h" | |
| static sk_sp<SkImage> make_bm() { | |
| SkBitmap bm; | |
| bm.allocN32Pixels(60, 60); | |
| bm.eraseColor(0); | |
| SkCanvas canvas(bm); | |
| SkPaint paint; | |
| canvas.drawPath(SkPath::Polygon({{{6,6}, {6,54}, {30,54}}}, false), paint); | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| canvas.drawRect(SkRect::MakeLTRB(0.5f, 0.5f, 59.5f, 59.5f), paint); | |
| return bm.asImage(); | |
| } | |
| // This creates a close, but imperfect concatenation of | |
| // scaling the image up by its dst-rect | |
| // scaling the image down by the matrix' scale | |
| // The bug was that for cases like this, we were incorrectly trying to take a | |
| // fast-path in the bitmapshader, but ended up drawing the last col of pixels | |
| // twice. The fix resulted in (a) not taking the fast-path, but (b) drawing | |
| // the image correctly. | |
| // | |
| DEF_SIMPLE_GM(bitmaprecttest, canvas, 320, 240) { | |
| auto image = make_bm(); | |
| canvas->drawImage(image, 150, 45); | |
| SkScalar scale = 0.472560018f; | |
| canvas->save(); | |
| canvas->scale(scale, scale); | |
| canvas->drawImageRect(image, SkRect::MakeXYWH(100, 100, 128, 128), SkSamplingOptions()); | |
| canvas->restore(); | |
| canvas->scale(-1, 1); | |
| canvas->drawImage(image, -310, 45); | |
| } |