summaryrefslogtreecommitdiffstats
path: root/src/SVGArray.js
diff options
context:
space:
mode:
authorUlrich-Matthias Schäfer <ulima.ums@googlemail.com>2018-10-25 23:26:38 +0200
committerUlrich-Matthias Schäfer <ulima.ums@googlemail.com>2018-10-25 23:26:38 +0200
commit464af8b747389b7fdb569a933591c863b9be0f6b (patch)
treea23da0d70a26c142616207b0a0a489affd2f3ac6 /src/SVGArray.js
parentf46aedf58fbc93483cb21017ffed10e439830108 (diff)
downloadsvg.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.js92
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
+ }
+})