blob: 8e710cda095021669b6e7780edd6d792529b3349 [file] [log] [blame]
senorblancoafc7cce2016-02-02 18:44:15 -08001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkCanvas.h"
10#include "include/core/SkImageFilter.h"
11#include "include/core/SkImageInfo.h"
12#include "include/core/SkPaint.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "include/core/SkRRect.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040014#include "include/core/SkRect.h"
15#include "include/core/SkRefCnt.h"
16#include "include/core/SkScalar.h"
17#include "include/core/SkSize.h"
18#include "include/core/SkString.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050019#include "include/core/SkSurface.h"
Michael Ludwig898bbfa2019-08-02 15:21:23 -040020#include "include/effects/SkImageFilters.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050021#include "tools/ToolUtils.h"
senorblancoafc7cce2016-02-02 18:44:15 -080022
23#define WIDTH 512
24#define HEIGHT 512
25
26namespace skiagm {
27
28class ComplexClipBlurTiledGM : public GM {
29public:
30 ComplexClipBlurTiledGM() {
31 }
32
33protected:
34 SkString onShortName() override {
35 return SkString("complexclip_blur_tiled");
36 }
37
38 SkISize onISize() override {
39 return SkISize::Make(WIDTH, HEIGHT);
40 }
41
42 void onDraw(SkCanvas* canvas) override {
43 SkPaint blurPaint;
Michael Ludwig898bbfa2019-08-02 15:21:23 -040044 blurPaint.setImageFilter(SkImageFilters::Blur(5.0f, 5.0f, nullptr));
robertphillips6e7025a2016-04-04 04:31:25 -070045 const SkScalar tileSize = SkIntToScalar(128);
Mike Reed918e1442017-01-23 11:39:45 -050046 SkRect bounds = canvas->getLocalClipBounds();
robertphillips6e7025a2016-04-04 04:31:25 -070047 int ts = SkScalarCeilToInt(tileSize);
senorblancoafc7cce2016-02-02 18:44:15 -080048 SkImageInfo info = SkImageInfo::MakeN32Premul(ts, ts);
Mike Kleinea3f0142019-03-20 11:12:10 -050049 auto tileSurface(ToolUtils::makeSurface(canvas, info));
senorblancoafc7cce2016-02-02 18:44:15 -080050 SkCanvas* tileCanvas = tileSurface->getCanvas();
robertphillips6e7025a2016-04-04 04:31:25 -070051 for (SkScalar y = bounds.top(); y < bounds.bottom(); y += tileSize) {
52 for (SkScalar x = bounds.left(); x < bounds.right(); x += tileSize) {
senorblancoafc7cce2016-02-02 18:44:15 -080053 tileCanvas->save();
54 tileCanvas->clear(0);
55 tileCanvas->translate(-x, -y);
56 SkRect rect = SkRect::MakeWH(WIDTH, HEIGHT);
57 tileCanvas->saveLayer(&rect, &blurPaint);
58 SkRRect rrect = SkRRect::MakeRectXY(rect.makeInset(20, 20), 25, 25);
Michael Ludwig2f6e2f82021-08-03 13:08:50 -040059 tileCanvas->clipRRect(rrect, SkClipOp::kDifference, true);
senorblancoafc7cce2016-02-02 18:44:15 -080060 SkPaint paint;
61 tileCanvas->drawRect(rect, paint);
62 tileCanvas->restore();
63 tileCanvas->restore();
reed9ce9d672016-03-17 10:51:11 -070064 canvas->drawImage(tileSurface->makeImageSnapshot().get(), x, y);
senorblancoafc7cce2016-02-02 18:44:15 -080065 }
66 }
67 }
68
69private:
John Stiles7571f9e2020-09-02 22:42:33 -040070 using INHERITED = GM;
senorblancoafc7cce2016-02-02 18:44:15 -080071};
72
73//////////////////////////////////////////////////////////////////////////////
74
robertphillips6e7025a2016-04-04 04:31:25 -070075DEF_GM(return new ComplexClipBlurTiledGM;)
senorblancoafc7cce2016-02-02 18:44:15 -080076
John Stilesa6841be2020-08-06 14:11:56 -040077} // namespace skiagm