Index: gm/bitmapsource2.cpp |
diff --git a/gm/bitmapsource2.cpp b/gm/bitmapsource2.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bc4acf717c3150d9cb5ac7ef2f34b408986a88c9 |
--- /dev/null |
+++ b/gm/bitmapsource2.cpp |
@@ -0,0 +1,90 @@ |
+/* |
+ * Copyright 2015 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "gm.h" |
+#include "SkBitmapSource.h" |
+ |
+namespace skiagm { |
+ |
+// This GM reproduces the issue in crbug.com/472795. The SkBitmapSource image |
+// is shifted for high quality mode between cpu and gpu. |
+class BitmapSourceGM : public GM { |
+public: |
+ BitmapSourceGM(const char* suffix, SkFilterQuality filter) : fSuffix(suffix), fFilter(filter) { |
+ this->setBGColor(0xFFFFFFFF); |
+ } |
+ |
+protected: |
+ SkString onShortName() override { |
+ SkString name("bitmapsrc2_"); |
+ name.append(fSuffix); |
+ return name; |
+ } |
+ |
+ SkISize onISize() override { return SkISize::Make(256, 256); } |
+ |
+ // Create a bitmap with high frequency vertical stripes |
+ void onOnceBeforeDraw() override { |
+ static const SkPMColor gColors[] = { |
+ SK_ColorRED, SK_ColorGRAY, |
+ SK_ColorGREEN, SK_ColorGRAY, |
+ SK_ColorBLUE, SK_ColorGRAY, |
+ SK_ColorCYAN, SK_ColorGRAY, |
+ SK_ColorMAGENTA, SK_ColorGRAY, |
+ SK_ColorYELLOW, SK_ColorGRAY, |
+ SK_ColorWHITE, SK_ColorGRAY, |
+ }; |
+ |
+ fBM.allocN32Pixels(kImageSize, kImageSize, true); |
+ |
+ SkCanvas canvas(fBM); |
+ |
+ int curColor = 0; |
+ |
+ for (int x = 0; x < kImageSize; x += 3) { |
+ SkRect r = SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(0), |
+ SkIntToScalar(3), SkIntToScalar(kImageSize)); |
+ SkPaint p; |
+ p.setColor(gColors[curColor]); |
+ canvas.drawRect(r, p); |
+ |
+ curColor = (curColor+1) % SK_ARRAY_COUNT(gColors); |
+ } |
+ } |
+ |
+ void onDraw(SkCanvas* canvas) override { |
+ SkRect srcRect = SkRect::MakeLTRB(0, 0, |
+ SkIntToScalar(kImageSize), SkIntToScalar(kImageSize)); |
+ SkRect dstRect = SkRect::MakeLTRB(0.75f, 0.75f, 225.75f, 225.75f); |
+ |
+ SkAutoTUnref<SkImageFilter> filter(SkBitmapSource::Create(fBM, srcRect, dstRect, fFilter)); |
+ |
+ SkPaint p; |
+ p.setImageFilter(filter); |
+ |
+ canvas->saveLayer(NULL, &p); |
+ canvas->restore(); |
+ } |
+ |
+private: |
+ static const int kImageSize = 503; |
+ |
+ SkString fSuffix; |
+ SkFilterQuality fFilter; |
+ SkBitmap fBM; |
+ |
+ typedef GM INHERITED; |
+}; |
+ |
+////////////////////////////////////////////////////////////////////////////// |
+ |
+DEF_GM( return SkNEW_ARGS(BitmapSourceGM, ("none", kNone_SkFilterQuality) ); ) |
+DEF_GM( return SkNEW_ARGS(BitmapSourceGM, ("low", kLow_SkFilterQuality) ); ) |
+DEF_GM( return SkNEW_ARGS(BitmapSourceGM, ("med", kMedium_SkFilterQuality) ); ) |
+DEF_GM( return SkNEW_ARGS(BitmapSourceGM, ("high", kHigh_SkFilterQuality) ); ) |
+ |
+} |