2 * Copyright 2015 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
10 #include "SkBlurImageFilter.h"
11 #include "SkColorFilterImageFilter.h"
12 #include "SkModeColorFilter.h"
13 #include "SkMorphologyImageFilter.h"
14 #include "SkOffsetImageFilter.h"
15 #include "SkSurface.h"
17 static sk_sp<SkImage> make_image(SkCanvas* rootCanvas) {
18 SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100);
19 auto surface(rootCanvas->makeSurface(info));
21 surface = SkSurface::MakeRaster(info);
25 paint.setAntiAlias(true);
26 paint.setColor(SK_ColorRED);
27 surface->getCanvas()->drawCircle(50, 50, 50, paint);
28 return surface->makeImageSnapshot();
31 static void show_image(SkCanvas* canvas, SkImage* image, sk_sp<SkImageFilter> filter) {
33 paint.setStyle(SkPaint::kStroke_Style);
34 SkRect r = SkRect::MakeIWH(image->width(), image->height()).makeOutset(SK_ScalarHalf,
36 canvas->drawRect(r, paint);
38 paint.setStyle(SkPaint::kFill_Style);
39 paint.setImageFilter(filter);
40 canvas->drawImage(image, 0, 0, &paint);
43 typedef sk_sp<SkImageFilter> (*ImageFilterFactory)();
45 // +[]{...} did not work on windows (VS)
46 // (ImageFilterFactory)[]{...} did not work on linux (gcc)
47 // hence this cast function
48 template <typename T> ImageFilterFactory IFCCast(T arg) { return arg; }
50 // Show the effect of localmatriximagefilter with various matrices, on various filters
51 DEF_SIMPLE_GM(localmatriximagefilter, canvas, 640, 640) {
52 sk_sp<SkImage> image0(make_image(canvas));
54 const ImageFilterFactory factories[] = {
55 IFCCast([]{ return SkBlurImageFilter::Make(8, 8, nullptr); }),
56 IFCCast([]{ return SkDilateImageFilter::Make(8, 8, nullptr); }),
57 IFCCast([]{ return SkErodeImageFilter::Make(8, 8, nullptr); }),
58 IFCCast([]{ return SkOffsetImageFilter::Make(8, 8, nullptr); }),
61 const SkMatrix matrices[] = {
62 SkMatrix::MakeScale(SK_ScalarHalf, SK_ScalarHalf),
63 SkMatrix::MakeScale(2, 2),
64 SkMatrix::MakeTrans(10, 10)
67 const SkScalar spacer = image0->width() * 3.0f / 2;
69 canvas->translate(40, 40);
70 for (auto&& factory : factories) {
71 sk_sp<SkImageFilter> filter(factory());
74 show_image(canvas, image0.get(), filter);
75 for (const auto& matrix : matrices) {
76 sk_sp<SkImageFilter> localFilter(filter->makeWithLocalMatrix(matrix));
77 canvas->translate(spacer, 0);
78 show_image(canvas, image0.get(), std::move(localFilter));
81 canvas->translate(0, spacer);