blob: 19dee85b58409ad310484e1a96f98fce57960c2a [file] [log] [blame]
senorblanco20311d42015-10-14 04:53:31 -07001/*
2 * Copyright 2015 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"
9#include "include/core/SkCanvas.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040010#include "include/core/SkColor.h"
11#include "include/core/SkImage.h"
12#include "include/core/SkImageFilter.h"
13#include "include/core/SkImageInfo.h"
14#include "include/core/SkMatrix.h"
15#include "include/core/SkPaint.h"
16#include "include/core/SkRect.h"
17#include "include/core/SkRefCnt.h"
18#include "include/core/SkScalar.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050019#include "include/core/SkSurface.h"
20#include "include/effects/SkBlurImageFilter.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050021#include "include/effects/SkMorphologyImageFilter.h"
22#include "include/effects/SkOffsetImageFilter.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050023#include "tools/ToolUtils.h"
senorblanco20311d42015-10-14 04:53:31 -070024
Ben Wagner7fde8e12019-05-01 17:28:53 -040025#include <utility>
26
reed9ce9d672016-03-17 10:51:11 -070027static sk_sp<SkImage> make_image(SkCanvas* rootCanvas) {
senorblanco20311d42015-10-14 04:53:31 -070028 SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100);
Mike Kleinea3f0142019-03-20 11:12:10 -050029 auto surface(ToolUtils::makeSurface(rootCanvas, info));
senorblanco20311d42015-10-14 04:53:31 -070030
31 SkPaint paint;
32 paint.setAntiAlias(true);
33 paint.setColor(SK_ColorRED);
34 surface->getCanvas()->drawCircle(50, 50, 50, paint);
reed9ce9d672016-03-17 10:51:11 -070035 return surface->makeImageSnapshot();
senorblanco20311d42015-10-14 04:53:31 -070036}
37
Stephen White930f69e2017-01-12 17:15:50 -050038static void show_image(SkCanvas* canvas, SkImage* image, sk_sp<SkImageFilter> filter) {
39 SkPaint paint;
40 paint.setStyle(SkPaint::kStroke_Style);
41 SkRect r = SkRect::MakeIWH(image->width(), image->height()).makeOutset(SK_ScalarHalf,
42 SK_ScalarHalf);
43 canvas->drawRect(r, paint);
44
45 paint.setStyle(SkPaint::kFill_Style);
46 paint.setImageFilter(filter);
47 canvas->drawImage(image, 0, 0, &paint);
48}
49
robertphillipsfc11b0a2016-04-05 09:09:36 -070050typedef sk_sp<SkImageFilter> (*ImageFilterFactory)();
senorblanco20311d42015-10-14 04:53:31 -070051
52// +[]{...} did not work on windows (VS)
53// (ImageFilterFactory)[]{...} did not work on linux (gcc)
54// hence this cast function
55template <typename T> ImageFilterFactory IFCCast(T arg) { return arg; }
56
57// Show the effect of localmatriximagefilter with various matrices, on various filters
Stephen White930f69e2017-01-12 17:15:50 -050058DEF_SIMPLE_GM(localmatriximagefilter, canvas, 640, 640) {
59 sk_sp<SkImage> image0(make_image(canvas));
senorblanco20311d42015-10-14 04:53:31 -070060
Stephen White930f69e2017-01-12 17:15:50 -050061 const ImageFilterFactory factories[] = {
62 IFCCast([]{ return SkBlurImageFilter::Make(8, 8, nullptr); }),
63 IFCCast([]{ return SkDilateImageFilter::Make(8, 8, nullptr); }),
64 IFCCast([]{ return SkErodeImageFilter::Make(8, 8, nullptr); }),
65 IFCCast([]{ return SkOffsetImageFilter::Make(8, 8, nullptr); }),
66 };
senorblanco20311d42015-10-14 04:53:31 -070067
Stephen White930f69e2017-01-12 17:15:50 -050068 const SkMatrix matrices[] = {
69 SkMatrix::MakeScale(SK_ScalarHalf, SK_ScalarHalf),
70 SkMatrix::MakeScale(2, 2),
71 SkMatrix::MakeTrans(10, 10)
72 };
senorblanco20311d42015-10-14 04:53:31 -070073
Stephen White930f69e2017-01-12 17:15:50 -050074 const SkScalar spacer = image0->width() * 3.0f / 2;
senorblanco20311d42015-10-14 04:53:31 -070075
Stephen White930f69e2017-01-12 17:15:50 -050076 canvas->translate(40, 40);
77 for (auto&& factory : factories) {
78 sk_sp<SkImageFilter> filter(factory());
senorblanco20311d42015-10-14 04:53:31 -070079
Stephen White930f69e2017-01-12 17:15:50 -050080 canvas->save();
81 show_image(canvas, image0.get(), filter);
82 for (const auto& matrix : matrices) {
83 sk_sp<SkImageFilter> localFilter(filter->makeWithLocalMatrix(matrix));
84 canvas->translate(spacer, 0);
85 show_image(canvas, image0.get(), std::move(localFilter));
senorblanco20311d42015-10-14 04:53:31 -070086 }
Stephen White930f69e2017-01-12 17:15:50 -050087 canvas->restore();
88 canvas->translate(0, spacer);
senorblanco20311d42015-10-14 04:53:31 -070089 }
Stephen White930f69e2017-01-12 17:15:50 -050090}