|  | /* | 
|  | * 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); | 
|  | } |