/* * 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" #include "SkClipOpPriv.h" #include "sk_tool_utils.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; blurPaint.setImageFilter(SkBlurImageFilter::Make(5.0f, 5.0f, nullptr)); const SkScalar tileSize = SkIntToScalar(128); SkRect bounds = canvas->getLocalClipBounds(); int ts = SkScalarCeilToInt(tileSize); SkImageInfo info = SkImageInfo::MakeN32Premul(ts, ts); auto tileSurface(sk_tool_utils::makeSurface(canvas, info)); SkCanvas* tileCanvas = tileSurface->getCanvas(); for (SkScalar y = bounds.top(); y < bounds.bottom(); y += tileSize) { for (SkScalar x = bounds.left(); x < bounds.right(); x += tileSize) { 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, kDifference_SkClipOp, true); SkPaint paint; tileCanvas->drawRect(rect, paint); tileCanvas->restore(); tileCanvas->restore(); canvas->drawImage(tileSurface->makeImageSnapshot().get(), x, y); } } } private: typedef GM INHERITED; }; ////////////////////////////////////////////////////////////////////////////// DEF_GM(return new ComplexClipBlurTiledGM;) }