You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.9 KiB
98 lines
2.9 KiB
jvm.VMLPathElement = function(config, style){ |
|
var scale = new jvm.VMLElement('skew'); |
|
|
|
jvm.VMLPathElement.parentClass.call(this, 'shape', config, style); |
|
|
|
this.node.coordorigin = "0 0"; |
|
|
|
scale.node.on = true; |
|
scale.node.matrix = '0.01,0,0,0.01,0,0'; |
|
scale.node.offset = '0,0'; |
|
|
|
this.node.appendChild(scale.node); |
|
}; |
|
|
|
jvm.inherits(jvm.VMLPathElement, jvm.VMLShapeElement); |
|
|
|
jvm.VMLPathElement.prototype.applyAttr = function(attr, value){ |
|
if (attr === 'd') { |
|
this.node.path = jvm.VMLPathElement.pathSvgToVml(value); |
|
} else { |
|
jvm.VMLShapeElement.prototype.applyAttr.call(this, attr, value); |
|
} |
|
}; |
|
|
|
jvm.VMLPathElement.pathSvgToVml = function(path) { |
|
var cx = 0, cy = 0, ctrlx, ctrly; |
|
|
|
path = path.replace(/(-?\d+)e(-?\d+)/g, '0'); |
|
return path.replace(/([MmLlHhVvCcSs])\s*((?:-?\d*(?:\.\d+)?\s*,?\s*)+)/g, function(segment, letter, coords, index){ |
|
coords = coords.replace(/(\d)-/g, '$1,-') |
|
.replace(/^\s+/g, '') |
|
.replace(/\s+$/g, '') |
|
.replace(/\s+/g, ',').split(','); |
|
if (!coords[0]) coords.shift(); |
|
for (var i=0, l=coords.length; i<l; i++) { |
|
coords[i] = Math.round(100*coords[i]); |
|
} |
|
switch (letter) { |
|
case 'm': |
|
cx += coords[0]; |
|
cy += coords[1]; |
|
return 't'+coords.join(','); |
|
case 'M': |
|
cx = coords[0]; |
|
cy = coords[1]; |
|
return 'm'+coords.join(','); |
|
case 'l': |
|
cx += coords[0]; |
|
cy += coords[1]; |
|
return 'r'+coords.join(','); |
|
case 'L': |
|
cx = coords[0]; |
|
cy = coords[1]; |
|
return 'l'+coords.join(','); |
|
case 'h': |
|
cx += coords[0]; |
|
return 'r'+coords[0]+',0'; |
|
case 'H': |
|
cx = coords[0]; |
|
return 'l'+cx+','+cy; |
|
case 'v': |
|
cy += coords[0]; |
|
return 'r0,'+coords[0]; |
|
case 'V': |
|
cy = coords[0]; |
|
return 'l'+cx+','+cy; |
|
case 'c': |
|
ctrlx = cx + coords[coords.length-4]; |
|
ctrly = cy + coords[coords.length-3]; |
|
cx += coords[coords.length-2]; |
|
cy += coords[coords.length-1]; |
|
return 'v'+coords.join(','); |
|
case 'C': |
|
ctrlx = coords[coords.length-4]; |
|
ctrly = coords[coords.length-3]; |
|
cx = coords[coords.length-2]; |
|
cy = coords[coords.length-1]; |
|
return 'c'+coords.join(','); |
|
case 's': |
|
coords.unshift(cy-ctrly); |
|
coords.unshift(cx-ctrlx); |
|
ctrlx = cx + coords[coords.length-4]; |
|
ctrly = cy + coords[coords.length-3]; |
|
cx += coords[coords.length-2]; |
|
cy += coords[coords.length-1]; |
|
return 'v'+coords.join(','); |
|
case 'S': |
|
coords.unshift(cy+cy-ctrly); |
|
coords.unshift(cx+cx-ctrlx); |
|
ctrlx = coords[coords.length-4]; |
|
ctrly = coords[coords.length-3]; |
|
cx = coords[coords.length-2]; |
|
cy = coords[coords.length-1]; |
|
return 'c'+coords.join(','); |
|
} |
|
return ''; |
|
}).replace(/z/g, 'e'); |
|
}; |