From e8532fb2d0519da2252bef0e6d83cbb52e058a94 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Mon, 14 Mar 2022 09:15:36 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=91=BB=20Inner=20Shadow=20(#246)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../image-filters/assets/inner-shadow.png | Bin 0 -> 26085 bytes .../{drop-shadows.md => shadows.md} | 59 +++++++- docs/docs/shaders/colors.md | 6 +- docs/sidebars.js | 2 +- example/src/Examples/API/Gradients2.tsx | 6 +- .../src/Examples/Neumorphism/Dashboard.tsx | 132 ++++++++++++++++++ .../src/Examples/Neumorphism/Neumorphism.tsx | 16 +++ .../Examples/Neumorphism/SF-Mono-Semibold.otf | Bin 0 -> 111096 bytes package/cpp/api/JsiSkImageFilterFactory.h | 58 ++++++++ package/src/renderer/components/Blend.tsx | 26 ++++ package/src/renderer/components/Paint.tsx | 7 +- .../{Blend.tsx => BlendColor.tsx} | 4 +- .../renderer/components/colorFilters/index.ts | 2 +- .../components/imageFilters/DropShadow.tsx | 24 +--- .../components/imageFilters/InnerShadow.tsx | 50 +++++++ .../components/imageFilters/Morphology.tsx | 32 +++++ .../renderer/components/imageFilters/index.ts | 2 + package/src/renderer/components/index.ts | 1 + .../src/renderer/components/shaders/Blend.tsx | 22 --- .../src/renderer/components/shaders/index.ts | 1 - .../skia/ImageFilter/ImageFilterFactory.ts | 42 ++++++ 21 files changed, 431 insertions(+), 61 deletions(-) create mode 100644 docs/docs/image-filters/assets/inner-shadow.png rename docs/docs/image-filters/{drop-shadows.md => shadows.md} (54%) create mode 100644 example/src/Examples/Neumorphism/Dashboard.tsx create mode 100755 example/src/Examples/Neumorphism/SF-Mono-Semibold.otf create mode 100644 package/src/renderer/components/Blend.tsx rename package/src/renderer/components/colorFilters/{Blend.tsx => BlendColor.tsx} (87%) create mode 100644 package/src/renderer/components/imageFilters/InnerShadow.tsx create mode 100644 package/src/renderer/components/imageFilters/Morphology.tsx delete mode 100644 package/src/renderer/components/shaders/Blend.tsx diff --git a/docs/docs/image-filters/assets/inner-shadow.png b/docs/docs/image-filters/assets/inner-shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..81cc514f5c57464fd34a5a6460ec499e4b89afe4 GIT binary patch literal 26085 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 Pf1N1FsmuP6wha3px5{qu literal 0 HcmV?d00001 diff --git a/docs/docs/image-filters/drop-shadows.md b/docs/docs/image-filters/shadows.md similarity index 54% rename from docs/docs/image-filters/drop-shadows.md rename to docs/docs/image-filters/shadows.md index 627d3de43c..e98404f9b2 100644 --- a/docs/docs/image-filters/drop-shadows.md +++ b/docs/docs/image-filters/shadows.md @@ -1,10 +1,12 @@ --- -id: drop-shadows -title: Drop Shadows -sidebar_label: Drop Shadows -slug: /image-filters/drop-shadows +id: shadows +title: Shadows +sidebar_label: Shadows +slug: /image-filters/shadows --- +## Drop Shadow + The `DropShadow` image filter is equivalent to its [SVG counterpart](https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/drop-shadow()). It creates a filter that draws a drop shadow under the input content. There is a `shadowOnly` property that renders the drop shadow excluding the input content. @@ -16,11 +18,10 @@ There is a `shadowOnly` property that renders the drop shadow excluding the inpu | dy | `number` | The Y offset of the shadow. | | blur | `number` | The blur radius for the shadow | | color | `Color` | The color of the drop shadow | -| cropRect | `IRect` | Optional rectangle that crops the input and output | | shadowOnly? | `boolean` | If true, the result does not include the input content | | children? | `ImageFilter` | Optional image filter to be applied first | -## Example +### Example The example below creates two drop shadows. It is equivalent to the following CSS notation @@ -60,3 +61,49 @@ const Neumorphism = () => { ### Result ![Drop Shadow](assets/drop-shadow.png) + +## Inner Shadow + +Inner shadows are drawn within the input content. + + +| Name | Type | Description | +|:------------|:--------------|:--------------------------------------------------------------| +| dx | `number` | The X offset of the shadow. | +| dy | `number` | The Y offset of the shadow. | +| blur | `number` | The blur radius for the shadow | +| color | `Color` | The color of the drop shadow | +| shadowOnly? | `boolean` | If true, the result does not include the input content | +| children? | `ImageFilter` | Optional image filter to be applied first | + +### Example + +```tsx twoslash +import { + InnerShadow, + Fill, + Group, + Paint, + RoundedRect, + Canvas +} from "@shopify/react-native-skia"; + +const Neumorphism = () => { + return ( + + + + + + + + + + + ); +}; +``` + +### Result + +![Drop Shadow](assets/inner-shadow.png) diff --git a/docs/docs/shaders/colors.md b/docs/docs/shaders/colors.md index b2bea46355..a62d9910c2 100644 --- a/docs/docs/shaders/colors.md +++ b/docs/docs/shaders/colors.md @@ -26,7 +26,7 @@ import { Shader, Fill, RadialGradient, - BlendShader, + Blend, vec } from "@shopify/react-native-skia"; @@ -34,14 +34,14 @@ export const BlendDemo = () => { return ( - + - + diff --git a/docs/sidebars.js b/docs/sidebars.js index 06e146c592..5987f31f17 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -79,7 +79,7 @@ const sidebars = { items: [ "mask-filters", "color-filters", - "image-filters/drop-shadows", + "image-filters/shadows", "image-filters", "path-effects", "backdrops-filters", diff --git a/example/src/Examples/API/Gradients2.tsx b/example/src/Examples/API/Gradients2.tsx index 0a2fdd584b..7ff1b984bb 100644 --- a/example/src/Examples/API/Gradients2.tsx +++ b/example/src/Examples/API/Gradients2.tsx @@ -16,7 +16,7 @@ import { vec, Turbulence, ColorShader, - BlendShader, + Blend, } from "@shopify/react-native-skia"; const { width } = Dimensions.get("window"); @@ -70,10 +70,10 @@ export const Gradients = () => { - + - + diff --git a/example/src/Examples/Neumorphism/Dashboard.tsx b/example/src/Examples/Neumorphism/Dashboard.tsx new file mode 100644 index 0000000000..840ad2a663 --- /dev/null +++ b/example/src/Examples/Neumorphism/Dashboard.tsx @@ -0,0 +1,132 @@ +import { + Canvas, + Circle, + Fill, + Group, + LinearGradient, + Paint, + add, + vec, + DropShadow, + Path, + Text, + Skia, + useLoop, + SweepGradient, + useDerivedValue, + mix, + useFont, + InnerShadow, + RoundedRect, +} from "@shopify/react-native-skia"; +import React from "react"; +import { Dimensions } from "react-native"; + +const { width, height } = Dimensions.get("window"); +const c = vec(width / 2, height / 2 - 85); +const r = 85; +const r1 = 60; + +const meter = Skia.Path.Make(); +meter.addCircle(c.x, c.y, r); + +export const Neumorphism = () => { + const font = useFont(require("./SF-Mono-Semibold.otf"), 32); + const progress = useLoop({ duration: 15000 }); + const end = useDerivedValue( + () => mix(progress.current, 0.2, 0.95), + [progress] + ); + const text = useDerivedValue( + () => `${Math.round(end.current * 100)}%`, + [end] + ); + if (font === null) { + return null; + } + const pos = font.measureText("30%"); + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/example/src/Examples/Neumorphism/Neumorphism.tsx b/example/src/Examples/Neumorphism/Neumorphism.tsx index d6be7249c6..36b3254dfb 100644 --- a/example/src/Examples/Neumorphism/Neumorphism.tsx +++ b/example/src/Examples/Neumorphism/Neumorphism.tsx @@ -5,6 +5,7 @@ import { Group, Paint, RoundedRect, + InnerShadow, } from "@shopify/react-native-skia"; import React from "react"; @@ -30,6 +31,21 @@ export const Neumorphism = () => { color="lightblue" /> + + + + + + + + ); }; diff --git a/example/src/Examples/Neumorphism/SF-Mono-Semibold.otf b/example/src/Examples/Neumorphism/SF-Mono-Semibold.otf new file mode 100755 index 0000000000000000000000000000000000000000..7e92bdf9b27887e3d14b71b469e89ca65ffcddf9 GIT binary patch literal 111096 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 Krx;vZT>ckv&SA6w literal 0 HcmV?d00001 diff --git a/package/cpp/api/JsiSkImageFilterFactory.h b/package/cpp/api/JsiSkImageFilterFactory.h index 889219bf9e..7d2eee37ab 100644 --- a/package/cpp/api/JsiSkImageFilterFactory.h +++ b/package/cpp/api/JsiSkImageFilterFactory.h @@ -94,6 +94,26 @@ class JsiSkImageFilterFactory : public JsiSkHostObject { getContext(), SkImageFilters::Compose(outer, inner))); } + + JSI_HOST_FUNCTION(MakeBlend) { + auto mode = static_cast(arguments[0].asNumber()); + sk_sp background = JsiSkImageFilter::fromValue(runtime, arguments[1]); + sk_sp foreground = nullptr; + + if(count > 2 && !arguments[2].isNull()) { + foreground = JsiSkImageFilter::fromValue(runtime, arguments[2]); + } + + SkImageFilters::CropRect cropRect = {}; + if (count > 3 && !arguments[3].isUndefined()) { + cropRect = *JsiSkRect::fromValue(runtime, arguments[3]); + } + + return jsi::Object::createFromHostObject( + runtime, std::make_shared( + getContext(), SkImageFilters::Blend(mode, background, foreground, cropRect))); + } + JSI_HOST_FUNCTION(MakeDropShadow) { auto dx = arguments[0].asNumber(); auto dy = arguments[1].asNumber(); @@ -136,6 +156,41 @@ class JsiSkImageFilterFactory : public JsiSkHostObject { color, input, cropRect))); } + JSI_HOST_FUNCTION(MakeErode) { + auto rx = arguments[0].asNumber(); + auto ry = arguments[1].asNumber(); + sk_sp input; + if (!arguments[2].isNull() && !arguments[2].isUndefined()) { + input = JsiSkImageFilter::fromValue(runtime, arguments[2]); + } + SkImageFilters::CropRect cropRect = {}; + if (count > 3 && !arguments[3].isUndefined()) { + cropRect = *JsiSkRect::fromValue(runtime, arguments[3]); + } + return jsi::Object::createFromHostObject( + runtime, + std::make_shared( + getContext(), SkImageFilters::Erode(rx, ry, input, cropRect)) + ); + } + + JSI_HOST_FUNCTION(MakeDilate) { + auto rx = arguments[0].asNumber(); + auto ry = arguments[1].asNumber(); + sk_sp input; + if (!arguments[2].isNull() && !arguments[2].isUndefined()) { + input = JsiSkImageFilter::fromValue(runtime, arguments[2]); + } + SkImageFilters::CropRect cropRect = {}; + if (count > 3 && !arguments[3].isUndefined()) { + cropRect = *JsiSkRect::fromValue(runtime, arguments[3]); + } + return jsi::Object::createFromHostObject( + runtime, + std::make_shared( + getContext(), SkImageFilters::Dilate(rx, ry, input, cropRect))); + } + JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkImageFilterFactory, MakeBlur), JSI_EXPORT_FUNC(JsiSkImageFilterFactory, MakeOffset), JSI_EXPORT_FUNC(JsiSkImageFilterFactory, @@ -144,6 +199,9 @@ class JsiSkImageFilterFactory : public JsiSkHostObject { MakeShader), JSI_EXPORT_FUNC(JsiSkImageFilterFactory, MakeDisplacementMap), JSI_EXPORT_FUNC(JsiSkImageFilterFactory, MakeCompose), + JSI_EXPORT_FUNC(JsiSkImageFilterFactory, MakeErode), + JSI_EXPORT_FUNC(JsiSkImageFilterFactory, MakeDilate), + JSI_EXPORT_FUNC(JsiSkImageFilterFactory, MakeBlend), JSI_EXPORT_FUNC(JsiSkImageFilterFactory, MakeDropShadow), JSI_EXPORT_FUNC(JsiSkImageFilterFactory, MakeDropShadowOnly)) diff --git a/package/src/renderer/components/Blend.tsx b/package/src/renderer/components/Blend.tsx new file mode 100644 index 0000000000..72c7afb04f --- /dev/null +++ b/package/src/renderer/components/Blend.tsx @@ -0,0 +1,26 @@ +import type { ReactNode } from "react"; +import React from "react"; + +import { isImageFilter, Skia, BlendMode } from "../../skia"; +import { useDeclaration } from "../nodes"; +import type { AnimatedProps, SkEnum } from "../processors"; +import { isShader } from "../../skia/Shader/Shader"; +import { enumKey } from "../processors/Paint"; + +interface BlendProps { + mode: SkEnum; + children?: ReactNode | ReactNode[]; +} +export const Blend = (props: AnimatedProps) => { + const declaration = useDeclaration(props, ({ mode }, children) => { + const [inner, outer] = children; + const blend = BlendMode[enumKey(mode)]; + if (isImageFilter(outer) && isImageFilter(inner)) { + return Skia.ImageFilter.MakeBlend(blend, outer, inner); + } else if (isShader(outer) && isShader(inner)) { + return Skia.Shader.MakeBlend(blend, outer, inner); + } + throw new Error(" can only blend Shaders or ImageFilters"); + }); + return ; +}; diff --git a/package/src/renderer/components/Paint.tsx b/package/src/renderer/components/Paint.tsx index 30d88e00a7..1f822a6e65 100644 --- a/package/src/renderer/components/Paint.tsx +++ b/package/src/renderer/components/Paint.tsx @@ -40,10 +40,9 @@ export const Paint = forwardRef>( const filters = children.filter(isImageFilter); if (filters.length > 0) { paint.setImageFilter( - filters.reduce( - Skia.ImageFilter.MakeCompose, - null - ) + filters + .reverse() + .reduce(Skia.ImageFilter.MakeCompose, null) ); } return paint; diff --git a/package/src/renderer/components/colorFilters/Blend.tsx b/package/src/renderer/components/colorFilters/BlendColor.tsx similarity index 87% rename from package/src/renderer/components/colorFilters/Blend.tsx rename to package/src/renderer/components/colorFilters/BlendColor.tsx index 4f3e3260d4..1c4ce7fab6 100644 --- a/package/src/renderer/components/colorFilters/Blend.tsx +++ b/package/src/renderer/components/colorFilters/BlendColor.tsx @@ -9,13 +9,13 @@ import type { Color } from "../../../skia"; import { composeColorFilter } from "./Compose"; -export interface BlendProps { +export interface BlendColorProps { mode: SkEnum; color: Color; children?: ReactNode | ReactNode[]; } -export const Blend = (props: AnimatedProps) => { +export const BlendColor = (props: AnimatedProps) => { const declaration = useDeclaration(props, ({ mode, color }, children) => { const cf = Skia.ColorFilter.MakeBlend( Skia.Color(color), diff --git a/package/src/renderer/components/colorFilters/index.ts b/package/src/renderer/components/colorFilters/index.ts index d9c515d9ec..d91dea76c1 100644 --- a/package/src/renderer/components/colorFilters/index.ts +++ b/package/src/renderer/components/colorFilters/index.ts @@ -1,5 +1,5 @@ export * from "./Matrix"; -export * from "./Blend"; +export * from "./BlendColor"; export * from "./Lerp"; export * from "./LinearToSRGBGamma"; export * from "./SRGBToLinearGamma"; diff --git a/package/src/renderer/components/imageFilters/DropShadow.tsx b/package/src/renderer/components/imageFilters/DropShadow.tsx index 55d5a4588a..507cd4aa44 100644 --- a/package/src/renderer/components/imageFilters/DropShadow.tsx +++ b/package/src/renderer/components/imageFilters/DropShadow.tsx @@ -1,12 +1,9 @@ import React from "react"; -import type { ReactNode } from "react"; -import { Skia } from "../../../skia"; +import { Skia, processColor } from "../../../skia"; import { useDeclaration } from "../../nodes/Declaration"; -import type { AnimatedProps } from "../../processors/Animations/Animations"; -import type { SkRect } from "../../../skia/Rect"; -import type { Color } from "../../../skia/Color"; -import { processColor } from "../../../skia/Color"; +import type { AnimatedProps } from "../../processors"; +import type { Color } from "../../../skia"; import { getInput } from "./getInput"; @@ -15,28 +12,19 @@ export interface DropShadowProps { dy: number; blur: number; color: Color; - children?: ReactNode | ReactNode[]; - cropRect?: SkRect; shadowOnly?: boolean; } export const DropShadow = (props: AnimatedProps) => { const declaration = useDeclaration( props, - ({ dx, dy, blur, color, shadowOnly, cropRect }, children, { opacity }) => { + ({ dx, dy, blur, color, shadowOnly }, children, { opacity }) => { const input = getInput(children); + const cl = processColor(color, opacity); const factory = shadowOnly ? Skia.ImageFilter.MakeDropShadowOnly : Skia.ImageFilter.MakeDropShadow; - return factory( - dx, - dy, - blur, - blur, - processColor(color, opacity), - input, - cropRect - ); + return factory(dx, dy, blur, blur, cl, input); } ); return ; diff --git a/package/src/renderer/components/imageFilters/InnerShadow.tsx b/package/src/renderer/components/imageFilters/InnerShadow.tsx new file mode 100644 index 0000000000..b83ef40d42 --- /dev/null +++ b/package/src/renderer/components/imageFilters/InnerShadow.tsx @@ -0,0 +1,50 @@ +import React from "react"; + +import { BlendMode, Skia, TileMode, processColor } from "../../../skia"; +import { useDeclaration } from "../../nodes/Declaration"; +import type { AnimatedProps } from "../../processors"; +import type { Color } from "../../../skia"; + +import { getInput } from "./getInput"; + +export interface InnerShadowProps { + dx: number; + dy: number; + blur: number; + color: Color; + shadowOnly?: boolean; + inner?: boolean; +} + +export const InnerShadow = (props: AnimatedProps) => { + const declaration = useDeclaration( + props, + ({ dx, dy, blur, color, shadowOnly }, children, { opacity }) => { + const input = getInput(children); + const cl = processColor(color, opacity); + const sourceGraphic = Skia.ImageFilter.MakeColorFilter( + Skia.ColorFilter.MakeBlend(0xff000000, BlendMode.Dst), + null + ); + const sourceAlpha = Skia.ImageFilter.MakeColorFilter( + Skia.ColorFilter.MakeBlend(0xff000000, BlendMode.SrcIn), + null + ); + const f1 = Skia.ImageFilter.MakeColorFilter( + Skia.ColorFilter.MakeBlend(cl, BlendMode.SrcOut), + null + ); + const f2 = Skia.ImageFilter.MakeOffset(dx, dy, f1); + const f3 = Skia.ImageFilter.MakeBlur(blur, blur, TileMode.Decal, f2); + const f4 = Skia.ImageFilter.MakeBlend(BlendMode.SrcIn, sourceAlpha, f3); + if (shadowOnly) { + return f4; + } + return Skia.ImageFilter.MakeCompose( + input, + Skia.ImageFilter.MakeBlend(BlendMode.SrcOver, sourceGraphic, f4) + ); + } + ); + return ; +}; diff --git a/package/src/renderer/components/imageFilters/Morphology.tsx b/package/src/renderer/components/imageFilters/Morphology.tsx new file mode 100644 index 0000000000..b64654f5b0 --- /dev/null +++ b/package/src/renderer/components/imageFilters/Morphology.tsx @@ -0,0 +1,32 @@ +import React from "react"; + +import { Skia } from "../../../skia"; +import { useDeclaration } from "../../nodes/Declaration"; +import type { AnimatedProps } from "../../processors"; + +import { getInput } from "./getInput"; + +export interface MorphologyProps { + operator: "erode" | "dilate"; + radius: number; + children: React.ReactNode | React.ReactNode[]; +} + +export const Morphology = (props: AnimatedProps) => { + const declaration = useDeclaration( + props, + ({ radius, operator }, children) => { + const input = getInput(children); + const factory = + operator === "dilate" + ? Skia.ImageFilter.MakeDilate + : Skia.ImageFilter.MakeErode; + return factory(radius, radius, input); + } + ); + return ; +}; + +Morphology.defaultProps = { + operator: "dilate", +}; diff --git a/package/src/renderer/components/imageFilters/index.ts b/package/src/renderer/components/imageFilters/index.ts index 74c82c7eb5..b42b756823 100644 --- a/package/src/renderer/components/imageFilters/index.ts +++ b/package/src/renderer/components/imageFilters/index.ts @@ -2,3 +2,5 @@ export * from "./Blur"; export * from "./Offset"; export * from "./DisplacementMap"; export * from "./DropShadow"; +export * from "./InnerShadow"; +export * from "./Morphology"; diff --git a/package/src/renderer/components/index.ts b/package/src/renderer/components/index.ts index e47bdb32eb..ab7d7e69a5 100644 --- a/package/src/renderer/components/index.ts +++ b/package/src/renderer/components/index.ts @@ -13,4 +13,5 @@ export * from "./Group"; export * from "./Mask"; export * from "./Paint"; export * from "./Compose"; +export * from "./Blend"; export * from "./Defs"; diff --git a/package/src/renderer/components/shaders/Blend.tsx b/package/src/renderer/components/shaders/Blend.tsx deleted file mode 100644 index df5d6cd77c..0000000000 --- a/package/src/renderer/components/shaders/Blend.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from "react"; -import type { ReactNode } from "react"; - -import { BlendMode, Skia } from "../../../skia"; -import { useDeclaration } from "../../nodes/Declaration"; -import type { SkEnum } from "../../processors/Paint"; -import { isShader } from "../../../skia/Shader/Shader"; -import { enumKey } from "../../processors/Paint"; -import type { AnimatedProps } from "../../processors/Animations/Animations"; - -export interface BlendShaderProps { - mode: SkEnum; - children: ReactNode | ReactNode[]; -} - -export const BlendShader = (props: AnimatedProps) => { - const declaration = useDeclaration(props, ({ mode }, children) => { - const [one, two] = children.filter(isShader); - return Skia.Shader.MakeBlend(BlendMode[enumKey(mode)], one, two); - }); - return ; -}; diff --git a/package/src/renderer/components/shaders/index.ts b/package/src/renderer/components/shaders/index.ts index e76ae105e3..1e779d5c6a 100644 --- a/package/src/renderer/components/shaders/index.ts +++ b/package/src/renderer/components/shaders/index.ts @@ -2,7 +2,6 @@ export * from "./RadialGradient"; export * from "./LinearGradient"; export * from "./TwoPointConicalGradient"; export * from "./SweepGradient"; -export * from "./Blend"; export * from "./Color"; export * from "./Turbulence"; export * from "./FractalNoise"; diff --git a/package/src/skia/ImageFilter/ImageFilterFactory.ts b/package/src/skia/ImageFilter/ImageFilterFactory.ts index bddb619e60..2d2849cf09 100644 --- a/package/src/skia/ImageFilter/ImageFilterFactory.ts +++ b/package/src/skia/ImageFilter/ImageFilterFactory.ts @@ -2,6 +2,7 @@ import type { SkColor } from "../Color"; import type { SkColorFilter } from "../ColorFilter/ColorFilter"; import type { IShader } from "../Shader/Shader"; import type { SkRect } from "../Rect"; +import type { BlendMode } from "../Paint/BlendMode"; import type { SkImageFilter, TileMode } from "./ImageFilter"; @@ -127,4 +128,45 @@ export interface ImageFilterFactory { input: SkImageFilter | null, cropRect?: SkRect ) => SkImageFilter; + /** + * Create a filter that erodes each input pixel's channel values to the minimum channel value + * within the given radii along the x and y axes. + * @param radiusX The distance to erode along the x axis to either side of each pixel. + * @param radiusY The distance to erode along the y axis to either side of each pixel. + * @param input The image filter that is eroded, using source bitmap if this is null. + * @param cropRect Optional rectangle that crops the input and output. + */ + MakeErode: ( + rx: number, + ry: number, + input: SkImageFilter | null, + cropRect?: SkRect + ) => SkImageFilter; + /** + * Create a filter that dilates each input pixel's channel values to the max value within the + * given radii along the x and y axes. + * @param radiusX The distance to dilate along the x axis to either side of each pixel. + * @param radiusY The distance to dilate along the y axis to either side of each pixel. + * @param input The image filter that is dilated, using source bitmap if this is null. + * @param cropRect Optional rectangle that crops the input and output. + */ + MakeDilate: ( + rx: number, + ry: number, + input: SkImageFilter | null, + cropRect?: SkRect + ) => SkImageFilter; + /** + * This filter takes an SkBlendMode and uses it to composite the two filters together. + * @param mode The blend mode that defines the compositing operation + * @param background The Dst pixels used in blending, if null the source bitmap is used. + * @param foreground The Src pixels used in blending, if null the source bitmap is used. + * @cropRect Optional rectangle to crop input and output. + */ + MakeBlend: ( + mode: BlendMode, + background: SkImageFilter, + foreground: SkImageFilter | null, + cropRect?: SkRect + ) => SkImageFilter; }