UNPKG

rabbit-ear

Version:
68 lines (64 loc) 2.37 kB
/* Rabbit Ear 0.9.4 alpha 2024-04-20 (c) Kraft, GNU GPLv3 License */ import { svg_multiplyMatrices2 } from './algebra.js'; const parseTransform = (transform) => { const parsed = transform.match(/(\w+\((\-?\d+\.?\d*e?\-?\d*,?\s*)+\))+/g); if (!parsed) { return []; } const listForm = parsed.map(a => a.match(/[\w\.\-]+/g)); return listForm.map(a => ({ transform: a.shift(), parameters: a.map(p => parseFloat(p)), })); }; const matrixFormTranslate = function (params) { switch (params.length) { case 1: return [1, 0, 0, 1, params[0], 0]; case 2: return [1, 0, 0, 1, params[0], params[1]]; default: console.warn(`improper translate, ${params}`); } return undefined; }; const matrixFormRotate = function (params) { const cos_p = Math.cos(params[0] / (180 * Math.PI)); const sin_p = Math.sin(params[0] / (180 * Math.PI)); switch (params.length) { case 1: return [cos_p, sin_p, -sin_p, cos_p, 0, 0]; case 3: return [cos_p, sin_p, -sin_p, cos_p, -params[1] * cos_p + params[2] * sin_p + params[1], -params[1] * sin_p - params[2] * cos_p + params[2]]; default: console.warn(`improper rotate, ${params}`); } return undefined; }; const matrixFormScale = function (params) { switch (params.length) { case 1: return [params[0], 0, 0, params[0], 0, 0]; case 2: return [params[0], 0, 0, params[1], 0, 0]; default: console.warn(`improper scale, ${params}`); } return undefined; }; const matrixFormSkewX = function (params) { return [1, 0, Math.tan(params[0] / (180 * Math.PI)), 1, 0, 0]; }; const matrixFormSkewY = function (params) { return [1, Math.tan(params[0] / (180 * Math.PI)), 0, 1, 0, 0]; }; const matrixForm = function (transformType, params) { switch (transformType) { case "translate": return matrixFormTranslate(params); case "rotate": return matrixFormRotate(params); case "scale": return matrixFormScale(params); case "skewX": return matrixFormSkewX(params); case "skewY": return matrixFormSkewY(params); case "matrix": return params; default: console.warn(`unknown transform type ${transformType}`); } return undefined; }; const transformStringToMatrix = function (string) { return parseTransform(string) .map(el => matrixForm(el.transform, el.parameters)) .filter(a => a !== undefined) .reduce((a, b) => svg_multiplyMatrices2(a, b), [1, 0, 0, 1, 0, 0]); }; export { parseTransform, transformStringToMatrix };