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