diff options
author | robertphillips <robertphillips@google.com> | 2015-06-02 10:52:43 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-06-02 10:52:43 -0700 |
commit | 05be93bbdf09576f7903130e3b106b0a8c7c4b4e (patch) | |
tree | 1e94f845fda357453a25d6195d905fea1d13116c /gm/bigtileimagefilter.cpp | |
parent | 91284caa23274d2336884913bc7806745071bd72 (diff) |
Fix dst bound reported by SkTileImageFilter
In the example from the bug we had the filter DAG:
color filter (table)
0: xfermode filter (arith)
0: tile filter [0,80,34,114] -> [0,80,800,480]
0: color filter (table)
0: bitmap src 34x34 -> [0,80,34,114]
1: color filter (table)
0: picture filter [0, 80, 800, 480]
computeFastBounds was coming out of the DAG with a bound of [0,80,34,114] which didn't represent the pixels that would be drawn.
This CL updates SkTileImageFilter to correctly set the bound for the pixels it will hit.
BUG=493783
Review URL: https://codereview.chromium.org/1152553006
Diffstat (limited to 'gm/bigtileimagefilter.cpp')
-rw-r--r-- | gm/bigtileimagefilter.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/gm/bigtileimagefilter.cpp b/gm/bigtileimagefilter.cpp new file mode 100644 index 0000000000..97de0d2042 --- /dev/null +++ b/gm/bigtileimagefilter.cpp @@ -0,0 +1,76 @@ +/* + * 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 "SkBitmapSource.h" +#include "SkTileImageFilter.h" +#include "gm.h" + +namespace skiagm { + +class BigTileImageFilterGM : public GM { +public: + BigTileImageFilterGM() { + this->setBGColor(0xFF000000); + } + +protected: + + SkString onShortName() override { + return SkString("bigtileimagefilter"); + } + + SkISize onISize() override{ + return SkISize::Make(kWidth, kHeight); + } + + void onOnceBeforeDraw() override { + fBitmap.allocN32Pixels(kBitmapSize, kBitmapSize); + + SkCanvas canvas(fBitmap); + canvas.clear(0xFF000000); + + SkPaint paint; + paint.setColor(SK_ColorRED); + paint.setStrokeWidth(3); + paint.setStyle(SkPaint::kStroke_Style); + + canvas.drawCircle(SkScalarHalf(kBitmapSize), SkScalarHalf(kBitmapSize), + SkScalarHalf(kBitmapSize), paint); + } + + void onDraw(SkCanvas* canvas) override { + canvas->clear(SK_ColorBLACK); + + SkPaint p; + + SkAutoTUnref<SkBitmapSource> bms(SkBitmapSource::Create(fBitmap)); + SkAutoTUnref<SkTileImageFilter> tif(SkTileImageFilter::Create( + SkRect::MakeWH(SkIntToScalar(kBitmapSize), SkIntToScalar(kBitmapSize)), + SkRect::MakeWH(SkIntToScalar(kWidth), SkIntToScalar(kHeight)), + bms)); + p.setImageFilter(tif); + + SkRect bound = SkRect::MakeWH(SkIntToScalar(kWidth), SkIntToScalar(kHeight)); + canvas->saveLayer(&bound, &p); + canvas->restore(); + } + +private: + static const int kWidth = 512; + static const int kHeight = 512; + static const int kBitmapSize = 64; + + SkBitmap fBitmap; + + typedef GM INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +DEF_GM( return SkNEW(BigTileImageFilterGM); ) + +} |