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