diff options
author | 2015-04-09 06:47:12 -0700 | |
---|---|---|
committer | 2015-04-09 06:47:12 -0700 | |
commit | e275fdf812b1dc09beaa3b14570eb0b641a07e6a (patch) | |
tree | 248ed71d69d11bb80b90d37ce51bfd340eafb944 /gm/bitmapsource2.cpp | |
parent | f57546ec7f9ab116d80044e19aa5e72060dbff09 (diff) |
Add GM to repro crbug.com/472795
This CL also adds a new parameter to SkBitmapSource which gives the user control of the filter quality.
BUG=472795
Review URL: https://codereview.chromium.org/1072603002
Diffstat (limited to 'gm/bitmapsource2.cpp')
-rw-r--r-- | gm/bitmapsource2.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/gm/bitmapsource2.cpp b/gm/bitmapsource2.cpp new file mode 100644 index 0000000000..bc4acf717c --- /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) ); ) + +} |