| Index: gm/complexclip_blur_tiled.cpp
|
| diff --git a/gm/complexclip_blur_tiled.cpp b/gm/complexclip_blur_tiled.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..aac04167b7b0a0f28c390e08c727e5550c489cc3
|
| --- /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);
|
| +
|
| +}
|
|
|