34 uniform float in_inverseScale;
35 uniform float2 in_blurOffset;
37 half4 main(float2 xy) {
38 float2 scaled_xy = float2(xy.x * in_inverseScale, xy.y * in_inverseScale);
40 half4 c = src.eval(scaled_xy);
41 c += src.eval(scaled_xy + float2( in_blurOffset.x, in_blurOffset.y));
42 c += src.eval(scaled_xy + float2( in_blurOffset.x, -in_blurOffset.y));
43 c += src.eval(scaled_xy + float2(-in_blurOffset.x, in_blurOffset.y));
44 c += src.eval(scaled_xy + float2(-in_blurOffset.x, -in_blurOffset.y));
46 return half4(c.rgb * 0.2, 1.0);
51 uniform shader in_blur;
52 uniform shader in_original;
53 uniform float in_inverseScale;
56 half4 main(float2 xy) {
57 float2 scaled_xy = float2(xy.x * in_inverseScale, xy.y * in_inverseScale);
59 half4 blurred = in_blur.eval(scaled_xy);
60 half4 composition = in_original.eval(xy);
61 return mix(composition, blurred, in_mix);
69 fBlurEffect = std::move(blurEffect);
73 SkDEBUGFAILF(
"RuntimeShader error: %s\n", error2.c_str());
75 fMixEffect = std::move(mixEffect);
93 float tmpRadius = (
float)blurRadius / 6.0f;
95 float radiusByPasses = tmpRadius / (
float)numberOfPasses;
101 const float stepX = radiusByPasses;
102 const float stepY = radiusByPasses;
112 drawSurface->getCanvas()->drawIRect(scaledInfo.
bounds(),
paint);
116 canvas->
drawImage(drawSurface->makeImageSnapshot(), input->
width() / 4, 0,
122 auto lastDrawTarget = drawSurface;
123 if (numberOfPasses > 1) {
124 auto readSurface = drawSurface;
127 for (
auto i = 1;
i < numberOfPasses;
i++) {
130 blurBuilder.
child(
"src") = readSurface->makeImageSnapshot()->makeShader(
132 blurBuilder.
uniform(
"in_inverseScale") = 1.0f;
133 blurBuilder.
uniform(
"in_blurOffset") =
SkV2{stepX * stepScale , stepY * stepScale};
136 drawSurface->getCanvas()->drawIRect(scaledInfo.
bounds(),
paint);
143 auto tmp = drawSurface;
144 drawSurface = readSurface;
147 lastDrawTarget = readSurface;
158 mixBuilder.
child(
"in_blur") = lastDrawTarget->makeImageSnapshot()->makeShader(
160 mixBuilder.
child(
"in_original") =
188 blurFilter.
draw(canvas, fMandrill, 45);
190 blurFilter.
draw(canvas, fMandrill, 55);
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
#define SkDEBUGFAILF(fmt,...)
static constexpr float kInverseInputScale
static constexpr float kMaxCrossFadeRadius
static constexpr float kInputScale
static constexpr uint32_t kMaxPasses
static sk_sp< SkSurface > MakeSurface(SkCanvas *canvas, const SkImageInfo &info)
void draw(SkCanvas *canvas, sk_sp< SkImage > input, int blurRadius)
SkString getName() const override
void onDraw(SkCanvas *canvas) override
void onOnceBeforeDraw() override
SkISize getISize() override
void translate(SkScalar dx, SkScalar dy)
sk_sp< SkSurface > makeSurface(const SkImageInfo &info, const SkSurfaceProps *props=nullptr)
void drawIRect(const SkIRect &rect, const SkPaint &paint)
void drawImage(const SkImage *image, SkScalar left, SkScalar top)
sk_sp< SkShader > makeShader(SkTileMode tmx, SkTileMode tmy, const SkSamplingOptions &, const SkMatrix *localMatrix=nullptr) const
BuilderUniform uniform(std::string_view name)
BuilderChild child(std::string_view name)
static Result MakeForShader(SkString sksl, const Options &)
sk_sp< SkShader > makeShader(const SkMatrix *localMatrix=nullptr) const
const uint8_t uint32_t uint32_t GError ** error
static float min(float r, float g, float b)
SK_API sk_sp< SkSurface > Raster(const SkImageInfo &imageInfo, size_t rowBytes, const SkSurfaceProps *surfaceProps)
SkSamplingOptions(SkFilterMode::kLinear))
SIN Vec< N, float > ceil(const Vec< N, float > &x)
static SkImageInfo MakeN32Premul(int width, int height)