From 70a644ca05f22a2d668796136de71a6ab5257a12 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Thu, 27 Jan 2022 09:32:44 +0100 Subject: [PATCH] Document Coons patches (#143) --- docs/docs/shapes/assets/patch/example1.png | Bin 0 -> 28717 bytes docs/docs/shapes/patch.md | 48 ++++++++++++++++++ docs/sidebars.js | 7 ++- example/src/Examples/API/Shapes2.tsx | 7 ++- example/src/Examples/Matrix/Matrix.tsx | 1 - .../src/renderer/components/shapes/Patch.tsx | 16 ++++-- 6 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 docs/docs/shapes/assets/patch/example1.png create mode 100644 docs/docs/shapes/patch.md diff --git a/docs/docs/shapes/assets/patch/example1.png b/docs/docs/shapes/assets/patch/example1.png new file mode 100644 index 0000000000000000000000000000000000000000..1072024b09a7aa2020cde6b115fc89434efb2e61 GIT binary patch literal 28717 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

p%*S`}`-J&}KZdL6| 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 cLPZS!KVmFFIs { + const colors = ["#61dafb", "#fb61da", "#61fbcf", "#dafb61"]; + const C = 64; + const topLeft = { src: vec(0, 0), c1: vec(C, 0), c2: vec(0, C) }; + const topRight = { src: vec(256, 0), c1: vec(256 + C, 0), c2: vec(256, C) }; + const bottomRight = { + src: vec(256, 256), + c1: vec(256 - 2 * C, 256), + c2: vec(256, 256 - 2 * C), + }; + const bottomLeft = { + src: vec(0, 256), + c1: vec(-2 * C, 256), + c2: vec(0, 256 - 2 * C), + }; + return ( + + + + ); +}; +``` + +![SVG Notation](assets/patch/example1.png) \ No newline at end of file diff --git a/docs/sidebars.js b/docs/sidebars.js index 4285ab7394..17723dda35 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -69,7 +69,12 @@ const sidebars = { collapsed: false, type: "category", label: "Shapes", - items: ["shapes/path", "shapes/polygons", "shapes/ellipses"], + items: [ + "shapes/path", + "shapes/polygons", + "shapes/ellipses", + "shapes/patch", + ], }, { collapsed: false, diff --git a/example/src/Examples/API/Shapes2.tsx b/example/src/Examples/API/Shapes2.tsx index 6167846285..bc54b40496 100644 --- a/example/src/Examples/API/Shapes2.tsx +++ b/example/src/Examples/API/Shapes2.tsx @@ -59,6 +59,11 @@ const inner = rrect( 0 ); +const topLeft = { src: vec(0, 0), c1: vec(0, 15), c2: vec(15, 0) }; +const topRight = { src: vec(100, 0), c1: vec(100, 15), c2: vec(85, 0) }; +const bottomRight = { src: vec(100, 100), c1: vec(100, 85), c2: vec(85, 100) }; +const bottomLeft = { src: vec(0, 100), c1: vec(0, 85), c2: vec(15, 100) }; + export const Shapes = () => { return ( @@ -106,7 +111,7 @@ export const Shapes = () => { diff --git a/example/src/Examples/Matrix/Matrix.tsx b/example/src/Examples/Matrix/Matrix.tsx index 9ab8f663da..98ebf614df 100644 --- a/example/src/Examples/Matrix/Matrix.tsx +++ b/example/src/Examples/Matrix/Matrix.tsx @@ -4,7 +4,6 @@ import { Fill, Paint, useFont, - useFontMgr, } from "@shopify/react-native-skia"; import React from "react"; import { useTimestamp } from "@shopify/react-native-skia/src/animation/Animation/hooks"; diff --git a/package/src/renderer/components/shapes/Patch.tsx b/package/src/renderer/components/shapes/Patch.tsx index 01ed93a3fb..1c8a0fa24f 100644 --- a/package/src/renderer/components/shapes/Patch.tsx +++ b/package/src/renderer/components/shapes/Patch.tsx @@ -1,15 +1,21 @@ import React from "react"; -import type { CustomPaintProps, SkEnum } from "../../processors"; +import type { CustomPaintProps, SkEnum, Vector } from "../../processors"; import { enumKey, processColor } from "../../processors"; import type { IPoint } from "../../../skia"; import { BlendMode } from "../../../skia/Paint/BlendMode"; import type { AnimatedProps } from "../../processors/Animations/Animations"; import { useDrawing } from "../../nodes/Drawing"; +interface CubicBezier { + src: Vector; + c1: Vector; + c2: Vector; +} + export interface PatchProps extends CustomPaintProps { colors: string[]; - cubics: IPoint[]; + cubics: [CubicBezier, CubicBezier, CubicBezier, CubicBezier]; texs?: IPoint[]; blendMode?: SkEnum; } @@ -18,9 +24,11 @@ export const Patch = (props: AnimatedProps) => { const onDraw = useDrawing( props, ({ canvas, paint, opacity }, { colors, cubics, texs, blendMode }) => { - const mode = blendMode ? BlendMode[enumKey(blendMode)] : undefined; + // If the colors are provided, the default blendMode is set to dstOver, if not, the default is set to srcOver + const defaultBlendMode = colors ? BlendMode.DstOver : BlendMode.SrcOver; + const mode = blendMode ? BlendMode[enumKey(blendMode)] : defaultBlendMode; canvas.drawPatch( - cubics, + cubics.map(({ src, c1, c2 }) => [src, c1, c2]).flat(), colors.map((c) => processColor(c, opacity)), texs, mode,