diff options
author | Ulrich-Matthias Schäfer <ulima.ums@googlemail.com> | 2018-10-25 23:26:38 +0200 |
---|---|---|
committer | Ulrich-Matthias Schäfer <ulima.ums@googlemail.com> | 2018-10-25 23:26:38 +0200 |
commit | 464af8b747389b7fdb569a933591c863b9be0f6b (patch) | |
tree | a23da0d70a26c142616207b0a0a489affd2f3ac6 /src/SVGArray.js | |
parent | f46aedf58fbc93483cb21017ffed10e439830108 (diff) | |
download | svg.js-464af8b747389b7fdb569a933591c863b9be0f6b.tar.gz svg.js-464af8b747389b7fdb569a933591c863b9be0f6b.zip |
Rename files so that they reflect their exported classes (see next commit)
Diffstat (limited to 'src/SVGArray.js')
-rw-r--r-- | src/SVGArray.js | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/SVGArray.js b/src/SVGArray.js new file mode 100644 index 0000000..aa43d5c --- /dev/null +++ b/src/SVGArray.js @@ -0,0 +1,92 @@ +/* global arrayClone */ + +// Module for array conversion +SVG.Array = function (array, fallback) { + array = (array || []).valueOf() + + // if array is empty and fallback is provided, use fallback + if (array.length === 0 && fallback) { + array = fallback.valueOf() + } + + // parse array + this.value = this.parse(array) +} + +SVG.extend(SVG.Array, { + // Make array morphable + morph: function (array) { + this.destination = this.parse(array) + + // normalize length of arrays + if (this.value.length !== this.destination.length) { + var lastValue = this.value[this.value.length - 1] + var lastDestination = this.destination[this.destination.length - 1] + + while (this.value.length > this.destination.length) { + this.destination.push(lastDestination) + } + while (this.value.length < this.destination.length) { + this.value.push(lastValue) + } + } + + return this + }, + // Clean up any duplicate points + settle: function () { + // find all unique values + for (var i = 0, il = this.value.length, seen = []; i < il; i++) { + if (seen.indexOf(this.value[i]) === -1) { + seen.push(this.value[i]) + } + } + + // set new value + this.value = seen + return seen + }, + // Get morphed array at given position + at: function (pos) { + // make sure a destination is defined + if (!this.destination) return this + + // generate morphed array + for (var i = 0, il = this.value.length, array = []; i < il; i++) { + array.push(this.value[i] + (this.destination[i] - this.value[i]) * pos) + } + + return new SVG.Array(array) + }, + toArray: function () { + return this.value + }, + // Convert array to string + toString: function () { + return this.value.join(' ') + }, + // Real value + valueOf: function () { + return this.value + }, + // Parse whitespace separated string + parse: function (array) { + array = array.valueOf() + + // if already is an array, no need to parse it + if (Array.isArray(array)) return array + + return array.trim().split(SVG.regex.delimiter).map(parseFloat) + }, + // Reverse array + reverse: function () { + this.value.reverse() + + return this + }, + clone: function () { + var clone = new this.constructor() + clone.value = arrayClone(this.value) + return clone + } +}) |