Commit e1a5ada5 by Dmitry Baranovskiy

• Moved getRGB to Raphael method

• added caching to some methods
• updated plugins
• added plugins for elements (Raphael.el.new_method = function…)
• fixed scale (still need to update animation)
• add some performance things to VML realisation
parent 95a611b8
...@@ -26,10 +26,6 @@ window.Raphael = (function () { ...@@ -26,10 +26,6 @@ window.Raphael = (function () {
R.svg = !(R.vml = R.type == "VML"); R.svg = !(R.vml = R.type == "VML");
R.idGenerator = 0; R.idGenerator = 0;
R.fn = {}; R.fn = {};
R.toString = function () {
return "Your browser " + (this.vml ? "doesn't ": "") + "support" + (this.svg ? "s": "") +
" SVG.\nYou are running " + unescape("Rapha%EBl%20") + this.version;
};
R.setWindow = function (newwin) { R.setWindow = function (newwin) {
win = newwin; win = newwin;
doc = win.document; doc = win.document;
...@@ -86,7 +82,7 @@ window.Raphael = (function () { ...@@ -86,7 +82,7 @@ window.Raphael = (function () {
red = red.r; red = red.r;
} }
if (typeof red == "string") { if (typeof red == "string") {
var clr = getRGB(red); var clr = R.getRGB(red);
red = clr.r; red = clr.r;
green = clr.g; green = clr.g;
blue = clr.b; blue = clr.b;
...@@ -123,8 +119,13 @@ window.Raphael = (function () { ...@@ -123,8 +119,13 @@ window.Raphael = (function () {
} }
return {h: hue, s: saturation, b: brightness}; return {h: hue, s: saturation, b: brightness};
}; };
var getRGB = function (colour) { var getRGBcache = {}, getRGBcount = [];
var htmlcolors = {aliceblue: "#f0f8ff", amethyst: "#96c", antiquewhite: "#faebd7", aqua: "#0ff", aquamarine: "#7fffd4", azure: "#f0ffff", beige: "#f5f5dc", bisque: "#ffe4c4", black: "#000", blanchedalmond: "#ffebcd", blue: "#00f", blueviolet: "#8a2be2", brown: "#a52a2a", burlywood: "#deb887", cadetblue: "#5f9ea0", chartreuse: "#7fff00", chocolate: "#d2691e", coral: "#ff7f50", cornflowerblue: "#6495ed", cornsilk: "#fff8dc", crimson: "#dc143c", cyan: "#0ff", darkblue: "#00008b", darkcyan: "#008b8b", darkgoldenrod: "#b8860b", darkgray: "#a9a9a9", darkgreen: "#006400", darkkhaki: "#bdb76b", darkmagenta: "#8b008b", darkolivegreen: "#556b2f", darkorange: "#ff8c00", darkorchid: "#9932cc", darkred: "#8b0000", darksalmon: "#e9967a", darkseagreen: "#8fbc8f", darkslateblue: "#483d8b", darkslategray: "#2f4f4f", darkturquoise: "#00ced1", darkviolet: "#9400d3", deeppink: "#ff1493", deepskyblue: "#00bfff", dimgray: "#696969", dodgerblue: "#1e90ff", firebrick: "#b22222", floralwhite: "#fffaf0", forestgreen: "#228b22", fuchsia: "#f0f", gainsboro: "#dcdcdc", ghostwhite: "#f8f8ff", gold: "#ffd700", goldenrod: "#daa520", gray: "#808080", green: "#008000", greenyellow: "#adff2f", honeydew: "#f0fff0", hotpink: "#ff69b4", indianred: "#cd5c5c", indigo: "#4b0082", ivory: "#fffff0", khaki: "#f0e68c", lavender: "#e6e6fa", lavenderblush: "#fff0f5", lawngreen: "#7cfc00", lemonchiffon: "#fffacd", lightblue: "#add8e6", lightcoral: "#f08080", lightcyan: "#e0ffff", lightgoldenrodyellow: "#fafad2", lightgreen: "#90ee90", lightgrey: "#d3d3d3", lightpink: "#ffb6c1", lightsalmon: "#ffa07a", lightsalmon: "#ffa07a", lightseagreen: "#20b2aa", lightskyblue: "#87cefa", lightslategray: "#789", lightsteelblue: "#b0c4de", lightyellow: "#ffffe0", lime: "#0f0", limegreen: "#32cd32", linen: "#faf0e6", magenta: "#f0f", maroon: "#800000", mediumaquamarine: "#66cdaa", mediumblue: "#0000cd", mediumorchid: "#ba55d3", mediumpurple: "#9370db", mediumseagreen: "#3cb371", mediumslateblue: "#7b68ee", mediumslateblue: "#7b68ee", mediumspringgreen: "#00fa9a", mediumturquoise: "#48d1cc", mediumvioletred: "#c71585", midnightblue: "#191970", mintcream: "#f5fffa", mistyrose: "#ffe4e1", moccasin: "#ffe4b5", navajowhite: "#ffdead", navy: "#000080", oldlace: "#fdf5e6", olive: "#808000", olivedrab: "#6b8e23", orange: "#ffa500", orangered: "#ff4500", orchid: "#da70d6", palegoldenrod: "#eee8aa", palegreen: "#98fb98", paleturquoise: "#afeeee", palevioletred: "#db7093", papayawhip: "#ffefd5", peachpuff: "#ffdab9", peru: "#cd853f", pink: "#ffc0cb", plum: "#dda0dd", powderblue: "#b0e0e6", purple: "#800080", red: "#f00", rosybrown: "#bc8f8f", royalblue: "#4169e1", saddlebrown: "#8b4513", salmon: "#fa8072", sandybrown: "#f4a460", seagreen: "#2e8b57", seashell: "#fff5ee", sienna: "#a0522d", silver: "#c0c0c0", skyblue: "#87ceeb", slateblue: "#6a5acd", slategray: "#708090", snow: "#fffafa", springgreen: "#00ff7f", steelblue: "#4682b4", tan: "#d2b48c", teal: "#008080", thistle: "#d8bfd8", tomato: "#ff6347", turquoise: "#40e0d0", violet: "#ee82ee", wheat: "#f5deb3", white: "#fff", whitesmoke: "#f5f5f5", yellow: "#ff0", yellowgreen: "#9acd32"}; R.getRGB = function (colour) {
if (colour in getRGBcache) {
return getRGBcache[colour];
}
var htmlcolors = {aliceblue: "#f0f8ff", amethyst: "#96c", antiquewhite: "#faebd7", aqua: "#0ff", aquamarine: "#7fffd4", azure: "#f0ffff", beige: "#f5f5dc", bisque: "#ffe4c4", black: "#000", blanchedalmond: "#ffebcd", blue: "#00f", blueviolet: "#8a2be2", brown: "#a52a2a", burlywood: "#deb887", cadetblue: "#5f9ea0", chartreuse: "#7fff00", chocolate: "#d2691e", coral: "#ff7f50", cornflowerblue: "#6495ed", cornsilk: "#fff8dc", crimson: "#dc143c", cyan: "#0ff", darkblue: "#00008b", darkcyan: "#008b8b", darkgoldenrod: "#b8860b", darkgray: "#a9a9a9", darkgreen: "#006400", darkkhaki: "#bdb76b", darkmagenta: "#8b008b", darkolivegreen: "#556b2f", darkorange: "#ff8c00", darkorchid: "#9932cc", darkred: "#8b0000", darksalmon: "#e9967a", darkseagreen: "#8fbc8f", darkslateblue: "#483d8b", darkslategray: "#2f4f4f", darkturquoise: "#00ced1", darkviolet: "#9400d3", deeppink: "#ff1493", deepskyblue: "#00bfff", dimgray: "#696969", dodgerblue: "#1e90ff", firebrick: "#b22222", floralwhite: "#fffaf0", forestgreen: "#228b22", fuchsia: "#f0f", gainsboro: "#dcdcdc", ghostwhite: "#f8f8ff", gold: "#ffd700", goldenrod: "#daa520", gray: "#808080", green: "#008000", greenyellow: "#adff2f", honeydew: "#f0fff0", hotpink: "#ff69b4", indianred: "#cd5c5c", indigo: "#4b0082", ivory: "#fffff0", khaki: "#f0e68c", lavender: "#e6e6fa", lavenderblush: "#fff0f5", lawngreen: "#7cfc00", lemonchiffon: "#fffacd", lightblue: "#add8e6", lightcoral: "#f08080", lightcyan: "#e0ffff", lightgoldenrodyellow: "#fafad2", lightgreen: "#90ee90", lightgrey: "#d3d3d3", lightpink: "#ffb6c1", lightsalmon: "#ffa07a", lightsalmon: "#ffa07a", lightseagreen: "#20b2aa", lightskyblue: "#87cefa", lightslategray: "#789", lightsteelblue: "#b0c4de", lightyellow: "#ffffe0", lime: "#0f0", limegreen: "#32cd32", linen: "#faf0e6", magenta: "#f0f", maroon: "#800000", mediumaquamarine: "#66cdaa", mediumblue: "#0000cd", mediumorchid: "#ba55d3", mediumpurple: "#9370db", mediumseagreen: "#3cb371", mediumslateblue: "#7b68ee", mediumslateblue: "#7b68ee", mediumspringgreen: "#00fa9a", mediumturquoise: "#48d1cc", mediumvioletred: "#c71585", midnightblue: "#191970", mintcream: "#f5fffa", mistyrose: "#ffe4e1", moccasin: "#ffe4b5", navajowhite: "#ffdead", navy: "#000080", oldlace: "#fdf5e6", olive: "#808000", olivedrab: "#6b8e23", orange: "#ffa500", orangered: "#ff4500", orchid: "#da70d6", palegoldenrod: "#eee8aa", palegreen: "#98fb98", paleturquoise: "#afeeee", palevioletred: "#db7093", papayawhip: "#ffefd5", peachpuff: "#ffdab9", peru: "#cd853f", pink: "#ffc0cb", plum: "#dda0dd", powderblue: "#b0e0e6", purple: "#800080", red: "#f00", rosybrown: "#bc8f8f", royalblue: "#4169e1", saddlebrown: "#8b4513", salmon: "#fa8072", sandybrown: "#f4a460", seagreen: "#2e8b57", seashell: "#fff5ee", sienna: "#a0522d", silver: "#c0c0c0", skyblue: "#87ceeb", slateblue: "#6a5acd", slategray: "#708090", snow: "#fffafa", springgreen: "#00ff7f", steelblue: "#4682b4", tan: "#d2b48c", teal: "#008080", thistle: "#d8bfd8", tomato: "#ff6347", turquoise: "#40e0d0", violet: "#ee82ee", wheat: "#f5deb3", white: "#fff", whitesmoke: "#f5f5f5", yellow: "#ff0", yellowgreen: "#9acd32"},
res;
if (colour.toString().toLowerCase() in htmlcolors) { if (colour.toString().toLowerCase() in htmlcolors) {
colour = htmlcolors[colour.toString().toLowerCase()]; colour = htmlcolors[colour.toString().toLowerCase()];
} }
...@@ -181,20 +182,26 @@ window.Raphael = (function () { ...@@ -181,20 +182,26 @@ window.Raphael = (function () {
var b = Math.round(blue).toString(16); var b = Math.round(blue).toString(16);
(b.length == 1) && (b = "0" + b); (b.length == 1) && (b = "0" + b);
rgb.hex = "#" + r + g + b; rgb.hex = "#" + r + g + b;
return rgb; res = rgb;
} else { } else {
return {r: -1, g: -1, b: -1, hex: "none"}; res = {r: -1, g: -1, b: -1, hex: "none"};
}
if (getRGBcount.length > 20) {
delete getRGBcache[getRGBcount.unshift()];
} }
getRGBcount.push(colour);
getRGBcache[colour] = res;
return res;
}; };
R.getColor = function (value) { R.getColor = function (value) {
var start = arguments.callee.start = arguments.callee.start || {h: 0, s: 1, b: value || .75}; var start = this.getColor.start = this.getColor.start || {h: 0, s: 1, b: value || .75},
var rgb = this.hsb2rgb(start.h, start.s, start.b); rgb = this.hsb2rgb(start.h, start.s, start.b);
start.h += .075; start.h += .075;
if (start.h > 1) { if (start.h > 1) {
start.h = 0; start.h = 0;
start.s -= .2; start.s -= .2;
if (start.s <= 0) { if (start.s <= 0) {
arguments.callee.start = {h: 0, s: 1, b: start.b}; this.getColor.start = {h: 0, s: 1, b: start.b};
} }
} }
return rgb.hex; return rgb.hex;
...@@ -203,7 +210,13 @@ window.Raphael = (function () { ...@@ -203,7 +210,13 @@ window.Raphael = (function () {
delete this.start; delete this.start;
}; };
// path utilities // path utilities
var pathcache = {}, pathcount = [];
R.parsePathString = function (pathString) { R.parsePathString = function (pathString) {
if (pathString in pathcache) {
console.log("cache1:" + pathString);
console.log("cache2:" + pathcache[pathString]);
return pathcache[pathString];
}
var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, q: 4, s: 4, t: 2, v: 1, z: 0}, var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, q: 4, s: 4, t: 2, v: 1, z: 0},
data = [], data = [],
toString = function () { toString = function () {
...@@ -214,21 +227,29 @@ window.Raphael = (function () { ...@@ -214,21 +227,29 @@ window.Raphael = (function () {
return res; return res;
}; };
if (pathString.toString.toString() == toString.toString()) { if (pathString.toString.toString() == toString.toString()) {
return pathString; data = pathString;
} }
pathString.replace(/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig, function (a, b, c) { if (!data.length) {
var params = [], name = b.toLowerCase(); pathString.replace(/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig, function (a, b, c) {
c.replace(/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig, function (a, b) { var params = [], name = b.toLowerCase();
b && params.push(+b); c.replace(/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig, function (a, b) {
b && params.push(+b);
});
while (params.length >= paramCounts[name]) {
data.push([b].concat(params.splice(0, paramCounts[name])));
if (!paramCounts[name]) {
break;
};
}
}); });
while (params.length >= paramCounts[name]) { data.toString = toString;
data.push([b].concat(params.splice(0, paramCounts[name]))); }
if (!paramCounts[name]) { if (pathcount.length > 20) {
break; delete pathcache[pathcount.unshift()];
}; }
} pathcount.push(pathString);
}); // console.log("data:" + pathString + ":" + data);
data.toString = toString; pathcache[pathString] = data;
return data; return data;
}; };
var pathDimensions = function (path) { var pathDimensions = function (path) {
...@@ -239,20 +260,17 @@ window.Raphael = (function () { ...@@ -239,20 +260,17 @@ window.Raphael = (function () {
pathArray = pathToAbsolute(pathArray); pathArray = pathToAbsolute(pathArray);
var x = [], y = [], length = 0; var x = [], y = [], length = 0;
for (var i = 0, ii = pathArray.length; i < ii; i++) { for (var i = 0, ii = pathArray.length; i < ii; i++) {
switch (pathArray[i][0]) { var pa = pathArray[i];
switch (pa[0]) {
case "Z": case "Z":
break; break;
case "A": case "A":
x.push(pathArray[i][pathArray[i].length - 2]); x.push(pa[pa.length - 2]);
y.push(pathArray[i][pathArray[i].length - 1]); y.push(pa[pa.length - 1]);
break; break;
default: default:
for (var j = 1, jj = pathArray[i].length; j < jj; j++) { for (var j = 1, jj = pa.length; j < jj; j++) {
if (j % 2) { (j % 2 ? x : y).push(pa[j]);
x.push(pathArray[i][j]);
} else {
y.push(pathArray[i][j]);
}
} }
} }
} }
...@@ -266,8 +284,8 @@ window.Raphael = (function () { ...@@ -266,8 +284,8 @@ window.Raphael = (function () {
X: x, X: x,
Y: y Y: y
}; };
}; },
var pathToRelative = function (pathArray) { pathToRelative = function (pathArray) {
var res = []; var res = [];
if (typeof pathArray == "string") { if (typeof pathArray == "string") {
pathArray = R.parsePathString(pathArray); pathArray = R.parsePathString(pathArray);
...@@ -277,32 +295,33 @@ window.Raphael = (function () { ...@@ -277,32 +295,33 @@ window.Raphael = (function () {
x = pathArray[0][1]; x = pathArray[0][1];
y = pathArray[0][2]; y = pathArray[0][2];
start++; start++;
res.push(pathArray[0]); res.push(["M", x, y]);
} }
for (var i = start, ii = pathArray.length; i < ii; i++) { for (var i = start, ii = pathArray.length; i < ii; i++) {
res[i] = []; var r = res[i] = [],
if (pathArray[i][0] != pathArray[i][0].toLowerCase()) { pa = pathArray[i];
res[i][0] = pathArray[i][0].toLowerCase(); if (pa[0] != pa[0].toLowerCase()) {
switch (res[i][0]) { r[0] = pa[0].toLowerCase();
switch (r[0]) {
case "a": case "a":
res[i][1] = pathArray[i][1]; r[1] = pa[1];
res[i][2] = pathArray[i][2]; r[2] = pa[2];
res[i][3] = 0; r[3] = 0;
res[i][4] = pathArray[i][4]; r[4] = pa[4];
res[i][5] = pathArray[i][5]; r[5] = pa[5];
res[i][6] = +(pathArray[i][6] - x).toFixed(3); r[6] = +(pa[6] - x).toFixed(3);
res[i][7] = +(pathArray[i][7] - y).toFixed(3); r[7] = +(pa[7] - y).toFixed(3);
break; break;
case "v": case "v":
res[i][1] = +(pathArray[i][1] - y).toFixed(3); r[1] = +(pa[1] - y).toFixed(3);
break; break;
default: default:
for (var j = 1, jj = pathArray[i].length; j < jj; j++) { for (var j = 1, jj = pa.length; j < jj; j++) {
res[i][j] = +(pathArray[i][j] - ((j % 2) ? x : y)).toFixed(3); r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);
} }
} }
} else { } else {
res[i] = pathArray[i]; res[i] = pa;
} }
switch (res[i][0]) { switch (res[i][0]) {
case "z": case "z":
...@@ -320,8 +339,8 @@ window.Raphael = (function () { ...@@ -320,8 +339,8 @@ window.Raphael = (function () {
} }
res.toString = pathArray.toString; res.toString = pathArray.toString;
return res; return res;
}; },
var pathToAbsolute = function (pathArray) { pathToAbsolute = function (pathArray) {
var res = []; var res = [];
if (typeof pathArray == "string") { if (typeof pathArray == "string") {
pathArray = R.parsePathString(pathArray); pathArray = R.parsePathString(pathArray);
...@@ -333,41 +352,42 @@ window.Raphael = (function () { ...@@ -333,41 +352,42 @@ window.Raphael = (function () {
x = +pathArray[0][1]; x = +pathArray[0][1];
y = +pathArray[0][2]; y = +pathArray[0][2];
start++; start++;
res[0] = pathArray[0]; res[0] = ["M", x, y];
} }
for (var i = start, ii = pathArray.length; i < ii; i++) { for (var i = start, ii = pathArray.length; i < ii; i++) {
res[i] = []; var r = res[i] = [],
if (pathArray[i][0] != (pathArray[i][0] + "").toUpperCase()) { pa = pathArray[i];
res[i][0] = (pathArray[i][0] + "").toUpperCase(); if (pa[0] != (pa[0] + "").toUpperCase()) {
switch (res[i][0]) { r[0] = (pa[0] + "").toUpperCase();
switch (r[0]) {
case "A": case "A":
res[i][1] = pathArray[i][1]; r[1] = pa[1];
res[i][2] = pathArray[i][2]; r[2] = pa[2];
res[i][3] = 0; r[3] = 0;
res[i][4] = pathArray[i][4]; r[4] = pa[4];
res[i][5] = pathArray[i][5]; r[5] = pa[5];
res[i][6] = +(pathArray[i][6] + x).toFixed(3); r[6] = +(pa[6] + x).toFixed(3);
res[i][7] = +(pathArray[i][7] + y).toFixed(3); r[7] = +(pa[7] + y).toFixed(3);
break; break;
case "V": case "V":
res[i][1] = +pathArray[i][1] + y; r[1] = +pa[1] + y;
break; break;
default: default:
for (var j = 1, jj = pathArray[i].length; j < jj; j++) { for (var j = 1, jj = pa.length; j < jj; j++) {
res[i][j] = +pathArray[i][j] + ((j % 2) ? x : y); r[j] = +pa[j] + ((j % 2) ? x : y);
} }
} }
} else { } else {
res[i] = pathArray[i]; res[i] = pa;
} }
switch (res[i][0]) { switch (r[0]) {
case "Z": case "Z":
break; break;
case "H": case "H":
x = res[i][1]; x = r[1];
break; break;
case "V": case "V":
y = res[i][1]; y = r[1];
break; break;
default: default:
x = res[i][res[i].length - 2]; x = res[i][res[i].length - 2];
...@@ -376,8 +396,12 @@ window.Raphael = (function () { ...@@ -376,8 +396,12 @@ window.Raphael = (function () {
} }
res.toString = pathArray.toString; res.toString = pathArray.toString;
return res; return res;
}; },
var pathEqualiser = function (path1, path2) { pecache = {}, pecount = [],
pathEqualiser = function (path1, path2) {
if ((path1 + path2) in pecache) {
return pecache[path1 + path2];
}
var data = [pathToAbsolute(R.parsePathString(path1)), pathToAbsolute(R.parsePathString(path2))], var data = [pathToAbsolute(R.parsePathString(path1)), pathToAbsolute(R.parsePathString(path2))],
attrs = [{x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0}, {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0}], attrs = [{x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0}, {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0}],
processPath = function (path, d) { processPath = function (path, d) {
...@@ -468,9 +492,14 @@ window.Raphael = (function () { ...@@ -468,9 +492,14 @@ window.Raphael = (function () {
attrs[1].x = data[1][i][data[1][i].length - 2]; attrs[1].x = data[1][i][data[1][i].length - 2];
attrs[1].y = data[1][i][data[1][i].length - 1]; attrs[1].y = data[1][i][data[1][i].length - 1];
} }
if (pecount.length > 20) {
delete pecache[pecount.unshift()];
}
pecount.push(path1 + path2);
pecache[path1 + path2] = data;
return data; return data;
}; },
var toGradient = function (gradient) { toGradient = function (gradient) {
if (typeof gradient == "string") { if (typeof gradient == "string") {
gradient = gradient.split(/\s*\-\s*/); gradient = gradient.split(/\s*\-\s*/);
var angle = gradient.shift(); var angle = gradient.shift();
...@@ -501,7 +530,7 @@ window.Raphael = (function () { ...@@ -501,7 +530,7 @@ window.Raphael = (function () {
for (var i = 0, ii = gradient.length; i < ii; i++) { for (var i = 0, ii = gradient.length; i < ii; i++) {
var dot = {}; var dot = {};
var par = gradient[i].match(/^([^:]*):?([\d\.]*)/); var par = gradient[i].match(/^([^:]*):?([\d\.]*)/);
dot.color = getRGB(par[1]).hex; dot.color = R.getRGB(par[1]).hex;
par[2] && (dot.offset = par[2] + "%"); par[2] && (dot.offset = par[2] + "%");
grobj.dots.push(dot); grobj.dots.push(dot);
} }
...@@ -531,8 +560,8 @@ window.Raphael = (function () { ...@@ -531,8 +560,8 @@ window.Raphael = (function () {
} else { } else {
return gradient; return gradient;
} }
}; },
var getContainer = function () { getContainer = function () {
var container, x, y, width, height; var container, x, y, width, height;
if (typeof arguments[0] == "string" || typeof arguments[0] == "object") { if (typeof arguments[0] == "string" || typeof arguments[0] == "object") {
if (typeof arguments[0] == "string") { if (typeof arguments[0] == "string") {
...@@ -554,16 +583,16 @@ window.Raphael = (function () { ...@@ -554,16 +583,16 @@ window.Raphael = (function () {
} else if (typeof arguments[0] == "number" && arguments.length > 3) { } else if (typeof arguments[0] == "number" && arguments.length > 3) {
return {container: 1, x: arguments[0], y: arguments[1], width: arguments[2], height: arguments[3]}; return {container: 1, x: arguments[0], y: arguments[1], width: arguments[2], height: arguments[3]};
} }
}; },
var plugins = function (con, scope, add) { plugins = function (con, add) {
for (var prop in add) if (add.hasOwnProperty(prop) && !(prop in con)) { for (var prop in add) if (add.hasOwnProperty(prop) && !(prop in con)) {
switch (typeof add[prop]) { switch (typeof add[prop]) {
case "function": case "function":
con[prop] = con === scope ? add[prop] : function () { add[prop].apply(scope, arguments); }; con[prop] = con === paper ? add[prop] : function () { return add[prop].apply(paper, arguments); };
break; break;
case "object": case "object":
con[prop] = {}; con[prop] = {};
plugins(con[prop], con, add[prop]); plugins(con[prop], add[prop]);
break; break;
default: default:
con[prop] = add[prop]; con[prop] = add[prop];
...@@ -574,6 +603,9 @@ window.Raphael = (function () { ...@@ -574,6 +603,9 @@ window.Raphael = (function () {
// SVG // SVG
if (R.svg) { if (R.svg) {
R.toString = function () {
return "Your browser supports SVG.\nYou are running Rapha\u00ebl " + this.version;
};
var thePath = function (params, pathString, SVG) { var thePath = function (params, pathString, SVG) {
var el = doc.createElementNS(SVG.svgns, "path"); var el = doc.createElementNS(SVG.svgns, "path");
if (SVG.canvas) { if (SVG.canvas) {
...@@ -781,7 +813,7 @@ window.Raphael = (function () { ...@@ -781,7 +813,7 @@ window.Raphael = (function () {
isopacity = false; isopacity = false;
} }
stop.setAttribute("offset", gradient.dots[i].offset ? gradient.dots[i].offset : (i == 0) ? "0%" : "100%"); stop.setAttribute("offset", gradient.dots[i].offset ? gradient.dots[i].offset : (i == 0) ? "0%" : "100%");
stop.setAttribute("stop-color", getRGB(gradient.dots[i].color).hex || "#fff"); stop.setAttribute("stop-color", R.getRGB(gradient.dots[i].color).hex || "#fff");
// ignoring opacity for internal points, because VML doesn't support it // ignoring opacity for internal points, because VML doesn't support it
el.appendChild(stop); el.appendChild(stop);
}; };
...@@ -797,7 +829,7 @@ window.Raphael = (function () { ...@@ -797,7 +829,7 @@ window.Raphael = (function () {
var updatePosition = function (o) { var updatePosition = function (o) {
if (o.pattern) { if (o.pattern) {
var bbox = o.getBBox(); var bbox = o.getBBox();
o.pattern.setAttribute("patternTransform", "translate(" + [bbox.x, bbox.y].join(",") + ")"); o.pattern.setAttribute("patternTransform", "translate(".concat(bbox.x, ",", bbox.y, ")"));
} }
}; };
var setFillAndStroke = function (o, params) { var setFillAndStroke = function (o, params) {
...@@ -813,6 +845,8 @@ window.Raphael = (function () { ...@@ -813,6 +845,8 @@ window.Raphael = (function () {
"--.": [8, 3, 1, 3], "--.": [8, 3, 1, 3],
"--..": [8, 3, 1, 3, 1, 3] "--..": [8, 3, 1, 3, 1, 3]
}, },
node = o.node,
attrs = o.attrs;
addDashes = function (o, value) { addDashes = function (o, value) {
value = dasharray[value.toString().toLowerCase()]; value = dasharray[value.toString().toLowerCase()];
if (value) { if (value) {
...@@ -823,7 +857,7 @@ window.Raphael = (function () { ...@@ -823,7 +857,7 @@ window.Raphael = (function () {
dashes.push(value[i] * width + ((i % 2) ? 1 : -1) * butt); dashes.push(value[i] * width + ((i % 2) ? 1 : -1) * butt);
} }
value = dashes.join(","); value = dashes.join(",");
o.node.setAttribute("stroke-dasharray", value); node.setAttribute("stroke-dasharray", value);
} }
}; };
for (var att in params) { for (var att in params) {
...@@ -831,69 +865,79 @@ window.Raphael = (function () { ...@@ -831,69 +865,79 @@ window.Raphael = (function () {
continue; continue;
} }
var value = params[att]; var value = params[att];
o.attrs[att] = value; attrs[att] = value;
if (att == "x" && o.attrs.dx) {
value += o.attrs.dx;
}
if (att == "y" && o.attrs.dy) {
value += o.attrs.dy;
}
switch (att) { switch (att) {
// Hyperlink // Hyperlink
case "href": case "href":
case "title": case "title":
case "target": case "target":
var pn = o.node.parentNode; var pn = node.parentNode;
if (pn.tagName.toLowerCase() != "a") { if (pn.tagName.toLowerCase() != "a") {
var hl = doc.createElementNS(o.svg.svgns, "a"); var hl = doc.createElementNS(o.svg.svgns, "a");
pn.insertBefore(hl, o.node); pn.insertBefore(hl, node);
hl.appendChild(o.node); hl.appendChild(node);
pn = hl; pn = hl;
} }
pn.setAttributeNS(o.svg.xlink, att, value); pn.setAttributeNS(o.svg.xlink, att, value);
break; break;
case "path": case "path":
if (o.type == "path") { if (o.type == "path") {
o.node.setAttribute("d", "M0,0"); node.setAttribute("d", "M0,0");
paper.pathfinder(o, value); paper.pathfinder(o, value);
} }
case "width":
node.setAttribute(att, value);
if (attrs.fx) {
att = "x";
value = attrs.x;
} else {
break;
}
case "x":
if (attrs.fx) {
value = -attrs.x - (attrs.width || 0);
}
case "rx": case "rx":
case "cx": case "cx":
case "x": node.setAttribute(att, value);
o.node.setAttribute(att, value);
updatePosition(o); updatePosition(o);
break; break;
case "height":
node.setAttribute(att, value);
if (attrs.fy) {
att = "y";
value = attrs.y;
} else {
break;
}
case "y":
if (attrs.fy) {
value = -attrs.y - (attrs.height || 0);
}
case "ry": case "ry":
case "cy": case "cy":
case "y": node.setAttribute(att, value);
o.node.setAttribute(att, value);
updatePosition(o); updatePosition(o);
break; break;
case "width":
o.node.setAttribute(att, value);
break;
case "height":
o.node.setAttribute(att, value);
break;
case "r": case "r":
if (o.type == "rect") { if (o.type == "rect") {
o.node.setAttribute("rx", value); node.setAttribute("rx", value);
o.node.setAttribute("ry", value); node.setAttribute("ry", value);
} else { } else {
o.node.setAttribute(att, value); node.setAttribute(att, value);
} }
break; break;
case "src": case "src":
if (o.type == "image") { if (o.type == "image") {
o.node.setAttributeNS(o.svg.xlink, "href", value); node.setAttributeNS(o.svg.xlink, "href", value);
} }
break; break;
case "stroke-width": case "stroke-width":
o.node.style.strokeWidth = value; node.style.strokeWidth = value;
// Need following line for Firefox // Need following line for Firefox
o.node.setAttribute(att, value); node.setAttribute(att, value);
if (o.attrs["stroke-dasharray"]) { if (attrs["stroke-dasharray"]) {
addDashes(o, o.attrs["stroke-dasharray"]); addDashes(o, attrs["stroke-dasharray"]);
} }
break; break;
case "stroke-dasharray": case "stroke-dasharray":
...@@ -939,36 +983,36 @@ window.Raphael = (function () { ...@@ -939,36 +983,36 @@ window.Raphael = (function () {
doc.body.appendChild(img); doc.body.appendChild(img);
img.src = isURL[1]; img.src = isURL[1];
o.svg.defs.appendChild(el); o.svg.defs.appendChild(el);
o.node.style.fill = "url(#" + el.id + ")"; node.style.fill = "url(#" + el.id + ")";
o.node.setAttribute("fill", "url(#" + el.id + ")"); node.setAttribute("fill", "url(#" + el.id + ")");
o.pattern = el; o.pattern = el;
updatePosition(o); updatePosition(o);
break; break;
} }
delete params.gradient; delete params.gradient;
delete o.attrs.gradient; delete attrs.gradient;
if (typeof o.attrs.opacity != "undefined" && typeof params.opacity == "undefined" ) { if (typeof attrs.opacity != "undefined" && typeof params.opacity == "undefined" ) {
o.node.style.opacity = o.attrs.opacity; node.style.opacity = attrs.opacity;
// Need following line for Firefox // Need following line for Firefox
o.node.setAttribute("opacity", o.attrs.opacity); node.setAttribute("opacity", attrs.opacity);
} }
if (typeof o.attrs["fill-opacity"] != "undefined" && typeof params["fill-opacity"] == "undefined" ) { if (typeof attrs["fill-opacity"] != "undefined" && typeof params["fill-opacity"] == "undefined" ) {
o.node.style.fillOpacity = o.attrs["fill-opacity"]; node.style.fillOpacity = o.attrs["fill-opacity"];
// Need following line for Firefox // Need following line for Firefox
o.node.setAttribute("fill-opacity", o.attrs["fill-opacity"]); node.setAttribute("fill-opacity", attrs["fill-opacity"]);
} }
case "stroke": case "stroke":
o.node.style[att] = getRGB(value).hex; node.style[att] = R.getRGB(value).hex;
// Need following line for Firefox // Need following line for Firefox
o.node.setAttribute(att, getRGB(value).hex); node.setAttribute(att, R.getRGB(value).hex);
break; break;
case "gradient": case "gradient":
addGrdientFill(o.node, value, o.svg); addGrdientFill(node, value, o.svg);
break; break;
case "opacity": case "opacity":
case "fill-opacity": case "fill-opacity":
if (o.attrs.gradient) { if (attrs.gradient) {
var gradient = doc.getElementById(o.node.getAttribute("fill").replace(/^url\(#|\)$/g, "")); var gradient = doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, ""));
if (gradient) { if (gradient) {
var stops = gradient.getElementsByTagName("stop"); var stops = gradient.getElementsByTagName("stop");
stops[stops.length - 1].setAttribute("stop-opacity", value); stops[stops.length - 1].setAttribute("stop-opacity", value);
...@@ -979,46 +1023,47 @@ window.Raphael = (function () { ...@@ -979,46 +1023,47 @@ window.Raphael = (function () {
var cssrule = att.replace(/(\-.)/g, function (w) { var cssrule = att.replace(/(\-.)/g, function (w) {
return w.substring(1).toUpperCase(); return w.substring(1).toUpperCase();
}); });
o.node.style[cssrule] = value; node.style[cssrule] = value;
// Need following line for Firefox // Need following line for Firefox
o.node.setAttribute(att, value); node.setAttribute(att, value);
break; break;
} }
} }
tuneText(o, params); tuneText(o, params);
}; };
var leading = 1.2; var leading = 1.2;
var tuneText = function (el, params) { var tuneText = function (el, params) {
if (el.type != "text" || !("text" in params || "font" in params || "font-size" in params || "x" in params)) { if (el.type != "text" || !("text" in params || "font" in params || "font-size" in params || "x" in params || "y" in params)) {
return; return;
} }
var fontSize = el.node.firstChild ? parseInt(doc.defaultView.getComputedStyle(el.node.firstChild, "").getPropertyValue("font-size"), 10) : 10; var a = el.attrs,
node = el.node,
fontSize = node.firstChild ? parseInt(doc.defaultView.getComputedStyle(node.firstChild, "").getPropertyValue("font-size"), 10) : 10;
if ("text" in params) { if ("text" in params) {
while (el.node.firstChild) { while (node.firstChild) {
el.node.removeChild(el.node.firstChild); node.removeChild(node.firstChild);
} }
var texts = (params.text + "").split("\n"); var texts = (params.text + "").split("\n");
for (var i = 0, ii = texts.length; i < ii; i++) { for (var i = 0, ii = texts.length; i < ii; i++) {
var tspan = doc.createElementNS(el.svg.svgns, "tspan"); var tspan = doc.createElementNS(el.svg.svgns, "tspan");
i && tspan.setAttribute("dy", fontSize * leading); i && tspan.setAttribute("dy", fontSize * leading);
i && tspan.setAttribute("x", el.attrs.x); i && tspan.setAttribute("x", a.x);
tspan.appendChild(doc.createTextNode(texts[i])); tspan.appendChild(doc.createTextNode(texts[i]));
el.node.appendChild(tspan); node.appendChild(tspan);
} }
} else { } else {
var texts = el.node.getElementsByTagName("tspan"); var texts = node.getElementsByTagName("tspan");
for (var i = 0, ii = texts.length; i < ii; i++) { for (var i = 0, ii = texts.length; i < ii; i++) {
i && texts[i].setAttribute("dy", fontSize * leading); i && texts[i].setAttribute("dy", fontSize * leading);
i && texts[i].setAttribute("x", el.attrs.x); i && texts[i].setAttribute("x", a.x);
} }
} }
el.node.setAttribute("y", el.attrs.y); node.setAttribute("y", a.y);
var bb = el.getBBox(); var bb = el.getBBox(),
var dif = el.attrs.y - (bb.y + bb.height / 2); dif = a.y - (bb.y + bb.height / 2);
if (dif) { dif && node.setAttribute("y", a.y + dif);
el.node.setAttribute("y", el.attrs.y + dif);
}
}; };
var Element = function (node, svg) { var Element = function (node, svg) {
var X = 0, var X = 0,
...@@ -1237,26 +1282,6 @@ window.Raphael = (function () { ...@@ -1237,26 +1282,6 @@ window.Raphael = (function () {
setFillAndStroke(res, {font: availableAttrs.font, stroke: "none", fill: "#000", text: text}); setFillAndStroke(res, {font: availableAttrs.font, stroke: "none", fill: "#000", text: text});
return res; return res;
}; };
var theGroup = function (svg) {
var el = doc.createElementNS(svg.svgns, "g");
if (svg.canvas) {
svg.canvas.appendChild(el);
}
var i = new Element(el, svg);
for (var f in svg) {
if (f[0] != "_" && typeof svg[f] == "function") {
i[f] = (function (f) {
return function () {
var e = svg[f].apply(svg, arguments);
el.appendChild(e[0]);
return e;
};
})(f);
}
}
i.type = "group";
return i;
};
var setSize = function (width, height) { var setSize = function (width, height) {
this.width = width || this.width; this.width = width || this.width;
this.height = height || this.height; this.height = height || this.height;
...@@ -1306,7 +1331,7 @@ window.Raphael = (function () { ...@@ -1306,7 +1331,7 @@ window.Raphael = (function () {
container[prop] = paper[prop]; container[prop] = paper[prop];
} }
} }
plugins(container, container, R.fn); plugins(container, R.fn);
container.clear(); container.clear();
return container; return container;
}; };
...@@ -1325,6 +1350,9 @@ window.Raphael = (function () { ...@@ -1325,6 +1350,9 @@ window.Raphael = (function () {
// VML // VML
if (R.vml) { if (R.vml) {
R.toString = function () {
return "Your browser doesn\u2019t support SVG.\nYou are running Rapha\u00ebl " + this.version;
};
thePath = function (params, pathString, VML) { thePath = function (params, pathString, VML) {
var g = createNode("group"), gl = g.style; var g = createNode("group"), gl = g.style;
gl.position = "absolute"; gl.position = "absolute";
...@@ -1342,7 +1370,6 @@ window.Raphael = (function () { ...@@ -1342,7 +1370,6 @@ window.Raphael = (function () {
el.coordsize = this.coordsize; el.coordsize = this.coordsize;
el.coordorigin = this.coordorigin; el.coordorigin = this.coordorigin;
g.appendChild(el); g.appendChild(el);
VML.canvas.appendChild(g);
var p = new Element(el, g, VML); var p = new Element(el, g, VML);
p.isAbsolute = true; p.isAbsolute = true;
p.type = "path"; p.type = "path";
...@@ -1549,7 +1576,6 @@ window.Raphael = (function () { ...@@ -1549,7 +1576,6 @@ window.Raphael = (function () {
p.attrs.path = ""; p.attrs.path = "";
paper.pathfinder(p, "" + pathString); paper.pathfinder(p, "" + pathString);
} }
// p.setBox();
if (params) { if (params) {
params.fill = params.fill || "none"; params.fill = params.fill || "none";
params.stroke = params.stroke || "#000"; params.stroke = params.stroke || "#000";
...@@ -1560,18 +1586,20 @@ window.Raphael = (function () { ...@@ -1560,18 +1586,20 @@ window.Raphael = (function () {
if (params.gradient) { if (params.gradient) {
addGrdientFill(p, params.gradient); addGrdientFill(p, params.gradient);
} }
VML.canvas.appendChild(g);
return p; return p;
}; };
var setFillAndStroke = function (o, params) { var setFillAndStroke = function (o, params) {
var s = o.node.style, var node = o.node,
s = node.style,
res = o; res = o;
o.attrs = o.attrs || {}; o.attrs = o.attrs || {};
for (var par in params) { for (var par in params) {
o.attrs[par] = params[par]; o.attrs[par] = params[par];
} }
params.href && (o.node.href = params.href); params.href && (node.href = params.href);
params.title && (o.node.title = params.title); params.title && (node.title = params.title);
params.target && (o.node.target = params.target); params.target && (node.target = params.target);
if (params.path && o.type == "path") { if (params.path && o.type == "path") {
o.Path = ""; o.Path = "";
o.path = []; o.path = [];
...@@ -1589,11 +1617,11 @@ window.Raphael = (function () { ...@@ -1589,11 +1617,11 @@ window.Raphael = (function () {
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, +xy[2] || null, +xy[3] || null);
} }
if (o.type == "image" && params.src) { if (o.type == "image" && params.src) {
o.node.src = params.src; node.src = params.src;
} }
if (o.type == "image" && params.opacity) { if (o.type == "image" && params.opacity) {
o.node.filterOpacity = " progid:DXImageTransform.Microsoft.Alpha(opacity=" + (params.opacity * 100) + ")"; node.filterOpacity = " progid:DXImageTransform.Microsoft.Alpha(opacity=" + (params.opacity * 100) + ")";
o.node.style.filter = (o.node.filterMatrix || "") + (o.node.filterOpacity || ""); node.style.filter = (node.filterMatrix || "") + (node.filterOpacity || "");
} }
params.font && (s.font = params.font); params.font && (s.font = params.font);
params["font-family"] && (s.fontFamily = params["font-family"]); params["font-family"] && (s.fontFamily = params["font-family"]);
...@@ -1601,14 +1629,12 @@ window.Raphael = (function () { ...@@ -1601,14 +1629,12 @@ window.Raphael = (function () {
params["font-weight"] && (s.fontWeight = params["font-weight"]); params["font-weight"] && (s.fontWeight = params["font-weight"]);
params["font-style"] && (s.fontStyle = params["font-style"]); params["font-style"] && (s.fontStyle = params["font-style"]);
if (typeof params.opacity != "undefined" || typeof params["stroke-width"] != "undefined" || typeof params.fill != "undefined" || typeof params.stroke != "undefined" || params["stroke-width"] || params["stroke-opacity"] || params["fill-opacity"] || params["stroke-dasharray"] || params["stroke-miterlimit"] || params["stroke-linejoin"] || params["stroke-linecap"]) { if (typeof params.opacity != "undefined" || typeof params["stroke-width"] != "undefined" || typeof params.fill != "undefined" || typeof params.stroke != "undefined" || params["stroke-width"] || params["stroke-opacity"] || params["fill-opacity"] || params["stroke-dasharray"] || params["stroke-miterlimit"] || params["stroke-linejoin"] || params["stroke-linecap"]) {
o = o.shape || o.node; o = o.shape || node;
var fill = (o.getElementsByTagName("fill") && o.getElementsByTagName("fill")[0]) || createNode("fill"); var fill = (o.getElementsByTagName("fill") && o.getElementsByTagName("fill")[0]) || createNode("fill");
if ("fill-opacity" in params || "opacity" in params) { if ("fill-opacity" in params || "opacity" in params) {
fill.opacity = ((+params["fill-opacity"] + 1 || 2) - 1) * ((+params.opacity + 1 || 2) - 1); fill.opacity = ((+params["fill-opacity"] + 1 || 2) - 1) * ((+params.opacity + 1 || 2) - 1);
} }
if (params.fill) { params.fill && (fill.on = true);
fill.on = true;
}
if (typeof fill.on == "undefined" || params.fill == "none") { if (typeof fill.on == "undefined" || params.fill == "none") {
fill.on = false; fill.on = false;
} }
...@@ -1618,7 +1644,7 @@ window.Raphael = (function () { ...@@ -1618,7 +1644,7 @@ window.Raphael = (function () {
fill.src = isURL[1]; fill.src = isURL[1];
fill.type = "tile"; fill.type = "tile";
} else { } else {
fill.color = getRGB(params.fill).hex; fill.color = R.getRGB(params.fill).hex;
fill.src = ""; fill.src = "";
fill.type = "solid"; fill.type = "solid";
} }
...@@ -1632,7 +1658,7 @@ window.Raphael = (function () { ...@@ -1632,7 +1658,7 @@ window.Raphael = (function () {
stroke.on = false; stroke.on = false;
} }
if (stroke.on && params.stroke) { if (stroke.on && params.stroke) {
stroke.color = getRGB(params.stroke).hex; stroke.color = R.getRGB(params.stroke).hex;
} }
stroke.opacity = ((+params["stroke-opacity"] + 1 || 2) - 1) * ((+params.opacity + 1 || 2) - 1); stroke.opacity = ((+params["stroke-opacity"] + 1 || 2) - 1) * ((+params.opacity + 1 || 2) - 1);
params["stroke-linejoin"] && (stroke.joinstyle = params["stroke-linejoin"] || "miter"); params["stroke-linejoin"] && (stroke.joinstyle = params["stroke-linejoin"] || "miter");
...@@ -1658,26 +1684,27 @@ window.Raphael = (function () { ...@@ -1658,26 +1684,27 @@ window.Raphael = (function () {
} }
if (res.type == "text") { if (res.type == "text") {
var span = doc.createElement("span"), var span = doc.createElement("span"),
s = span.style; s = span.style,
a = res.attrs;
s.padding = 0; s.padding = 0;
s.margin = 0; s.margin = 0;
s.lineHeight = 1; s.lineHeight = 1;
s.display = "inline"; s.display = "inline";
res.attrs.font && (s.font = res.attrs.font); a.font && (s.font = a.font);
res.attrs["font-family"] && (s.fontFamily = res.attrs["font-family"]); a["font-family"] && (s.fontFamily = a["font-family"]);
res.attrs["font-size"] && (s.fontSize = res.attrs["font-size"]); a["font-size"] && (s.fontSize = a["font-size"]);
res.attrs["font-weight"] && (s.fontWeight = res.attrs["font-weight"]); a["font-weight"] && (s.fontWeight = a["font-weight"]);
res.attrs["font-style"] && (s.fontStyle = res.attrs["font-style"]); a["font-style"] && (s.fontStyle = a["font-style"]);
res.node.parentNode.appendChild(span); res.node.parentNode.appendChild(span);
span.innerText = res.node.string; span.innerText = res.node.string;
res.W = res.attrs.w = span.offsetWidth; res.W = a.w = span.offsetWidth;
res.H = res.attrs.h = span.offsetHeight; res.H = a.h = span.offsetHeight;
res.X = res.attrs.x; res.X = a.x;
res.Y = res.attrs.y + Math.round(res.H / 2); res.Y = a.y + Math.round(res.H / 2);
res.node.parentNode.removeChild(span); res.node.parentNode.removeChild(span);
// text-anchor emulation // text-anchor emulation
switch (res.attrs["text-anchor"]) { switch (a["text-anchor"]) {
case "start": case "start":
res.node.style["v-text-align"] = "left"; res.node.style["v-text-align"] = "left";
res.bbx = Math.round(res.W / 2); res.bbx = Math.round(res.W / 2);
...@@ -1720,15 +1747,15 @@ window.Raphael = (function () { ...@@ -1720,15 +1747,15 @@ window.Raphael = (function () {
fill.method = "none"; fill.method = "none";
fill.type = ((gradient.type + "").toLowerCase() == "radial") ? "gradientTitle" : "gradient"; fill.type = ((gradient.type + "").toLowerCase() == "radial") ? "gradientTitle" : "gradient";
if (typeof gradient.dots[0].color != "undefined") { if (typeof gradient.dots[0].color != "undefined") {
fill.color = getRGB(gradient.dots[0].color).hex; fill.color = R.getRGB(gradient.dots[0].color).hex;
} }
if (typeof gradient.dots[gradient.dots.length - 1].color != "undefined") { if (typeof gradient.dots[gradient.dots.length - 1].color != "undefined") {
fill.color2 = getRGB(gradient.dots[gradient.dots.length - 1].color).hex; fill.color2 = R.getRGB(gradient.dots[gradient.dots.length - 1].color).hex;
} }
var colors = []; var colors = [];
for (var i = 0, ii = gradient.dots.length; i < ii; i++) { for (var i = 0, ii = gradient.dots.length; i < ii; i++) {
if (gradient.dots[i].offset) { if (gradient.dots[i].offset) {
colors.push(gradient.dots[i].offset + " " + getRGB(gradient.dots[i].color).hex); colors.push(gradient.dots[i].offset + " " + R.getRGB(gradient.dots[i].color).hex);
} }
}; };
var fillOpacity = typeof gradient.dots[gradient.dots.length - 1].opacity == "undefined" ? (typeof attrs.opacity == "undefined" ? 1 : attrs.opacity) : gradient.dots[gradient.dots.length - 1].opacity; var fillOpacity = typeof gradient.dots[gradient.dots.length - 1].opacity == "undefined" ? (typeof attrs.opacity == "undefined" ? 1 : attrs.opacity) : gradient.dots[gradient.dots.length - 1].opacity;
...@@ -1797,6 +1824,7 @@ window.Raphael = (function () { ...@@ -1797,6 +1824,7 @@ window.Raphael = (function () {
Element.prototype.setBox = function (params, cx, cy) { Element.prototype.setBox = function (params, cx, cy) {
var gs = this.Group.style, var gs = this.Group.style,
os = (this.shape && this.shape.style) || this.node.style; os = (this.shape && this.shape.style) || this.node.style;
params = params || {};
for (var i in params) { for (var i in params) {
this.attrs[i] = params[i]; this.attrs[i] = params[i];
} }
...@@ -1877,7 +1905,7 @@ window.Raphael = (function () { ...@@ -1877,7 +1905,7 @@ window.Raphael = (function () {
(os.width != w + "px") && (os.width = w + "px"); (os.width != w + "px") && (os.width = w + "px");
(os.height != h + "px") && (os.height = h + "px"); (os.height != h + "px") && (os.height = h + "px");
var arcsize = (+params.r || 0) / (Math.min(w, h)); var arcsize = (+params.r || 0) / (Math.min(w, h));
if (this.type == "rect" && this.arcsize != arcsize) { if (this.type == "rect" && this.arcsize != arcsize && (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");
o.arcsize = arcsize; o.arcsize = arcsize;
...@@ -2155,7 +2183,7 @@ window.Raphael = (function () { ...@@ -2155,7 +2183,7 @@ window.Raphael = (function () {
for (var prop in paper) { for (var prop in paper) {
container[prop] = paper[prop]; container[prop] = paper[prop];
} }
plugins(container, container, R.fn); plugins(container, R.fn);
container.clear = function () { container.clear = function () {
var todel = []; var todel = [];
for (var i = 0, ii = r.childNodes.length; i < ii; i++) { for (var i = 0, ii = r.childNodes.length; i < ii; i++) {
...@@ -2258,9 +2286,6 @@ window.Raphael = (function () { ...@@ -2258,9 +2286,6 @@ window.Raphael = (function () {
paper.text = function (x, y, text) { paper.text = function (x, y, text) {
return theText(this, x, y, text); return theText(this, x, y, text);
}; };
paper.group = function () {
return this;
};
paper.drawGrid = function (x, y, w, h, wv, hv, color) { paper.drawGrid = function (x, y, w, h, wv, hv, color) {
color = color || "#000"; color = color || "#000";
var path = ["M", x, y, "L", x + w, y, x + w, y + h, x, y + h, x, y], var path = ["M", x, y, "L", x + w, y, x + w, y + h, x, y + h, x, y],
...@@ -2312,6 +2337,7 @@ window.Raphael = (function () { ...@@ -2312,6 +2337,7 @@ window.Raphael = (function () {
for (var i = 0, ii = path.length; i < ii; i++) { for (var i = 0, ii = path.length; i < ii; i++) {
var b = path[i].shift(); var b = path[i].shift();
commands[b].apply(p, path[i]); commands[b].apply(p, path[i]);
path[i].unshift(b);
} }
}; };
paper.set = function (itemsArray) { paper.set = function (itemsArray) {
...@@ -2327,13 +2353,13 @@ window.Raphael = (function () { ...@@ -2327,13 +2353,13 @@ window.Raphael = (function () {
} }
y = y || x; y = y || x;
!+y && (y = x); !+y && (y = x);
var dx, dy, dcx, dcy; var dx, dy, dcx, dcy, a = this.attrs;
if (x != 0) { if (x != 0) {
var bb = this.type == "path" ? pathDimensions(this.attrs.path) : this.getBBox(), var bb = this.type == "path" ? pathDimensions(a.path) : this.getBBox(),
rcx = bb.x + bb.width / 2, rcx = bb.x + bb.width / 2,
rcy = bb.y + bb.height / 2; rcy = bb.y + bb.height / 2;
cx = isNaN(cx) ? rcx : cx; cx = (+cx || cx == 0) ? cx : rcx;
cy = isNaN(cy) ? rcy : cy; cy = (+cy || cy == 0) ? cy : rcy;
var dirx = Math.round(x / Math.abs(x)), var dirx = Math.round(x / Math.abs(x)),
diry = Math.round(y / Math.abs(y)), diry = Math.round(y / Math.abs(y)),
s = this.node.style, s = this.node.style,
...@@ -2342,8 +2368,8 @@ window.Raphael = (function () { ...@@ -2342,8 +2368,8 @@ window.Raphael = (function () {
switch (this.type) { switch (this.type) {
case "rect": case "rect":
case "image": case "image":
var neww = this.attrs.width * x * dirx / this._.sx, var neww = a.width * x * dirx / this._.sx,
newh = this.attrs.height * y * diry / this._.sy, newh = a.height * y * diry / this._.sy,
newx = ncx - neww / 2, newx = ncx - neww / 2,
newy = ncy - newh / 2; newy = ncy - newh / 2;
this.attr({ this.attr({
...@@ -2356,31 +2382,31 @@ window.Raphael = (function () { ...@@ -2356,31 +2382,31 @@ window.Raphael = (function () {
case "circle": case "circle":
case "ellipse": case "ellipse":
this.attr({ this.attr({
rx: this.attrs.rx * x / this._.sx, rx: a.rx * x / this._.sx,
ry: this.attrs.ry * y / this._.sy, ry: a.ry * y / this._.sy,
r: this.attrs.r * x / this._.sx, r: a.r * x / this._.sx,
cx: ncx, cx: ncx,
cy: ncy cy: ncy
}); });
break; break;
case "path": case "path":
var path = pathToRelative(R.parsePathString(this.attrs.path)), var path = pathToRelative(a.path),
skip = true; skip = true;
for (var i = 0, ii = path.length; i < ii; i++) { for (var i = 0, ii = path.length; i < ii; i++) {
if (path[i][0].toUpperCase() == "M" && skip) { var p = path[i];
if (p[0].toUpperCase() == "M" && skip) {
continue; continue;
} else { } else {
skip = false; skip = false;
} }
if (this.svg && path[i][0].toUpperCase() == "A") { if (this.svg && p[0].toUpperCase() == "A") {
path[i][path[i].length - 2] *= x; p[path[i].length - 2] *= x;
path[i][path[i].length - 1] *= y; p[path[i].length - 1] *= y;
path[i][1] *= x; p[1] *= x;
path[i][2] *= y; p[2] *= y;
} else { } else {
for (var j = 1, jj = path[i].length; j < jj; j++) { for (var j = 1, jj = p.length; j < jj; j++) {
// path[i][j] *= (j % 2) ? x * dirx / this._.sx : y * diry / this._.sy; p[j] *= (j % 2) ? x / this._.sx : y / this._.sy;
path[i][j] *= (j % 2) ? x / this._.sx : y / this._.sy;
} }
} }
} }
...@@ -2396,26 +2422,25 @@ window.Raphael = (function () { ...@@ -2396,26 +2422,25 @@ window.Raphael = (function () {
} }
if (this.type in {text: 1, image:1} && (dirx != 1 || diry != 1)) { if (this.type in {text: 1, image:1} && (dirx != 1 || diry != 1)) {
if (this.transformations) { if (this.transformations) {
var bb = this.getBBox(); this.transformations[2] = "scale(".concat(dirx, ",", diry, ")");
this.transformations[2] = "scale(" + [dirx, diry] + ")";
this.node.setAttribute("transform", this.transformations.join(" ")); this.node.setAttribute("transform", this.transformations.join(" "));
dx = (dirx == -1) ? -this.attrs.x * 2 - neww || bb.width : 0; dx = (dirx == -1) ? -a.x - (neww || 0) : a.x;
dy = (diry == -1) ? -this.attrs.y * 2 - newh || bb.height : 0; dy = (diry == -1) ? -a.y - (newh || 0) : a.y;
this.attr({x: this.attrs.x + dx, y: this.attrs.y + dy}); this.attr({x: dx, y: dy});
this.attrs.dx = dx; a.fx = dirx - 1;
this.attrs.dy = dy; a.fy = diry - 1;
} else { } else {
this.node.filterMatrix = " progid:DXImageTransform.Microsoft.Matrix(M11=" + dirx + this.node.filterMatrix = " progid:DXImageTransform.Microsoft.Matrix(M11=".concat(dirx,
", M12=0, M21=0, M22=" + diry + ", M12=0, M21=0, M22=", diry,
", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')"; ", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')");
s.filter = (this.node.filterMatrix || "") + (this.node.filterOpacity || ""); s.filter = (this.node.filterMatrix || "") + (this.node.filterOpacity || "");
} }
} else { } else {
if (this.transformations) { if (this.transformations) {
this.transformations[2] = ""; this.transformations[2] = "";
this.node.setAttribute("transform", this.transformations.join(" ")); this.node.setAttribute("transform", this.transformations.join(" "));
this.attrs.dx = 0; a.fx = 0;
this.attrs.dy = 0; a.fy = 0;
} else { } else {
this.node.filterMatrix = ""; this.node.filterMatrix = "";
s.filter = (this.node.filterMatrix || "") + (this.node.filterOpacity || ""); s.filter = (this.node.filterMatrix || "") + (this.node.filterOpacity || "");
...@@ -2444,8 +2469,8 @@ window.Raphael = (function () { ...@@ -2444,8 +2469,8 @@ window.Raphael = (function () {
diff[attr] = (to[attr] - from[attr]) / ms; diff[attr] = (to[attr] - from[attr]) / ms;
break; break;
case "colour": case "colour":
from[attr] = getRGB(from[attr]); from[attr] = R.getRGB(from[attr]);
var toColour = getRGB(to[attr]); var toColour = R.getRGB(to[attr]);
diff[attr] = { diff[attr] = {
r: (toColour.r - from[attr].r) / ms, r: (toColour.r - from[attr].r) / ms,
g: (toColour.g - from[attr].g) / ms, g: (toColour.g - from[attr].g) / ms,
...@@ -2699,7 +2724,7 @@ window.Raphael = (function () { ...@@ -2699,7 +2724,7 @@ window.Raphael = (function () {
return out; return out;
}; };
R.noConflict = function () { R.ninja = function () {
var r = window.Raphael; var r = window.Raphael;
delete window.Raphael; delete window.Raphael;
if (oldRaphael.was) { if (oldRaphael.was) {
...@@ -2707,5 +2732,6 @@ window.Raphael = (function () { ...@@ -2707,5 +2732,6 @@ window.Raphael = (function () {
} }
return r; return r;
}; };
R.el = Element.prototype;
return R; return R;
})(); })();
\ No newline at end of file
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