1 /*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "gm.h"
9 #include "SkBlurImageFilter.h"
10 #include "SkRRect.h"
11 #include "SkSurface.h"
12
13 #define WIDTH 512
14 #define HEIGHT 512
15
16 namespace skiagm {
17
18 class ComplexClipBlurTiledGM : public GM {
19 public:
ComplexClipBlurTiledGM()20 ComplexClipBlurTiledGM() {
21 }
22
23 protected:
onShortName()24 SkString onShortName() override {
25 return SkString("complexclip_blur_tiled");
26 }
27
onISize()28 SkISize onISize() override {
29 return SkISize::Make(WIDTH, HEIGHT);
30 }
31
onDraw(SkCanvas * canvas)32 void onDraw(SkCanvas* canvas) override {
33 SkPaint blurPaint;
34 SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(5.0f, 5.0f));
35 blurPaint.setImageFilter(blur);
36 const SkScalar tile_size = SkIntToScalar(128);
37 SkRect bounds;
38 if (!canvas->getClipBounds(&bounds)) {
39 bounds.setEmpty();
40 }
41 int ts = SkScalarCeilToInt(tile_size);
42 SkImageInfo info = SkImageInfo::MakeN32Premul(ts, ts);
43 SkAutoTUnref<SkSurface> tileSurface(canvas->newSurface(info));
44 if (!tileSurface.get()) {
45 tileSurface.reset(SkSurface::NewRaster(info));
46 }
47 SkCanvas* tileCanvas = tileSurface->getCanvas();
48 for (SkScalar y = bounds.top(); y < bounds.bottom(); y += tile_size) {
49 for (SkScalar x = bounds.left(); x < bounds.right(); x += tile_size) {
50 tileCanvas->save();
51 tileCanvas->clear(0);
52 tileCanvas->translate(-x, -y);
53 SkRect rect = SkRect::MakeWH(WIDTH, HEIGHT);
54 tileCanvas->saveLayer(&rect, &blurPaint);
55 SkRRect rrect = SkRRect::MakeRectXY(rect.makeInset(20, 20), 25, 25);
56 tileCanvas->clipRRect(rrect, SkRegion::kDifference_Op, true);
57 SkPaint paint;
58 tileCanvas->drawRect(rect, paint);
59 tileCanvas->restore();
60 tileCanvas->restore();
61 SkAutoTUnref<SkImage> tileImage(tileSurface->newImageSnapshot());
62 canvas->drawImage(tileImage, x, y);
63 }
64 }
65 }
66
67 private:
68 typedef GM INHERITED;
69 };
70
71 //////////////////////////////////////////////////////////////////////////////
72
MyFactory1(void *)73 static GM* MyFactory1(void*) { return new ComplexClipBlurTiledGM(); }
74 static GMRegistry reg1(MyFactory1);
75
76 }
77