// ┌─────────────────────────────────────────────────────────────────────┐ \\
-// │ Raphaël 2 - JavaScript Vector Library │ \\
+// │ Raphaël - JavaScript Vector Library │ \\
// ├─────────────────────────────────────────────────────────────────────┤ \\
// │ VML Module │ \\
// ├─────────────────────────────────────────────────────────────────────┤ \\
abs = math.abs,
fillString = "fill",
separator = /[, ]+/,
+ eve = R.eve,
+ ms = " progid:DXImageTransform.Microsoft",
S = " ",
- E = "";
- // VML
- var map = {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"},
+ E = "",
+ map = {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"},
bites = /([clmz]),?([^clmz]*)/gi,
blurregexp = / progid:\S+Blur\([^\)]+\)/g,
val = /-?[^,\s-]+/g,
cssDot = "position:absolute;left:0;top:0;width:1px;height:1px",
zoom = 21600,
- pathTypes = {path: 1, rect: 1},
+ pathTypes = {path: 1, rect: 1, image: 1},
ovalTypes = {circle: 1, ellipse: 1},
path2vml = function (path) {
var total = /[ahqstv]/ig,
command = R._pathToAbsolute;
- Str(path).match(total) && (command = path2curve);
+ Str(path).match(total) && (command = R._path2curve);
total = /[clmz]/g;
if (command == R._pathToAbsolute && !Str(path).match(total)) {
var res = Str(path).replace(bites, function (all, command, args) {
var vals = [],
- isMove = lowerCase.call(command) == "m",
+ isMove = command.toLowerCase() == "m",
res = map[command];
args.replace(val, function (value) {
if (isMove && vals.length == 2) {
R.toString = function () {
return "Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl " + this.version;
};
- addArrow = function (o, value, isEnd) {
+ var addArrow = function (o, value, isEnd) {
var values = Str(value).toLowerCase().split("-"),
se = isEnd ? "end" : "start",
i = values.length,
stroke[se + "arrow"] = type;
stroke[se + "arrowlength"] = w;
stroke[se + "arrowwidth"] = h;
- };
+ },
setFillAndStroke = function (o, params) {
// o.paper.canvas.style.display = "none";
o.attrs = o.attrs || {};
params.target && (node.target = params.target);
params.cursor && (s.cursor = params.cursor);
"blur" in params && o.blur(params.blur);
- "transform" in params && o.transform(params.transform);
if (params.path && o.type == "path" || newpath) {
- node.path = path2vml(a.path);
+ node.path = path2vml(~Str(a.path).toLowerCase().indexOf("r") ? R._pathToAbsolute(a.path) : a.path);
+ if (o.type == "image") {
+ o._.fillpos = [a.x, a.y];
+ o._.fillsize = [a.width, a.height];
+ setCoords(o, 1, 1, 0, 0, 0);
+ }
}
+ "transform" in params && o.transform(params.transform);
if (isOval) {
- var cx = a.cx,
- cy = a.cy,
- rx = a.rx || a.r || 0,
- ry = a.ry || a.r || 0;
+ var cx = +a.cx,
+ cy = +a.cy,
+ rx = +a.rx || +a.r || 0,
+ ry = +a.ry || +a.r || 0;
node.path = R.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x", round((cx - rx) * zoom), round((cy - ry) * zoom), round((cx + rx) * zoom), round((cy + ry) * zoom), round(cx * zoom));
}
if ("clip-rect" in params) {
if (rect.length == 4) {
rect[2] = +rect[2] + (+rect[0]);
rect[3] = +rect[3] + (+rect[1]);
- var div = node.clipRect || g.doc.createElement("div"),
- dstyle = div.style,
- group = node.parentNode;
+ var div = node.clipRect || R._g.doc.createElement("div"),
+ dstyle = div.style;
dstyle.clip = R.format("rect({1}px {2}px {3}px {0}px)", rect);
if (!node.clipRect) {
dstyle.position = "absolute";
dstyle.left = 0;
dstyle.width = o.paper.width + "px";
dstyle.height = o.paper.height + "px";
- group.parentNode.insertBefore(div, group);
- div.appendChild(group);
+ node.parentNode.insertBefore(div, node);
+ div.appendChild(node);
node.clipRect = div;
}
}
if (!params["clip-rect"]) {
- node.clipRect && (node.clipRect.style.clip = E);
+ node.clipRect && (node.clipRect.style.clip = "auto");
}
}
if (o.textpath) {
a["font-family"] && (s.fontFamily = a["font-family"]);
a["font-weight"] && (s.fontWeight = a["font-weight"]);
a["font-style"] && (s.fontStyle = a["font-style"]);
- fontSize = toFloat(fontSize ? fontSize[0] : a["font-size"]);
+ fontSize = toFloat(a["font-size"] || fontSize && fontSize[0]) || 10;
s.fontSize = fontSize * m + "px";
res.textpath.string && (span.innerHTML = Str(res.textpath.string).replace(/</g, "<").replace(/&/g, "&").replace(/\n/g, "<br>"));
var brect = span.getBoundingClientRect();
res.W = a.w = (brect.right - brect.left) / m;
res.H = a.h = (brect.bottom - brect.top) / m;
- res.paper.canvas.style.display = "none";
+ // res.paper.canvas.style.display = "none";
res.X = a.x;
res.Y = a.y + res.H / 2;
res.textpath.style["v-text-kern"] = true;
}
// res.paper.canvas.style.display = E;
- };
+ },
addGradientFill = function (o, gradient, fill) {
o.attrs = o.attrs || {};
var attrs = o.attrs,
+ pow = Math.pow,
opacity,
oindex,
type = "linear",
o.appendChild(fill);
}
return 1;
- };
+ },
Element = function (node, vml) {
this[0] = this.node = node;
node.raphael = true;
if (tstr == null) {
return this._.transform;
}
- R._extractTransform(this, tstr);
+ var vbs = this.paper._viewBoxShift,
+ vbt = vbs ? "s" + [vbs.scale, vbs.scale] + "-1-1t" + [vbs.dx, vbs.dy] : E,
+ oldt;
+ if (vbs) {
+ oldt = tstr = Str(tstr).replace(/\.{3}|\u2026/g, this._.transform || E);
+ }
+ R._extractTransform(this, vbt + tstr);
var matrix = this.matrix.clone(),
- vbs = this.paper._viewBoxShift,
skew = this.skew,
o = this.node,
split,
- isGrad = Str(this.attrs.fill).indexOf("-") + 1;
+ isGrad = ~Str(this.attrs.fill).indexOf("-"),
+ isPatt = !Str(this.attrs.fill).indexOf("url(");
matrix.translate(-.5, -.5);
- if (vbs) {
- matrix.scale(vbs.scale, vbs.scale, -1, -1);
- matrix.translate(vbs.dx, vbs.dy);
- }
- if (isGrad || this.type == "image") {
+ if (isPatt || isGrad || this.type == "image") {
skew.matrix = "1 0 0 1";
skew.offset = "0 0";
split = matrix.split();
skew.matrix = Str(matrix);
skew.offset = matrix.offset();
}
+ oldt && (this._.transform = oldt);
return this;
};
elproto.rotate = function (deg, cx, cy) {
if (this.removed) {
return {};
}
- if (this.type == "text") {
- return {
- x: this.X + (this.bbx || 0) - this.W / 2,
- y: this.Y - this.H,
- width: this.W,
- height: this.H
- };
- } else {
- return pathDimensions(this.attrs.path);
- }
+ return {
+ x: this.X + (this.bbx || 0) - this.W / 2,
+ y: this.Y - this.H,
+ width: this.W,
+ height: this.H
+ };
};
elproto.remove = function () {
if (this.removed) {
return;
}
+ this.paper.__set__ && this.paper.__set__.exclude(this);
R.eve.unbind("*.*." + this.id);
R._tear(this, this.paper);
this.node.parentNode.removeChild(this.node);
this.shape && this.shape.parentNode.removeChild(this.shape);
for (var i in this) {
- delete this[i];
+ this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null;
}
this.removed = true;
};
}
value == null && R.is(name, "object") && (params = name);
for (var key in params) {
- R.eve("attr." + key + "." + this.id, this, params[key]);
+ eve("attr." + key + "." + this.id, this, params[key]);
}
if (params) {
for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) {
- var par = this.paper.customAttributes[key].apply(this, [][concat](params[key]));
+ var par = this.paper.customAttributes[key].apply(this, [].concat(params[key]));
this.attrs[key] = params[key];
for (var subkey in par) if (par[has](subkey)) {
params[subkey] = par[subkey];
};
elproto.toFront = function () {
!this.removed && this.node.parentNode.appendChild(this.node);
- this.paper && this.paper.top != this && tofront(this, this.paper);
+ this.paper && this.paper.top != this && R._tofront(this, this.paper);
return this;
};
elproto.toBack = function () {
}
if (this.node.parentNode.firstChild != this.node) {
this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild);
- toback(this, this.paper);
+ R._toback(this, this.paper);
}
return this;
};
if (this.removed) {
return this;
}
- if (element.constructor == Set) {
+ if (element.constructor == R.st.constructor) {
element = element[element.length - 1];
}
if (element.node.nextSibling) {
if (this.removed) {
return this;
}
- if (element.constructor == Set) {
+ if (element.constructor == R.st.constructor) {
element = element[0];
}
element.node.parentNode.insertBefore(this.node, element.node);
path.textpathok = true;
o.string = Str(text);
o.on = true;
- el.style.cssText = "position:absolute;left:0;top:0;width:1px;height:1px";
+ el.style.cssText = cssDot;
el.coordsize = zoom + S + zoom;
el.coordorigin = "0 0";
var p = new Element(el, vml),
- attr = {fill: "#000", stroke: "none", font: availableAttrs.font, text: text};
+ attr = {
+ fill: "#000",
+ stroke: "none",
+ font: R._availableAttrs.font,
+ text: text
+ };
p.shape = el;
p.path = path;
p.textpath = o;
cs.height = height;
cs.clip = "rect(0 " + width + " " + height + " 0)";
if (this._viewBox) {
- setViewBox.apply(this, this._viewBox);
+ R._engine.setViewBox.apply(this, this._viewBox);
}
return this;
};
});
return this;
};
- var createNode,
- initWin = function (win) {
+ var createNode;
+ R._engine.initWin = function (win) {
var doc = win.document;
doc.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)");
try {
};
}
};
- initWin(R._g.win);
+ R._engine.initWin(R._g.win);
R._engine.create = function () {
var con = R._getContainer.apply(0, arguments),
container = con.container,
R.prototype.clear = function () {
R.eve("clear", this);
this.canvas.innerHTML = E;
- this.span = g.doc.createElement("span");
+ this.span = R._g.doc.createElement("span");
this.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";
this.canvas.appendChild(this.span);
this.bottom = this.top = null;
R.eve("remove", this);
this.canvas.parentNode.removeChild(this.canvas);
for (var i in this) {
- this[i] = removed(i);
+ this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null;
}
return true;
};
+
+ var setproto = R.st;
+ for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) {
+ setproto[method] = (function (methodname) {
+ return function () {
+ var arg = arguments;
+ return this.forEach(function (el) {
+ el[methodname].apply(el, arg);
+ });
+ };
+ })(method);
+ }
}(window.Raphael);
\ No newline at end of file