summaryrefslogtreecommitdiffstats
path: root/src/array.js
blob: 5ce01607207501cbc301590f8db2da686d770eee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/* 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) throw new Error('No destination set')

    // 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)
  },
  // 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
  }
})