Index: gm/bitmaprect.cpp |
diff --git a/gm/bitmaprect.cpp b/gm/bitmaprect.cpp |
index badffb9a939060c0e4bdd04c5a29bab3f559cae4..53a855e7782e1e6c7f5cb4cb16f1468c0a21c515 100644 |
--- a/gm/bitmaprect.cpp |
+++ b/gm/bitmaprect.cpp |
@@ -233,6 +233,49 @@ private: |
typedef skiagm::GM INHERITED; |
}; |
+class BitmapRectRounding : public skiagm::GM { |
+ SkBitmap fBM; |
+ |
+public: |
+ BitmapRectRounding() {} |
+ |
+protected: |
+ SkString onShortName() SK_OVERRIDE { |
+ SkString str; |
+ str.printf("bitmaprect_rounding"); |
+ return str; |
+ } |
+ |
+ SkISize onISize() SK_OVERRIDE { |
+ return SkISize::Make(640, 480); |
+ } |
+ |
+ void onOnceBeforeDraw() SK_OVERRIDE { |
+ fBM.allocN32Pixels(10, 10); |
+ fBM.eraseColor(SK_ColorBLUE); |
+ } |
+ |
+ // This choice of coordinates and matrix land the bottom edge of the clip (and bitmap dst) |
+ // at exactly 1/2 pixel boundary. However, drawBitmapRect may lose precision along the way. |
+ // If it does, we may see a red-line at the bottom, instead of the bitmap exactly matching |
+ // the clip (in which case we should see all blue). |
+ // The correct image should be all blue. |
+ void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
+ SkPaint paint; |
+ paint.setColor(SK_ColorRED); |
+ |
+ const SkRect r = SkRect::MakeXYWH(1, 1, 110, 114); |
+ canvas->scale(0.9f, 0.9f); |
+ |
+ // the drawRect shows the same problem as clipRect(r) followed by drawcolor(red) |
+ canvas->drawRect(r, paint); |
+ canvas->drawBitmapRect(fBM, NULL, r, NULL); |
+ } |
+ |
+private: |
+ typedef skiagm::GM INHERITED; |
+}; |
+ |
////////////////////////////////////////////////////////////////////////////// |
static skiagm::GM* MyFactory0(void*) { return new DrawBitmapRect2(false); } |
@@ -254,3 +297,5 @@ static skiagm::GMRegistry reg2(MyFactory2); |
static skiagm::GMRegistry reg3(MyFactory3); |
static skiagm::GMRegistry reg4(MyFactory4); |
#endif |
+ |
+DEF_GM( return new BitmapRectRounding; ) |