From e022222365c8590a1297e24146ec181fde974081 Mon Sep 17 00:00:00 2001 From: "Michael \"Z\" Goddard" Date: Thu, 14 Feb 2019 18:00:50 -0500 Subject: [PATCH] replace Silhouette._data with Silhouette._colorData _colorData holds the same (and more) data that _data holds. Dropping the _data array saves a lot of memory for a tiny performance degradation in regards to touching object. --- src/Silhouette.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/Silhouette.js b/src/Silhouette.js index 413d3b5b..7523d357 100644 --- a/src/Silhouette.js +++ b/src/Silhouette.js @@ -19,12 +19,12 @@ let __SilhouetteUpdateCanvas; * @param {number} y - y * @return {number} Alpha value for x/y position */ -const getPoint = ({_width: width, _height: height, _data: data}, x, y) => { +const getPoint = ({_width: width, _height: height, _colorData: data}, x, y) => { // 0 if outside bouds, otherwise read from data. if (x >= width || y >= height || x < 0 || y < 0) { return 0; } - return data[(y * width) + x]; + return data[(((y * width) + x) * 4) + 3]; }; /** @@ -76,7 +76,6 @@ class Silhouette { * The data representing a skin's silhouette shape. * @type {Uint8ClampedArray} */ - this._data = null; this._colorData = null; this.colorAtNearest = this.colorAtLinear = (_, dst) => dst.fill(0); @@ -100,16 +99,11 @@ class Silhouette { ctx.drawImage(bitmapData, 0, 0, width, height); const imageData = ctx.getImageData(0, 0, width, height); - this._data = new Uint8ClampedArray(imageData.data.length / 4); this._colorData = imageData.data; // delete our custom overriden "uninitalized" color functions // let the prototype work for itself delete this.colorAtNearest; delete this.colorAtLinear; - - for (let i = 0; i < imageData.data.length; i += 4) { - this._data[i / 4] = imageData.data[i + 3]; - } } /** @@ -166,7 +160,7 @@ class Silhouette { * @return {boolean} If the nearest pixel has an alpha value. */ isTouchingNearest (vec) { - if (!this._data) return; + if (!this._colorData) return; return getPoint( this, Math.floor(vec[0] * (this._width - 1)), @@ -181,7 +175,7 @@ class Silhouette { * @return {boolean} Any of the pixels have some alpha. */ isTouchingLinear (vec) { - if (!this._data) return; + if (!this._colorData) return; const x = Math.floor(vec[0] * (this._width - 1)); const y = Math.floor(vec[1] * (this._height - 1)); return getPoint(this, x, y) > 0 ||