Commit 7d132c6d by Dmitry Baranovskiy

1.3.2

• fixed hsb2rgb & rgb2hsb caching
• Dramatically improved path rendering in IE
• Fixed scale issues
• Fixed getPointAtLength
parent 1bf5b16d
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -5,15 +5,15 @@ ...@@ -5,15 +5,15 @@
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
*/ */
Raphael = (function () { Raphael = (function () {
var separator = /[, ]+/, var separator = /[, ]+/,
elements = /^(circle|rect|path|ellipse|text|image)$/, elements = /^(circle|rect|path|ellipse|text|image)$/,
proto = "prototype",
has = "hasOwnProperty", has = "hasOwnProperty",
doc = document, doc = document,
win = window, win = window,
oldRaphael = { oldRaphael = {
was: win[has]("Raphael"), was: Object[proto][has].call(win, "Raphael"),
is: win.Raphael is: win.Raphael
}, },
R = function () { R = function () {
...@@ -39,7 +39,6 @@ Raphael = (function () { ...@@ -39,7 +39,6 @@ Raphael = (function () {
events = "click dblclick mousedown mousemove mouseout mouseover mouseup"[split](S), events = "click dblclick mousedown mousemove mouseout mouseover mouseup"[split](S),
join = "join", join = "join",
length = "length", length = "length",
proto = "prototype",
lowerCase = String[proto].toLowerCase, lowerCase = String[proto].toLowerCase,
math = Math, math = Math,
mmax = math.max, mmax = math.max,
...@@ -51,24 +50,25 @@ Raphael = (function () { ...@@ -51,24 +50,25 @@ Raphael = (function () {
pow = math.pow, pow = math.pow,
push = "push", push = "push",
rg = /^(?=[\da-f]$)/, rg = /^(?=[\da-f]$)/,
ISURL = /^url\(['"]?([^\)]+)['"]?\)$/i, ISURL = /^url\(['"]?([^\)]+?)['"]?\)$/i,
colourRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgb\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|rgb\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\)|hs[bl]\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|hs[bl]\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\))\s*$/i, colourRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgb\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|rgb\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\)|hs[bl]\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|hs[bl]\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\))\s*$/i,
round = math.round, round = math.round,
setAttribute = "setAttribute", setAttribute = "setAttribute",
toFloat = parseFloat, toFloat = parseFloat,
toInt = parseInt, toInt = parseInt,
upperCase = String[proto].toUpperCase, upperCase = String[proto].toUpperCase,
availableAttrs = {"clip-rect": "0 0 1e9 1e9", cursor: "default", cx: 0, cy: 0, fill: "#fff", "fill-opacity": 1, font: '10px "Arial"', "font-family": '"Arial"', "font-size": "10", "font-style": "normal", "font-weight": 400, gradient: 0, height: 0, href: "http://raphaeljs.com/", opacity: 1, path: "M0,0", r: 0, rotation: 0, rx: 0, ry: 0, scale: "1 1", src: "", stroke: "#000", "stroke-dasharray": "", "stroke-linecap": "butt", "stroke-linejoin": "butt", "stroke-miterlimit": 0, "stroke-opacity": 1, "stroke-width": 1, target: "_blank", "text-anchor": "middle", title: "Raphael", translation: "0 0", width: 0, x: 0, y: 0}, availableAttrs = {blur: 0, "clip-rect": "0 0 1e9 1e9", cursor: "default", cx: 0, cy: 0, fill: "#fff", "fill-opacity": 1, font: '10px "Arial"', "font-family": '"Arial"', "font-size": "10", "font-style": "normal", "font-weight": 400, gradient: 0, height: 0, href: "http://raphaeljs.com/", opacity: 1, path: "M0,0", r: 0, rotation: 0, rx: 0, ry: 0, scale: "1 1", src: "", stroke: "#000", "stroke-dasharray": "", "stroke-linecap": "butt", "stroke-linejoin": "butt", "stroke-miterlimit": 0, "stroke-opacity": 1, "stroke-width": 1, target: "_blank", "text-anchor": "middle", title: "Raphael", translation: "0 0", width: 0, x: 0, y: 0},
availableAnimAttrs = {along: "along", "clip-rect": "csv", cx: nu, cy: nu, fill: "colour", "fill-opacity": nu, "font-size": nu, height: nu, opacity: nu, path: "path", r: nu, rotation: "csv", rx: nu, ry: nu, scale: "csv", stroke: "colour", "stroke-opacity": nu, "stroke-width": nu, translation: "csv", width: nu, x: nu, y: nu}, availableAnimAttrs = {along: "along", blur: nu, "clip-rect": "csv", cx: nu, cy: nu, fill: "colour", "fill-opacity": nu, "font-size": nu, height: nu, opacity: nu, path: "path", r: nu, rotation: "csv", rx: nu, ry: nu, scale: "csv", stroke: "colour", "stroke-opacity": nu, "stroke-width": nu, translation: "csv", width: nu, x: nu, y: nu},
rp = "replace"; rp = "replace";
R.version = "1.3.2"; R.version = "1.3.2";
R.type = (win.SVGAngle || doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML"); R.type = (win.SVGAngle || doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML");
if (R.type == "VML") { if (R.type == "VML") {
var d = document.createElement("div"); var d = doc.createElement("div");
d.innerHTML = '<!--[if vml]><br><br><![endif]-->'; d.innerHTML = '<!--[if vml]><br><br><![endif]-->';
if (d.childNodes[length] != 2) { if (d.childNodes[length] != 2) {
return null; return R.type = null;
} }
d = null;
} }
R.svg = !(R.vml = R.type == "VML"); R.svg = !(R.vml = R.type == "VML");
Paper[proto] = R[proto]; Paper[proto] = R[proto];
...@@ -92,12 +92,12 @@ Raphael = (function () { ...@@ -92,12 +92,12 @@ Raphael = (function () {
var bod; var bod;
color = (color + E)[rp](trim, E); color = (color + E)[rp](trim, E);
try { try {
var docum = new ActiveXObject("htmlfile"); var docum = new win.ActiveXObject("htmlfile");
docum.write("<body>"); docum.write("<body>");
docum.close(); docum.close();
bod = docum.body; bod = docum.body;
} catch(e) { } catch(e) {
bod = createPopup().document.body; bod = win.createPopup().document.body;
} }
var range = bod.createTextRange(); var range = bod.createTextRange();
try { try {
...@@ -121,6 +121,12 @@ Raphael = (function () { ...@@ -121,6 +121,12 @@ Raphael = (function () {
} }
return toHex(color); return toHex(color);
}; };
var hsbtoString = function () {
return "hsb(" + [this.h, this.s, this.b] + ")";
},
rgbtoString = function () {
return this.hex;
};
R.hsb2rgb = cacher(function (hue, saturation, brightness) { R.hsb2rgb = cacher(function (hue, saturation, brightness) {
if (R.is(hue, "object") && "h" in hue && "s" in hue && "b" in hue) { if (R.is(hue, "object") && "h" in hue && "s" in hue && "b" in hue) {
brightness = hue.b; brightness = hue.b;
...@@ -149,7 +155,7 @@ Raphael = (function () { ...@@ -149,7 +155,7 @@ Raphael = (function () {
red *= 255; red *= 255;
green *= 255; green *= 255;
blue *= 255; blue *= 255;
var rgb = {r: red, g: green, b: blue}, var rgb = {r: red, g: green, b: blue, toString: rgbtoString},
r = (~~red)[toString](16), r = (~~red)[toString](16),
g = (~~green)[toString](16), g = (~~green)[toString](16),
b = (~~blue)[toString](16); b = (~~blue)[toString](16);
...@@ -197,7 +203,7 @@ Raphael = (function () { ...@@ -197,7 +203,7 @@ Raphael = (function () {
hue < 0 && hue++; hue < 0 && hue++;
hue > 1 && hue--; hue > 1 && hue--;
} }
return {h: hue, s: saturation, b: brightness}; return {h: hue, s: saturation, b: brightness, toString: hsbtoString};
}, R); }, R);
var p2s = /,?([achlmqrstvxz]),?/gi; var p2s = /,?([achlmqrstvxz]),?/gi;
R._path2string = function () { R._path2string = function () {
...@@ -325,7 +331,7 @@ Raphael = (function () { ...@@ -325,7 +331,7 @@ Raphael = (function () {
data[push]([b][concat](params.splice(0, paramCounts[name]))); data[push]([b][concat](params.splice(0, paramCounts[name])));
if (!paramCounts[name]) { if (!paramCounts[name]) {
break; break;
}; }
} }
}); });
} }
...@@ -804,7 +810,7 @@ Raphael = (function () { ...@@ -804,7 +810,7 @@ Raphael = (function () {
par[2] && (dot.offset = par[2] + "%"); par[2] && (dot.offset = par[2] + "%");
dots[push](dot); dots[push](dot);
} }
for (var i = 1, ii = dots[length] - 1; i < ii; i++) { for (i = 1, ii = dots[length] - 1; i < ii; i++) {
if (!dots[i].offset) { if (!dots[i].offset) {
var start = toFloat(dots[i - 1].offset || 0), var start = toFloat(dots[i - 1].offset || 0),
end = 0; end = 0;
...@@ -828,36 +834,29 @@ Raphael = (function () { ...@@ -828,36 +834,29 @@ Raphael = (function () {
} }
return dots; return dots;
}), }),
getContainer = function () { getContainer = function (x, y, w, h) {
var container, var container;
x, if (R.is(x, "string") || R.is(x, "object")) {
y, container = R.is(x, "string") ? doc.getElementById(x) : x;
width,
height;
if (R.is(arguments[0], "string") || R.is(arguments[0], "object")) {
if (R.is(arguments[0], "string")) {
container = doc.getElementById(arguments[0]);
} else {
container = arguments[0];
}
if (container.tagName) { if (container.tagName) {
if (arguments[1] == null) { if (y == null) {
return { return {
container: container, container: container,
width: container.style.pixelWidth || container.offsetWidth, width: container.style.pixelWidth || container.offsetWidth,
height: container.style.pixelHeight || container.offsetHeight height: container.style.pixelHeight || container.offsetHeight
}; };
} else { } else {
return {container: container, width: arguments[1], height: arguments[2]}; return {container: container, width: y, height: w};
} }
} }
} else if (R.is(arguments[0], nu) && arguments[length] > 3) { } else if (R.is(x, nu) && h != null) {
return {container: 1, x: arguments[0], y: arguments[1], width: arguments[2], height: arguments[3]}; return {container: 1, x: x, y: y, width: w, height: h};
} }
}, },
plugins = function (con, add) { plugins = function (con, add) {
var that = this; var that = this;
for (var prop in add) if (add[has](prop) && !(prop in con)) { for (var prop in add) {
if (add[has](prop) && !(prop in con)) {
switch (typeof add[prop]) { switch (typeof add[prop]) {
case "function": case "function":
(function (f) { (function (f) {
...@@ -873,6 +872,7 @@ Raphael = (function () { ...@@ -873,6 +872,7 @@ Raphael = (function () {
break; break;
} }
} }
}
}, },
tear = function (el, paper) { tear = function (el, paper) {
el == paper.top && (paper.top = el.prev); el == paper.top && (paper.top = el.prev);
...@@ -927,10 +927,10 @@ Raphael = (function () { ...@@ -927,10 +927,10 @@ Raphael = (function () {
if (R.svg) { if (R.svg) {
Paper[proto].svgns = "http://www.w3.org/2000/svg"; Paper[proto].svgns = "http://www.w3.org/2000/svg";
Paper[proto].xlink = "http://www.w3.org/1999/xlink"; Paper[proto].xlink = "http://www.w3.org/1999/xlink";
var round = function (num) { round = function (num) {
return +num + (~~num === num) * .5; return +num + (~~num === num) * .5;
}, };
roundPath = function (path) { var roundPath = function (path) {
for (var i = 0, ii = path[length]; i < ii; i++) { for (var i = 0, ii = path[length]; i < ii; i++) {
if (lowerCase.call(path[i][0]) != "a") { if (lowerCase.call(path[i][0]) != "a") {
for (var j = 1, jj = path[i][length]; j < jj; j++) { for (var j = 1, jj = path[i][length]; j < jj; j++) {
...@@ -945,9 +945,11 @@ Raphael = (function () { ...@@ -945,9 +945,11 @@ Raphael = (function () {
}, },
$ = function (el, attr) { $ = function (el, attr) {
if (attr) { if (attr) {
for (var key in attr) if (attr[has](key)) { for (var key in attr) {
if (attr[has](key)) {
el[setAttribute](key, attr[key]); el[setAttribute](key, attr[key]);
} }
}
} else { } else {
return doc.createElementNS(Paper[proto].svgns, el); return doc.createElementNS(Paper[proto].svgns, el);
} }
...@@ -1004,6 +1006,10 @@ Raphael = (function () { ...@@ -1004,6 +1006,10 @@ Raphael = (function () {
if (!dots) { if (!dots) {
return null; return null;
} }
var id = o.getAttribute("fill");
id = id.match(/^url\(#(.*)\)$/);
id && SVG.defs.removeChild(doc.getElementById(id[1]));
var el = $(type + "Gradient"); var el = $(type + "Gradient");
el.id = "r" + (R._id++)[toString](36); el.id = "r" + (R._id++)[toString](36);
$(el, type == "radial" ? {fx: fx, fy: fy} : {x1: vector[0], y1: vector[1], x2: vector[2], y2: vector[3]}); $(el, type == "radial" ? {fx: fx, fy: fy} : {x1: vector[0], y1: vector[1], x2: vector[2], y2: vector[3]});
...@@ -1015,7 +1021,7 @@ Raphael = (function () { ...@@ -1015,7 +1021,7 @@ Raphael = (function () {
"stop-color": dots[i].color || "#fff" "stop-color": dots[i].color || "#fff"
}); });
el[appendChild](stop); el[appendChild](stop);
}; }
$(o, { $(o, {
fill: "url(#" + el.id + ")", fill: "url(#" + el.id + ")",
opacity: 1, opacity: 1,
...@@ -1070,13 +1076,17 @@ Raphael = (function () { ...@@ -1070,13 +1076,17 @@ Raphael = (function () {
rotxy[2] = +rotxy[2]; rotxy[2] = +rotxy[2];
} }
toFloat(rot) && o.rotate(0, true); toFloat(rot) && o.rotate(0, true);
for (var att in params) if (params[has](att)) { for (var att in params) {
if (params[has](att)) {
if (!availableAttrs[has](att)) { if (!availableAttrs[has](att)) {
continue; continue;
} }
var value = params[att]; var value = params[att];
attrs[att] = value; attrs[att] = value;
switch (att) { switch (att) {
case "blur":
o.blur(value);
break;
case "rotation": case "rotation":
o.rotate(value, true); o.rotate(value, true);
break; break;
...@@ -1202,14 +1212,14 @@ Raphael = (function () { ...@@ -1202,14 +1212,14 @@ Raphael = (function () {
translate.call(o, xy[0], xy[1]); translate.call(o, xy[0], xy[1]);
break; break;
case "scale": case "scale":
var xy = (value + E)[split](separator); xy = (value + E)[split](separator);
o.scale(+xy[0] || 1, +xy[1] || +xy[0] || 1, +xy[2] || null, +xy[3] || null); o.scale(+xy[0] || 1, +xy[1] || +xy[0] || 1, isNaN(toFloat(xy[2])) ? null : +xy[2], isNaN(toFloat(xy[3])) ? null : +xy[3]);
break; break;
case "fill": case "fill":
var isURL = (value + E).match(ISURL); var isURL = (value + E).match(ISURL);
if (isURL) { if (isURL) {
var el = $("pattern"), el = $("pattern");
ig = $("image"); var ig = $("image");
el.id = "r" + (R._id++)[toString](36); el.id = "r" + (R._id++)[toString](36);
$(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse", height: 1, width: 1}); $(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse", height: 1, width: 1});
$(ig, {x: 0, y: 0}); $(ig, {x: 0, y: 0});
...@@ -1274,6 +1284,7 @@ Raphael = (function () { ...@@ -1274,6 +1284,7 @@ Raphael = (function () {
break; break;
} }
} }
}
tuneText(o, params); tuneText(o, params);
if (rotxy) { if (rotxy) {
...@@ -1282,8 +1293,8 @@ Raphael = (function () { ...@@ -1282,8 +1293,8 @@ Raphael = (function () {
toFloat(rot) && o.rotate(rot, true); toFloat(rot) && o.rotate(rot, true);
} }
}; };
var leading = 1.2; var leading = 1.2,
var tuneText = function (el, params) { tuneText = function (el, params) {
if (el.type != "text" || !(params[has]("text") || params[has]("font") || params[has]("font-size") || params[has]("x") || params[has]("y"))) { if (el.type != "text" || !(params[has]("text") || params[has]("font") || params[has]("font-size") || params[has]("x") || params[has]("y"))) {
return; return;
} }
...@@ -1304,8 +1315,8 @@ Raphael = (function () { ...@@ -1304,8 +1315,8 @@ Raphael = (function () {
node[appendChild](tspan); node[appendChild](tspan);
} }
} else { } else {
var texts = node.getElementsByTagName("tspan"); texts = node.getElementsByTagName("tspan");
for (var i = 0, ii = texts[length]; i < ii; i++) { for (i = 0, ii = texts[length]; i < ii; i++) {
i && $(texts[i], {dy: fontSize * leading, x: a.x}); i && $(texts[i], {dy: fontSize * leading, x: a.x});
} }
} }
...@@ -1313,8 +1324,8 @@ Raphael = (function () { ...@@ -1313,8 +1324,8 @@ Raphael = (function () {
var bb = el.getBBox(), var bb = el.getBBox(),
dif = a.y - (bb.y + bb.height / 2); dif = a.y - (bb.y + bb.height / 2);
dif && isFinite(dif) && $(node, {y: a.y + dif}); dif && isFinite(dif) && $(node, {y: a.y + dif});
}; },
var Element = function (node, svg) { Element = function (node, svg) {
var X = 0, var X = 0,
Y = 0; Y = 0;
this[0] = node; this[0] = node;
...@@ -1424,11 +1435,11 @@ Raphael = (function () { ...@@ -1424,11 +1435,11 @@ Raphael = (function () {
hide && this.hide(); hide && this.hide();
return bbox; return bbox;
}; };
Element[proto].attr = function () { Element[proto].attr = function (name, value) {
if (this.removed) { if (this.removed) {
return this; return this;
} }
if (arguments[length] == 0) { if (name == null) {
var res = {}; var res = {};
for (var i in this.attrs) if (this.attrs[has](i)) { for (var i in this.attrs) if (this.attrs[has](i)) {
res[i] = this.attrs[i]; res[i] = this.attrs[i];
...@@ -1438,34 +1449,34 @@ Raphael = (function () { ...@@ -1438,34 +1449,34 @@ Raphael = (function () {
res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient;
return res; return res;
} }
if (arguments[length] == 1 && R.is(arguments[0], "string")) { if (value == null && R.is(name, "string")) {
if (arguments[0] == "translation") { if (name == "translation") {
return translate.call(this); return translate.call(this);
} }
if (arguments[0] == "rotation") { if (name == "rotation") {
return this.rotate(); return this.rotate();
} }
if (arguments[0] == "scale") { if (name == "scale") {
return this.scale(); return this.scale();
} }
if (arguments[0] == "fill" && this.attrs.fill == "none" && this.attrs.gradient) { if (name == "fill" && this.attrs.fill == "none" && this.attrs.gradient) {
return this.attrs.gradient; return this.attrs.gradient;
} }
return this.attrs[arguments[0]]; return this.attrs[name];
} }
if (arguments[length] == 1 && R.is(arguments[0], "array")) { if (value == null && R.is(name, "array")) {
var values = {}; var values = {};
for (var j in arguments[0]) if (arguments[0][has](j)) { for (var j = 0, jj = name.length; j < jj; j++) {
values[arguments[0][j]] = this.attrs[arguments[0][j]]; values[name[j]] = this.attr(name[j]);
} }
return values; return values;
} }
if (arguments[length] == 2) { if (value != null) {
var params = {}; var params = {};
params[arguments[0]] = arguments[1]; params[name] = value;
setFillAndStroke(this, params); setFillAndStroke(this, params);
} else if (arguments[length] == 1 && R.is(arguments[0], "object")) { } else if (name != null && R.is(name, "object")) {
setFillAndStroke(this, arguments[0]); setFillAndStroke(this, name);
} }
return this; return this;
}; };
...@@ -1511,6 +1522,28 @@ Raphael = (function () { ...@@ -1511,6 +1522,28 @@ Raphael = (function () {
insertbefore(this, element, this.paper); insertbefore(this, element, this.paper);
return this; return this;
}; };
Element[proto].blur = function (size) {
// Experimental. No Safari support. Use it on your own risk.
var t = this;
if (+size !== 0) {
var fltr = $("filter"),
blur = $("feGaussianBlur");
t.attrs.blur = size;
fltr.id = "r" + (R._id++)[toString](36);
$(blur, {stdDeviation: +size || 1.5});
fltr.appendChild(blur);
t.paper.defs.appendChild(fltr);
t._blur = fltr;
$(t.node, {filter: "url(#" + fltr.id + ")"});
} else {
if (t._blur) {
t._blur.parentNode.removeChild(t._blur);
delete t._blur;
delete t.attrs.blur;
}
t.node.removeAttribute("filter");
}
};
var theCircle = function (svg, x, y, r) { var theCircle = function (svg, x, y, r) {
x = round(x); x = round(x);
y = round(y); y = round(y);
...@@ -1572,7 +1605,7 @@ Raphael = (function () { ...@@ -1572,7 +1605,7 @@ Raphael = (function () {
return this; return this;
}; };
var create = function () { var create = function () {
var con = getContainer[apply](null, arguments), var con = getContainer[apply](0, arguments),
container = con && con.container, container = con && con.container,
x = con.x, x = con.x,
y = con.y, y = con.y,
...@@ -1631,6 +1664,8 @@ Raphael = (function () { ...@@ -1631,6 +1664,8 @@ Raphael = (function () {
var map = {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"}, var map = {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"},
bites = /([clmz]),?([^clmz]*)/gi, bites = /([clmz]),?([^clmz]*)/gi,
val = /-?[^,\s-]+/g, val = /-?[^,\s-]+/g,
coordsize = 1e3 + S + 1e3,
zoom = 10,
path2vml = function (path) { path2vml = function (path) {
var total = /[ahqstv]/ig, var total = /[ahqstv]/ig,
command = pathToAbsolute; command = pathToAbsolute;
...@@ -1646,19 +1681,20 @@ Raphael = (function () { ...@@ -1646,19 +1681,20 @@ Raphael = (function () {
res += vals + map[command == "m" ? "l" : "L"]; res += vals + map[command == "m" ? "l" : "L"];
vals = []; vals = [];
} }
vals[push](round(value)); vals[push](round(value * zoom));
}); });
return res + vals; return res + vals;
}); });
return res; return res;
} }
var pa = command(path), p, res = [], r; var pa = command(path), p, r;
res = [];
for (var i = 0, ii = pa[length]; i < ii; i++) { for (var i = 0, ii = pa[length]; i < ii; i++) {
p = pa[i]; p = pa[i];
r = lowerCase.call(pa[i][0]); r = lowerCase.call(pa[i][0]);
r == "z" && (r = "x"); r == "z" && (r = "x");
for (var j = 1, jj = p[length]; j < jj; j++) { for (var j = 1, jj = p[length]; j < jj; j++) {
r += round(p[j]) + (j != jj - 1 ? "," : E); r += round(p[j] * zoom) + (j != jj - 1 ? "," : E);
} }
res[push](r); res[push](r);
} }
...@@ -1668,18 +1704,18 @@ Raphael = (function () { ...@@ -1668,18 +1704,18 @@ Raphael = (function () {
R[toString] = function () { R[toString] = function () {
return "Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl " + this.version; return "Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl " + this.version;
}; };
var thePath = function (pathString, VML) { thePath = function (pathString, vml) {
var g = createNode("group"); var g = createNode("group");
g.style.cssText = "position:absolute;left:0;top:0;width:" + VML.width + "px;height:" + VML.height + "px"; g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px";
g.coordsize = VML.coordsize; g.coordsize = vml.coordsize;
g.coordorigin = VML.coordorigin; g.coordorigin = vml.coordorigin;
var el = createNode("shape"), ol = el.style; var el = createNode("shape"), ol = el.style;
ol.width = VML.width + "px"; ol.width = vml.width + "px";
ol.height = VML.height + "px"; ol.height = vml.height + "px";
el.coordsize = this.coordsize; el.coordsize = coordsize;
el.coordorigin = this.coordorigin; el.coordorigin = vml.coordorigin;
g[appendChild](el); g[appendChild](el);
var p = new Element(el, g, VML), var p = new Element(el, g, vml),
attr = {fill: "none", stroke: "#000"}; attr = {fill: "none", stroke: "#000"};
pathString && (attr.path = pathString); pathString && (attr.path = pathString);
p.isAbsolute = true; p.isAbsolute = true;
...@@ -1687,10 +1723,10 @@ Raphael = (function () { ...@@ -1687,10 +1723,10 @@ Raphael = (function () {
p.path = []; p.path = [];
p.Path = E; p.Path = E;
setFillAndStroke(p, attr); setFillAndStroke(p, attr);
VML.canvas[appendChild](g); vml.canvas[appendChild](g);
return p; return p;
}; };
var setFillAndStroke = function (o, params) { setFillAndStroke = function (o, params) {
o.attrs = o.attrs || {}; o.attrs = o.attrs || {};
var node = o.node, var node = o.node,
a = o.attrs, a = o.attrs,
...@@ -1704,6 +1740,7 @@ Raphael = (function () { ...@@ -1704,6 +1740,7 @@ Raphael = (function () {
params.title && (node.title = params.title); params.title && (node.title = params.title);
params.target && (node.target = params.target); params.target && (node.target = params.target);
params.cursor && (s.cursor = params.cursor); params.cursor && (s.cursor = params.cursor);
"blur" in params && o.blur(params.blur);
if (params.path && o.type == "path") { if (params.path && o.type == "path") {
a.path = params.path; a.path = params.path;
node.path = path2vml(a.path); node.path = path2vml(a.path);
...@@ -1815,8 +1852,8 @@ Raphael = (function () { ...@@ -1815,8 +1852,8 @@ Raphael = (function () {
} }
(params.stroke == "none" || stroke.on == null || params.stroke == 0 || params["stroke-width"] == 0) && (stroke.on = false); (params.stroke == "none" || stroke.on == null || params.stroke == 0 || params["stroke-width"] == 0) && (stroke.on = false);
stroke.on && params.stroke && (stroke.color = R.getRGB(params.stroke).hex); stroke.on && params.stroke && (stroke.color = R.getRGB(params.stroke).hex);
var opacity = ((+a["stroke-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1), opacity = ((+a["stroke-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1);
width = (toFloat(params["stroke-width"]) || 1) * .75; var width = (toFloat(params["stroke-width"]) || 1) * .75;
opacity < 0 && (opacity = 0); opacity < 0 && (opacity = 0);
opacity > 1 && (opacity = 1); opacity > 1 && (opacity = 1);
params["stroke-width"] == null && (width = a["stroke-width"]); params["stroke-width"] == null && (width = a["stroke-width"]);
...@@ -1845,7 +1882,7 @@ Raphael = (function () { ...@@ -1845,7 +1882,7 @@ Raphael = (function () {
newstroke && node[appendChild](stroke); newstroke && node[appendChild](stroke);
} }
if (res.type == "text") { if (res.type == "text") {
var s = res.paper.span.style; s = res.paper.span.style;
a.font && (s.font = a.font); a.font && (s.font = a.font);
a["font-family"] && (s.fontFamily = a["font-family"]); a["font-family"] && (s.fontFamily = a["font-family"]);
a["font-size"] && (s.fontSize = a["font-size"]); a["font-size"] && (s.fontSize = a["font-size"]);
...@@ -1873,7 +1910,7 @@ Raphael = (function () { ...@@ -1873,7 +1910,7 @@ Raphael = (function () {
} }
} }
}; };
var addGradientFill = function (o, gradient) { addGradientFill = function (o, gradient) {
o.attrs = o.attrs || {}; o.attrs = o.attrs || {};
var attrs = o.attrs, var attrs = o.attrs,
fill = o.node.getElementsByTagName("fill"), fill = o.node.getElementsByTagName("fill"),
...@@ -1925,7 +1962,7 @@ Raphael = (function () { ...@@ -1925,7 +1962,7 @@ Raphael = (function () {
} }
return 1; return 1;
}; };
var Element = function (node, group, vml) { Element = function (node, group, vml) {
var Rotation = 0, var Rotation = 0,
RotX = 0, RotX = 0,
RotY = 0, RotY = 0,
...@@ -2052,43 +2089,40 @@ Raphael = (function () { ...@@ -2052,43 +2089,40 @@ Raphael = (function () {
cx = (cx == null) ? x + w / 2 : cx; cx = (cx == null) ? x + w / 2 : cx;
cy = (cy == null) ? y + h / 2 : cy; cy = (cy == null) ? y + h / 2 : cy;
var left = cx - this.paper.width / 2, var left = cx - this.paper.width / 2,
top = cy - this.paper.height / 2; top = cy - this.paper.height / 2, t;
if (this.type == "path" || this.type == "text") { gs.left != (t = left + "px") && (gs.left = t);
(gs.left != left + "px") && (gs.left = left + "px"); gs.top != (t = top + "px") && (gs.top = t);
(gs.top != top + "px") && (gs.top = top + "px"); this.X = this.type == "path" ? -left : x;
this.X = this.type == "text" ? x : -left; this.Y = this.type == "path" ? -top : y;
this.Y = this.type == "text" ? y : -top;
this.W = w; this.W = w;
this.H = h; this.H = h;
(os.left != -left + "px") && (os.left = -left + "px"); if (this.type == "path") {
(os.top != -top + "px") && (os.top = -top + "px"); os.left != (t = -left * zoom + "px") && (os.left = t);
os.top != (t = -top * zoom + "px") && (os.top = t);
} else if (this.type == "text") {
os.left != (t = -left + "px") && (os.left = t);
os.top != (t = -top + "px") && (os.top = t);
} else { } else {
(gs.left != left + "px") && (gs.left = left + "px"); gs.width != (t = this.paper.width + "px") && (gs.width = t);
(gs.top != top + "px") && (gs.top = top + "px"); gs.height != (t = this.paper.height + "px") && (gs.height = t);
this.X = x; os.left != (t = x - left + "px") && (os.left = t);
this.Y = y; os.top != (t = y - top + "px") && (os.top = t);
this.W = w; os.width != (t = w + "px") && (os.width = t);
this.H = h; os.height != (t = h + "px") && (os.height = t);
(gs.width != this.paper.width + "px") && (gs.width = this.paper.width + "px");
(gs.height != this.paper.height + "px") && (gs.height = this.paper.height + "px");
(os.left != x - left + "px") && (os.left = x - left + "px");
(os.top != y - top + "px") && (os.top = y - top + "px");
(os.width != w + "px") && (os.width = w + "px");
(os.height != h + "px") && (os.height = h + "px");
var arcsize = (+params.r || 0) / mmin(w, h); var arcsize = (+params.r || 0) / mmin(w, h);
if (this.type == "rect" && this.arcsize.toFixed(4) != arcsize.toFixed(4) && (arcsize || this.arcsize)) { if (this.type == "rect" && this.arcsize.toFixed(4) != arcsize.toFixed(4) && (arcsize || this.arcsize)) {
// We should replace element with the new one // We should replace element with the new one
var o = createNode("roundrect"), var o = createNode("roundrect"),
a = {}, a = {},
i = 0,
ii = this.events && this.events[length]; ii = this.events && this.events[length];
i = 0;
o.arcsize = arcsize; o.arcsize = arcsize;
o.raphael = this; o.raphael = this;
this.Group[appendChild](o); this.Group[appendChild](o);
this.Group.removeChild(this.node); this.Group.removeChild(this.node);
this[0] = this.node = o; this[0] = this.node = o;
this.arcsize = arcsize; this.arcsize = arcsize;
for (var i in attr) { for (i in attr) {
a[i] = attr[i]; a[i] = attr[i];
} }
delete a.scale; delete a.scale;
...@@ -2134,11 +2168,11 @@ Raphael = (function () { ...@@ -2134,11 +2168,11 @@ Raphael = (function () {
} }
this.removed = true; this.removed = true;
}; };
Element[proto].attr = function () { Element[proto].attr = function (name, value) {
if (this.removed) { if (this.removed) {
return this; return this;
} }
if (arguments[length] == 0) { if (name == null) {
var res = {}; var res = {};
for (var i in this.attrs) if (this.attrs[has](i)) { for (var i in this.attrs) if (this.attrs[has](i)) {
res[i] = this.attrs[i]; res[i] = this.attrs[i];
...@@ -2148,34 +2182,34 @@ Raphael = (function () { ...@@ -2148,34 +2182,34 @@ Raphael = (function () {
res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient;
return res; return res;
} }
if (arguments[length] == 1 && R.is(arguments[0], "string")) { if (value == null && R.is(name, "string")) {
if (arguments[0] == "translation") { if (name == "translation") {
return translate.call(this); return translate.call(this);
} }
if (arguments[0] == "rotation") { if (name == "rotation") {
return this.rotate(); return this.rotate();
} }
if (arguments[0] == "scale") { if (name == "scale") {
return this.scale(); return this.scale();
} }
if (arguments[0] == "fill" && this.attrs.fill == "none" && this.attrs.gradient) { if (name == "fill" && this.attrs.fill == "none" && this.attrs.gradient) {
return this.attrs.gradient; return this.attrs.gradient;
} }
return this.attrs[arguments[0]]; return this.attrs[name];
}
if (this.attrs && value == null && R.is(name, "array")) {
var ii, values = {};
for (i = 0, ii = name[length]; i < ii; i++) {
values[name[i]] = this.attr(name[i]);
} }
if (this.attrs && arguments[length] == 1 && R.is(arguments[0], "array")) {
var values = {};
for (var i = 0, ii = arguments[0][length]; i < ii; i++) {
values[arguments[0][i]] = this.attrs[arguments[0][i]];
};
return values; return values;
} }
var params; var params;
if (arguments[length] == 2) { if (value != null) {
params = {}; params = {};
params[arguments[0]] = arguments[1]; params[name] = value;
} }
arguments[length] == 1 && R.is(arguments[0], "object") && (params = arguments[0]); value == null && R.is(name, "object") && (params = name);
if (params) { if (params) {
if (params.text && this.type == "text") { if (params.text && this.type == "text") {
this.node.string = params.text; this.node.string = params.text;
...@@ -2223,13 +2257,28 @@ Raphael = (function () { ...@@ -2223,13 +2257,28 @@ Raphael = (function () {
insertbefore(this, element, this.paper); insertbefore(this, element, this.paper);
return this; return this;
}; };
var blurregexp = / progid:\S+Blur\([^\)]+\)/g;
Element[proto].blur = function (size) {
var s = this.node.style,
f = s.filter;
f = f.replace(blurregexp, "");
if (+size !== 0) {
this.attrs.blur = size;
s.filter = f + " progid:DXImageTransform.Microsoft.Blur(pixelradius=" + (+size || 1.5) + ")";
s.margin = Raphael.format("-{0}px 0 0 -{0}px", Math.round(+size || 1.5));
} else {
s.filter = f;
s.margin = 0;
delete this.attrs.blur;
}
};
var theCircle = function (vml, x, y, r) { theCircle = function (vml, x, y, r) {
var g = createNode("group"), var g = createNode("group"),
o = createNode("oval"), o = createNode("oval"),
ol = o.style; ol = o.style;
g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px"; g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px";
g.coordsize = vml.coordsize; g.coordsize = coordsize;
g.coordorigin = vml.coordorigin; g.coordorigin = vml.coordorigin;
g[appendChild](o); g[appendChild](o);
var res = new Element(o, g, vml); var res = new Element(o, g, vml);
...@@ -2241,13 +2290,13 @@ Raphael = (function () { ...@@ -2241,13 +2290,13 @@ Raphael = (function () {
res.setBox({x: x - r, y: y - r, width: r * 2, height: r * 2}); res.setBox({x: x - r, y: y - r, width: r * 2, height: r * 2});
vml.canvas[appendChild](g); vml.canvas[appendChild](g);
return res; return res;
}, };
theRect = function (vml, x, y, w, h, r) { theRect = function (vml, x, y, w, h, r) {
var g = createNode("group"), var g = createNode("group"),
o = createNode("roundrect"), o = createNode("roundrect"),
arcsize = (+r || 0) / (mmin(w, h)); arcsize = (+r || 0) / (mmin(w, h));
g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px"; g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px";
g.coordsize = vml.coordsize; g.coordsize = coordsize;
g.coordorigin = vml.coordorigin; g.coordorigin = vml.coordorigin;
g[appendChild](o); g[appendChild](o);
o.arcsize = arcsize; o.arcsize = arcsize;
...@@ -2258,13 +2307,13 @@ Raphael = (function () { ...@@ -2258,13 +2307,13 @@ Raphael = (function () {
res.setBox({x: x, y: y, width: w, height: h, r: r}); res.setBox({x: x, y: y, width: w, height: h, r: r});
vml.canvas[appendChild](g); vml.canvas[appendChild](g);
return res; return res;
}, };
theEllipse = function (vml, x, y, rx, ry) { theEllipse = function (vml, x, y, rx, ry) {
var g = createNode("group"), var g = createNode("group"),
o = createNode("oval"), o = createNode("oval"),
ol = o.style; ol = o.style;
g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px"; g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px";
g.coordsize = vml.coordsize; g.coordsize = coordsize;
g.coordorigin = vml.coordorigin; g.coordorigin = vml.coordorigin;
g[appendChild](o); g[appendChild](o);
var res = new Element(o, g, vml); var res = new Element(o, g, vml);
...@@ -2277,13 +2326,13 @@ Raphael = (function () { ...@@ -2277,13 +2326,13 @@ Raphael = (function () {
res.setBox({x: x - rx, y: y - ry, width: rx * 2, height: ry * 2}); res.setBox({x: x - rx, y: y - ry, width: rx * 2, height: ry * 2});
vml.canvas[appendChild](g); vml.canvas[appendChild](g);
return res; return res;
}, };
theImage = function (vml, src, x, y, w, h) { theImage = function (vml, src, x, y, w, h) {
var g = createNode("group"), var g = createNode("group"),
o = createNode("image"), o = createNode("image"),
ol = o.style; ol = o.style;
g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px"; g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px";
g.coordsize = vml.coordsize; g.coordsize = coordsize;
g.coordorigin = vml.coordorigin; g.coordorigin = vml.coordorigin;
o.src = src; o.src = src;
g[appendChild](o); g[appendChild](o);
...@@ -2297,7 +2346,7 @@ Raphael = (function () { ...@@ -2297,7 +2346,7 @@ Raphael = (function () {
res.setBox({x: x, y: y, width: w, height: h}); res.setBox({x: x, y: y, width: w, height: h});
vml.canvas[appendChild](g); vml.canvas[appendChild](g);
return res; return res;
}, };
theText = function (vml, x, y, text) { theText = function (vml, x, y, text) {
var g = createNode("group"), var g = createNode("group"),
el = createNode("shape"), el = createNode("shape"),
...@@ -2306,9 +2355,9 @@ Raphael = (function () { ...@@ -2306,9 +2355,9 @@ Raphael = (function () {
ps = path.style, ps = path.style,
o = createNode("textpath"); o = createNode("textpath");
g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px"; g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px";
g.coordsize = vml.coordsize; g.coordsize = coordsize;
g.coordorigin = vml.coordorigin; g.coordorigin = vml.coordorigin;
path.v = R.format("m{0},{1}l{2},{1}", round(x), round(y), round(x) + 1); path.v = R.format("m{0},{1}l{2},{1}", round(x * 10), round(y * 10), round(x * 10) + 1);
path.textpathok = true; path.textpathok = true;
ol.width = vml.width; ol.width = vml.width;
ol.height = vml.height; ol.height = vml.height;
...@@ -2330,7 +2379,7 @@ Raphael = (function () { ...@@ -2330,7 +2379,7 @@ Raphael = (function () {
res.setBox(); res.setBox();
vml.canvas[appendChild](g); vml.canvas[appendChild](g);
return res; return res;
}, };
setSize = function (width, height) { setSize = function (width, height) {
var cs = this.canvas.style; var cs = this.canvas.style;
width == +width && (width += "px"); width == +width && (width += "px");
...@@ -2339,8 +2388,8 @@ Raphael = (function () { ...@@ -2339,8 +2388,8 @@ Raphael = (function () {
cs.height = height; cs.height = height;
cs.clip = "rect(0 " + width + " " + height + " 0)"; cs.clip = "rect(0 " + width + " " + height + " 0)";
return this; return this;
}, };
createNode; var createNode;
doc.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)"); doc.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)");
try { try {
!doc.namespaces.rvml && doc.namespaces.add("rvml", "urn:schemas-microsoft-com:vml"); !doc.namespaces.rvml && doc.namespaces.add("rvml", "urn:schemas-microsoft-com:vml");
...@@ -2352,8 +2401,8 @@ Raphael = (function () { ...@@ -2352,8 +2401,8 @@ Raphael = (function () {
return doc.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">'); return doc.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');
}; };
} }
var create = function () { create = function () {
var con = getContainer[apply](null, arguments), var con = getContainer[apply](0, arguments),
container = con.container, container = con.container,
height = con.height, height = con.height,
s, s,
...@@ -2372,7 +2421,7 @@ Raphael = (function () { ...@@ -2372,7 +2421,7 @@ Raphael = (function () {
height == +height && (height += "px"); height == +height && (height += "px");
res.width = 1e3; res.width = 1e3;
res.height = 1e3; res.height = 1e3;
res.coordsize = "1000 1000"; res.coordsize = zoom * 1e3 + S + zoom * 1e3;
res.coordorigin = "0 0"; res.coordorigin = "0 0";
res.span = doc.createElement("span"); res.span = doc.createElement("span");
res.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;"; res.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";
...@@ -2406,15 +2455,16 @@ Raphael = (function () { ...@@ -2406,15 +2455,16 @@ Raphael = (function () {
for (var i in this) { for (var i in this) {
this[i] = removed(i); this[i] = removed(i);
} }
return true;
}; };
} }
// rest // rest
// Safari or Chrome (WebKit) rendering bug workaround method // Safari or Chrome (WebKit) rendering bug workaround method
if ((/^Apple|^Google/).test(navigator.vendor) && !(navigator.userAgent.indexOf("Version/4.0") + 1)) { if ((/^Apple|^Google/).test(win.navigator.vendor) && !(win.navigator.userAgent.indexOf("Version/4.0") + 1)) {
Paper[proto].safari = function () { Paper[proto].safari = function () {
var rect = this.rect(-99, -99, this.width + 99, this.height + 99); var rect = this.rect(-99, -99, this.width + 99, this.height + 99);
setTimeout(function () {rect.remove();}); win.setTimeout(function () {rect.remove();});
}; };
} else { } else {
Paper[proto].safari = function () {}; Paper[proto].safari = function () {};
...@@ -2503,7 +2553,7 @@ Raphael = (function () { ...@@ -2503,7 +2553,7 @@ Raphael = (function () {
Paper[proto].raphael = R; Paper[proto].raphael = R;
function x_y() { function x_y() {
return this.x + S + this.y; return this.x + S + this.y;
}; }
Element[proto].scale = function (x, y, cx, cy) { Element[proto].scale = function (x, y, cx, cy) {
if (x == null && y == null) { if (x == null && y == null) {
return { return {
...@@ -2560,7 +2610,6 @@ Raphael = (function () { ...@@ -2560,7 +2610,6 @@ Raphael = (function () {
skip = true; skip = true;
for (var i = 0, ii = path[length]; i < ii; i++) { for (var i = 0, ii = path[length]; i < ii; i++) {
var p = path[i], var p = path[i],
j,
P0 = upperCase.call(p[0]); P0 = upperCase.call(p[0]);
if (P0 == "M" && skip) { if (P0 == "M" && skip) {
continue; continue;
...@@ -2572,9 +2621,9 @@ Raphael = (function () { ...@@ -2572,9 +2621,9 @@ Raphael = (function () {
p[path[i][length] - 1] *= ky; p[path[i][length] - 1] *= ky;
p[1] *= dirx * kx; p[1] *= dirx * kx;
p[2] *= diry * ky; p[2] *= diry * ky;
p[5] = +(dirx + diry ? !!+p[5] : !+p[5]); p[5] = +!(dirx + diry ? !+p[5] : +p[5]);
} else if (P0 == "H") { } else if (P0 == "H") {
for (j = 1, jj = p[length]; j < jj; j++) { for (var j = 1, jj = p[length]; j < jj; j++) {
p[j] *= kx; p[j] *= kx;
} }
} else if (P0 == "V") { } else if (P0 == "V") {
...@@ -2587,8 +2636,8 @@ Raphael = (function () { ...@@ -2587,8 +2636,8 @@ Raphael = (function () {
} }
} }
} }
var dim2 = pathDimensions(path), var dim2 = pathDimensions(path);
dx = ncx - dim2.x - dim2.width / 2, dx = ncx - dim2.x - dim2.width / 2;
dy = ncy - dim2.y - dim2.height / 2; dy = ncy - dim2.y - dim2.height / 2;
path[0][1] += dx; path[0][1] += dx;
path[0][2] += dy; path[0][2] += dy;
...@@ -2633,7 +2682,19 @@ Raphael = (function () { ...@@ -2633,7 +2682,19 @@ Raphael = (function () {
delete attr.translation; delete attr.translation;
return this.paper[this.type]().attr(attr); return this.paper[this.type]().attr(attr);
}; };
var getLengthFactory = function (istotal, subpath) { var getPointAtSegmentLength = cacher(function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {
var len = 0,
old;
for (var i = 0; i < 1.001; i+=.001) {
var dot = R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, i);
i && (len += pow(pow(old.x - dot.x, 2) + pow(old.y - dot.y, 2), .5));
if (len >= length) {
return dot;
}
old = dot;
}
}),
getLengthFactory = function (istotal, subpath) {
return function (path, length, onlystart) { return function (path, length, onlystart) {
path = path2curve(path); path = path2curve(path);
var x, y, p, l, sp = "", subpaths = {}, point, var x, y, p, l, sp = "", subpaths = {}, point,
...@@ -2647,9 +2708,9 @@ Raphael = (function () { ...@@ -2647,9 +2708,9 @@ Raphael = (function () {
l = segmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); l = segmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);
if (len + l > length) { if (len + l > length) {
if (subpath && !subpaths.start) { if (subpath && !subpaths.start) {
point = R.findDotsAtSegment(x, y, p[1], p[2], p[3], p[4], p[5], p[6], (length - len) / l); point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);
sp += ["C", point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y]; sp += ["C", point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y];
if (onlystart) return sp; if (onlystart) {return sp;}
subpaths.start = sp; subpaths.start = sp;
sp = ["M", point.x, point.y + "C", point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]][join](); sp = ["M", point.x, point.y + "C", point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]][join]();
len += l; len += l;
...@@ -2658,7 +2719,7 @@ Raphael = (function () { ...@@ -2658,7 +2719,7 @@ Raphael = (function () {
continue; continue;
} }
if (!istotal && !subpath) { if (!istotal && !subpath) {
point = R.findDotsAtSegment(x, y, p[1], p[2], p[3], p[4], p[5], p[6], (length - len) / l); point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);
return {x: point.x, y: point.y, alpha: point.alpha}; return {x: point.x, y: point.y, alpha: point.alpha};
} }
} }
...@@ -2679,7 +2740,7 @@ Raphael = (function () { ...@@ -2679,7 +2740,7 @@ Raphael = (function () {
len = 0; len = 0;
for (var i = 0; i < 1.01; i+=.01) { for (var i = 0; i < 1.01; i+=.01) {
var dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, i); var dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, i);
i && (len += math.sqrt(pow(old.x - dot.x, 2) + pow(old.y - dot.y, 2))); i && (len += pow(pow(old.x - dot.x, 2) + pow(old.y - dot.y, 2), .5));
old = dot; old = dot;
} }
return len; return len;
...@@ -2688,15 +2749,15 @@ Raphael = (function () { ...@@ -2688,15 +2749,15 @@ Raphael = (function () {
getPointAtLength = getLengthFactory(), getPointAtLength = getLengthFactory(),
getSubpathsAtLength = getLengthFactory(0, 1); getSubpathsAtLength = getLengthFactory(0, 1);
Element[proto].getTotalLength = function () { Element[proto].getTotalLength = function () {
if (this.type != "path") return; if (this.type != "path") {return;}
return getTotalLength(this.attrs.path); return getTotalLength(this.attrs.path);
}; };
Element[proto].getPointAtLength = function (length) { Element[proto].getPointAtLength = function (length) {
if (this.type != "path") return; if (this.type != "path") {return;}
return getPointAtLength(this.attrs.path, length); return getPointAtLength(this.attrs.path, length);
}; };
Element[proto].getSubpath = function (from, to) { Element[proto].getSubpath = function (from, to) {
if (this.type != "path") return; if (this.type != "path") {return;}
if (math.abs(this.getTotalLength() - to) < 1e-6) { if (math.abs(this.getTotalLength() - to) < 1e-6) {
return getSubpathsAtLength(this.attrs.path, from).end; return getSubpathsAtLength(this.attrs.path, from).end;
} }
...@@ -2839,7 +2900,7 @@ Raphael = (function () { ...@@ -2839,7 +2900,7 @@ Raphael = (function () {
break; break;
case "clip-rect": case "clip-rect":
now = []; now = [];
var i = 4; i = 4;
while (i--) { while (i--) {
now[i] = +from[attr][i] + pos * ms * diff[attr][i]; now[i] = +from[attr][i] + pos * ms * diff[attr][i];
} }
...@@ -2853,7 +2914,7 @@ Raphael = (function () { ...@@ -2853,7 +2914,7 @@ Raphael = (function () {
that._run && that._run.call(that); that._run && that._run.call(that);
} else { } else {
if (to.along) { if (to.along) {
var point = getPointAtLength(to.along, to.len * !to.back); point = getPointAtLength(to.along, to.len * !to.back);
that.translate(diff.sx - (diff.x || 0) + point.x - diff.sx, diff.sy - (diff.y || 0) + point.y - diff.sy); that.translate(diff.sx - (diff.x || 0) + point.x - diff.sx, diff.sy - (diff.y || 0) + point.y - diff.sy);
to.rot && that.rotate(diff.r + point.alpha, point.x, point.y); to.rot && that.rotate(diff.r + point.alpha, point.x, point.y);
} }
...@@ -2868,7 +2929,7 @@ Raphael = (function () { ...@@ -2868,7 +2929,7 @@ Raphael = (function () {
e.prev = time; e.prev = time;
} }
R.svg && that && that.paper.safari(); R.svg && that && that.paper.safari();
animationElements[length] && setTimeout(animation); animationElements[length] && win.setTimeout(animation);
}, },
upto255 = function (color) { upto255 = function (color) {
return color > 255 ? 255 : (color < 0 ? 0 : color); return color > 255 ? 255 : (color < 0 ? 0 : color);
...@@ -2988,7 +3049,7 @@ Raphael = (function () { ...@@ -2988,7 +3049,7 @@ Raphael = (function () {
case "clip-rect": case "clip-rect":
from[attr] = (from[attr] + E)[split](separator); from[attr] = (from[attr] + E)[split](separator);
diff[attr] = []; diff[attr] = [];
var i = 4; i = 4;
while (i--) { while (i--) {
diff[attr][i] = (values[i] - from[attr][i]) / ms; diff[attr][i] = (values[i] - from[attr][i]) / ms;
} }
...@@ -3074,7 +3135,7 @@ Raphael = (function () { ...@@ -3074,7 +3135,7 @@ Raphael = (function () {
} }
} else { } else {
for (var i = 0, ii = this.items[length]; i < ii; i++) { for (var i = 0, ii = this.items[length]; i < ii; i++) {
this.items[i].attr[apply](this.items[i], arguments); this.items[i].attr(name, value);
} }
} }
return this; return this;
...@@ -3218,10 +3279,10 @@ Raphael = (function () { ...@@ -3218,10 +3279,10 @@ Raphael = (function () {
return out; return out;
}; };
R.format = function (token) { var formatrg = /\{(\d+)\}/g;
var args = R.is(arguments[1], "array") ? [0][concat](arguments[1]) : arguments, R.format = function (token, array) {
rg = /\{(\d+)\}/g; var args = R.is(array, "array") ? [0][concat](array) : arguments;
token && R.is(token, "string") && args[length] - 1 && (token = token[rp](rg, function (str, i) { token && R.is(token, "string") && args[length] - 1 && (token = token[rp](formatrg, function (str, i) {
return args[++i] == null ? E : args[i]; return args[++i] == null ? E : args[i];
})); }));
return token || E; return token || E;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment