blob: f0cad82ce72d97ba5a4081b6050cabf86fba48ac [file] [log] [blame]
wutao0dc1f4f2017-06-26 15:03:55 -07001/*
2 * Copyright 2017 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 "sk_tool_utils.h"
10#include "SkSurface.h"
11#include "SkBlurImageFilter.h"
12
13static sk_sp<SkSurface> make_surface(SkCanvas* canvas, const SkImageInfo& info) {
14 auto surface = canvas->makeSurface(info);
15 if (!surface) {
16 surface = SkSurface::MakeRaster(info);
17 }
18 return surface;
19}
20
21static sk_sp<SkImage> make_image(SkCanvas* canvas) {
22 SkImageInfo info = SkImageInfo::MakeN32Premul(250, 200);
23 auto surface = make_surface(canvas, info);
24 SkCanvas* c = surface->getCanvas();
25 SkPaint paint;
26 paint.setAntiAlias(true);
27
28 paint.setColor(SK_ColorBLUE);
29 c->drawRect(SkRect::MakeIWH(info.width(), info.height()), paint);
30 paint.setColor(SK_ColorGREEN);
31 c->drawCircle(125, 100, 100, paint);
32 paint.setColor(SK_ColorRED);
33 c->drawRect(SkRect::MakeIWH(80, 80), paint);
34
35 return surface->makeImageSnapshot();
36}
37
38static void draw_image(SkCanvas* canvas, const sk_sp<SkImage> image, sk_sp<SkImageFilter> filter) {
39 SkAutoCanvasRestore acr(canvas, true);
40 SkPaint paint;
41 paint.setImageFilter(std::move(filter));
42
43 canvas->translate(SkIntToScalar(30), 0);
44 canvas->clipRect(SkRect::MakeIWH(image->width(),image->height()));
45 canvas->drawImage(image, 0, 0, &paint);
46}
47
48namespace skiagm {
49
50// This GM draws one rectangle, one green inscribed circle, and one red square
51// with different blur settings.
52class ImageBlurClampModeGM : public GM {
53public:
54 ImageBlurClampModeGM() {
55 this->setBGColor(sk_tool_utils::color_to_565(0xFFCCCCCC));
56 }
57
58protected:
59
60 SkString onShortName() override {
61 return SkString("imageblurclampmode");
62 }
63
64 SkISize onISize() override {
65 return SkISize::Make(850, 920);
66 }
67
wutao039a7c72017-06-30 10:44:45 -070068 bool runAsBench() const override { return true; }
69
wutao0dc1f4f2017-06-26 15:03:55 -070070 void onDraw(SkCanvas* canvas) override {
71 sk_sp<SkImage> image(make_image(canvas));
72
73 canvas->translate(0, 30);
74 // Test different kernel size, including the one to launch 2d Gaussian
75 // blur.
76 for (auto sigma: { 0.6f, 3.0f, 8.0f, 20.0f }) {
77 canvas->save();
wutao039a7c72017-06-30 10:44:45 -070078 sk_sp<SkImageFilter> filter(
79 SkBlurImageFilter::Make(sigma, 0.0f, nullptr, nullptr,
80 SkBlurImageFilter::kClamp_TileMode));
wutao0dc1f4f2017-06-26 15:03:55 -070081 draw_image(canvas, image, std::move(filter));
82 canvas->translate(image->width() + 20, 0);
83
wutao039a7c72017-06-30 10:44:45 -070084 filter = SkBlurImageFilter::Make(0.0f, sigma, nullptr, nullptr,
85 SkBlurImageFilter::kClamp_TileMode);
wutao0dc1f4f2017-06-26 15:03:55 -070086 draw_image(canvas, image, std::move(filter));
87 canvas->translate(image->width() + 20, 0);
88
wutao039a7c72017-06-30 10:44:45 -070089 filter = SkBlurImageFilter::Make(sigma, sigma, nullptr, nullptr,
90 SkBlurImageFilter::kClamp_TileMode);
wutao0dc1f4f2017-06-26 15:03:55 -070091 draw_image(canvas, image, std::move(filter));
92 canvas->translate(image->width() + 20, 0);
93
94 canvas->restore();
95 canvas->translate(0, image->height() + 20);
96 }
97 }
98
99private:
100 typedef GM INHERITED;
101};
102
103//////////////////////////////////////////////////////////////////////////////
104
105DEF_GM(return new ImageBlurClampModeGM;)
106}