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,49 +834,43 @@ Raphael = (function () { ...@@ -828,49 +834,43 @@ 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) {
switch (typeof add[prop]) { if (add[has](prop) && !(prop in con)) {
case "function": switch (typeof add[prop]) {
(function (f) { case "function":
con[prop] = con === that ? f : function () { return f[apply](that, arguments); }; (function (f) {
})(add[prop]); con[prop] = con === that ? f : function () { return f[apply](that, arguments); };
break; })(add[prop]);
case "object": break;
con[prop] = con[prop] || {}; case "object":
plugins.call(this, con[prop], add[prop]); con[prop] = con[prop] || {};
break; plugins.call(this, con[prop], add[prop]);
default: break;
con[prop] = add[prop]; default:
break; con[prop] = add[prop];
break;
}
} }
} }
}, },
...@@ -927,31 +927,33 @@ Raphael = (function () { ...@@ -927,31 +927,33 @@ 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++) {
path[i][j] = round(path[i][j]); path[i][j] = round(path[i][j]);
}
} else {
path[i][6] = round(path[i][6]);
path[i][7] = round(path[i][7]);
} }
} else {
path[i][6] = round(path[i][6]);
path[i][7] = round(path[i][7]);
} }
return path; }
}, return path;
$ = function (el, attr) { },
if (attr) { $ = function (el, attr) {
for (var key in attr) if (attr[has](key)) { if (attr) {
for (var key in attr) {
if (attr[has](key)) {
el[setAttribute](key, attr[key]); el[setAttribute](key, attr[key]);
} }
} else {
return doc.createElementNS(Paper[proto].svgns, el);
} }
}; } else {
return doc.createElementNS(Paper[proto].svgns, el);
}
};
R[toString] = function () { R[toString] = function () {
return "Your browser supports SVG.\nYou are running Rapha\xebl " + this.version; return "Your browser supports SVG.\nYou are running Rapha\xebl " + this.version;
}; };
...@@ -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,208 +1076,213 @@ Raphael = (function () { ...@@ -1070,208 +1076,213 @@ 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 (!availableAttrs[has](att)) { if (params[has](att)) {
continue; if (!availableAttrs[has](att)) {
} continue;
var value = params[att]; }
attrs[att] = value; var value = params[att];
switch (att) { attrs[att] = value;
case "rotation": switch (att) {
o.rotate(value, true); case "blur":
break; o.blur(value);
// Hyperlink
case "href":
case "title":
case "target":
var pn = node.parentNode;
if (lowerCase.call(pn.tagName) != "a") {
var hl = $("a");
pn.insertBefore(hl, node);
hl[appendChild](node);
pn = hl;
}
pn.setAttributeNS(o.paper.xlink, att, value);
break;
case "cursor":
node.style.cursor = value;
break;
case "clip-rect":
var rect = (value + E)[split](separator);
if (rect[length] == 4) {
o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode);
var el = $("clipPath"),
rc = $("rect");
el.id = "r" + (R._id++)[toString](36);
$(rc, {
x: rect[0],
y: rect[1],
width: rect[2],
height: rect[3]
});
el[appendChild](rc);
o.paper.defs[appendChild](el);
$(node, {"clip-path": "url(#" + el.id + ")"});
o.clip = rc;
}
if (!value) {
var clip = doc.getElementById(node.getAttribute("clip-path")[rp](/(^url\(#|\)$)/g, E));
clip && clip.parentNode.removeChild(clip);
$(node, {"clip-path": E});
delete o.clip;
}
break;
case "path":
if (o.type == "path") {
$(node, {d: value ? attrs.path = roundPath(pathToAbsolute(value)) : "M0,0"});
}
break;
case "width":
node[setAttribute](att, value);
if (attrs.fx) {
att = "x";
value = attrs.x;
} else {
break; break;
} case "rotation":
case "x": o.rotate(value, true);
if (attrs.fx) {
value = -attrs.x - (attrs.width || 0);
}
case "rx":
if (att == "rx" && o.type == "rect") {
break; break;
} // Hyperlink
case "cx": case "href":
rotxy && (att == "x" || att == "cx") && (rotxy[1] += value - attrs[att]); case "title":
node[setAttribute](att, round(value)); case "target":
o.pattern && updatePosition(o); var pn = node.parentNode;
break; if (lowerCase.call(pn.tagName) != "a") {
case "height": var hl = $("a");
node[setAttribute](att, value); pn.insertBefore(hl, node);
if (attrs.fy) { hl[appendChild](node);
att = "y"; pn = hl;
value = attrs.y; }
} else { pn.setAttributeNS(o.paper.xlink, att, value);
break; break;
} case "cursor":
case "y": node.style.cursor = value;
if (attrs.fy) {
value = -attrs.y - (attrs.height || 0);
}
case "ry":
if (att == "ry" && o.type == "rect") {
break; break;
} case "clip-rect":
case "cy": var rect = (value + E)[split](separator);
rotxy && (att == "y" || att == "cy") && (rotxy[2] += value - attrs[att]); if (rect[length] == 4) {
node[setAttribute](att, round(value)); o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode);
o.pattern && updatePosition(o); var el = $("clipPath"),
rc = $("rect");
el.id = "r" + (R._id++)[toString](36);
$(rc, {
x: rect[0],
y: rect[1],
width: rect[2],
height: rect[3]
});
el[appendChild](rc);
o.paper.defs[appendChild](el);
$(node, {"clip-path": "url(#" + el.id + ")"});
o.clip = rc;
}
if (!value) {
var clip = doc.getElementById(node.getAttribute("clip-path")[rp](/(^url\(#|\)$)/g, E));
clip && clip.parentNode.removeChild(clip);
$(node, {"clip-path": E});
delete o.clip;
}
break; break;
case "r": case "path":
if (o.type == "rect") { if (o.type == "path") {
$(node, {rx: value, ry: value}); $(node, {d: value ? attrs.path = roundPath(pathToAbsolute(value)) : "M0,0"});
} else { }
break;
case "width":
node[setAttribute](att, value); node[setAttribute](att, value);
} if (attrs.fx) {
break; att = "x";
case "src": value = attrs.x;
if (o.type == "image") { } else {
node.setAttributeNS(o.paper.xlink, "href", value); break;
} }
break; case "x":
case "stroke-width": if (attrs.fx) {
node.style.strokeWidth = value; value = -attrs.x - (attrs.width || 0);
// Need following line for Firefox }
node[setAttribute](att, value); case "rx":
if (attrs["stroke-dasharray"]) { if (att == "rx" && o.type == "rect") {
addDashes(o, attrs["stroke-dasharray"]); break;
} }
break; case "cx":
case "stroke-dasharray": rotxy && (att == "x" || att == "cx") && (rotxy[1] += value - attrs[att]);
addDashes(o, value); node[setAttribute](att, round(value));
break;
case "translation":
var xy = (value + E)[split](separator);
xy[0] = +xy[0] || 0;
xy[1] = +xy[1] || 0;
if (rotxy) {
rotxy[1] += xy[0];
rotxy[2] += xy[1];
}
translate.call(o, xy[0], xy[1]);
break;
case "scale":
var xy = (value + E)[split](separator);
o.scale(+xy[0] || 1, +xy[1] || +xy[0] || 1, +xy[2] || null, +xy[3] || null);
break;
case "fill":
var isURL = (value + E).match(ISURL);
if (isURL) {
var el = $("pattern"),
ig = $("image");
el.id = "r" + (R._id++)[toString](36);
$(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse", height: 1, width: 1});
$(ig, {x: 0, y: 0});
ig.setAttributeNS(o.paper.xlink, "href", isURL[1]);
el[appendChild](ig);
var img = doc.createElement("img");
img.style.cssText = "position:absolute;left:-9999em;top-9999em";
img.onload = function () {
$(el, {width: this.offsetWidth, height: this.offsetHeight});
$(ig, {width: this.offsetWidth, height: this.offsetHeight});
doc.body.removeChild(this);
o.paper.safari();
};
doc.body[appendChild](img);
img.src = isURL[1];
o.paper.defs[appendChild](el);
node.style.fill = "url(#" + el.id + ")";
$(node, {fill: "url(#" + el.id + ")"});
o.pattern = el;
o.pattern && updatePosition(o); o.pattern && updatePosition(o);
break; break;
} case "height":
if (!R.getRGB(value).error) { node[setAttribute](att, value);
delete params.gradient; if (attrs.fy) {
delete attrs.gradient; att = "y";
!R.is(attrs.opacity, "undefined") && value = attrs.y;
R.is(params.opacity, "undefined") && } else {
$(node, {opacity: attrs.opacity}); break;
!R.is(attrs["fill-opacity"], "undefined") && }
R.is(params["fill-opacity"], "undefined") && case "y":
$(node, {"fill-opacity": attrs["fill-opacity"]}); if (attrs.fy) {
} else if ((({circle: 1, ellipse: 1})[has](o.type) || (value + E).charAt() != "r") && addGradientFill(node, value, o.paper)) { value = -attrs.y - (attrs.height || 0);
attrs.gradient = value; }
attrs.fill = "none"; case "ry":
if (att == "ry" && o.type == "rect") {
break;
}
case "cy":
rotxy && (att == "y" || att == "cy") && (rotxy[2] += value - attrs[att]);
node[setAttribute](att, round(value));
o.pattern && updatePosition(o);
break; break;
} case "r":
case "stroke": if (o.type == "rect") {
node[setAttribute](att, R.getRGB(value).hex); $(node, {rx: value, ry: value});
break; } else {
case "gradient": node[setAttribute](att, value);
(({circle: 1, ellipse: 1})[has](o.type) || (value + E).charAt() != "r") && addGradientFill(node, value, o.paper);
break;
case "opacity":
case "fill-opacity":
if (attrs.gradient) {
var gradient = doc.getElementById(node.getAttribute("fill")[rp](/^url\(#|\)$/g, E));
if (gradient) {
var stops = gradient.getElementsByTagName("stop");
stops[stops[length] - 1][setAttribute]("stop-opacity", value);
} }
break; break;
} case "src":
default: if (o.type == "image") {
att == "font-size" && (value = toInt(value, 10) + "px"); node.setAttributeNS(o.paper.xlink, "href", value);
var cssrule = att[rp](/(\-.)/g, function (w) { }
return upperCase.call(w.substring(1)); break;
}); case "stroke-width":
node.style[cssrule] = value; node.style.strokeWidth = value;
// Need following line for Firefox // Need following line for Firefox
node[setAttribute](att, value); node[setAttribute](att, value);
break; if (attrs["stroke-dasharray"]) {
addDashes(o, attrs["stroke-dasharray"]);
}
break;
case "stroke-dasharray":
addDashes(o, value);
break;
case "translation":
var xy = (value + E)[split](separator);
xy[0] = +xy[0] || 0;
xy[1] = +xy[1] || 0;
if (rotxy) {
rotxy[1] += xy[0];
rotxy[2] += xy[1];
}
translate.call(o, xy[0], xy[1]);
break;
case "scale":
xy = (value + E)[split](separator);
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;
case "fill":
var isURL = (value + E).match(ISURL);
if (isURL) {
el = $("pattern");
var ig = $("image");
el.id = "r" + (R._id++)[toString](36);
$(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse", height: 1, width: 1});
$(ig, {x: 0, y: 0});
ig.setAttributeNS(o.paper.xlink, "href", isURL[1]);
el[appendChild](ig);
var img = doc.createElement("img");
img.style.cssText = "position:absolute;left:-9999em;top-9999em";
img.onload = function () {
$(el, {width: this.offsetWidth, height: this.offsetHeight});
$(ig, {width: this.offsetWidth, height: this.offsetHeight});
doc.body.removeChild(this);
o.paper.safari();
};
doc.body[appendChild](img);
img.src = isURL[1];
o.paper.defs[appendChild](el);
node.style.fill = "url(#" + el.id + ")";
$(node, {fill: "url(#" + el.id + ")"});
o.pattern = el;
o.pattern && updatePosition(o);
break;
}
if (!R.getRGB(value).error) {
delete params.gradient;
delete attrs.gradient;
!R.is(attrs.opacity, "undefined") &&
R.is(params.opacity, "undefined") &&
$(node, {opacity: attrs.opacity});
!R.is(attrs["fill-opacity"], "undefined") &&
R.is(params["fill-opacity"], "undefined") &&
$(node, {"fill-opacity": attrs["fill-opacity"]});
} else if ((({circle: 1, ellipse: 1})[has](o.type) || (value + E).charAt() != "r") && addGradientFill(node, value, o.paper)) {
attrs.gradient = value;
attrs.fill = "none";
break;
}
case "stroke":
node[setAttribute](att, R.getRGB(value).hex);
break;
case "gradient":
(({circle: 1, ellipse: 1})[has](o.type) || (value + E).charAt() != "r") && addGradientFill(node, value, o.paper);
break;
case "opacity":
case "fill-opacity":
if (attrs.gradient) {
var gradient = doc.getElementById(node.getAttribute("fill")[rp](/^url\(#|\)$/g, E));
if (gradient) {
var stops = gradient.getElementsByTagName("stop");
stops[stops[length] - 1][setAttribute]("stop-opacity", value);
}
break;
}
default:
att == "font-size" && (value = toInt(value, 10) + "px");
var cssrule = att[rp](/(\-.)/g, function (w) {
return upperCase.call(w.substring(1));
});
node.style[cssrule] = value;
// Need following line for Firefox
node[setAttribute](att, value);
break;
}
} }
} }
...@@ -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,
...@@ -1625,12 +1658,14 @@ Raphael = (function () { ...@@ -1625,12 +1658,14 @@ Raphael = (function () {
} }
}; };
} }
// VML // VML
if (R.vml) { if (R.vml) {
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; if (this.type == "path") {
(os.left != -left + "px") && (os.left = -left + "px"); os.left != (t = -left * zoom + "px") && (os.left = t);
(os.top != -top + "px") && (os.top = -top + "px"); 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 && arguments[length] == 1 && R.is(arguments[0], "array")) { if (this.attrs && value == null && R.is(name, "array")) {
var values = {}; var ii, values = {};
for (var i = 0, ii = arguments[0][length]; i < ii; i++) { for (i = 0, ii = name[length]; i < ii; i++) {
values[arguments[0][i]] = this.attrs[arguments[0][i]]; values[name[i]] = this.attr(name[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,9 +2636,9 @@ Raphael = (function () { ...@@ -2587,9 +2636,9 @@ 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;
this.attr({path: path}); this.attr({path: path});
...@@ -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;
...@@ -3217,11 +3278,11 @@ Raphael = (function () { ...@@ -3217,11 +3278,11 @@ 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