/*
|
* raphael.zoom 0.0.4
|
*
|
* Copyright (c) 2010 Wout Fierens - http://boysabroad.com
|
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
|
*/
|
|
// get all elements in the paper
|
Raphael.fn.elements = function() {
|
var b = this.bottom,
|
r = [];
|
while (b) {
|
r.push(b);
|
b = b.next;
|
}
|
return r;
|
}
|
|
// initialize zoom of paper
|
Raphael.fn.initZoom = function(zoom) {
|
var elements = this.elements();
|
this.zoom = zoom || 1;
|
|
for (var i = 0; i < elements.length; i++) {
|
elements[i].initZoom();
|
}
|
|
return this;
|
}
|
|
// set the zoom of all elements
|
Raphael.fn.setZoom = function(zoom) {
|
if (!zoom) return;
|
|
var elements = this.elements();
|
if (!this.zoom)
|
this.initZoom();
|
|
for (var i = 0; i < elements.length; i++) {
|
elements[i].setZoom(zoom);
|
}
|
this.zoom = zoom;
|
|
return this;
|
}
|
|
// initialize zoom of element
|
Raphael.el.initZoom = function(zoom) {
|
var sw = parseFloat(this.attr("stroke-width")) || 0;
|
zoom = zoom || this.paper.zoom;
|
|
if (this.type != "text") sw /= zoom;
|
this.zoom = zoom;
|
this.zoom_memory = {
|
"stroke-width": sw,
|
rotation: 360
|
};
|
|
this.setStrokeWidth(sw / zoom);
|
|
if (this.type == "text") {
|
var fs = parseFloat(this.attr("font-size")) || 0
|
this.zoom_memory["font-size"] = fs;
|
this.zoom_memory["x"] = (parseFloat(this.attrs["x"]) || 0) / zoom;
|
this.zoom_memory["y"] = (parseFloat(this.attrs["y"]) || 0) / zoom;
|
}
|
return this;
|
}
|
|
// zoom element preserving some original values
|
Raphael.el.setZoom = function(zoom) {
|
if (!zoom) return;
|
if (!this.zoom_memory)
|
this.initZoom();
|
|
// scale to zoom
|
var new_zoom = zoom / this.zoom;
|
this.scale(new_zoom, new_zoom, 0, 0);
|
this.applyScale();
|
|
// save new zoom
|
this.zoom = zoom;
|
this.setStrokeWidth(this.zoom_memory["stroke-width"]);
|
|
if (this.type == "text")
|
this.attr({
|
"font-size": this.zoom_memory["font-size"] * zoom,
|
"x": this.zoom_memory["x"] * zoom,
|
"y": this.zoom_memory["y"] * zoom
|
});
|
|
return this;
|
}
|
|
// set element zoomed attributes
|
Raphael.el.setAttr = function() {
|
if (typeof arguments[0] == "string") {
|
attr = {};
|
attr[arguments[0]] = arguments[1];
|
} else {
|
attr = arguments[0];
|
}
|
|
for (var key in attr) {
|
switch(key) {
|
case "stroke-width":
|
this.setStrokeWidth(attr[key]);
|
break;
|
case "font-size":
|
this.setFontSize(attr[key]);
|
break;
|
case "x":
|
case "y":
|
if (this.type == "text")
|
this.zoom_memory[key] = attr[key] / this.zoom;
|
this.attr(key, attr[key]);
|
break;
|
default:
|
this.attr(key, attr[key]);
|
break;
|
}
|
}
|
return this;
|
}
|
|
// set element translation
|
Raphael.el.setTranslation = function(x, y) {
|
if (this.type == "text")
|
this.setAttr({
|
x: this.attrs["x"] + x,
|
y: this.attrs["y"] + y
|
});
|
else
|
this.translate(x,y);
|
|
return this;
|
}
|
|
// set element rotation
|
Raphael.el.setRotation = function(angle, x, y) {
|
if (!this.zoom_memory) this.initZoom();
|
if (angle == 0)
|
angle = 360;
|
this.rotate(angle, x, y);
|
this.zoom_memory.rotation = angle;
|
this.transformations = [];
|
this._.rt = { cx: null, cy: undefined, deg: 360 };
|
|
return this;
|
}
|
|
// set element zoomed stroke width
|
Raphael.el.setStrokeWidth = function(value) {
|
if (value == 0 || (value = parseFloat(value))) {
|
this.attr({ "stroke-width": value * this.zoom });
|
this.zoom_memory["stroke-width"] = value;
|
}
|
|
return this;
|
}
|
|
// set element font size
|
Raphael.el.setFontSize = function(value) {
|
if (value == 0 || (value = parseFloat(value))) {
|
this.attr({ "font-size": value * this.zoom });
|
this.zoom_memory["font-size"] = value;
|
}
|
|
return this;
|
}
|
|
// apply the current scale and reset it to 1
|
Raphael.el.applyScale = function() {
|
this._.sx = 1;
|
this._.sy = 1;
|
this.scale(1, 1);
|
|
return this;
|
}
|