wz_jsgraphics.js
上传用户:wlfwy2004
上传日期:2016-12-12
资源大小:33978k
文件大小:22k
源码类别:

Jsp/Servlet

开发平台:

Java

  1. /*
  2.  * FCKeditor - The text editor for internet
  3.  * Copyright (C) 2003-2005 Frederico Caldeira Knabben
  4.  * 
  5.  * Licensed under the terms of the GNU Lesser General Public License:
  6.  *  http://www.opensource.org/licenses/lgpl-license.php
  7.  * 
  8.  * For further information visit:
  9.  *  http://www.fckeditor.net/
  10.  * 
  11.  * File Name: wz_jsgraphics.js
  12.  *  Javascript Graphics.
  13.  * 
  14.  * File Authors:
  15.  *  Grant French (grant@mcpuk.net)
  16.  */
  17. /***********************************************************************
  18. ** Title.........:  Javascript Graphics
  19. ** Version.......:  1.0
  20. ** Author........:  Xiang Wei ZHUO <wei@zhuo.org>
  21. ** Filename......:  wz_jsgraphics.js
  22. ** Last changed..:  31 Aug 2003  
  23. ** Notes.........:  Modified for Image Editor, added extra commands
  24. **/ 
  25. /* This notice must be untouched at all times.
  26. wz_jsgraphics.js    v. 2.03
  27. The latest version is available at
  28. http://www.walterzorn.com
  29. or http://www.devira.com
  30. or http://www.walterzorn.de
  31. Copyright (c) 2002-2003 Walter Zorn. All rights reserved.
  32. Created 3. 11. 2002 by Walter Zorn <walter@kreuzotter.de>
  33. Last modified: 11. 6. 2003
  34. High Performance JavaScript Graphics Library.
  35. Provides methods
  36. - to draw lines, rectangles, ellipses, polygons
  37.   with specifiable line thickness,
  38. - to fill rectangles and ellipses
  39. - to draw text.
  40. NOTE: Operations, functions and branching have rather been optimized
  41. to efficiency and speed than to shortness of source code.
  42. This program is free software;
  43. you can redistribute it and/or modify it under the terms of the
  44. GNU General Public License as published by the Free Software Foundation;
  45. either version 2 of the License, or (at your option) any later version.
  46. This program is distributed in the hope that it will be useful,
  47. but WITHOUT ANY WARRANTY;
  48. without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  49. See the GNU General Public License
  50. at http://www.gnu.org/copyleft/gpl.html for more details.
  51. */
  52. var jg_ihtm, jg_ie, jg_dom,
  53. jg_n4 = (document.layers && typeof document.classes != "undefined");
  54. function chkDHTM(x, i)
  55. {
  56.     x = document.body || null;
  57.     jg_ie = (x && typeof x.insertAdjacentHTML != "undefined");
  58.     jg_dom = (x && !jg_ie &&
  59.         typeof x.appendChild != "undefined" &&
  60.         typeof document.createRange != "undefined" &&
  61.         typeof (i = document.createRange()).setStartBefore != "undefined" &&
  62.         typeof i.createContextualFragment != "undefined");
  63.     jg_ihtm = (!jg_ie && !jg_dom && x && typeof x.innerHTML != "undefined");
  64. }
  65. function pntDoc()
  66. {
  67.     this.wnd.document.write(this.htm);
  68.     this.htm = '';
  69. }
  70. function pntCnvDom()
  71. {
  72.     var x = document.createRange();
  73.     x.setStartBefore(this.cnv);
  74.     x = x.createContextualFragment(this.htm);
  75.     this.cnv.appendChild(x);
  76.     this.htm = '';
  77. }
  78. function pntCnvIe()
  79. {
  80.     this.cnv.insertAdjacentHTML("BeforeEnd", this.htm);
  81.     this.htm = '';
  82. }
  83. function pntCnvIhtm()
  84. {
  85.     this.cnv.innerHTML += this.htm;
  86.     this.htm = '';
  87. }
  88. function pntCnv()
  89. {
  90.     this.htm = '';
  91. }
  92. function mkDiv(x, y, w, h)
  93. {
  94.     this.htm += '<div style="position:absolute;'+
  95.         'left:' + x + 'px;'+
  96.         'top:' + y + 'px;'+
  97.         'width:' + w + 'px;'+
  98.         'height:' + h + 'px;'+
  99.         'clip:rect(0,'+w+'px,'+h+'px,0);'+
  100.         'overflow:hidden;background-color:' + this.color + ';'+
  101.         '"></div>';
  102.     //alert(this.htm);
  103. }
  104. function mkDivPrint(x, y, w, h)
  105. {
  106.     this.htm += '<div style="position:absolute;'+
  107.         'border-left:' + w + 'px solid ' + this.color + ';'+
  108.         'left:' + x + 'px;'+
  109.         'top:' + y + 'px;'+
  110.         'width:' + w + 'px;'+
  111.         'height:' + h + 'px;'+
  112.         'clip:rect(0,'+w+'px,'+h+'px,0);'+
  113.         'overflow:hidden;background-color:' + this.color + ';'+
  114.         '"></div>';
  115. }
  116. function mkLyr(x, y, w, h)
  117. {
  118.     this.htm += '<layer '+
  119.         'left="' + x + '" '+
  120.         'top="' + y + '" '+
  121.         'width="' + w + '" '+
  122.         'height="' + h + '" '+
  123.         'bgcolor="' + this.color + '"></layer>n';
  124. }
  125. function mkLbl(txt, x, y)
  126. {
  127.     this.htm += '<div style="position:absolute;white-space:nowrap;'+
  128.         'left:' + x + 'px;'+
  129.         'top:' + y + 'px;'+
  130.         'font-family:' +  this.ftFam + ';'+
  131.         'font-size:' + this.ftSz + ';'+
  132.         'color:' + this.color + ';' + this.ftSty + '">'+
  133.         txt +
  134.         '</div>';
  135. }
  136. function mkLin(x1, y1, x2, y2)
  137. {
  138.     if (x1 > x2)
  139.     {
  140.         var _x2 = x2;
  141.         var _y2 = y2;
  142.         x2 = x1;
  143.         y2 = y1;
  144.         x1 = _x2;
  145.         y1 = _y2;
  146.     }
  147.     var dx = x2-x1, dy = Math.abs(y2-y1),
  148.     x = x1, y = y1,
  149.     yIncr = (y1 > y2)? -1 : 1;
  150.     if (dx >= dy)
  151.     {
  152.         var pr = dy<<1,
  153.         pru = pr - (dx<<1),
  154.         p = pr-dx,
  155.         ox = x;
  156.         while ((dx--) > 0)
  157.         {
  158.             ++x;
  159.             if (p > 0)
  160.             {
  161.                 this.mkDiv(ox, y, x-ox, 1);
  162.                 y += yIncr;
  163.                 p += pru;
  164.                 ox = x;
  165.             }
  166.             else p += pr;
  167.         }
  168.         this.mkDiv(ox, y, x2-ox+1, 1);
  169.     }
  170.     else
  171.     {
  172.         var pr = dx<<1,
  173.         pru = pr - (dy<<1),
  174.         p = pr-dy,
  175.         oy = y;
  176.         if (y2 <= y1)
  177.         {
  178.             while ((dy--) > 0)
  179.             {
  180.                 if (p > 0)
  181.                 {
  182.                     this.mkDiv(x++, y, 1, oy-y+1);
  183.                     y += yIncr;
  184.                     p += pru;
  185.                     oy = y;
  186.                 }
  187.                 else
  188.                 {
  189.                     y += yIncr;
  190.                     p += pr;
  191.                 }
  192.             }
  193.             this.mkDiv(x2, y2, 1, oy-y2+1);
  194.         }
  195.         else
  196.         {
  197.             while ((dy--) > 0)
  198.             {
  199.                 y += yIncr;
  200.                 if (p > 0)
  201.                 {
  202.                     this.mkDiv(x++, oy, 1, y-oy);
  203.                     p += pru;
  204.                     oy = y;
  205.                 }
  206.                 else p += pr;
  207.             }
  208.             this.mkDiv(x2, oy, 1, y2-oy+1);
  209.         }
  210.     }
  211. }
  212. function mkLin2D(x1, y1, x2, y2)
  213. {
  214.     if (x1 > x2)
  215.     {
  216.         var _x2 = x2;
  217.         var _y2 = y2;
  218.         x2 = x1;
  219.         y2 = y1;
  220.         x1 = _x2;
  221.         y1 = _y2;
  222.     }
  223.     var dx = x2-x1, dy = Math.abs(y2-y1),
  224.     x = x1, y = y1,
  225.     yIncr = (y1 > y2)? -1 : 1;
  226.     var s = this.stroke;
  227.     if (dx >= dy)
  228.     {
  229.         if (s-0x3 > 0)
  230.         {
  231.             var _s = (s*dx*Math.sqrt(1+dy*dy/(dx*dx))-dx-(s>>1)*dy) / dx;
  232.             _s = (!(s-0x4)? Math.ceil(_s) : Math.round(_s)) + 1;
  233.         }
  234.         else var _s = s;
  235.         var ad = Math.ceil(s/2);
  236.         var pr = dy<<1,
  237.         pru = pr - (dx<<1),
  238.         p = pr-dx,
  239.         ox = x;
  240.         while ((dx--) > 0)
  241.         {
  242.             ++x;
  243.             if (p > 0)
  244.             {
  245.                 this.mkDiv(ox, y, x-ox+ad, _s);
  246.                 y += yIncr;
  247.                 p += pru;
  248.                 ox = x;
  249.             }
  250.             else p += pr;
  251.         }
  252.         this.mkDiv(ox, y, x2-ox+ad+1, _s);
  253.     }
  254.     else
  255.     {
  256.         if (s-0x3 > 0)
  257.         {
  258.             var _s = (s*dy*Math.sqrt(1+dx*dx/(dy*dy))-(s>>1)*dx-dy) / dy;
  259.             _s = (!(s-0x4)? Math.ceil(_s) : Math.round(_s)) + 1;
  260.         }
  261.         else var _s = s;
  262.         var ad = Math.round(s/2);
  263.         var pr = dx<<1,
  264.         pru = pr - (dy<<1),
  265.         p = pr-dy,
  266.         oy = y;
  267.         if (y2 <= y1)
  268.         {
  269.             ++ad;
  270.             while ((dy--) > 0)
  271.             {
  272.                 if (p > 0)
  273.                 {
  274.                     this.mkDiv(x++, y, _s, oy-y+ad);
  275.                     y += yIncr;
  276.                     p += pru;
  277.                     oy = y;
  278.                 }
  279.                 else
  280.                 {
  281.                     y += yIncr;
  282.                     p += pr;
  283.                 }
  284.             }
  285.             this.mkDiv(x2, y2, _s, oy-y2+ad);
  286.         }
  287.         else
  288.         {
  289.             while ((dy--) > 0)
  290.             {
  291.                 y += yIncr;
  292.                 if (p > 0)
  293.                 {
  294.                     this.mkDiv(x++, oy, _s, y-oy+ad);
  295.                     p += pru;
  296.                     oy = y;
  297.                 }
  298.                 else p += pr;
  299.             }
  300.             this.mkDiv(x2, oy, _s, y2-oy+ad+1);
  301.         }
  302.     }
  303. }
  304. function mkLinDott(x1, y1, x2, y2)
  305. {
  306.     if (x1 > x2)
  307.     {
  308.         var _x2 = x2;
  309.         var _y2 = y2;
  310.         x2 = x1;
  311.         y2 = y1;
  312.         x1 = _x2;
  313.         y1 = _y2;
  314.     }
  315.     var dx = x2-x1, dy = Math.abs(y2-y1),
  316.     x = x1, y = y1,
  317.     yIncr = (y1 > y2)? -1 : 1,
  318.     drw = true;
  319.     if (dx >= dy)
  320.     {
  321.         var pr = dy<<1,
  322.         pru = pr - (dx<<1),
  323.         p = pr-dx;
  324.         while ((dx--) > 0)
  325.         {
  326.             if (drw) this.mkDiv(x, y, 1, 1);
  327.             drw = !drw;
  328.             if (p > 0)
  329.             {
  330.                 y += yIncr;
  331.                 p += pru;
  332.             }
  333.             else p += pr;
  334.             ++x;
  335.         }
  336.         if (drw) this.mkDiv(x, y, 1, 1);
  337.     }
  338.     else
  339.     {
  340.         var pr = dx<<1,
  341.         pru = pr - (dy<<1),
  342.         p = pr-dy;
  343.         while ((dy--) > 0)
  344.         {
  345.             if (drw) this.mkDiv(x, y, 1, 1);
  346.             drw = !drw;
  347.             y += yIncr;
  348.             if (p > 0)
  349.             {
  350.                 ++x;
  351.                 p += pru;
  352.             }
  353.             else p += pr;
  354.         }
  355.         if (drw) this.mkDiv(x, y, 1, 1);
  356.     }
  357. }
  358. function mkOv(left, top, width, height)
  359. {
  360.     var a = width>>1, b = height>>1,
  361.     wod = width&1, hod = (height&1)+1,
  362.     cx = left+a, cy = top+b,
  363.     x = 0, y = b,
  364.     ox = 0, oy = b,
  365.     aa = (a*a)<<1, bb = (b*b)<<1,
  366.     st = (aa>>1)*(1-(b<<1)) + bb,
  367.     tt = (bb>>1) - aa*((b<<1)-1),
  368.     w, h;
  369.     while (y > 0)
  370.     {
  371.         if (st < 0)
  372.         {
  373.             st += bb*((x<<1)+0x3);
  374.             tt += (bb<<1)*(++x);
  375.         }
  376.         else if (tt < 0)
  377.         {
  378.             st += bb*((x<<1)+0x3) - (aa<<1)*(y-1);
  379.             tt += (bb<<1)*(++x) - aa*(((y--)<<1)-0x3);
  380.             w = x-ox;
  381.             h = oy-y;
  382.             if (w&0x2 && h&0x2)
  383.             {
  384.                 this.mkOvQds(cx, cy, -x+0x2, ox+wod, -oy, oy-1+hod, 1, 1);
  385.                 this.mkOvQds(cx, cy, -x+1, x-1+wod, -y-1, y+hod, 1, 1);
  386.             }
  387.             else this.mkOvQds(cx, cy, -x+1, ox+wod, -oy, oy-h+hod, w, h);
  388.             ox = x;
  389.             oy = y;
  390.         }
  391.         else
  392.         {
  393.             tt -= aa*((y<<1)-0x3);
  394.             st -= (aa<<1)*(--y);
  395.         }
  396.     }
  397.     this.mkDiv(cx-a, cy-oy, a-ox+1, (oy<<1)+hod);
  398.     this.mkDiv(cx+ox+wod, cy-oy, a-ox+1, (oy<<1)+hod);
  399. }
  400. function mkOv2D(left, top, width, height)
  401. {
  402.     var s = this.stroke;
  403.     width += s-1;
  404.     height += s-1;
  405.     var a = width>>1, b = height>>1,
  406.     wod = width&1, hod = (height&1)+1,
  407.     cx = left+a, cy = top+b,
  408.     x = 0, y = b,
  409.     aa = (a*a)<<1, bb = (b*b)<<1,
  410.     st = (aa>>1)*(1-(b<<1)) + bb,
  411.     tt = (bb>>1) - aa*((b<<1)-1);
  412.     if (s-0x4 < 0 && (!(s-0x2) || width-0x33 > 0 && height-0x33 > 0))
  413.     {
  414.         var ox = 0, oy = b,
  415.         w, h,
  416.         pxl, pxr, pxt, pxb, pxw;
  417.         while (y > 0)
  418.         {
  419.             if (st < 0)
  420.             {
  421.                 st += bb*((x<<1)+0x3);
  422.                 tt += (bb<<1)*(++x);
  423.             }
  424.             else if (tt < 0)
  425.             {
  426.                 st += bb*((x<<1)+0x3) - (aa<<1)*(y-1);
  427.                 tt += (bb<<1)*(++x) - aa*(((y--)<<1)-0x3);
  428.                 w = x-ox;
  429.                 h = oy-y;
  430.                 if (w-1)
  431.                 {
  432.                     pxw = w+1+(s&1);
  433.                     h = s;
  434.                 }
  435.                 else if (h-1)
  436.                 {
  437.                     pxw = s;
  438.                     h += 1+(s&1);
  439.                 }
  440.                 else pxw = h = s;
  441.                 this.mkOvQds(cx, cy, -x+1, ox-pxw+w+wod, -oy, -h+oy+hod, pxw, h);
  442.                 ox = x;
  443.                 oy = y;
  444.             }
  445.             else
  446.             {
  447.                 tt -= aa*((y<<1)-0x3);
  448.                 st -= (aa<<1)*(--y);
  449.             }
  450.         }
  451.         this.mkDiv(cx-a, cy-oy, s, (oy<<1)+hod);
  452.         this.mkDiv(cx+a+wod-s+1, cy-oy, s, (oy<<1)+hod);
  453.     }
  454.     else
  455.     {
  456.         var _a = (width-((s-1)<<1))>>1,
  457.         _b = (height-((s-1)<<1))>>1,
  458.         _x = 0, _y = _b,
  459.         _aa = (_a*_a)<<1, _bb = (_b*_b)<<1,
  460.         _st = (_aa>>1)*(1-(_b<<1)) + _bb,
  461.         _tt = (_bb>>1) - _aa*((_b<<1)-1),
  462.         pxl = new Array(),
  463.         pxt = new Array(),
  464.         _pxb = new Array();
  465.         pxl[0] = 0;
  466.         pxt[0] = b;
  467.         _pxb[0] = _b-1;
  468.         while (y > 0)
  469.         {
  470.             if (st < 0)
  471.             {
  472.                 st += bb*((x<<1)+0x3);
  473.                 tt += (bb<<1)*(++x);
  474.                 pxl[pxl.length] = x;
  475.                 pxt[pxt.length] = y;
  476.             }
  477.             else if (tt < 0)
  478.             {
  479.                 st += bb*((x<<1)+0x3) - (aa<<1)*(y-1);
  480.                 tt += (bb<<1)*(++x) - aa*(((y--)<<1)-0x3);
  481.                 pxl[pxl.length] = x;
  482.                 pxt[pxt.length] = y;
  483.             }
  484.             else
  485.             {
  486.                 tt -= aa*((y<<1)-0x3);
  487.                 st -= (aa<<1)*(--y);
  488.             }
  489.             if (_y > 0)
  490.             {
  491.                 if (_st < 0)
  492.                 {
  493.                     _st += _bb*((_x<<1)+0x3);
  494.                     _tt += (_bb<<1)*(++_x);
  495.                     _pxb[_pxb.length] = _y-1;
  496.                 }
  497.                 else if (_tt < 0)
  498.                 {
  499.                     _st += _bb*((_x<<1)+0x3) - (_aa<<1)*(_y-1);
  500.                     _tt += (_bb<<1)*(++_x) - _aa*(((_y--)<<1)-0x3);
  501.                     _pxb[_pxb.length] = _y-1;
  502.                 }
  503.                 else
  504.                 {
  505.                     _tt -= _aa*((_y<<1)-0x3);
  506.                     _st -= (_aa<<1)*(--_y);
  507.                     _pxb[_pxb.length-1]--;
  508.                 }
  509.             }
  510.         }
  511.         var ox = 0, oy = b,
  512.         _oy = _pxb[0],
  513.         l = pxl.length,
  514.         w, h;
  515.         for (var i = 0; i < l; i++)
  516.         {
  517.             if (typeof _pxb[i] != "undefined")
  518.             {
  519.                 if (_pxb[i] < _oy || pxt[i] < oy)
  520.                 {
  521.                     x = pxl[i];
  522.                     this.mkOvQds(cx, cy, -x+1, ox+wod, -oy, _oy+hod, x-ox, oy-_oy);
  523.                     ox = x;
  524.                     oy = pxt[i];
  525.                     _oy = _pxb[i];
  526.                 }
  527.             }
  528.             else
  529.             {
  530.                 x = pxl[i];
  531.                 this.mkDiv(cx-x+1, cy-oy, 1, (oy<<1)+hod);
  532.                 this.mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);
  533.                 ox = x;
  534.                 oy = pxt[i];
  535.             }
  536.         }
  537.         this.mkDiv(cx-a, cy-oy, 1, (oy<<1)+hod);
  538.         this.mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);
  539.     }
  540. }
  541. function mkOvDott(left, top, width, height)
  542. {
  543.     var a = width>>1, b = height>>1,
  544.     wod = width&1, hod = height&1,
  545.     cx = left+a, cy = top+b,
  546.     x = 0, y = b,
  547.     aa2 = (a*a)<<1, aa4 = aa2<<1, bb = (b*b)<<1,
  548.     st = (aa2>>1)*(1-(b<<1)) + bb,
  549.     tt = (bb>>1) - aa2*((b<<1)-1),
  550.     drw = true;
  551.     while (y > 0)
  552.     {
  553.         if (st < 0)
  554.         {
  555.             st += bb*((x<<1)+0x3);
  556.             tt += (bb<<1)*(++x);
  557.         }
  558.         else if (tt < 0)
  559.         {
  560.             st += bb*((x<<1)+0x3) - aa4*(y-1);
  561.             tt += (bb<<1)*(++x) - aa2*(((y--)<<1)-0x3);
  562.         }
  563.         else
  564.         {
  565.             tt -= aa2*((y<<1)-0x3);
  566.             st -= aa4*(--y);
  567.         }
  568.         if (drw) this.mkOvQds(cx, cy, -x, x+wod, -y, y+hod, 1, 1);
  569.         drw = !drw;
  570.     }
  571. }
  572. function mkRect(x, y, w, h)
  573. {
  574.     var s = this.stroke;
  575.     this.mkDiv(x, y, w, s);
  576.     this.mkDiv(x+w, y, s, h);
  577.     this.mkDiv(x, y+h, w+s, s);
  578.     this.mkDiv(x, y+s, s, h-s);
  579. }
  580. function mkRectDott(x, y, w, h)
  581. {
  582.     this.drawLine(x, y, x+w, y);
  583.     this.drawLine(x+w, y, x+w, y+h);
  584.     this.drawLine(x, y+h, x+w, y+h);
  585.     this.drawLine(x, y, x, y+h);
  586. }
  587. function jsgFont()
  588. {
  589.     this.PLAIN = 'font-weight:normal;';
  590.     this.BOLD = 'font-weight:bold;';
  591.     this.ITALIC = 'font-style:italic;';
  592.     this.ITALIC_BOLD = this.ITALIC + this.BOLD;
  593.     this.BOLD_ITALIC = this.ITALIC_BOLD;
  594. }
  595. var Font = new jsgFont();
  596. function jsgStroke()
  597. {
  598.     this.DOTTED = -1;
  599. }
  600. var Stroke = new jsgStroke();
  601. function jsGraphics(id, wnd)
  602. {
  603.     this.setColor = new Function('arg', 'this.color = arg;');
  604.     this.getColor = new Function('return this.color');
  605.     this.setStroke = function(x)
  606.     {
  607.         this.stroke = x;
  608.         if (!(x+1))
  609.         {
  610.             this.drawLine = mkLinDott;
  611.             this.mkOv = mkOvDott;
  612.             this.drawRect = mkRectDott;
  613.         }
  614.         else if (x-1 > 0)
  615.         {
  616.             this.drawLine = mkLin2D;
  617.             this.mkOv = mkOv2D;
  618.             this.drawRect = mkRect;
  619.         }
  620.         else
  621.         {
  622.             this.drawLine = mkLin;
  623.             this.mkOv = mkOv;
  624.             this.drawRect = mkRect;
  625.         }
  626.     };
  627.     this.setPrintable = function(arg)
  628.     {
  629.         this.printable = arg;
  630.         this.mkDiv = jg_n4? mkLyr : arg? mkDivPrint : mkDiv;
  631.     };
  632.     this.setFont = function(fam, sz, sty)
  633.     {
  634.         this.ftFam = fam;
  635.         this.ftSz = sz;
  636.         this.ftSty = sty || Font.PLAIN;
  637.     };
  638.     this.drawPolyline = this.drawPolyLine = function(x, y, s)
  639.     {
  640.         var i = x.length-1; while (i >= 0)
  641.             this.drawLine(x[i], y[i], x[--i], y[i]);
  642.     };
  643.     this.fillRect = function(x, y, w, h)
  644.     {
  645.         this.mkDiv(x, y, w, h);
  646.     };
  647.     this.fillRectPattern = function(x, y, w, h, url)
  648.     {
  649.         this.htm += '<div style="position:absolute;'+
  650.             'left:' + x + 'px;'+
  651.             'top:' + y + 'px;'+
  652.             'width:' + w + 'px;'+
  653.             'height:' + h + 'px;'+
  654.             'clip:rect(0,'+w+'px,'+h+'px,0);'+
  655.             'overflow:hidden;'+
  656.             //'background-color:' + this.color + ';'+
  657.             "background-image: url('" + url + "');"+
  658.             "layer-background-image: url('" + url + "');"+
  659.             'z-index:100;"></div>';
  660.         //alert(this.htm);
  661.     }
  662.     this.drawHandle = function(x, y, w, h, cursor)
  663.     {
  664.         
  665.         this.htm += '<div style="position:absolute;'+
  666.         'left:' + x + 'px;'+
  667.         'top:' + y + 'px;'+
  668.         'width:' + w + 'px;'+
  669.         'height:' + h + 'px;'+
  670.         'clip:rect(0,'+w+'px,'+h+'px,0);'+
  671.         'padding: 2px;overflow:hidden;'+
  672.         "cursor: '" + cursor + "';"+
  673.         '" class="handleBox" id="' + cursor + '" ></div>';
  674.     }
  675.     this.drawHandleBox = function(x, y, w, h, cursor)
  676.     {
  677.         
  678.         this.htm += '<div style="position:absolute;'+
  679.         'left:' + x + 'px;'+
  680.         'top:' + y + 'px;'+
  681.         'width:' + w + 'px;'+
  682.         'height:' + h + 'px;'+
  683.         'clip:rect(0,'+(w+2)+'px,'+(h+2)+'px,0);'+
  684.         'overflow:hidden; border: solid 1px '+ this.color+';'+
  685.         "cursor: '" + cursor + "';"+
  686.         '" class="handleBox" id="' + cursor + '" ></div>';
  687.         
  688.     }
  689.     this.drawPolygon = function(x, y)
  690.     {
  691.         this.drawPolyline(x, y);
  692.         this.drawLine(x[x.length-1], y[x.length-1], x[0], y[0]);
  693.     };
  694.     this.drawEllipse = this.drawOval = function(x, y, w, h)
  695.     {
  696.         this.mkOv(x, y, w, h);
  697.     };
  698.     this.fillEllipse = this.fillOval = function(left, top, w, h)
  699.     {
  700.         var a = (w -= 1)>>1, b = (h -= 1)>>1,
  701.         wod = (w&1)+1, hod = (h&1)+1,
  702.         cx = left+a, cy = top+b,
  703.         x = 0, y = b,
  704.         ox = 0, oy = b,
  705.         aa2 = (a*a)<<1, aa4 = aa2<<1, bb = (b*b)<<1,
  706.         st = (aa2>>1)*(1-(b<<1)) + bb,
  707.         tt = (bb>>1) - aa2*((b<<1)-1),
  708.         pxl, dw, dh;
  709.         if (w+1) while (y > 0)
  710.         {
  711.             if (st < 0)
  712.             {
  713.                 st += bb*((x<<1)+0x3);
  714.                 tt += (bb<<1)*(++x);
  715.             }
  716.             else if (tt < 0)
  717.             {
  718.                 st += bb*((x<<1)+0x3) - aa4*(y-1);
  719.                 pxl = cx-x;
  720.                 dw = (x<<1)+wod;
  721.                 tt += (bb<<1)*(++x) - aa2*(((y--)<<1)-0x3);
  722.                 dh = oy-y;
  723.                 this.mkDiv(pxl, cy-oy, dw, dh);
  724.                 this.mkDiv(pxl, cy+oy-dh+hod, dw, dh);
  725.                 ox = x;
  726.                 oy = y;
  727.             }
  728.             else
  729.             {
  730.                 tt -= aa2*((y<<1)-0x3);
  731.                 st -= aa4*(--y);
  732.             }
  733.         }
  734.         this.mkDiv(cx-a, cy-oy, w+1, (oy<<1)+hod);
  735.     };
  736.     this.drawString = mkLbl;
  737.     this.clear = function()
  738.     {
  739.         this.htm = "";
  740.         if (this.cnv) this.cnv.innerHTML = this.defhtm;
  741.         
  742.     };
  743.     this.mkOvQds = function(cx, cy, xl, xr, yt, yb, w, h)
  744.     {
  745.         this.mkDiv(xr+cx, yt+cy, w, h);
  746.         this.mkDiv(xr+cx, yb+cy, w, h);
  747.         this.mkDiv(xl+cx, yb+cy, w, h);
  748.         this.mkDiv(xl+cx, yt+cy, w, h);
  749.     };
  750.     this.setStroke(1);
  751.     this.setPrintable(false);
  752.     this.setFont('verdana,geneva,helvetica,sans-serif', String.fromCharCode(0x31, 0x32, 0x70, 0x78), Font.PLAIN);
  753.     this.color = '#000000';
  754.     this.htm = '';
  755.     this.wnd = wnd || window;
  756.     if (!(jg_ie || jg_dom || jg_ihtm)) chkDHTM();
  757.     if (typeof id != 'string' || !id) this.paint = pntDoc;
  758.     else
  759.     {
  760.         this.cnv = document.all? (this.wnd.document.all[id] || null)
  761.             : document.getElementById? (this.wnd.document.getElementById(id) || null)
  762.             : null;
  763.         this.defhtm = (this.cnv && this.cnv.innerHTML)? this.cnv.innerHTML : '';
  764.         this.paint = jg_dom? pntCnvDom : jg_ie? pntCnvIe : jg_ihtm? pntCnvIhtm : pntCnv;
  765.     }
  766. }