wz_jsgraphics.js
上传用户:simon2hong
上传日期:2021-11-18
资源大小:16746k
文件大小:23k
源码类别:

OA系统

开发平台:

C#

  1. /* This notice must be untouched at all times.
  2. wz_jsgraphics.js    v. 3.03
  3. The latest version is available at
  4. http://www.walterzorn.com
  5. or http://www.devira.com
  6. or http://www.walterzorn.de
  7. Copyright (c) 2002-2004 Walter Zorn. All rights reserved.
  8. Created 3. 11. 2002 by Walter Zorn (Web: http://www.walterzorn.com )
  9. Last modified: 28. 1. 2008
  10. Performance optimizations for Internet Explorer
  11. by Thomas Frank and John Holdsworth.
  12. fillPolygon method implemented by Matthieu Haller.
  13. High Performance JavaScript Graphics Library.
  14. Provides methods
  15. - to draw lines, rectangles, ellipses, polygons
  16. with specifiable line thickness,
  17. - to fill rectangles, polygons, ellipses and arcs
  18. - to draw text.
  19. NOTE: Operations, functions and branching have rather been optimized
  20. to efficiency and speed than to shortness of source code.
  21. LICENSE: LGPL
  22. This library is free software; you can redistribute it and/or
  23. modify it under the terms of the GNU Lesser General Public
  24. License (LGPL) as published by the Free Software Foundation; either
  25. version 2.1 of the License, or (at your option) any later version.
  26. This library is distributed in the hope that it will be useful,
  27. but WITHOUT ANY WARRANTY; without even the implied warranty of
  28. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  29. Lesser General Public License for more details.
  30. You should have received a copy of the GNU Lesser General Public
  31. License along with this library; if not, write to the Free Software
  32. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA,
  33. or see http://www.gnu.org/copyleft/lesser.html
  34. */
  35. var jg_ok, jg_ie, jg_fast, jg_dom, jg_moz;
  36. function _chkDHTM(x, i)
  37. {
  38. x = document.body || null;
  39. jg_ie = x && typeof x.insertAdjacentHTML != "undefined" && document.createElement;
  40. jg_dom = (x && !jg_ie &&
  41. typeof x.appendChild != "undefined" &&
  42. typeof document.createRange != "undefined" &&
  43. typeof (i = document.createRange()).setStartBefore != "undefined" &&
  44. typeof i.createContextualFragment != "undefined");
  45. jg_fast = jg_ie && document.all && !window.opera;
  46. jg_moz = jg_dom && typeof x.style.MozOpacity != "undefined";
  47. jg_ok = !!(jg_ie || jg_dom);
  48. }
  49. function _pntCnvDom()
  50. {
  51. var x = this.wnd.document.createRange();
  52. x.setStartBefore(this.cnv);
  53. x = x.createContextualFragment(jg_fast? this._htmRpc() : this.htm);
  54. if(this.cnv) this.cnv.appendChild(x);
  55. this.htm = "";
  56. }
  57. function _pntCnvIe()
  58. {
  59. if(this.cnv) this.cnv.insertAdjacentHTML("BeforeEnd", jg_fast? this._htmRpc() : this.htm);
  60. this.htm = "";
  61. }
  62. function _pntDoc()
  63. {
  64. this.wnd.document.write(jg_fast? this._htmRpc() : this.htm);
  65. this.htm = '';
  66. }
  67. function _pntN()
  68. {
  69. ;
  70. }
  71. function _mkDiv(x, y, w, h)
  72. {
  73. this.htm += '<div style="position:absolute;'+
  74. 'left:' + x + 'px;'+
  75. 'top:' + y + 'px;'+
  76. 'width:' + w + 'px;'+
  77. 'height:' + h + 'px;'+
  78. 'clip:rect(0,'+w+'px,'+h+'px,0);'+
  79. 'background-color:' + this.color +
  80. (!jg_moz? ';overflow:hidden' : '')+
  81. ';"></div>';
  82. }
  83. function _mkDivIe(x, y, w, h)
  84. {
  85. this.htm += '%%'+this.color+';'+x+';'+y+';'+w+';'+h+';';
  86. }
  87. function _mkDivPrt(x, y, w, h)
  88. {
  89. this.htm += '<div style="position:absolute;'+
  90. 'border-left:' + w + 'px solid ' + this.color + ';'+
  91. 'left:' + x + 'px;'+
  92. 'top:' + y + 'px;'+
  93. 'width:0px;'+
  94. 'height:' + h + 'px;'+
  95. 'clip:rect(0,'+w+'px,'+h+'px,0);'+
  96. 'background-color:' + this.color +
  97. (!jg_moz? ';overflow:hidden' : '')+
  98. ';"></div>';
  99. }
  100. var _regex =  /%%([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);/g;
  101. function _htmRpc()
  102. {
  103. return this.htm.replace(
  104. _regex,
  105. '<div style="overflow:hidden;position:absolute;background-color:'+
  106. '$1;left:$2;top:$3;width:$4;height:$5"></div>n');
  107. }
  108. function _htmPrtRpc()
  109. {
  110. return this.htm.replace(
  111. _regex,
  112. '<div style="overflow:hidden;position:absolute;background-color:'+
  113. '$1;left:$2;top:$3;width:$4;height:$5;border-left:$4px solid $1"></div>n');
  114. }
  115. function _mkLin(x1, y1, x2, y2)
  116. {
  117. if(x1 > x2)
  118. {
  119. var _x2 = x2;
  120. var _y2 = y2;
  121. x2 = x1;
  122. y2 = y1;
  123. x1 = _x2;
  124. y1 = _y2;
  125. }
  126. var dx = x2-x1, dy = Math.abs(y2-y1),
  127. x = x1, y = y1,
  128. yIncr = (y1 > y2)? -1 : 1;
  129. if(dx >= dy)
  130. {
  131. var pr = dy<<1,
  132. pru = pr - (dx<<1),
  133. p = pr-dx,
  134. ox = x;
  135. while(dx > 0)
  136. {--dx;
  137. ++x;
  138. if(p > 0)
  139. {
  140. this._mkDiv(ox, y, x-ox, 1);
  141. y += yIncr;
  142. p += pru;
  143. ox = x;
  144. }
  145. else p += pr;
  146. }
  147. this._mkDiv(ox, y, x2-ox+1, 1);
  148. }
  149. else
  150. {
  151. var pr = dx<<1,
  152. pru = pr - (dy<<1),
  153. p = pr-dy,
  154. oy = y;
  155. if(y2 <= y1)
  156. {
  157. while(dy > 0)
  158. {--dy;
  159. if(p > 0)
  160. {
  161. this._mkDiv(x++, y, 1, oy-y+1);
  162. y += yIncr;
  163. p += pru;
  164. oy = y;
  165. }
  166. else
  167. {
  168. y += yIncr;
  169. p += pr;
  170. }
  171. }
  172. this._mkDiv(x2, y2, 1, oy-y2+1);
  173. }
  174. else
  175. {
  176. while(dy > 0)
  177. {--dy;
  178. y += yIncr;
  179. if(p > 0)
  180. {
  181. this._mkDiv(x++, oy, 1, y-oy);
  182. p += pru;
  183. oy = y;
  184. }
  185. else p += pr;
  186. }
  187. this._mkDiv(x2, oy, 1, y2-oy+1);
  188. }
  189. }
  190. }
  191. function _mkLin2D(x1, y1, x2, y2)
  192. {
  193. if(x1 > x2)
  194. {
  195. var _x2 = x2;
  196. var _y2 = y2;
  197. x2 = x1;
  198. y2 = y1;
  199. x1 = _x2;
  200. y1 = _y2;
  201. }
  202. var dx = x2-x1, dy = Math.abs(y2-y1),
  203. x = x1, y = y1,
  204. yIncr = (y1 > y2)? -1 : 1;
  205. var s = this.stroke;
  206. if(dx >= dy)
  207. {
  208. if(dx > 0 && s-3 > 0)
  209. {
  210. var _s = (s*dx*Math.sqrt(1+dy*dy/(dx*dx))-dx-(s>>1)*dy) / dx;
  211. _s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;
  212. }
  213. else var _s = s;
  214. var ad = Math.ceil(s/2);
  215. var pr = dy<<1,
  216. pru = pr - (dx<<1),
  217. p = pr-dx,
  218. ox = x;
  219. while(dx > 0)
  220. {--dx;
  221. ++x;
  222. if(p > 0)
  223. {
  224. this._mkDiv(ox, y, x-ox+ad, _s);
  225. y += yIncr;
  226. p += pru;
  227. ox = x;
  228. }
  229. else p += pr;
  230. }
  231. this._mkDiv(ox, y, x2-ox+ad+1, _s);
  232. }
  233. else
  234. {
  235. if(s-3 > 0)
  236. {
  237. var _s = (s*dy*Math.sqrt(1+dx*dx/(dy*dy))-(s>>1)*dx-dy) / dy;
  238. _s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;
  239. }
  240. else var _s = s;
  241. var ad = Math.round(s/2);
  242. var pr = dx<<1,
  243. pru = pr - (dy<<1),
  244. p = pr-dy,
  245. oy = y;
  246. if(y2 <= y1)
  247. {
  248. ++ad;
  249. while(dy > 0)
  250. {--dy;
  251. if(p > 0)
  252. {
  253. this._mkDiv(x++, y, _s, oy-y+ad);
  254. y += yIncr;
  255. p += pru;
  256. oy = y;
  257. }
  258. else
  259. {
  260. y += yIncr;
  261. p += pr;
  262. }
  263. }
  264. this._mkDiv(x2, y2, _s, oy-y2+ad);
  265. }
  266. else
  267. {
  268. while(dy > 0)
  269. {--dy;
  270. y += yIncr;
  271. if(p > 0)
  272. {
  273. this._mkDiv(x++, oy, _s, y-oy+ad);
  274. p += pru;
  275. oy = y;
  276. }
  277. else p += pr;
  278. }
  279. this._mkDiv(x2, oy, _s, y2-oy+ad+1);
  280. }
  281. }
  282. }
  283. function _mkLinDott(x1, y1, x2, y2)
  284. {
  285. if(x1 > x2)
  286. {
  287. var _x2 = x2;
  288. var _y2 = y2;
  289. x2 = x1;
  290. y2 = y1;
  291. x1 = _x2;
  292. y1 = _y2;
  293. }
  294. var dx = x2-x1, dy = Math.abs(y2-y1),
  295. x = x1, y = y1,
  296. yIncr = (y1 > y2)? -1 : 1,
  297. drw = true;
  298. if(dx >= dy)
  299. {
  300. var pr = dy<<1,
  301. pru = pr - (dx<<1),
  302. p = pr-dx;
  303. while(dx > 0)
  304. {--dx;
  305. if(drw) this._mkDiv(x, y, 1, 1);
  306. drw = !drw;
  307. if(p > 0)
  308. {
  309. y += yIncr;
  310. p += pru;
  311. }
  312. else p += pr;
  313. ++x;
  314. }
  315. }
  316. else
  317. {
  318. var pr = dx<<1,
  319. pru = pr - (dy<<1),
  320. p = pr-dy;
  321. while(dy > 0)
  322. {--dy;
  323. if(drw) this._mkDiv(x, y, 1, 1);
  324. drw = !drw;
  325. y += yIncr;
  326. if(p > 0)
  327. {
  328. ++x;
  329. p += pru;
  330. }
  331. else p += pr;
  332. }
  333. }
  334. if(drw) this._mkDiv(x, y, 1, 1);
  335. }
  336. function _mkOv(left, top, width, height)
  337. {
  338. var a = (++width)>>1, b = (++height)>>1,
  339. wod = width&1, hod = height&1,
  340. cx = left+a, cy = top+b,
  341. x = 0, y = b,
  342. ox = 0, oy = b,
  343. aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,
  344. st = (aa2>>1)*(1-(b<<1)) + bb2,
  345. tt = (bb2>>1) - aa2*((b<<1)-1),
  346. w, h;
  347. while(y > 0)
  348. {
  349. if(st < 0)
  350. {
  351. st += bb2*((x<<1)+3);
  352. tt += bb4*(++x);
  353. }
  354. else if(tt < 0)
  355. {
  356. st += bb2*((x<<1)+3) - aa4*(y-1);
  357. tt += bb4*(++x) - aa2*(((y--)<<1)-3);
  358. w = x-ox;
  359. h = oy-y;
  360. if((w&2) && (h&2))
  361. {
  362. this._mkOvQds(cx, cy, x-2, y+2, 1, 1, wod, hod);
  363. this._mkOvQds(cx, cy, x-1, y+1, 1, 1, wod, hod);
  364. }
  365. else this._mkOvQds(cx, cy, x-1, oy, w, h, wod, hod);
  366. ox = x;
  367. oy = y;
  368. }
  369. else
  370. {
  371. tt -= aa2*((y<<1)-3);
  372. st -= aa4*(--y);
  373. }
  374. }
  375. w = a-ox+1;
  376. h = (oy<<1)+hod;
  377. y = cy-oy;
  378. this._mkDiv(cx-a, y, w, h);
  379. this._mkDiv(cx+ox+wod-1, y, w, h);
  380. }
  381. function _mkOv2D(left, top, width, height)
  382. {
  383. var s = this.stroke;
  384. width += s+1;
  385. height += s+1;
  386. var a = width>>1, b = height>>1,
  387. wod = width&1, hod = height&1,
  388. cx = left+a, cy = top+b,
  389. x = 0, y = b,
  390. aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,
  391. st = (aa2>>1)*(1-(b<<1)) + bb2,
  392. tt = (bb2>>1) - aa2*((b<<1)-1);
  393. if(s-4 < 0 && (!(s-2) || width-51 > 0 && height-51 > 0))
  394. {
  395. var ox = 0, oy = b,
  396. w, h,
  397. pxw;
  398. while(y > 0)
  399. {
  400. if(st < 0)
  401. {
  402. st += bb2*((x<<1)+3);
  403. tt += bb4*(++x);
  404. }
  405. else if(tt < 0)
  406. {
  407. st += bb2*((x<<1)+3) - aa4*(y-1);
  408. tt += bb4*(++x) - aa2*(((y--)<<1)-3);
  409. w = x-ox;
  410. h = oy-y;
  411. if(w-1)
  412. {
  413. pxw = w+1+(s&1);
  414. h = s;
  415. }
  416. else if(h-1)
  417. {
  418. pxw = s;
  419. h += 1+(s&1);
  420. }
  421. else pxw = h = s;
  422. this._mkOvQds(cx, cy, x-1, oy, pxw, h, wod, hod);
  423. ox = x;
  424. oy = y;
  425. }
  426. else
  427. {
  428. tt -= aa2*((y<<1)-3);
  429. st -= aa4*(--y);
  430. }
  431. }
  432. this._mkDiv(cx-a, cy-oy, s, (oy<<1)+hod);
  433. this._mkDiv(cx+a+wod-s, cy-oy, s, (oy<<1)+hod);
  434. }
  435. else
  436. {
  437. var _a = (width-(s<<1))>>1,
  438. _b = (height-(s<<1))>>1,
  439. _x = 0, _y = _b,
  440. _aa2 = (_a*_a)<<1, _aa4 = _aa2<<1, _bb2 = (_b*_b)<<1, _bb4 = _bb2<<1,
  441. _st = (_aa2>>1)*(1-(_b<<1)) + _bb2,
  442. _tt = (_bb2>>1) - _aa2*((_b<<1)-1),
  443. pxl = new Array(),
  444. pxt = new Array(),
  445. _pxb = new Array();
  446. pxl[0] = 0;
  447. pxt[0] = b;
  448. _pxb[0] = _b-1;
  449. while(y > 0)
  450. {
  451. if(st < 0)
  452. {
  453. pxl[pxl.length] = x;
  454. pxt[pxt.length] = y;
  455. st += bb2*((x<<1)+3);
  456. tt += bb4*(++x);
  457. }
  458. else if(tt < 0)
  459. {
  460. pxl[pxl.length] = x;
  461. st += bb2*((x<<1)+3) - aa4*(y-1);
  462. tt += bb4*(++x) - aa2*(((y--)<<1)-3);
  463. pxt[pxt.length] = y;
  464. }
  465. else
  466. {
  467. tt -= aa2*((y<<1)-3);
  468. st -= aa4*(--y);
  469. }
  470. if(_y > 0)
  471. {
  472. if(_st < 0)
  473. {
  474. _st += _bb2*((_x<<1)+3);
  475. _tt += _bb4*(++_x);
  476. _pxb[_pxb.length] = _y-1;
  477. }
  478. else if(_tt < 0)
  479. {
  480. _st += _bb2*((_x<<1)+3) - _aa4*(_y-1);
  481. _tt += _bb4*(++_x) - _aa2*(((_y--)<<1)-3);
  482. _pxb[_pxb.length] = _y-1;
  483. }
  484. else
  485. {
  486. _tt -= _aa2*((_y<<1)-3);
  487. _st -= _aa4*(--_y);
  488. _pxb[_pxb.length-1]--;
  489. }
  490. }
  491. }
  492. var ox = -wod, oy = b,
  493. _oy = _pxb[0],
  494. l = pxl.length,
  495. w, h;
  496. for(var i = 0; i < l; i++)
  497. {
  498. if(typeof _pxb[i] != "undefined")
  499. {
  500. if(_pxb[i] < _oy || pxt[i] < oy)
  501. {
  502. x = pxl[i];
  503. this._mkOvQds(cx, cy, x, oy, x-ox, oy-_oy, wod, hod);
  504. ox = x;
  505. oy = pxt[i];
  506. _oy = _pxb[i];
  507. }
  508. }
  509. else
  510. {
  511. x = pxl[i];
  512. this._mkDiv(cx-x, cy-oy, 1, (oy<<1)+hod);
  513. this._mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);
  514. ox = x;
  515. oy = pxt[i];
  516. }
  517. }
  518. this._mkDiv(cx-a, cy-oy, 1, (oy<<1)+hod);
  519. this._mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);
  520. }
  521. }
  522. function _mkOvDott(left, top, width, height)
  523. {
  524. var a = (++width)>>1, b = (++height)>>1,
  525. wod = width&1, hod = height&1, hodu = hod^1,
  526. cx = left+a, cy = top+b,
  527. x = 0, y = b,
  528. aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,
  529. st = (aa2>>1)*(1-(b<<1)) + bb2,
  530. tt = (bb2>>1) - aa2*((b<<1)-1),
  531. drw = true;
  532. while(y > 0)
  533. {
  534. if(st < 0)
  535. {
  536. st += bb2*((x<<1)+3);
  537. tt += bb4*(++x);
  538. }
  539. else if(tt < 0)
  540. {
  541. st += bb2*((x<<1)+3) - aa4*(y-1);
  542. tt += bb4*(++x) - aa2*(((y--)<<1)-3);
  543. }
  544. else
  545. {
  546. tt -= aa2*((y<<1)-3);
  547. st -= aa4*(--y);
  548. }
  549. if(drw && y >= hodu) this._mkOvQds(cx, cy, x, y, 1, 1, wod, hod);
  550. drw = !drw;
  551. }
  552. }
  553. function _mkRect(x, y, w, h)
  554. {
  555. var s = this.stroke;
  556. this._mkDiv(x, y, w, s);
  557. this._mkDiv(x+w, y, s, h);
  558. this._mkDiv(x, y+h, w+s, s);
  559. this._mkDiv(x, y+s, s, h-s);
  560. }
  561. function _mkRectDott(x, y, w, h)
  562. {
  563. this.drawLine(x, y, x+w, y);
  564. this.drawLine(x+w, y, x+w, y+h);
  565. this.drawLine(x, y+h, x+w, y+h);
  566. this.drawLine(x, y, x, y+h);
  567. }
  568. function jsgFont()
  569. {
  570. this.PLAIN = 'font-weight:normal;';
  571. this.BOLD = 'font-weight:bold;';
  572. this.ITALIC = 'font-style:italic;';
  573. this.ITALIC_BOLD = this.ITALIC + this.BOLD;
  574. this.BOLD_ITALIC = this.ITALIC_BOLD;
  575. }
  576. var Font = new jsgFont();
  577. function jsgStroke()
  578. {
  579. this.DOTTED = -1;
  580. }
  581. var Stroke = new jsgStroke();
  582. function jsGraphics(cnv, wnd)
  583. {
  584. this.setColor = function(x)
  585. {
  586. this.color = x.toLowerCase();
  587. };
  588. this.setStroke = function(x)
  589. {
  590. this.stroke = x;
  591. if(!(x+1))
  592. {
  593. this.drawLine = _mkLinDott;
  594. this._mkOv = _mkOvDott;
  595. this.drawRect = _mkRectDott;
  596. }
  597. else if(x-1 > 0)
  598. {
  599. this.drawLine = _mkLin2D;
  600. this._mkOv = _mkOv2D;
  601. this.drawRect = _mkRect;
  602. }
  603. else
  604. {
  605. this.drawLine = _mkLin;
  606. this._mkOv = _mkOv;
  607. this.drawRect = _mkRect;
  608. }
  609. };
  610. this.setPrintable = function(arg)
  611. {
  612. this.printable = arg;
  613. if(jg_fast)
  614. {
  615. this._mkDiv = _mkDivIe;
  616. this._htmRpc = arg? _htmPrtRpc : _htmRpc;
  617. }
  618. else this._mkDiv = arg? _mkDivPrt : _mkDiv;
  619. };
  620. this.setFont = function(fam, sz, sty)
  621. {
  622. this.ftFam = fam;
  623. this.ftSz = sz;
  624. this.ftSty = sty || Font.PLAIN;
  625. };
  626. this.drawPolyline = this.drawPolyLine = function(x, y)
  627. {
  628. for (var i=x.length - 1; i;)
  629. {--i;
  630. this.drawLine(x[i], y[i], x[i+1], y[i+1]);
  631. }
  632. };
  633. this.fillRect = function(x, y, w, h)
  634. {
  635. this._mkDiv(x, y, w, h);
  636. };
  637. this.drawPolygon = function(x, y)
  638. {
  639. this.drawPolyline(x, y);
  640. this.drawLine(x[x.length-1], y[x.length-1], x[0], y[0]);
  641. };
  642. this.drawEllipse = this.drawOval = function(x, y, w, h)
  643. {
  644. this._mkOv(x, y, w, h);
  645. };
  646. this.fillEllipse = this.fillOval = function(left, top, w, h)
  647. {
  648. var a = w>>1, b = h>>1,
  649. wod = w&1, hod = h&1,
  650. cx = left+a, cy = top+b,
  651. x = 0, y = b, oy = b,
  652. aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,
  653. st = (aa2>>1)*(1-(b<<1)) + bb2,
  654. tt = (bb2>>1) - aa2*((b<<1)-1),
  655. xl, dw, dh;
  656. if(w) while(y > 0)
  657. {
  658. if(st < 0)
  659. {
  660. st += bb2*((x<<1)+3);
  661. tt += bb4*(++x);
  662. }
  663. else if(tt < 0)
  664. {
  665. st += bb2*((x<<1)+3) - aa4*(y-1);
  666. xl = cx-x;
  667. dw = (x<<1)+wod;
  668. tt += bb4*(++x) - aa2*(((y--)<<1)-3);
  669. dh = oy-y;
  670. this._mkDiv(xl, cy-oy, dw, dh);
  671. this._mkDiv(xl, cy+y+hod, dw, dh);
  672. oy = y;
  673. }
  674. else
  675. {
  676. tt -= aa2*((y<<1)-3);
  677. st -= aa4*(--y);
  678. }
  679. }
  680. this._mkDiv(cx-a, cy-oy, w, (oy<<1)+hod);
  681. };
  682. this.fillArc = function(iL, iT, iW, iH, fAngA, fAngZ)
  683. {
  684. var a = iW>>1, b = iH>>1,
  685. iOdds = (iW&1) | ((iH&1) << 16),
  686. cx = iL+a, cy = iT+b,
  687. x = 0, y = b, ox = x, oy = y,
  688. aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,
  689. st = (aa2>>1)*(1-(b<<1)) + bb2,
  690. tt = (bb2>>1) - aa2*((b<<1)-1),
  691. // Vars for radial boundary lines
  692. xEndA, yEndA, xEndZ, yEndZ,
  693. iSects = (1 << (Math.floor((fAngA %= 360.0)/180.0) << 3))
  694. | (2 << (Math.floor((fAngZ %= 360.0)/180.0) << 3))
  695. | ((fAngA >= fAngZ) << 16),
  696. aBndA = new Array(b+1), aBndZ = new Array(b+1);
  697. // Set up radial boundary lines
  698. fAngA *= Math.PI/180.0;
  699. fAngZ *= Math.PI/180.0;
  700. xEndA = cx+Math.round(a*Math.cos(fAngA));
  701. yEndA = cy+Math.round(-b*Math.sin(fAngA));
  702. _mkLinVirt(aBndA, cx, cy, xEndA, yEndA);
  703. xEndZ = cx+Math.round(a*Math.cos(fAngZ));
  704. yEndZ = cy+Math.round(-b*Math.sin(fAngZ));
  705. _mkLinVirt(aBndZ, cx, cy, xEndZ, yEndZ);
  706. while(y > 0)
  707. {
  708. if(st < 0) // Advance x
  709. {
  710. st += bb2*((x<<1)+3);
  711. tt += bb4*(++x);
  712. }
  713. else if(tt < 0) // Advance x and y
  714. {
  715. st += bb2*((x<<1)+3) - aa4*(y-1);
  716. ox = x;
  717. tt += bb4*(++x) - aa2*(((y--)<<1)-3);
  718. this._mkArcDiv(ox, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);
  719. oy = y;
  720. }
  721. else // Advance y
  722. {
  723. tt -= aa2*((y<<1)-3);
  724. st -= aa4*(--y);
  725. if(y && (aBndA[y] != aBndA[y-1] || aBndZ[y] != aBndZ[y-1]))
  726. {
  727. this._mkArcDiv(x, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);
  728. ox = x;
  729. oy = y;
  730. }
  731. }
  732. }
  733. this._mkArcDiv(x, 0, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);
  734. if(iOdds >> 16) // Odd height
  735. {
  736. if(iSects >> 16) // Start-angle > end-angle
  737. {
  738. var xl = (yEndA <= cy || yEndZ > cy)? (cx - x) : cx;
  739. this._mkDiv(xl, cy, x + cx - xl + (iOdds & 0xffff), 1);
  740. }
  741. else if((iSects & 0x01) && yEndZ > cy)
  742. this._mkDiv(cx - x, cy, x, 1);
  743. }
  744. };
  745. /* fillPolygon method, implemented by Matthieu Haller.
  746. This javascript function is an adaptation of the gdImageFilledPolygon for Walter Zorn lib.
  747. C source of GD 1.8.4 found at http://www.boutell.com/gd/
  748. THANKS to Kirsten Schulz for the polygon fixes!
  749. The intersection finding technique of this code could be improved
  750. by remembering the previous intertersection, and by using the slope.
  751. That could help to adjust intersections to produce a nice
  752. interior_extrema. */
  753. this.fillPolygon = function(array_x, array_y)
  754. {
  755. var i;
  756. var y;
  757. var miny, maxy;
  758. var x1, y1;
  759. var x2, y2;
  760. var ind1, ind2;
  761. var ints;
  762. var n = array_x.length;
  763. if(!n) return;
  764. miny = array_y[0];
  765. maxy = array_y[0];
  766. for(i = 1; i < n; i++)
  767. {
  768. if(array_y[i] < miny)
  769. miny = array_y[i];
  770. if(array_y[i] > maxy)
  771. maxy = array_y[i];
  772. }
  773. for(y = miny; y <= maxy; y++)
  774. {
  775. var polyInts = new Array();
  776. ints = 0;
  777. for(i = 0; i < n; i++)
  778. {
  779. if(!i)
  780. {
  781. ind1 = n-1;
  782. ind2 = 0;
  783. }
  784. else
  785. {
  786. ind1 = i-1;
  787. ind2 = i;
  788. }
  789. y1 = array_y[ind1];
  790. y2 = array_y[ind2];
  791. if(y1 < y2)
  792. {
  793. x1 = array_x[ind1];
  794. x2 = array_x[ind2];
  795. }
  796. else if(y1 > y2)
  797. {
  798. y2 = array_y[ind1];
  799. y1 = array_y[ind2];
  800. x2 = array_x[ind1];
  801. x1 = array_x[ind2];
  802. }
  803. else continue;
  804.  //  Modified 11. 2. 2004 Walter Zorn
  805. if((y >= y1) && (y < y2))
  806. polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);
  807. else if((y == maxy) && (y > y1) && (y <= y2))
  808. polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);
  809. }
  810. polyInts.sort(_CompInt);
  811. for(i = 0; i < ints; i+=2)
  812. this._mkDiv(polyInts[i], y, polyInts[i+1]-polyInts[i]+1, 1);
  813. }
  814. };
  815. this.drawString = function(txt, x, y)
  816. {
  817. this.htm += '<div style="position:absolute;white-space:nowrap;'+
  818. 'left:' + x + 'px;'+
  819. 'top:' + y + 'px;'+
  820. 'font-family:' +  this.ftFam + ';'+
  821. 'font-size:' + this.ftSz + ';'+
  822. 'color:' + this.color + ';' + this.ftSty + '">'+
  823. txt +
  824. '</div>';
  825. };
  826. /* drawStringRect() added by Rick Blommers.
  827. Allows to specify the size of the text rectangle and to align the
  828. text both horizontally (e.g. right) and vertically within that rectangle */
  829. this.drawStringRect = function(txt, x, y, width, halign)
  830. {
  831. this.htm += '<div style="position:absolute;overflow:hidden;'+
  832. 'left:' + x + 'px;'+
  833. 'top:' + y + 'px;'+
  834. 'width:'+width +'px;'+
  835. 'text-align:'+halign+';'+
  836. 'font-family:' +  this.ftFam + ';'+
  837. 'font-size:' + this.ftSz + ';'+
  838. 'color:' + this.color + ';' + this.ftSty + '">'+
  839. txt +
  840. '</div>';
  841. };
  842. this.drawImage = function(imgSrc, x, y, w, h, a)
  843. {
  844. this.htm += '<div style="position:absolute;'+
  845. 'left:' + x + 'px;'+
  846. 'top:' + y + 'px;'+
  847. // w (width) and h (height) arguments are now optional.
  848. // Added by Mahmut Keygubatli, 14.1.2008
  849. (w? ('width:' +  w + 'px;') : '') +
  850. (h? ('height:' + h + 'px;'):'')+'">'+
  851. '<img src="' + imgSrc +'"'+ (w ? (' width="' + w + '"'):'')+ (h ? (' height="' + h + '"'):'') + (a? (' '+a) : '') + '>'+
  852. '</div>';
  853. };
  854. this.clear = function()
  855. {
  856. this.htm = "";
  857. if(this.cnv) this.cnv.innerHTML = "";
  858. };
  859. this._mkOvQds = function(cx, cy, x, y, w, h, wod, hod)
  860. {
  861. var xl = cx - x, xr = cx + x + wod - w, yt = cy - y, yb = cy + y + hod - h;
  862. if(xr > xl+w)
  863. {
  864. this._mkDiv(xr, yt, w, h);
  865. this._mkDiv(xr, yb, w, h);
  866. }
  867. else
  868. w = xr - xl + w;
  869. this._mkDiv(xl, yt, w, h);
  870. this._mkDiv(xl, yb, w, h);
  871. };
  872. this._mkArcDiv = function(x, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects)
  873. {
  874. var xrDef = cx + x + (iOdds & 0xffff), y2, h = oy - y, xl, xr, w;
  875. if(!h) h = 1;
  876. x = cx - x;
  877. if(iSects & 0xff0000) // Start-angle > end-angle
  878. {
  879. y2 = cy - y - h;
  880. if(iSects & 0x00ff)
  881. {
  882. if(iSects & 0x02)
  883. {
  884. xl = Math.max(x, aBndZ[y]);
  885. w = xrDef - xl;
  886. if(w > 0) this._mkDiv(xl, y2, w, h);
  887. }
  888. if(iSects & 0x01)
  889. {
  890. xr = Math.min(xrDef, aBndA[y]);
  891. w = xr - x;
  892. if(w > 0) this._mkDiv(x, y2, w, h);
  893. }
  894. }
  895. else
  896. this._mkDiv(x, y2, xrDef - x, h);
  897. y2 = cy + y + (iOdds >> 16);
  898. if(iSects & 0xff00)
  899. {
  900. if(iSects & 0x0100)
  901. {
  902. xl = Math.max(x, aBndA[y]);
  903. w = xrDef - xl;
  904. if(w > 0) this._mkDiv(xl, y2, w, h);
  905. }
  906. if(iSects & 0x0200)
  907. {
  908. xr = Math.min(xrDef, aBndZ[y]);
  909. w = xr - x;
  910. if(w > 0) this._mkDiv(x, y2, w, h);
  911. }
  912. }
  913. else
  914. this._mkDiv(x, y2, xrDef - x, h);
  915. }
  916. else
  917. {
  918. if(iSects & 0x00ff)
  919. {
  920. if(iSects & 0x02)
  921. xl = Math.max(x, aBndZ[y]);
  922. else
  923. xl = x;
  924. if(iSects & 0x01)
  925. xr = Math.min(xrDef, aBndA[y]);
  926. else
  927. xr = xrDef;
  928. y2 = cy - y - h;
  929. w = xr - xl;
  930. if(w > 0) this._mkDiv(xl, y2, w, h);
  931. }
  932. if(iSects & 0xff00)
  933. {
  934. if(iSects & 0x0100)
  935. xl = Math.max(x, aBndA[y]);
  936. else
  937. xl = x;
  938. if(iSects & 0x0200)
  939. xr = Math.min(xrDef, aBndZ[y]);
  940. else
  941. xr = xrDef;
  942. y2 = cy + y + (iOdds >> 16);
  943. w = xr - xl;
  944. if(w > 0) this._mkDiv(xl, y2, w, h);
  945. }
  946. }
  947. };
  948. this.setStroke(1);
  949. this.setFont("verdana,geneva,helvetica,sans-serif", "12px", Font.PLAIN);
  950. this.color = "#000000";
  951. this.htm = "";
  952. this.wnd = wnd || window;
  953. if(!jg_ok) _chkDHTM();
  954. if(jg_ok)
  955. {
  956. if(cnv)
  957. {
  958. if(typeof(cnv) == "string")
  959. this.cont = document.all? (this.wnd.document.all[cnv] || null)
  960. : document.getElementById? (this.wnd.document.getElementById(cnv) || null)
  961. : null;
  962. else if(cnv == window.document)
  963. this.cont = document.getElementsByTagName("body")[0];
  964. // If cnv is a direct reference to a canvas DOM node
  965. // (option suggested by Andreas Luleich)
  966. else this.cont = cnv;
  967. // Create new canvas inside container DIV. Thus the drawing and clearing
  968. // methods won't interfere with the container's inner html.
  969. // Solution suggested by Vladimir.
  970. this.cnv = this.wnd.document.createElement("div");
  971. this.cnv.style.fontSize=0;
  972. this.cont.appendChild(this.cnv);
  973. this.paint = jg_dom? _pntCnvDom : _pntCnvIe;
  974. }
  975. else
  976. this.paint = _pntDoc;
  977. }
  978. else
  979. this.paint = _pntN;
  980. this.setPrintable(false);
  981. }
  982. function _mkLinVirt(aLin, x1, y1, x2, y2)
  983. {
  984. var dx = Math.abs(x2-x1), dy = Math.abs(y2-y1),
  985. x = x1, y = y1,
  986. xIncr = (x1 > x2)? -1 : 1,
  987. yIncr = (y1 > y2)? -1 : 1,
  988. p,
  989. i = 0;
  990. if(dx >= dy)
  991. {
  992. var pr = dy<<1,
  993. pru = pr - (dx<<1);
  994. p = pr-dx;
  995. while(dx > 0)
  996. {--dx;
  997. if(p > 0)    //  Increment y
  998. {
  999. aLin[i++] = x;
  1000. y += yIncr;
  1001. p += pru;
  1002. }
  1003. else p += pr;
  1004. x += xIncr;
  1005. }
  1006. }
  1007. else
  1008. {
  1009. var pr = dx<<1,
  1010. pru = pr - (dy<<1);
  1011. p = pr-dy;
  1012. while(dy > 0)
  1013. {--dy;
  1014. y += yIncr;
  1015. aLin[i++] = x;
  1016. if(p > 0)    //  Increment x
  1017. {
  1018. x += xIncr;
  1019. p += pru;
  1020. }
  1021. else p += pr;
  1022. }
  1023. }
  1024. for(var len = aLin.length, i = len-i; i;)
  1025. aLin[len-(i--)] = x;
  1026. };
  1027. function _CompInt(x, y)
  1028. {
  1029. return(x - y);
  1030. }