From 17ddf61d2c0b656f26772bd24ff3bc694458c113 Mon Sep 17 00:00:00 2001 From: Elze Kool Date: Mon, 3 Jun 2019 15:50:17 +0200 Subject: [PATCH] Add bound and compositor transformers compositor transformer allows compositing multiple transformers and the bound transformer makes sure all emitted points are within the bounding region --- packages/draw/src/index.ts | 2 + packages/draw/src/transformers/bound.ts | 42 ++++++++++++++++++++ packages/draw/src/transformers/compositor.ts | 16 ++++++++ 3 files changed, 60 insertions(+) create mode 100644 packages/draw/src/transformers/bound.ts create mode 100644 packages/draw/src/transformers/compositor.ts diff --git a/packages/draw/src/index.ts b/packages/draw/src/index.ts index 9d83b31..583e0c1 100644 --- a/packages/draw/src/index.ts +++ b/packages/draw/src/index.ts @@ -7,4 +7,6 @@ export { IldaFont } from './IldaFont'; export { Timeline } from './Timeline'; export { rotate } from './transformers/rotate'; export { distort } from './transformers/distort'; +export { bound } from './transformers/bound'; +export { compositor } from './transformers/compositor'; export { Svg, loadSvgFile } from './Svg'; diff --git a/packages/draw/src/transformers/bound.ts b/packages/draw/src/transformers/bound.ts new file mode 100644 index 0000000..7c9c4ce --- /dev/null +++ b/packages/draw/src/transformers/bound.ts @@ -0,0 +1,42 @@ +import { Point } from '../Point'; + +interface BoundTransformerOptions { + lowestX?: number; + lowestY?: number; + highestX?: number; + highestY?: number; +} + +function boundValue(min: number, max: number, value: number): number { + return Math.max(min, Math.min(max, value)); +} + +// Bound values to a specific X-Y range. Can be used for safe zones e.g. +export function bound(options: BoundTransformerOptions) { + const lowestX: number = options.lowestX || 0.0; + const lowestY: number = options.lowestY || 0.0; + const highestX: number = options.highestX || 1.0; + const highestY: number = options.highestY || 1.0; + + return function(points: Point[]) { + return points.map(function(point: Point): Point { + if ( + point.x > lowestX && + point.x < highestX && + point.y > lowestY && + point.y < highestY + ) { + return point; + } + + // Replace out of bound points with blanking points at the edge position. + // TODO: Very crude algorithm. Can cause some position/color issues when + // used at low resolutions. + return new Point( + boundValue(lowestX, highestX, point.x), + boundValue(lowestY, highestY, point.y), + [0, 0, 0] + ); + }); + }; +} diff --git a/packages/draw/src/transformers/compositor.ts b/packages/draw/src/transformers/compositor.ts new file mode 100644 index 0000000..b900f2c --- /dev/null +++ b/packages/draw/src/transformers/compositor.ts @@ -0,0 +1,16 @@ +import { Point } from '../Point'; + +type TransformFn = (points: Point[]) => Point[]; + +// Compositor allows combining multiple transformers +export function compositor(transformers: TransformFn[]): TransformFn { + return function(points: Point[]): Point[] { + let transformedPoints: Point[] = points; + + transformers.forEach(function(transformer) { + transformedPoints = transformer(transformedPoints); + }); + + return transformedPoints; + }; +}