diff options
author | senorblanco <senorblanco@chromium.org> | 2016-02-02 18:44:15 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-02 18:44:16 -0800 |
commit | afc7cce5d68663934128d76963cd501f771d71de (patch) | |
tree | b13153dfaeb926a130a946ccf7010b8253f06518 /gm/complexclip_blur_tiled.cpp | |
parent | 67e8bd207261ed4a4b30c4e488a6a2b6baf04d7a (diff) |
Fix for rounded-rect clips with filters.
Don't use the base canvas size to limit raster of complex clips, since
the top canvas size may actually be larger (e.g., a blur filter which
expands the clip bounds to accommodate filter margins). Use the top
canvas bounds instead.
BUG=skia:4879,471212
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1657333002
Review URL: https://codereview.chromium.org/1657333002
Diffstat (limited to 'gm/complexclip_blur_tiled.cpp')
-rw-r--r-- | gm/complexclip_blur_tiled.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/gm/complexclip_blur_tiled.cpp b/gm/complexclip_blur_tiled.cpp new file mode 100644 index 0000000000..aac04167b7 --- /dev/null +++ b/gm/complexclip_blur_tiled.cpp @@ -0,0 +1,76 @@ +/* + * Copyright 2016 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 "SkBlurImageFilter.h" +#include "SkRRect.h" +#include "SkSurface.h" + +#define WIDTH 512 +#define HEIGHT 512 + +namespace skiagm { + +class ComplexClipBlurTiledGM : public GM { +public: + ComplexClipBlurTiledGM() { + } + +protected: + SkString onShortName() override { + return SkString("complexclip_blur_tiled"); + } + + SkISize onISize() override { + return SkISize::Make(WIDTH, HEIGHT); + } + + void onDraw(SkCanvas* canvas) override { + SkPaint blurPaint; + SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(5.0f, 5.0f)); + blurPaint.setImageFilter(blur); + const SkScalar tile_size = SkIntToScalar(128); + SkRect bounds; + if (!canvas->getClipBounds(&bounds)) { + bounds.setEmpty(); + } + int ts = SkScalarCeilToInt(tile_size); + SkImageInfo info = SkImageInfo::MakeN32Premul(ts, ts); + SkAutoTUnref<SkSurface> tileSurface(canvas->newSurface(info)); + if (!tileSurface.get()) { + tileSurface.reset(SkSurface::NewRaster(info)); + } + SkCanvas* tileCanvas = tileSurface->getCanvas(); + for (SkScalar y = bounds.top(); y < bounds.bottom(); y += tile_size) { + for (SkScalar x = bounds.left(); x < bounds.right(); x += tile_size) { + tileCanvas->save(); + tileCanvas->clear(0); + tileCanvas->translate(-x, -y); + SkRect rect = SkRect::MakeWH(WIDTH, HEIGHT); + tileCanvas->saveLayer(&rect, &blurPaint); + SkRRect rrect = SkRRect::MakeRectXY(rect.makeInset(20, 20), 25, 25); + tileCanvas->clipRRect(rrect, SkRegion::kDifference_Op, true); + SkPaint paint; + tileCanvas->drawRect(rect, paint); + tileCanvas->restore(); + tileCanvas->restore(); + SkAutoTUnref<SkImage> tileImage(tileSurface->newImageSnapshot()); + canvas->drawImage(tileImage, x, y); + } + } + } + +private: + typedef GM INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +static GM* MyFactory1(void*) { return new ComplexClipBlurTiledGM(); } +static GMRegistry reg1(MyFactory1); + +} |