Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
colorfilterimagefilter.cpp
Go to the documentation of this file.
1/*
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
8#include "gm/gm.h"
17#include "include/core/SkRect.h"
27#include "tools/DecodeUtils.h"
28#include "tools/Resources.h"
29
30#include <string.h>
31#include <utility>
32
33using namespace skia_private;
34
35#define FILTER_WIDTH SkIntToScalar(30)
36#define FILTER_HEIGHT SkIntToScalar(30)
37#define MARGIN SkIntToScalar(10)
38
39static sk_sp<SkColorFilter> cf_make_brightness(float brightness) {
40 float matrix[20] = {
41 1, 0, 0, 0, brightness,
42 0, 1, 0, 0, brightness,
43 0, 0, 1, 0, brightness,
44 0, 0, 0, 1, 0 };
45 return SkColorFilters::Matrix(matrix);
46}
47
49 float matrix[20];
50 memset(matrix, 0, 20 * sizeof(float));
51 matrix[0] = matrix[5] = matrix[10] = 0.2126f;
52 matrix[1] = matrix[6] = matrix[11] = 0.7152f;
53 matrix[2] = matrix[7] = matrix[12] = 0.0722f;
54 matrix[18] = 1.0f;
55 return SkColorFilters::Matrix(matrix);
56}
57
61
63 array->push_back(cf_make_brightness(0.5f));
64 array->push_back(cf_make_grayscale());
65 array->push_back(cf_make_colorize(SK_ColorBLUE));
66}
67
68///////////////////////////////////////////////////////////////////////////////////////////////////
69
71 const SkPoint pts[] = { { 0, 0 }, { 100, 100 } };
72 const SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };
73 return SkGradientShader::MakeLinear(pts, colors, nullptr, 3, SkTileMode::kRepeat);
74}
75
77 const SkPoint pts[] = { { 0, 0 }, { 100, 100 } };
78 const SkColor colors[] = { SK_ColorRED, 0x0000FF00, SK_ColorBLUE };
79 return SkGradientShader::MakeLinear(pts, colors, nullptr, 3, SkTileMode::kRepeat);
80}
81
83 sk_sp<SkImage> image(ToolUtils::GetResourceAsImage("images/mandrill_128.png"));
84 if (!image) {
85 return nullptr;
86 }
88}
89
91 if (auto shader = sh_make_lineargradient0()) {
92 array->push_back(std::move(shader));
93 }
94 if (auto shader = sh_make_lineargradient1()) {
95 array->push_back(std::move(shader));
96 }
97 if (auto shader = sh_make_image()) {
98 array->push_back(std::move(shader));
99 }
100}
101
102///////////////////////////////////////////////////////////////////////////////////////////////////
103
105 return SkImageFilters::Blur(amount, amount, std::move(input));
106}
107
109 return SkImageFilters::ColorFilter(cf_make_brightness(amount), std::move(input));
110}
111
115
119
120static void draw_clipped_rect(SkCanvas* canvas,
121 const SkRect& r,
122 const SkPaint& paint,
123 float outset = 0.0f) {
124 canvas->save();
125 SkRect clip(r);
126 clip.outset(outset, outset);
127 canvas->clipRect(clip);
128 canvas->drawRect(r, paint);
129 canvas->restore();
130}
131
132DEF_SIMPLE_GM(colorfilterimagefilter, canvas, 400, 100){
135 paint.setColor(SK_ColorRED);
136 canvas->save();
137 for (float brightness = -1.0f; brightness <= 1.0f; brightness += 0.2f) {
138 sk_sp<SkImageFilter> dim(make_brightness(-brightness, nullptr));
139 sk_sp<SkImageFilter> bright(make_brightness(brightness, std::move(dim)));
140 paint.setImageFilter(std::move(bright));
141 draw_clipped_rect(canvas, r, paint);
142 canvas->translate(FILTER_WIDTH + MARGIN, 0);
143 }
144 canvas->restore();
145 canvas->translate(0, FILTER_HEIGHT + MARGIN);
146 {
147 sk_sp<SkImageFilter> brightness(make_brightness(0.9f, nullptr));
148 sk_sp<SkImageFilter> grayscale(make_grayscale(std::move(brightness)));
149 paint.setImageFilter(std::move(grayscale));
150 draw_clipped_rect(canvas, r, paint);
151 canvas->translate(FILTER_WIDTH + MARGIN, 0);
152 }
153 {
154 sk_sp<SkImageFilter> grayscale(make_grayscale(nullptr));
155 sk_sp<SkImageFilter> brightness(make_brightness(0.9f, std::move(grayscale)));
156 paint.setImageFilter(std::move(brightness));
157 draw_clipped_rect(canvas, r, paint);
158 canvas->translate(FILTER_WIDTH + MARGIN, 0);
159 }
160 {
162 sk_sp<SkImageFilter> brightness(make_brightness(1.0f, std::move(blue)));
163 paint.setImageFilter(std::move(brightness));
164 draw_clipped_rect(canvas, r, paint);
165 canvas->translate(FILTER_WIDTH + MARGIN, 0);
166 }
167 {
168 sk_sp<SkImageFilter> brightness(make_brightness(1.0f, nullptr));
169 sk_sp<SkImageFilter> blue(make_mode_blue(std::move(brightness)));
170 paint.setImageFilter(std::move(blue));
171 draw_clipped_rect(canvas, r, paint);
172 canvas->translate(FILTER_WIDTH + MARGIN, 0);
173 }
174 {
175 sk_sp<SkImageFilter> blur(make_blur(3.0f, nullptr));
176 sk_sp<SkImageFilter> brightness(make_brightness(0.5f, std::move(blur)));
177 paint.setImageFilter(std::move(brightness));
178 draw_clipped_rect(canvas, r, paint, 3);
179 canvas->translate(FILTER_WIDTH + MARGIN, 0);
180 }
181 {
183 paint.setImageFilter(std::move(blue));
184 draw_clipped_rect(canvas, r, paint, 5);
185 canvas->translate(FILTER_WIDTH + MARGIN, 0);
186 }
187}
188
189DEF_SIMPLE_GM(colorfilterimagefilter_layer, canvas, 32, 32) {
190 SkAutoCanvasRestore autoCanvasRestore(canvas, false);
191 SkColorMatrix cm;
192 cm.setSaturation(0.0f);
194 SkPaint p;
195 p.setImageFilter(SkImageFilters::ColorFilter(std::move(cf), nullptr));
196 canvas->saveLayer(nullptr, &p);
197 canvas->clear(SK_ColorRED);
198}
199
200///////////////////////////////////////////////////////////////////////////////////////////////////
201DEF_SIMPLE_GM(colorfiltershader, canvas, 610, 610) {
203 sk_gm_get_colorfilters(&filters);
204
205 TArray<sk_sp<SkShader>> shaders;
206 sk_gm_get_shaders(&shaders);
207
208 const SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
210 {0, 0}, 50, {0, 0}, 150, colors, nullptr, 2, SkTileMode::kClamp));
211
213 SkRect r = SkRect::MakeWH(120, 120);
214
215 canvas->translate(20, 20);
216 for (int y = 0; y < SkToInt(shaders.size()); ++y) {
217 SkShader* shader = shaders[y].get();
218
219 canvas->save();
220 for (int x = -1; x < filters.size(); ++x) {
221 sk_sp<SkColorFilter> filter = x >= 0 ? filters[x] : nullptr;
222
223 paint.setShader(shader->makeWithColorFilter(filter));
224 canvas->drawRect(r, paint);
225 canvas->translate(150, 0);
226 }
227 canvas->restore();
228 canvas->translate(0, 150);
229 }
230}
static const int outset
Definition BlurTest.cpp:58
static sk_sp< SkColorFilter > make_grayscale()
SkColor4f color
uint32_t SkColor
Definition SkColor.h:37
constexpr SkColor SK_ColorBLUE
Definition SkColor.h:135
constexpr SkColor SK_ColorRED
Definition SkColor.h:126
constexpr SkColor SK_ColorGREEN
Definition SkColor.h:131
static SkPath clip(const SkPath &path, const SkHalfPlane &plane)
Definition SkPath.cpp:3824
constexpr int SkToInt(S x)
Definition SkTo.h:29
void drawRect(const SkRect &rect, const SkPaint &paint)
void clipRect(const SkRect &rect, SkClipOp op, bool doAntiAlias)
void restore()
Definition SkCanvas.cpp:465
int save()
Definition SkCanvas.cpp:451
static sk_sp< SkColorFilter > Blend(const SkColor4f &c, sk_sp< SkColorSpace >, SkBlendMode mode)
static sk_sp< SkColorFilter > Matrix(const SkColorMatrix &)
void setSaturation(float sat)
static sk_sp< SkShader > MakeTwoPointConical(const SkPoint &start, SkScalar startRadius, const SkPoint &end, SkScalar endRadius, const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
static sk_sp< SkShader > MakeLinear(const SkPoint pts[2], const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
static sk_sp< SkImageFilter > ColorFilter(sk_sp< SkColorFilter > cf, sk_sp< SkImageFilter > input, const CropRect &cropRect={})
static sk_sp< SkImageFilter > Blur(SkScalar sigmaX, SkScalar sigmaY, SkTileMode tileMode, sk_sp< SkImageFilter > input, const CropRect &cropRect={})
sk_sp< SkShader > makeShader(SkTileMode tmx, SkTileMode tmy, const SkSamplingOptions &, const SkMatrix *localMatrix=nullptr) const
Definition SkImage.cpp:179
sk_sp< SkShader > makeWithColorFilter(sk_sp< SkColorFilter >) const
Definition SkShader.cpp:43
int size() const
Definition SkTArray.h:416
const Paint & paint
#define FILTER_HEIGHT
#define FILTER_WIDTH
static sk_sp< SkImageFilter > make_mode_blue(sk_sp< SkImageFilter > input)
static void draw_clipped_rect(SkCanvas *canvas, const SkRect &r, const SkPaint &paint, float outset=0.0f)
static sk_sp< SkShader > sh_make_lineargradient1()
static sk_sp< SkImageFilter > make_brightness(float amount, sk_sp< SkImageFilter > input)
static sk_sp< SkShader > sh_make_image()
static void sk_gm_get_shaders(TArray< sk_sp< SkShader > > *array)
static sk_sp< SkColorFilter > cf_make_colorize(SkColor color)
static sk_sp< SkShader > sh_make_lineargradient0()
static sk_sp< SkImageFilter > make_blur(float amount, sk_sp< SkImageFilter > input)
static sk_sp< SkColorFilter > cf_make_grayscale()
#define MARGIN
static sk_sp< SkColorFilter > cf_make_brightness(float brightness)
static void sk_gm_get_colorfilters(TArray< sk_sp< SkColorFilter > > *array)
sk_sp< SkImage > image
Definition examples.cpp:29
#define DEF_SIMPLE_GM(NAME, CANVAS, W, H)
Definition gm.h:50
double y
double x
sk_sp< SkImage > GetResourceAsImage(const char *resource)
Definition DecodeUtils.h:25
static constexpr SkRect MakeWH(float w, float h)
Definition SkRect.h:609