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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
SVG.ViewBox = SVG.invent({
create: function(source) {
var i, base = [0, 0, 0, 0]
var x, y, width, height, box, view, we, he
, wm = 1 // width multiplier
, hm = 1 // height multiplier
, reg = /[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?/gi
if(source instanceof SVG.Element){
we = source
he = source
view = (source.attr('viewBox') || '').match(reg)
box = source.bbox
// get dimensions of current node
width = new SVG.Number(source.width())
height = new SVG.Number(source.height())
// find nearest non-percentual dimensions
while (width.unit == '%') {
wm *= width.value
width = new SVG.Number(we instanceof SVG.Doc ? we.parent().offsetWidth : we.parent().width())
we = we.parent()
}
while (height.unit == '%') {
hm *= height.value
height = new SVG.Number(he instanceof SVG.Doc ? he.parent().offsetHeight : he.parent().height())
he = he.parent()
}
// ensure defaults
this.x = 0
this.y = 0
this.width = width * wm
this.height = height * hm
this.zoom = 1
if (view) {
// get width and height from viewbox
x = parseFloat(view[0])
y = parseFloat(view[1])
width = parseFloat(view[2])
height = parseFloat(view[3])
// calculate zoom accoring to viewbox
this.zoom = ((this.width / this.height) > (width / height)) ?
this.height / height :
this.width / width
// calculate real pixel dimensions on parent SVG.Doc element
this.x = x
this.y = y
this.width = width
this.height = height
}
}else{
// ensure source as object
source = typeof source === 'string' ?
source.match(reg).map(function(el){ return parseFloat(el) }) :
Array.isArray(source) ?
source :
typeof source == 'object' ?
[source.x, source.y, source.width, source.height] :
arguments.length == 4 ?
[].slice.call(arguments) :
base
this.x = source[0]
this.y = source[1]
this.width = source[2]
this.height = source[3]
}
}
, extend: {
toString: function() {
return this.x + ' ' + this.y + ' ' + this.width + ' ' + this.height
}
, morph: function(v){
var v = arguments.length == 1 ?
[v.x, v.y, v.width, v.height] :
[].slice.call(arguments)
this.destination = new SVG.ViewBox(v)
return this
}
, at: function(pos) {
if(!this.destination) return this
return new SVG.ViewBox([
this.x + (this.destination.x - this.x) * pos
, this.y + (this.destination.y - this.y) * pos
, this.width + (this.destination.width - this.width) * pos
, this.height + (this.destination.height - this.height) * pos
])
}
}
// Define parent
, parent: SVG.Container
// Add parent method
, construct: {
// get/set viewbox
viewbox: function(v) {
if (arguments.length == 0)
// act as a getter if there are no arguments
return new SVG.ViewBox(this)
// otherwise act as a setter
v = arguments.length == 1 ?
[v.x, v.y, v.width, v.height] :
[].slice.call(arguments)
return this.attr('viewBox', v)
}
}
})
|