|
/* This notice must be untouched at all times. |
|
|
|
wz_jsgraphics.js v. 2.36 |
|
The latest version is available at |
|
http://www.walterzorn.com |
|
or http://www.devira.com |
|
or http://www.walterzorn.de |
|
|
|
Copyright (c) 2002-2004 Walter Zorn. All rights reserved. |
|
Created 3. 11. 2002 by Walter Zorn (Web: http://www.walterzorn.com ) |
|
Last modified: 21. 6. 2006 |
|
|
|
Performance optimizations for Internet Explorer |
|
by Thomas Frank and John Holdsworth. |
|
fillPolygon method implemented by Matthieu Haller. |
|
|
|
High Performance JavaScript Graphics Library. |
|
Provides methods |
|
- to draw lines, rectangles, ellipses, polygons |
|
with specifiable line thickness, |
|
- to fill rectangles and ellipses |
|
- to draw text. |
|
NOTE: Operations, functions and branching have rather been optimized |
|
to efficiency and speed than to shortness of source code. |
|
|
|
LICENSE: LGPL |
|
|
|
This library is free software; you can redistribute it and/or |
|
modify it under the terms of the GNU Lesser General Public |
|
License (LGPL) as published by the Free Software Foundation; either |
|
version 2.1 of the License, or (at your option) any later version. |
|
|
|
This library is distributed in the hope that it will be useful, |
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
Lesser General Public License for more details. |
|
|
|
You should have received a copy of the GNU Lesser General Public |
|
License along with this library; if not, write to the Free Software |
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, |
|
or see http://www.gnu.org/copyleft/lesser.html |
|
*/ |
|
|
|
|
|
var jg_ihtm, jg_ie, jg_fast, jg_dom, jg_moz, |
|
jg_n4 = (document.layers && typeof document.classes != "undefined"); |
|
|
|
|
|
function chkDHTM(x, i) |
|
{ |
|
x = document.body || null; |
|
jg_ie = x && typeof x.insertAdjacentHTML != "undefined"; |
|
jg_dom = (x && !jg_ie && |
|
typeof x.appendChild != "undefined" && |
|
typeof document.createRange != "undefined" && |
|
typeof (i = document.createRange()).setStartBefore != "undefined" && |
|
typeof i.createContextualFragment != "undefined"); |
|
jg_ihtm = !jg_ie && !jg_dom && x && typeof x.innerHTML != "undefined"; |
|
jg_fast = jg_ie && document.all && !window.opera; |
|
jg_moz = jg_dom && typeof x.style.MozOpacity != "undefined"; |
|
} |
|
|
|
|
|
function pntDoc() |
|
{ |
|
this.wnd.document.write(jg_fast? this.htmRpc() : this.htm); |
|
this.htm = ''; |
|
} |
|
|
|
|
|
function pntCnvDom() |
|
{ |
|
var x = this.wnd.document.createRange(); |
|
x.setStartBefore(this.cnv); |
|
x = x.createContextualFragment(jg_fast? this.htmRpc() : this.htm); |
|
if(this.cnv) this.cnv.appendChild(x); |
|
this.htm = ''; |
|
} |
|
|
|
|
|
function pntCnvIe() |
|
{ |
|
if(this.cnv) this.cnv.insertAdjacentHTML("BeforeEnd", jg_fast? this.htmRpc() : this.htm); |
|
this.htm = ''; |
|
} |
|
|
|
|
|
function pntCnvIhtm() |
|
{ |
|
if(this.cnv) this.cnv.innerHTML += this.htm; |
|
this.htm = ''; |
|
} |
|
|
|
|
|
function pntCnv() |
|
{ |
|
this.htm = ''; |
|
} |
|
|
|
|
|
function mkDiv(x, y, w, h) |
|
{ |
|
this.htm += '<div style="position:absolute;'+ |
|
'left:' + x + 'px;'+ |
|
'top:' + y + 'px;'+ |
|
'width:' + w + 'px;'+ |
|
'height:' + h + 'px;'+ |
|
'clip:rect(0,'+w+'px,'+h+'px,0);'+ |
|
'background-color:' + this.color + |
|
(!jg_moz? ';overflow:hidden' : '')+ |
|
';"><\/div>'; |
|
} |
|
|
|
|
|
function mkDivIe(x, y, w, h) |
|
{ |
|
this.htm += '%%'+this.color+';'+x+';'+y+';'+w+';'+h+';'; |
|
} |
|
|
|
|
|
function mkDivPrt(x, y, w, h) |
|
{ |
|
this.htm += '<div style="position:absolute;'+ |
|
'border-left:' + w + 'px solid ' + this.color + ';'+ |
|
'left:' + x + 'px;'+ |
|
'top:' + y + 'px;'+ |
|
'width:0px;'+ |
|
'height:' + h + 'px;'+ |
|
'clip:rect(0,'+w+'px,'+h+'px,0);'+ |
|
'background-color:' + this.color + |
|
(!jg_moz? ';overflow:hidden' : '')+ |
|
';"><\/div>'; |
|
} |
|
|
|
|
|
function mkLyr(x, y, w, h) |
|
{ |
|
this.htm += '<layer '+ |
|
'left="' + x + '" '+ |
|
'top="' + y + '" '+ |
|
'width="' + w + '" '+ |
|
'height="' + h + '" '+ |
|
'bgcolor="' + this.color + '"><\/layer>\n'; |
|
} |
|
|
|
|
|
var regex = /%%([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);/g; |
|
function htmRpc() |
|
{ |
|
return this.htm.replace( |
|
regex, |
|
'<div style="overflow:hidden;position:absolute;background-color:'+ |
|
'$1;left:$2;top:$3;width:$4;height:$5"></div>\n'); |
|
} |
|
|
|
|
|
function htmPrtRpc() |
|
{ |
|
return this.htm.replace( |
|
regex, |
|
'<div style="overflow:hidden;position:absolute;background-color:'+ |
|
'$1;left:$2;top:$3;width:$4;height:$5;border-left:$4px solid $1"></div>\n'); |
|
} |
|
|
|
|
|
function mkLin(x1, y1, x2, y2) |
|
{ |
|
if (x1 > x2) |
|
{ |
|
var _x2 = x2; |
|
var _y2 = y2; |
|
x2 = x1; |
|
y2 = y1; |
|
x1 = _x2; |
|
y1 = _y2; |
|
} |
|
var dx = x2-x1, dy = Math.abs(y2-y1), |
|
x = x1, y = y1, |
|
yIncr = (y1 > y2)? -1 : 1; |
|
|
|
if (dx >= dy) |
|
{ |
|
var pr = dy<<1, |
|
pru = pr - (dx<<1), |
|
p = pr-dx, |
|
ox = x; |
|
while ((dx--) > 0) |
|
{ |
|
++x; |
|
if (p > 0) |
|
{ |
|
this.mkDiv(ox, y, x-ox, 1); |
|
y += yIncr; |
|
p += pru; |
|
ox = x; |
|
} |
|
else p += pr; |
|
} |
|
this.mkDiv(ox, y, x2-ox+1, 1); |
|
} |
|
|
|
else |
|
{ |
|
var pr = dx<<1, |
|
pru = pr - (dy<<1), |
|
p = pr-dy, |
|
oy = y; |
|
if (y2 <= y1) |
|
{ |
|
while ((dy--) > 0) |
|
{ |
|
if (p > 0) |
|
{ |
|
this.mkDiv(x++, y, 1, oy-y+1); |
|
y += yIncr; |
|
p += pru; |
|
oy = y; |
|
} |
|
else |
|
{ |
|
y += yIncr; |
|
p += pr; |
|
} |
|
} |
|
this.mkDiv(x2, y2, 1, oy-y2+1); |
|
} |
|
else |
|
{ |
|
while ((dy--) > 0) |
|
{ |
|
y += yIncr; |
|
if (p > 0) |
|
{ |
|
this.mkDiv(x++, oy, 1, y-oy); |
|
p += pru; |
|
oy = y; |
|
} |
|
else p += pr; |
|
} |
|
this.mkDiv(x2, oy, 1, y2-oy+1); |
|
} |
|
} |
|
} |
|
|
|
|
|
function mkLin2D(x1, y1, x2, y2) |
|
{ |
|
if (x1 > x2) |
|
{ |
|
var _x2 = x2; |
|
var _y2 = y2; |
|
x2 = x1; |
|
y2 = y1; |
|
x1 = _x2; |
|
y1 = _y2; |
|
} |
|
var dx = x2-x1, dy = Math.abs(y2-y1), |
|
x = x1, y = y1, |
|
yIncr = (y1 > y2)? -1 : 1; |
|
|
|
var s = this.stroke; |
|
if (dx >= dy) |
|
{ |
|
if (dx > 0 && s-3 > 0) |
|
{ |
|
var _s = (s*dx*Math.sqrt(1+dy*dy/(dx*dx))-dx-(s>>1)*dy) / dx; |
|
_s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1; |
|
} |
|
else var _s = s; |
|
var ad = Math.ceil(s/2); |
|
|
|
var pr = dy<<1, |
|
pru = pr - (dx<<1), |
|
p = pr-dx, |
|
ox = x; |
|
while ((dx--) > 0) |
|
{ |
|
++x; |
|
if (p > 0) |
|
{ |
|
this.mkDiv(ox, y, x-ox+ad, _s); |
|
y += yIncr; |
|
p += pru; |
|
ox = x; |
|
} |
|
else p += pr; |
|
} |
|
this.mkDiv(ox, y, x2-ox+ad+1, _s); |
|
} |
|
|
|
else |
|
{ |
|
if (s-3 > 0) |
|
{ |
|
var _s = (s*dy*Math.sqrt(1+dx*dx/(dy*dy))-(s>>1)*dx-dy) / dy; |
|
_s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1; |
|
} |
|
else var _s = s; |
|
var ad = Math.round(s/2); |
|
|
|
var pr = dx<<1, |
|
pru = pr - (dy<<1), |
|
p = pr-dy, |
|
oy = y; |
|
if (y2 <= y1) |
|
{ |
|
++ad; |
|
while ((dy--) > 0) |
|
{ |
|
if (p > 0) |
|
{ |
|
this.mkDiv(x++, y, _s, oy-y+ad); |
|
y += yIncr; |
|
p += pru; |
|
oy = y; |
|
} |
|
else |
|
{ |
|
y += yIncr; |
|
p += pr; |
|
} |
|
} |
|
this.mkDiv(x2, y2, _s, oy-y2+ad); |
|
} |
|
else |
|
{ |
|
while ((dy--) > 0) |
|
{ |
|
y += yIncr; |
|
if (p > 0) |
|
{ |
|
this.mkDiv(x++, oy, _s, y-oy+ad); |
|
p += pru; |
|
oy = y; |
|
} |
|
else p += pr; |
|
} |
|
this.mkDiv(x2, oy, _s, y2-oy+ad+1); |
|
} |
|
} |
|
} |
|
|
|
|
|
function mkLinDott(x1, y1, x2, y2) |
|
{ |
|
if (x1 > x2) |
|
{ |
|
var _x2 = x2; |
|
var _y2 = y2; |
|
x2 = x1; |
|
y2 = y1; |
|
x1 = _x2; |
|
y1 = _y2; |
|
} |
|
var dx = x2-x1, dy = Math.abs(y2-y1), |
|
x = x1, y = y1, |
|
yIncr = (y1 > y2)? -1 : 1, |
|
drw = true; |
|
if (dx >= dy) |
|
{ |
|
var pr = dy<<1, |
|
pru = pr - (dx<<1), |
|
p = pr-dx; |
|
while ((dx--) > 0) |
|
{ |
|
if (drw) this.mkDiv(x, y, 1, 1); |
|
drw = !drw; |
|
if (p > 0) |
|
{ |
|
y += yIncr; |
|
p += pru; |
|
} |
|
else p += pr; |
|
++x; |
|
} |
|
if (drw) this.mkDiv(x, y, 1, 1); |
|
} |
|
|
|
else |
|
{ |
|
var pr = dx<<1, |
|
pru = pr - (dy<<1), |
|
p = pr-dy; |
|
while ((dy--) > 0) |
|
{ |
|
if (drw) this.mkDiv(x, y, 1, 1); |
|
drw = !drw; |
|
y += yIncr; |
|
if (p > 0) |
|
{ |
|
++x; |
|
p += pru; |
|
} |
|
else p += pr; |
|
} |
|
if (drw) this.mkDiv(x, y, 1, 1); |
|
} |
|
} |
|
|
|
|
|
function mkOv(left, top, width, height) |
|
{ |
|
var a = width>>1, b = height>>1, |
|
wod = width&1, hod = (height&1)+1, |
|
cx = left+a, cy = top+b, |
|
x = 0, y = b, |
|
ox = 0, oy = b, |
|
aa = (a*a)<<1, bb = (b*b)<<1, |
|
st = (aa>>1)*(1-(b<<1)) + bb, |
|
tt = (bb>>1) - aa*((b<<1)-1), |
|
w, h; |
|
while (y > 0) |
|
{ |
|
if (st < 0) |
|
{ |
|
st += bb*((x<<1)+3); |
&nbs |