Subversion Repositories wimsdev

Rev

Rev 20 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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