From 491c7591d05a381852090e723bbc9c68f281fdd7 Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Sun, 4 Nov 2018 15:17:10 -0800 Subject: [PATCH] Use morganherlocker/cubic-spline for spline This allows us to do a simpler line interpolation which is closer to what Winamp actually does: 1. Derive a Y value for every column 2. Draw a pixel at the Y value for the first column 3. For each successive column: 3a. Draw a vertical line from the previous Y value to the current Y value --- ...st-js-can-pose-for-a-screenshot-1-snap.png | Bin 67543 -> 67626 bytes js/components/EqualizerWindow/EqGraph.js | 47 ++--- js/components/EqualizerWindow/bresenham.ts | 71 -------- js/components/EqualizerWindow/spline.js | 161 ++++++++++-------- 4 files changed, 110 insertions(+), 169 deletions(-) delete mode 100644 js/components/EqualizerWindow/bresenham.ts diff --git a/js/__tests__/__image_snapshots__/baseline-integration-test-js-can-pose-for-a-screenshot-1-snap.png b/js/__tests__/__image_snapshots__/baseline-integration-test-js-can-pose-for-a-screenshot-1-snap.png index 9daf7d54f4fc1c68ea63e118f7e9468e51fc6d2b..9892d3f59c9de79d1a76d07a60982b9aa7373dab 100644 GIT binary patch delta 41214 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 KT2&g35&s1|duX@- delta 41129 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 diff --git a/js/components/EqualizerWindow/EqGraph.js b/js/components/EqualizerWindow/EqGraph.js index 832f3285..fb7d7db1 100644 --- a/js/components/EqualizerWindow/EqGraph.js +++ b/js/components/EqualizerWindow/EqGraph.js @@ -2,8 +2,7 @@ import React from "react"; import { connect } from "react-redux"; import { percentToRange, clamp } from "../../utils"; import { BANDS } from "../../constants"; -import { getCurvePoints } from "./spline"; -import line from "./bresenham"; +import spline from "./spline"; const GRAPH_HEIGHT = 19; const GRAPH_WIDTH = 113; @@ -81,36 +80,24 @@ class EqGraph extends React.Component { const min = 0; const max = GRAPH_HEIGHT - 1; - const points = amplitudes.reduce((prev, value, i) => { + const xs = []; + const ys = []; + amplitudes.forEach((value, i) => { const percent = (100 - value) / 100; - const y = percentToRange(percent, min, max); - const x = i * 12; // Each band is 12 pixels wide - return prev.concat(x, y); - }, []); - - // Spline between points in order to create nice curves - const tension = 0.8; - const resolution = 4; // Points in each segment - const smoothPoints = getCurvePoints(points, tension, resolution); - const smoothPointCoords = []; - for (let i = 0; i < smoothPoints.length; i += 2) { - // Splining can push peaks out of bounds. So we fudge them back in. - const x = Math.round(smoothPoints[i]); - const y = Math.round(clamp(smoothPoints[i + 1], min, max)); - smoothPointCoords.push({ x, y }); - } - - let prev = smoothPointCoords.shift(); - - smoothPointCoords.forEach(next => { - for (const point of line(prev, next)) { - // Note: Technially, we are double drawing each point given to us by - // getCurvePoints, since the end of each line is the same as the start - // of the next. - this.canvasCtx.fillRect(paddingLeft + point.x, point.y, 1, 1); - } - prev = next; + // Each band is 12 pixels widex + xs.push(i * 12); + ys.push(percentToRange(percent, min, max)); }); + + const maxX = xs[xs.length - 1]; + let lastY = ys[0]; + for (let x = 0; x <= maxX; x++) { + const y = clamp(Math.round(spline(x, xs, ys)), 0, GRAPH_HEIGHT - 1); + const yTop = Math.min(y, lastY); + const height = 1 + Math.abs(lastY - y); + this.canvasCtx.fillRect(paddingLeft + x, yTop, 1, height); + lastY = y; + } } drawPreampLine() { diff --git a/js/components/EqualizerWindow/bresenham.ts b/js/components/EqualizerWindow/bresenham.ts deleted file mode 100644 index cfcf1927..00000000 --- a/js/components/EqualizerWindow/bresenham.ts +++ /dev/null @@ -1,71 +0,0 @@ -// Adapted from https://github.com/nquicenob/bresenham-line by Nicolas Quiceno -interface Point { - x: number; - y: number; -} - -type Sign = 1 | -1; -function getSing(num: number): Sign { - return num > 0 ? 1 : -1; -} - -function getInitValues(startPoint: Point, finalPoint: Point) { - const abs = Math.abs; - const diffx = finalPoint.x - startPoint.x; - const diffy = finalPoint.y - startPoint.y; - - return { - absDiff: { - x: abs(diffx), - y: abs(diffy) - }, - sign: { - x: getSing(diffx), - y: getSing(diffy) - } - }; -} - -function getBreakFn(sign: Sign): (current: number, final: number) => boolean { - return sign < 0 - ? (current, final) => current >= final - : (current, final) => current <= final; -} - -function calcMainCoordinates(absDiff: Point): ["x", "y"] | ["y", "x"] { - return absDiff.x > absDiff.y ? ["x", "y"] : ["y", "x"]; -} - -export default function line(point: Point, finalPoint: Point) { - const { absDiff, sign } = getInitValues(point, finalPoint); - const [mainCoordinate, coordinate] = calcMainCoordinates(absDiff); - - const final = finalPoint[mainCoordinate]; - - const mainSign = sign[mainCoordinate]; - const secondSign = sign[coordinate]; - - const mainDiff = absDiff[mainCoordinate]; - const secondDiff = absDiff[coordinate]; - - const breakFn = getBreakFn(mainSign); - - let mainValue = point[mainCoordinate]; - let secondValue = point[coordinate]; - - let eps = 0; - - const points = []; - for (; breakFn(mainValue, final); mainValue += mainSign) { - points.push({ - [mainCoordinate]: mainValue, - [coordinate]: secondValue - }); - eps += secondDiff; - if (eps << 1 >= mainDiff) { - secondValue += secondSign; - eps -= mainDiff; - } - } - return points; -} diff --git a/js/components/EqualizerWindow/spline.js b/js/components/EqualizerWindow/spline.js index 397148d7..97549b83 100644 --- a/js/components/EqualizerWindow/spline.js +++ b/js/components/EqualizerWindow/spline.js @@ -1,79 +1,104 @@ -/*! Curve calc function for canvas 2.3.1 - * Epistemex (c) 2013-2014 - * License: MIT - */ +// Adapted from https://github.com/morganherlocker/cubic-spline -/** - * Calculates an array containing points representing a cardinal spline through given point array. - * Points must be arranged as: [x1, y1, x2, y2, ..., xn, yn]. - * - * The points for the cardinal spline are returned as a new array. - * - * @param {Array} points - point array - * @param {Number} [tension=0.5] - tension. Typically between [0.0, 1.0] but can be exceeded - * @param {Number} [numOfSeg=20] - number of segments between two points (line resolution) - * @returns {Float32Array} New array with the calculated points that was added to the path - */ -export function getCurvePoints(points, tension = 0.5, numOfSeg = 25) { - let i = 1, - l = points.length, - rPos = 0, - cachePtr = 4; - const rLen = (l - 2) * numOfSeg + 2, - res = new Float32Array(rLen), - cache = new Float32Array((numOfSeg + 2) * 4); - // for cloning point array - const pts = points.slice(0); +export default function spline(x, xs, ys) { + let ks = xs.map(() => { + return 0; + }); + ks = getNaturalKs(xs, ys, ks); + let i = 1; + while (xs[i] < x) i++; + const t = (x - xs[i - 1]) / (xs[i] - xs[i - 1]); + const a = ks[i - 1] * (xs[i] - xs[i - 1]) - (ys[i] - ys[i - 1]); + const b = -ks[i] * (xs[i] - xs[i - 1]) + (ys[i] - ys[i - 1]); + const q = + (1 - t) * ys[i - 1] + t * ys[i] + t * (1 - t) * (a * (1 - t) + b * t); + return q; +} - pts.unshift(points[1]); // copy 1. point and insert at beginning - pts.unshift(points[0]); - pts.push(points[l - 2], points[l - 1]); // duplicate end-points +function getNaturalKs(xs, ys, ks) { + const n = xs.length - 1; + const A = zerosMat(n + 1, n + 2); - // cache inner-loop calculations as they are based on t alone - cache[0] = 1; // 1,0,0,0 - - for (; i < numOfSeg; i++) { - const st = i / numOfSeg, - st2 = st * st, - st3 = st2 * st, - st23 = st3 * 2, - st32 = st2 * 3; - - cache[cachePtr++] = st23 - st32 + 1; // c1 - cache[cachePtr++] = st32 - st23; // c2 - cache[cachePtr++] = st3 - 2 * st2 + st; // c3 - cache[cachePtr++] = st3 - st2; // c4 + for ( + let i = 1; + i < n; + i++ // rows + ) { + A[i][i - 1] = 1 / (xs[i] - xs[i - 1]); + A[i][i] = 2 * (1 / (xs[i] - xs[i - 1]) + 1 / (xs[i + 1] - xs[i])); + A[i][i + 1] = 1 / (xs[i + 1] - xs[i]); + A[i][n + 1] = + 3 * + ((ys[i] - ys[i - 1]) / ((xs[i] - xs[i - 1]) * (xs[i] - xs[i - 1])) + + (ys[i + 1] - ys[i]) / ((xs[i + 1] - xs[i]) * (xs[i + 1] - xs[i]))); } - cache[++cachePtr] = 1; // 0,1,0,0 + A[0][0] = 2 / (xs[1] - xs[0]); + A[0][1] = 1 / (xs[1] - xs[0]); + A[0][n + 1] = (3 * (ys[1] - ys[0])) / ((xs[1] - xs[0]) * (xs[1] - xs[0])); - // calc. points - for (let j = 2, t; j < l; j += 2) { - const pt1 = pts[j], - pt2 = pts[j + 1], - pt3 = pts[j + 2], - pt4 = pts[j + 3], - t1x = (pt3 - pts[j - 2]) * tension, - t1y = (pt4 - pts[j - 1]) * tension, - t2x = (pts[j + 4] - pt1) * tension, - t2y = (pts[j + 5] - pt2) * tension; + A[n][n - 1] = 1 / (xs[n] - xs[n - 1]); + A[n][n] = 2 / (xs[n] - xs[n - 1]); + A[n][n + 1] = + (3 * (ys[n] - ys[n - 1])) / ((xs[n] - xs[n - 1]) * (xs[n] - xs[n - 1])); - for (t = 0; t < numOfSeg; t++) { - const c = t << 2, //t * 4; - c1 = cache[c], - c2 = cache[c + 1], - c3 = cache[c + 2], - c4 = cache[c + 3]; + return solve(A, ks); +} - res[rPos++] = c1 * pt1 + c2 * pt3 + c3 * t1x + c4 * t2x; - res[rPos++] = c1 * pt2 + c2 * pt4 + c3 * t1y + c4 * t2y; +function solve(A, ks) { + const m = A.length; + for ( + let k = 0; + k < m; + k++ // column + ) { + // pivot for column + let i_max = 0; + let vali = Number.NEGATIVE_INFINITY; + for (var i = k; i < m; i++) + if (A[i][k] > vali) { + i_max = i; + vali = A[i][k]; + } + swapRows(A, k, i_max); + + // for all rows below pivot + for (var i = k + 1; i < m; i++) { + for (var j = k + 1; j < m + 1; j++) + A[i][j] = A[i][j] - A[k][j] * (A[i][k] / A[k][k]); + A[i][k] = 0; } } - - // add last point - l = points.length - 2; - res[rPos++] = points[l]; - res[rPos] = points[l + 1]; - - return res; + for ( + var i = m - 1; + i >= 0; + i-- // rows = columns + ) { + const v = A[i][m] / A[i][i]; + ks[i] = v; + for ( + var j = i - 1; + j >= 0; + j-- // rows + ) { + A[j][m] -= A[j][i] * v; + A[j][i] = 0; + } + } + return ks; +} + +function zerosMat(r, c) { + const A = []; + for (let i = 0; i < r; i++) { + A.push([]); + for (let j = 0; j < c; j++) A[i].push(0); + } + return A; +} + +function swapRows(m, k, l) { + const p = m[k]; + m[k] = m[l]; + m[l] = p; }