fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 3.32 kB
Source Map (JSON)
{"version":3,"file":"ColorAnimation.min.mjs","names":[],"sources":["../../../../src/util/animation/ColorAnimation.ts"],"sourcesContent":["import { Color } from '../../color/Color';\nimport type { TRGBAColorSource } from '../../color/typedefs';\nimport { halfPI } from '../../constants';\nimport { capValue } from '../misc/capValue';\nimport { AnimationBase } from './AnimationBase';\nimport type {\n ColorAnimationOptions,\n TEasingFunction,\n TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultColorEasing: TEasingFunction = (\n timeElapsed,\n startValue,\n byValue,\n duration,\n) => {\n const durationProgress = 1 - Math.cos((timeElapsed / duration) * halfPI);\n return startValue + byValue * durationProgress;\n};\n\nconst wrapColorCallback = <R>(\n callback?: TOnAnimationChangeCallback<string, R>,\n) =>\n callback &&\n ((rgba: TRGBAColorSource, valueProgress: number, durationProgress: number) =>\n callback(new Color(rgba).toRgba(), valueProgress, durationProgress));\n\nexport class ColorAnimation extends AnimationBase<TRGBAColorSource> {\n constructor({\n startValue,\n endValue,\n easing = defaultColorEasing,\n onChange,\n onComplete,\n abort,\n ...options\n }: ColorAnimationOptions) {\n const startColor = new Color(startValue).getSource();\n const endColor = new Color(endValue).getSource();\n super({\n ...options,\n startValue: startColor,\n byValue: endColor.map(\n (value, i) => value - startColor[i],\n ) as TRGBAColorSource,\n easing,\n onChange: wrapColorCallback(onChange),\n onComplete: wrapColorCallback(onComplete),\n abort: wrapColorCallback(abort),\n });\n }\n protected calculate(timeElapsed: number) {\n const [r, g, b, a] = this.startValue.map((value, i) =>\n this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n ) as TRGBAColorSource;\n const value = [\n ...[r, g, b].map(Math.round),\n capValue(0, a, 1),\n ] as TRGBAColorSource;\n return {\n value,\n valueProgress:\n // to correctly calculate the change ratio we must find a changed value\n value\n .map((p, i) =>\n this.byValue[i] !== 0\n ? Math.abs((p - this.startValue[i]) / this.byValue[i])\n : 0,\n )\n .find((p) => p !== 0) || 0,\n };\n }\n}\n"],"mappings":"+MAWA,MAAM,GACJ,EACA,EACA,EACA,IAGO,EAAa,GADK,EAAI,KAAK,IAAK,EAAc,EAAY,EAAA,EAI7D,EACJ,GAEA,KACE,EAAwB,EAAuB,IAC/C,EAAS,IAAI,EAAM,EAAA,CAAM,QAAA,CAAU,EAAe,EAAA,EAEtD,IAAa,EAAb,cAAoC,CAAA,CAClC,YAAA,CAAY,WACV,EAAA,SACA,EAAA,OACA,EAAS,EAAA,SACT,EAAA,WACA,EAAA,MACA,EAAA,GACG,GAAA,CAEH,IAAM,EAAa,IAAI,EAAM,EAAA,CAAY,WAAA,CACnC,EAAW,IAAI,EAAM,EAAA,CAAU,WAAA,CACrC,MAAM,CAAA,GACD,EACH,WAAY,EACZ,QAAS,EAAS,KACf,EAAO,IAAM,EAAQ,EAAW,GAAA,CAEnC,OAAA,EACA,SAAU,EAAkB,EAAA,CAC5B,WAAY,EAAkB,EAAA,CAC9B,MAAO,EAAkB,EAAA,CAAA,CAAA,CAG7B,UAAoB,EAAA,CAClB,GAAA,CAAO,EAAG,EAAG,EAAG,GAAK,KAAK,WAAW,KAAK,EAAO,IAC/C,KAAK,OAAO,EAAa,EAAO,KAAK,QAAQ,GAAI,KAAK,SAAU,EAAA,CAAA,CAE5D,EAAQ,CAAA,GACT,CAAC,EAAG,EAAG,EAAA,CAAG,IAAI,KAAK,MAAA,CACtB,EAAS,EAAG,EAAG,EAAA,CAAA,CAEjB,MAAO,CACL,MAAA,EACA,cAEE,EACG,KAAK,EAAG,IACP,KAAK,QAAQ,KAAO,EAEhB,EADA,KAAK,KAAK,EAAI,KAAK,WAAW,IAAM,KAAK,QAAQ,GAAA,CACjD,CAEL,KAAM,GAAM,IAAM,EAAN,EAAY,EAAA,GAAA,OAAA,KAAA"}