blob: 25e4de9711f0c519cd112f3d74dac032d955d392 [file] [log] [blame]
senorblanco@chromium.orgf1369ce2012-08-20 14:53:21 +00001/*
2 * Copyright 2012 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/SkBitmap.h"
10#include "include/core/SkBlendMode.h"
11#include "include/core/SkCanvas.h"
12#include "include/core/SkColor.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "include/core/SkColorFilter.h"
14#include "include/core/SkImage.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040015#include "include/core/SkImageFilter.h"
16#include "include/core/SkPaint.h"
17#include "include/core/SkPoint.h"
18#include "include/core/SkRect.h"
19#include "include/core/SkRefCnt.h"
20#include "include/core/SkScalar.h"
21#include "include/core/SkSize.h"
22#include "include/core/SkString.h"
Michael Ludwig898bbfa2019-08-02 15:21:23 -040023#include "include/effects/SkImageFilters.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040024#include "tools/ToolUtils.h"
25
26#include <utility>
senorblanco@chromium.orgf1369ce2012-08-20 14:53:21 +000027
senorblanco@chromium.orgf1369ce2012-08-20 14:53:21 +000028class ImageFiltersGraphGM : public skiagm::GM {
29public:
commit-bot@chromium.org60c8d242014-05-27 16:28:43 +000030 ImageFiltersGraphGM() {}
senorblanco@chromium.orgf1369ce2012-08-20 14:53:21 +000031
32protected:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +000033
robertphillips943a4622015-09-03 13:32:33 -070034 SkString onShortName() override {
senorblanco@chromium.orgf1369ce2012-08-20 14:53:21 +000035 return SkString("imagefiltersgraph");
36 }
37
senorblancoeae84c22016-01-26 08:41:02 -080038 SkISize onISize() override { return SkISize::Make(600, 150); }
senorblanco@chromium.orgf1369ce2012-08-20 14:53:21 +000039
robertphillips943a4622015-09-03 13:32:33 -070040 void onOnceBeforeDraw() override {
reed9ce9d672016-03-17 10:51:11 -070041 fImage = SkImage::MakeFromBitmap(
Mike Kleinea3f0142019-03-20 11:12:10 -050042 ToolUtils::create_string_bitmap(100, 100, SK_ColorWHITE, 20, 70, 96, "e"));
commit-bot@chromium.org60c8d242014-05-27 16:28:43 +000043 }
44
robertphillips943a4622015-09-03 13:32:33 -070045 void onDraw(SkCanvas* canvas) override {
mtklein871ad7a2015-03-27 12:33:46 -070046 canvas->clear(SK_ColorBLACK);
senorblanco@chromium.org985fa792012-10-24 15:14:26 +000047 {
Michael Ludwig898bbfa2019-08-02 15:21:23 -040048 sk_sp<SkImageFilter> bitmapSource(SkImageFilters::Image(fImage));
Mike Reedb286bc22019-04-08 16:23:20 -040049 sk_sp<SkColorFilter> cf(SkColorFilters::Blend(SK_ColorRED,
Mike Reed7d954ad2016-10-28 15:42:34 -040050 SkBlendMode::kSrcIn));
Michael Ludwig898bbfa2019-08-02 15:21:23 -040051 sk_sp<SkImageFilter> blur(SkImageFilters::Blur(4.0f, 4.0f, std::move(bitmapSource)));
52 sk_sp<SkImageFilter> erode(SkImageFilters::Erode(4, 4, blur));
53 sk_sp<SkImageFilter> color(SkImageFilters::ColorFilter(std::move(cf),
robertphillips5605b562016-04-05 11:50:42 -070054 std::move(erode)));
Michael Ludwig898bbfa2019-08-02 15:21:23 -040055 sk_sp<SkImageFilter> merge(SkImageFilters::Merge(blur, color));
rmistry@google.comae933ce2012-08-23 18:19:56 +000056
senorblanco@chromium.org985fa792012-10-24 15:14:26 +000057 SkPaint paint;
robertphillips2238c9d2016-03-30 13:34:16 -070058 paint.setImageFilter(std::move(merge));
senorblanco@chromium.org985fa792012-10-24 15:14:26 +000059 canvas->drawPaint(paint);
senorblanco@chromium.org34a849d2013-10-24 15:59:31 +000060 canvas->translate(SkIntToScalar(100), 0);
senorblanco@chromium.org985fa792012-10-24 15:14:26 +000061 }
62 {
Michael Ludwig898bbfa2019-08-02 15:21:23 -040063 sk_sp<SkImageFilter> morph(SkImageFilters::Dilate(5, 5, nullptr));
senorblanco@chromium.orgf1369ce2012-08-20 14:53:21 +000064
Mike Reede869a1e2019-04-30 12:18:54 -040065 float matrix[20] = { 1, 0, 0, 0, 0,
66 0, 1, 0, 0, 0,
67 0, 0, 1, 0, 0,
68 0, 0, 0, 0.5f, 0 };
senorblanco@chromium.orgf1369ce2012-08-20 14:53:21 +000069
Mike Reede869a1e2019-04-30 12:18:54 -040070 sk_sp<SkColorFilter> matrixFilter(SkColorFilters::Matrix(matrix));
Michael Ludwig898bbfa2019-08-02 15:21:23 -040071 sk_sp<SkImageFilter> colorMorph(SkImageFilters::ColorFilter(std::move(matrixFilter),
robertphillips5605b562016-04-05 11:50:42 -070072 std::move(morph)));
senorblanco@chromium.org985fa792012-10-24 15:14:26 +000073 SkPaint paint;
Michael Ludwig898bbfa2019-08-02 15:21:23 -040074 paint.setImageFilter(SkImageFilters::Xfermode(SkBlendMode::kSrcOver,
75 std::move(colorMorph)));
reedcfb6bdf2016-03-29 11:32:50 -070076
reed9ce9d672016-03-17 10:51:11 -070077 DrawClippedImage(canvas, fImage.get(), paint);
senorblanco@chromium.org34a849d2013-10-24 15:59:31 +000078 canvas->translate(SkIntToScalar(100), 0);
senorblanco@chromium.org985fa792012-10-24 15:14:26 +000079 }
commit-bot@chromium.orgbbfe4542013-10-24 01:46:11 +000080 {
Mike Reede869a1e2019-04-30 12:18:54 -040081 float matrix[20] = { 1, 0, 0, 0, 0,
82 0, 1, 0, 0, 0,
83 0, 0, 1, 0, 0,
84 0, 0, 0, 0.5f, 0 };
85 sk_sp<SkColorFilter> matrixCF(SkColorFilters::Matrix(matrix));
Michael Ludwig898bbfa2019-08-02 15:21:23 -040086 sk_sp<SkImageFilter> matrixFilter(SkImageFilters::ColorFilter(std::move(matrixCF),
robertphillips5605b562016-04-05 11:50:42 -070087 nullptr));
Michael Ludwig898bbfa2019-08-02 15:21:23 -040088 sk_sp<SkImageFilter> offsetFilter(SkImageFilters::Offset(10.0f, 10.f, matrixFilter));
commit-bot@chromium.orgbbfe4542013-10-24 01:46:11 +000089
commit-bot@chromium.orgbbfe4542013-10-24 01:46:11 +000090 SkPaint paint;
Michael Ludwig898bbfa2019-08-02 15:21:23 -040091 paint.setImageFilter(SkImageFilters::Arithmetic(
Brian Salomon89cb8212017-01-09 10:48:23 -050092 0, 1, 1, 0, true, std::move(matrixFilter), std::move(offsetFilter), nullptr));
reedcfb6bdf2016-03-29 11:32:50 -070093
reed9ce9d672016-03-17 10:51:11 -070094 DrawClippedImage(canvas, fImage.get(), paint);
senorblanco@chromium.org34a849d2013-10-24 15:59:31 +000095 canvas->translate(SkIntToScalar(100), 0);
96 }
97 {
Michael Ludwig898bbfa2019-08-02 15:21:23 -040098 sk_sp<SkImageFilter> blur(SkImageFilters::Blur(10, 10, nullptr));
senorblanco@chromium.org34a849d2013-10-24 15:59:31 +000099
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400100 SkIRect cropRect = SkIRect::MakeWH(95, 100);
senorblanco@chromium.org34a849d2013-10-24 15:59:31 +0000101 SkPaint paint;
reedcfb6bdf2016-03-29 11:32:50 -0700102 paint.setImageFilter(
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400103 SkImageFilters::Xfermode(SkBlendMode::kSrcIn, std::move(blur), nullptr, &cropRect));
reed9ce9d672016-03-17 10:51:11 -0700104 DrawClippedImage(canvas, fImage.get(), paint);
senorblanco@chromium.org34a849d2013-10-24 15:59:31 +0000105 canvas->translate(SkIntToScalar(100), 0);
commit-bot@chromium.orgbbfe4542013-10-24 01:46:11 +0000106 }
senorblanco@chromium.org6776b822014-01-03 21:48:22 +0000107 {
senorblancoeae84c22016-01-26 08:41:02 -0800108 // Dilate -> matrix convolution.
109 // This tests that a filter using asFragmentProcessor (matrix
110 // convolution) correctly handles a non-zero source offset
111 // (supplied by the dilate).
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400112 sk_sp<SkImageFilter> dilate(SkImageFilters::Dilate(5, 5, nullptr));
senorblancoeae84c22016-01-26 08:41:02 -0800113
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400114 SkScalar kernel[9] = { -1, -1, -1,
115 -1, 7, -1,
116 -1, -1, -1 };
senorblancoeae84c22016-01-26 08:41:02 -0800117 SkISize kernelSize = SkISize::Make(3, 3);
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400118 SkScalar gain = 1.0f, bias = 0;
senorblancoeae84c22016-01-26 08:41:02 -0800119 SkIPoint kernelOffset = SkIPoint::Make(1, 1);
senorblancoeae84c22016-01-26 08:41:02 -0800120 bool convolveAlpha = false;
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400121 sk_sp<SkImageFilter> convolve(SkImageFilters::MatrixConvolution(
122 kernelSize, kernel, gain, bias, kernelOffset, SkTileMode::kClamp, convolveAlpha,
123 std::move(dilate)));
senorblancoeae84c22016-01-26 08:41:02 -0800124
125 SkPaint paint;
robertphillipsfc11b0a2016-04-05 09:09:36 -0700126 paint.setImageFilter(std::move(convolve));
reed9ce9d672016-03-17 10:51:11 -0700127 DrawClippedImage(canvas, fImage.get(), paint);
senorblancoeae84c22016-01-26 08:41:02 -0800128 canvas->translate(SkIntToScalar(100), 0);
129 }
130 {
senorblanco@chromium.org6776b822014-01-03 21:48:22 +0000131 // Test that crop offsets are absolute, not relative to the parent's crop rect.
Mike Reedb286bc22019-04-08 16:23:20 -0400132 sk_sp<SkColorFilter> cf1(SkColorFilters::Blend(SK_ColorBLUE, SkBlendMode::kSrcIn));
133 sk_sp<SkColorFilter> cf2(SkColorFilters::Blend(SK_ColorGREEN, SkBlendMode::kSrcIn));
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400134 SkIRect outerRect = SkIRect::MakeXYWH(10, 10, 80, 80);
135 SkIRect innerRect= SkIRect::MakeXYWH(20, 20, 60, 60);
136 sk_sp<SkImageFilter> color1(SkImageFilters::ColorFilter(
137 std::move(cf1), nullptr, &outerRect));
138 sk_sp<SkImageFilter> color2(SkImageFilters::ColorFilter(
139 std::move(cf2), std::move(color1), &innerRect));
senorblanco@chromium.org6776b822014-01-03 21:48:22 +0000140
141 SkPaint paint;
robertphillipsfc11b0a2016-04-05 09:09:36 -0700142 paint.setImageFilter(std::move(color2));
mtklein871ad7a2015-03-27 12:33:46 -0700143 paint.setColor(SK_ColorRED);
senorblanco@chromium.org6776b822014-01-03 21:48:22 +0000144 canvas->drawRect(SkRect::MakeXYWH(0, 0, 100, 100), paint);
145 canvas->translate(SkIntToScalar(100), 0);
146 }
senorblanco@chromium.orgf1369ce2012-08-20 14:53:21 +0000147 }
148
149private:
fmalita5598b632015-09-15 11:26:13 -0700150 static void DrawClippedImage(SkCanvas* canvas, const SkImage* image, const SkPaint& paint) {
151 canvas->save();
152 canvas->clipRect(SkRect::MakeIWH(image->width(), image->height()));
153 canvas->drawImage(image, 0, 0, &paint);
154 canvas->restore();
155 }
156
reed9ce9d672016-03-17 10:51:11 -0700157 sk_sp<SkImage> fImage;
fmalita5598b632015-09-15 11:26:13 -0700158
senorblanco@chromium.orgf1369ce2012-08-20 14:53:21 +0000159 typedef GM INHERITED;
senorblanco@chromium.orgf1369ce2012-08-20 14:53:21 +0000160};
161
162///////////////////////////////////////////////////////////////////////////////
163
robertphillips943a4622015-09-03 13:32:33 -0700164DEF_GM(return new ImageFiltersGraphGM;)