Subversion Repositories wimsdev

Rev

Rev 15118 | Rev 15126 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #include "canvasdraw.h"
  2.  
  3. void add_js_userdraw(char *draw_type,char *stroke_color,double stroke_opacity,int crosshair_size,int arrow_head,int use_offset, char *css_class,int use_snap,int canvas_type,int use_filled,char * fill_color,double fill_opacity,int line_width,char *font_family){
  4.  
  5. #define MAX_USERDRAW_PRIMITIVES 59
  6. static char userdraw_primitives[MAX_USERDRAW_PRIMITIVES][32] = {
  7. "point","points", /* 0,1 */
  8. "crosshair","crosshairs",/* 2,3 */
  9. "circle","circles",/* 4,5 */
  10. "segment","segments", /* 6,7 */
  11. "demiline","halfline","demilines","halflines", /* 8,9,10,11 */
  12. "line","lines", /* 12,13 */
  13. "hline","hlines", /* 14,15 */
  14. "vline","vlines", /* 16,17 */
  15. "arrow","arrows", /* 18,19 */
  16. "arrow2","arrows2", /* 20,21 */
  17. "curvedarrow","curvedarrows",/* 22,23 */
  18. "curvedarrow2","curvedarrows2", /* 24,25 */
  19. "freehandline","path","freehandlines","paths", /* 26,27,28,29 */
  20. "poly","polys",/*poly[3]...polys[9] */ /* 30,31 */
  21. "polygon","polygons", /* 32,33 */
  22. "polyline","polylines", /* 34,35 */
  23. "triangle","triangles", /* 36,37 */
  24. "rect","rects",/* 38,39 */
  25. "roundrect","roundrects", /* 40,41*/
  26. "arc","arcs", /* 42,43 */
  27. "text", /* 44 */
  28. "image","images", /* 45 46*/
  29. "input","inputs", /* 47,48*/
  30. "clickfill","gridfill","diamondfill","dotfill","hatchfill","textfill",/* 49,50,51,52,53,54 */
  31. "parallelogram","parallelograms",/* 55,56 */
  32. "function","functions" /* 57,58 is the same as command "userinput function"*/
  33. };
  34.  
  35. /*1+strlen() of words "point","points",... == 6,7,..*/
  36. //static int userdraw_primitives_length[MAX_USERDRAW_PRIMITIVES] = {6,7,10,11,7,8,8,9,9,9,10,10,5,6,6,7,6,7,6,7,7,8,12,13,13,14,13,5,14,6,5,6,8,9,9,10,9,10,5,6,10,11,4,5,5,6,7,6,7,19,12,8,10,9,14,15};
  37.  
  38. static int userdraw_primitives_length[MAX_USERDRAW_PRIMITIVES] = {6,7,10,11,7,8,8,9,9,9,10,10,5,6,6,7,6,7,6,7,7,8,12,13,13,14,13,5,14,6,5,6,8,9,9,10,9,10,5,6,10,11,4,5,5,6,7,6,7,10,9,12,8,10,9,14,15,9,10};
  39. int p;
  40. int found = 0;
  41. int draw_num = -1;
  42. int equal = -1;;
  43. int polynum = -1;
  44.  
  45.  
  46. if(strncmp(draw_type,"functions",9) == 0){
  47.  draw_num = 58; polynum = (int) (draw_type[9]-'0');found = 1;
  48. // fprintf(stdout,"found polys%d<br />",polynum);
  49. }
  50. else
  51. {
  52. if(strncmp(draw_type,"polys",5) == 0){
  53.  draw_num = 31; polynum = (int) (draw_type[5]-'0');found = 1;
  54. // fprintf(stdout,"found polys%d<br />",polynum);
  55. }
  56. else
  57. {
  58.  if( strncmp(draw_type,"poly",4)  == 0 && ( strstr(draw_type,"polygon") == NULL && strstr(draw_type,"polyline") == NULL ) ){
  59.   draw_num = 30; polynum = (int) (draw_type[4]-'0');found = 1;
  60. //  fprintf(stdout,"found poly%d<br />",polynum);
  61.  }
  62.  else
  63.  {
  64.   for( p = 0; p < MAX_USERDRAW_PRIMITIVES ; p++ ){
  65.    equal = strncmp(userdraw_primitives[p],draw_type,userdraw_primitives_length[p]);
  66. /* remake array:  static int userdraw_primitives_length[MAX_USERDRAW_PRIMITIVES]*/
  67. /* fprintf(stdout,"%d,",1+strlen(userdraw_primitives[p]));*/
  68.    if( equal == 0 ){
  69. /*    fprintf(stdout,"found %s p=%d<br />",userdraw_primitives[p],p);*/
  70.     draw_num= p;found=1; break;
  71.    }
  72.   }
  73.  }
  74. }
  75. }
  76. if( found == 0 ){canvas_error("unknown userdraw primitive found...typo?");}
  77.  
  78. /* begin user_draw() */
  79. fprintf(js_include_file,"function user_draw(evt){\
  80. if(evt.button == 2){remove_last();return;};\
  81. var mouse = getMouse(evt,canvas_userdraw);\
  82. var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
  83. var x = xy[0];var y = xy[1];\
  84. if(x>forbidden_zone[0] && y>forbidden_zone[1]){console.log('drawing in zoom area...');return;};\
  85. ");
  86. int temp_reply_format = 22;
  87. switch( draw_num ){
  88.  default: break;
  89.  case 0:temp_reply_format = 8;fprintf(js_include_file,"points(x,y,0,0);");break;
  90.  case 1:temp_reply_format = 8;fprintf(js_include_file,"points(x,y,0,1);");break;
  91.  case 2:temp_reply_format = 8;fprintf(js_include_file,"crosshairs(x,y,0,0);");break;
  92.  case 3:temp_reply_format = 8;fprintf(js_include_file,"crosshairs(x,y,0,1);");break;
  93.  case 4:temp_reply_format = 10;fprintf(js_include_file,"circles(x,y,0,0);");break;
  94.  case 5:temp_reply_format = 10;fprintf(js_include_file,"circles(x,y,0,1);");break;
  95.  case 6:temp_reply_format = 11;fprintf(js_include_file,"segments(x,y,0,0);");break;
  96.  case 7:temp_reply_format = 11;fprintf(js_include_file,"segments(x,y,0,1);");break;
  97.  case 8 ... 9:temp_reply_format = 11;fprintf(js_include_file,"demilines(x,y,0,0);");break;
  98.  case 10 ... 11:temp_reply_format = 11;fprintf(js_include_file,"demilines(x,y,0,1);");break;
  99.  case 12:temp_reply_format = 11;fprintf(js_include_file,"lines(x,y,0,0);");break;
  100.  case 13:temp_reply_format = 11;fprintf(js_include_file,"lines(x,y,0,1);");break;
  101.  case 14:temp_reply_format = 11;fprintf(js_include_file,"hlines(x,y,0,0);");break;
  102.  case 15:temp_reply_format = 11;fprintf(js_include_file,"hlines(x,y,0,1);");break;
  103.  case 16:temp_reply_format = 11;fprintf(js_include_file,"vlines(x,y,0,0);");break;
  104.  case 17:temp_reply_format = 11;fprintf(js_include_file,"vlines(x,y,0,1);");break;
  105.  case 18:temp_reply_format = 11;fprintf(js_include_file,"arrows(x,y,0,0);");break;
  106.  case 19:temp_reply_format = 11;fprintf(js_include_file,"arrows(x,y,0,1);");break;
  107.  case 20:temp_reply_format = 11;fprintf(js_include_file,"arrows2(x,y,0,0);");break;
  108.  case 21:temp_reply_format = 11;fprintf(js_include_file,"arrows2(x,y,0,1);");break;
  109.  case 22:temp_reply_format = 2;fprintf(js_include_file,"curvedarrows(x,y,0,0);");break;
  110.  case 23:temp_reply_format = 2;fprintf(js_include_file,"curvedarrows(x,y,0,1);");break;
  111.  case 24:temp_reply_format = 2;fprintf(js_include_file,"curvedarrows2(x,y,0,0);");break;
  112.  case 25:temp_reply_format = 2;fprintf(js_include_file,"curvedarrows2(x,y,0,1);");break;
  113.  case 26 ... 27:temp_reply_format = 6;fprintf(js_include_file,"paths(x,y,0,0);");break;
  114.  case 28 ... 29:temp_reply_format = 6;fprintf(js_include_file,"paths(x,y,0,0);");break;
  115.  case 30:temp_reply_format = 2;fprintf(js_include_file,"polys(x,y,0,0);");break;
  116.  case 31:temp_reply_format = 2;fprintf(js_include_file,"polys(x,y,0,1);");break;
  117.  case 32:temp_reply_format = 2;fprintf(js_include_file,"polygon(x,y,0,0);");break;
  118.  case 33:temp_reply_format = 2;fprintf(js_include_file,"polygon(x,y,0,1);");break;
  119.  case 34:temp_reply_format = 23;fprintf(js_include_file,"polylines(x,y,0,1);");break;
  120.  case 35:temp_reply_format = 23;fprintf(js_include_file,"polylines(x,y,0,1);");break;
  121.  case 36:temp_reply_format = 2;fprintf(js_include_file,"triangles(x,y,0,0);");break;
  122.  case 37:temp_reply_format = 2;fprintf(js_include_file,"triangles(x,y,0,1);");break;
  123.  case 38:temp_reply_format = 2;fprintf(js_include_file,"rects(x,y,0,0);");break;
  124.  case 39:temp_reply_format = 2;fprintf(js_include_file,"rects(x,y,0,1);");break;
  125.  case 40:temp_reply_format = 2;fprintf(js_include_file,"roundrects(x,y,0,0);");break;
  126.  case 41:temp_reply_format = 2;fprintf(js_include_file,"roundrects(x,y,0,1);");break;
  127.  case 42:temp_reply_format = 25;js_function[JS_FIND_ANGLE] = 1; fprintf(js_include_file,"arcs(x,y,0,0);");break;
  128.  case 43:temp_reply_format = 25;js_function[JS_FIND_ANGLE] = 1; fprintf(js_include_file,"arcs(x,y,0,1);");break;
  129.  case 44:temp_reply_format = 17;fprintf(js_include_file,"text(x,y,0,1);");break;
  130.  case 45:temp_reply_format = 17;fprintf(js_include_file,"images(x,y,0,0);");break;
  131.  case 46:temp_reply_format = 17;fprintf(js_include_file,"images(x,y,0,1);");break;
  132.  case 47:temp_reply_format = 27;fprintf(js_include_file,"inputs(x,y,0,0);");break;
  133.  case 48:temp_reply_format = 27;fprintf(js_include_file,"inputs(x,y,0,1);");break;
  134.  case 49 ... 54 :
  135.  /*
  136.  "clickfill 49","gridfill 50","diamondfill 51","dotfill 52","hatchfill 53","textfill 54", 49,50,51,52,53,54
  137. use_filled ...  0:no fill, 1:fill,2=grid?,3=hatch?,4=diamond?,5=dot?,6=image ?
  138.  */
  139.  temp_reply_format = 10;
  140.  fprintf(js_include_file,"clickfill(x,y,0,1);");
  141.  if( draw_num == 49 ){ use_filled = 1;}
  142.  else{
  143.  if( draw_num == 50 ){js_function[DRAW_GRIDFILL] = 1;use_filled = 2;}
  144.  else{
  145.  if( draw_num == 51 ){js_function[DRAW_DIAMONDFILL] = 1;use_filled = 4;}
  146.  else{
  147.  if( draw_num == 52 ){js_function[DRAW_DOTFILL] = 1;use_filled = 5;}
  148.  else{
  149.  if( draw_num == 53 ){js_function[DRAW_HATCHFILL] = 1;use_filled = 3;}
  150.  else{
  151.  if( draw_num == 54 ){js_function[DRAW_TEXTFILL] = 1;use_filled = 7;}}}}}}
  152.  break;
  153.  
  154.  case 55:temp_reply_format = 2;fprintf(js_include_file,"parallelograms(x,y,0,0);");break;
  155.  case 56:temp_reply_format = 2;fprintf(js_include_file,"parallelograms(x,y,0,1);");break;
  156.  case 57 ... 58:
  157.  fprintf(stdout,"functions num = %d;",(int) (draw_type[9]-'0')); /* functions4 == 9*/
  158.  if(reply_format == 0 || reply_format != -1){reply_format = 24;}
  159.  break;
  160.  
  161. }
  162. fprintf(js_include_file," return;};");
  163.  
  164. if( reply_format == 0 ){reply_format = temp_reply_format;}
  165.  
  166. /* begin user_drag()  */
  167. fprintf(js_include_file,"function user_drag(evt){\
  168. var mouse = getMouse(evt,canvas_userdraw);\
  169. if(isTouch){var xy = multisnap_check(mouse.x,mouse.y,use_snap);};\
  170. var x = mouse.x;var y = mouse.y;if(x>forbidden_zone[0] && y>forbidden_zone[1]){return;};");
  171. switch( draw_num ){
  172.  case 0:fprintf(js_include_file,"return;");break;
  173.  case 1:fprintf(js_include_file,"return;");break;
  174.  case 2:fprintf(js_include_file,"return;");break;
  175.  case 3:fprintf(js_include_file,"return;");break;
  176.  case 4:fprintf(js_include_file,"circles(x,y,1,0);return;");break;
  177.  case 5:fprintf(js_include_file,"circles(x,y,1,1);return;");break;
  178.  case 6:fprintf(js_include_file,"segments(x,y,1,0);");break;
  179.  case 7:fprintf(js_include_file,"segments(x,y,1,1);return;");break;
  180.  case 8 ... 9:fprintf(js_include_file,"demilines(x,y,1,0);return;");break;
  181.  case 10 ... 11:fprintf(js_include_file,"demilines(x,y,1,1);return;");break;
  182.  case 12:fprintf(js_include_file,"lines(x,y,1,0);return;");break;
  183.  case 13:fprintf(js_include_file,"lines(x,y,1,1);return;");break;
  184.  case 14:fprintf(js_include_file,"hlines(x,y,1,0);return;");break;
  185.  case 15:fprintf(js_include_file,"hlines(x,y,1,1);return;");break;
  186.  case 16:fprintf(js_include_file,"vlines(x,y,1,0);return;");break;
  187.  case 17:fprintf(js_include_file,"vlines(x,y,1,1);return;");break;
  188.  case 18:fprintf(js_include_file,"arrows(x,y,1,0);return;");break;
  189.  case 19:fprintf(js_include_file,"arrows(x,y,1,1);return;");break;
  190.  case 20:fprintf(js_include_file,"arrows2(x,y,1,0);return;");break;
  191.  case 21:fprintf(js_include_file,"arrows2(x,y,1,1);return;");break;
  192.  case 22:fprintf(js_include_file,"curvedarrows(x,y,1,0);return;");break;
  193.  case 23:fprintf(js_include_file,"curvedarrows(x,y,1,1);return;");break;
  194.  case 24:fprintf(js_include_file,"curvedarrows2(x,y,1,0);return;");break;
  195.  case 25:fprintf(js_include_file,"curvedarrows2(x,y,1,1);return;");break;
  196.  case 26 ... 27:fprintf(js_include_file,"paths(x,y,1,0);return;");break;
  197.  case 28 ... 29:fprintf(js_include_file,"paths(x,y,1,0);return;");break;
  198.  case 30:fprintf(js_include_file,"polys(x,y,1,0);return;");break;
  199.  case 31:fprintf(js_include_file,"polys(x,y,1,1);return;");break;
  200.  case 32:fprintf(js_include_file,"polygon(x,y,1,0);return;");break;
  201.  case 33:fprintf(js_include_file,"polygon(x,y,1,1);return;");break;
  202.  case 34:fprintf(js_include_file,"polylines(x,y,1,1);return;");break;
  203.  case 35:fprintf(js_include_file,"polylines(x,y,1,1);return;");break;
  204.  case 36:fprintf(js_include_file,"triangles(x,y,1,0);return;");break;
  205.  case 37:fprintf(js_include_file,"triangles(x,y,1,1);return;");break;
  206.  case 38:fprintf(js_include_file,"rects(x,y,1,0);return;");break;
  207.  case 39:fprintf(js_include_file,"rects(x,y,1,1);return;");break;
  208.  case 40:fprintf(js_include_file,"roundrects(x,y,1,0);return;");break;
  209.  case 41:fprintf(js_include_file,"roundrects(x,y,1,1);return;");break;
  210.  case 42:fprintf(js_include_file,"arcs(x,y,1,0);return;");break;
  211.  case 43:fprintf(js_include_file,"arcs(x,y,1,1);return;");break;
  212.  case 44:fprintf(js_include_file,"return;");break;
  213.  case 45:fprintf(js_include_file,"return;");break;
  214.  case 46:fprintf(js_include_file,"return;");break;
  215.  case 47:fprintf(js_include_file,"return;");break;
  216.  case 48:fprintf(js_include_file,"return;");break;
  217.  case 49:fprintf(js_include_file,"return;");break;
  218.  case 50:fprintf(js_include_file,"return;");break;
  219.  case 51:fprintf(js_include_file,"return;");break;
  220.  case 52:fprintf(js_include_file,"return;");break;
  221.  case 53:fprintf(js_include_file,"return;");break;
  222.  case 54:fprintf(js_include_file,"return;");break;
  223.  case 55:fprintf(js_include_file,"parallelograms(x,y,1,0);return;");break;
  224.  case 56:fprintf(js_include_file,"parallelograms(x,y,1,1);return;");break;
  225.  case 57 ... 58: break;
  226. }
  227.  
  228. fprintf(js_include_file,"};");
  229.  
  230. /* add all stuff needed to draw the selected primitives... */
  231. switch( draw_num ){
  232. /* point/points */
  233.  case -1 : break;
  234.  case 0 ... 1:
  235.  fprintf(js_include_file,"\
  236. context_userdraw.fillStyle = \"rgba(%s,%.2f)\";\
  237. function redraw_userdraw(){draw_points();}\
  238. function remove_last(){if( userdraw_x.length > 0 ){userdraw_x.pop();userdraw_y.pop();draw_points();};return;};\
  239. function points(x,y,event_which,num){\
  240. if(event_which == 1){ return; };\
  241. if( num == 0 ){\
  242.  userdraw_x[0] = x;\
  243.  userdraw_y[0] = y;\
  244. }else{\
  245.  userdraw_x.push(x);\
  246.  userdraw_y.push(y);\
  247. };\
  248. draw_points();\
  249. };\
  250. function draw_points(){\
  251. var len = userdraw_x.length;\
  252. var radius = 2*(context_userdraw.lineWidth);\
  253. context_userdraw.clearRect(0,0,xsize,ysize);\
  254. var r = 2*Math.PI;\
  255. for(var p = 0 ; p < len ; p++ ){\
  256.  context_userdraw.beginPath();\
  257.  context_userdraw.arc(userdraw_x[p],userdraw_y[p],radius,0,r,false);\
  258.  context_userdraw.closePath();context_userdraw.fill();\
  259. };\
  260. };",stroke_color,stroke_opacity);
  261.  break;
  262.   /* crosshair /crosshairs */
  263.  case 2 ... 3:
  264.  fprintf(js_include_file,"\
  265. function redraw_userdraw(){draw_crosshairs();};\
  266. function remove_last(){if( userdraw_x.length > 0 ){userdraw_x.pop();userdraw_y.pop();draw_crosshairs();};return;};\
  267. function crosshairs(x,y,event_which,num){\
  268. if(event_which == 1){ return; };\
  269. if( num == 0 ){\
  270.  userdraw_x[0] = x;\
  271.  userdraw_y[0] = y;\
  272. }else{\
  273.  userdraw_x.push(x);\
  274.  userdraw_y.push(y);\
  275. };\
  276. draw_crosshairs();\
  277. };\
  278. function draw_crosshairs(){\
  279. var crosshair_size = %d;\
  280. context_userdraw.clearRect(0,0,xsize,ysize);\
  281. var x1,x2,y1,y2;\
  282. var len = userdraw_x.length;\
  283. for(var p = 0 ; p < len ; p++ ){\
  284.  x1 = userdraw_x[p] - crosshair_size;\
  285.  x2 = userdraw_x[p] + crosshair_size;\
  286.  y1 = userdraw_y[p] - crosshair_size;\
  287.  y2 = userdraw_y[p] + crosshair_size;\
  288.  context_userdraw.beginPath();\
  289.  context_userdraw.moveTo(x1,y1);\
  290.  context_userdraw.lineTo(x2,y2);\
  291.  context_userdraw.closePath();\
  292.  context_userdraw.stroke();\
  293.  context_userdraw.beginPath();\
  294.  context_userdraw.moveTo(x2,y1);\
  295.  context_userdraw.lineTo(x1,y2);\
  296.  context_userdraw.closePath();\
  297.  context_userdraw.stroke();\
  298. };\
  299. };",crosshair_size);
  300.  break;
  301.  /* circle/circles */
  302.  case 4 ... 5 :
  303.   fprintf(js_include_file,"\
  304. function redraw_userdraw(){draw_circles();};\
  305. function remove_last(){if( userdraw_x.length > 0 ){userdraw_x.pop();userdraw_y.pop();userdraw_radius.pop();draw_circles();};return;};\
  306. function circles(x,y,event_which,num){\
  307. var last = userdraw_x.length - 1;\
  308. var xc = userdraw_x[last];\
  309. var yc = userdraw_y[last];\
  310. if(event_which == 0){\
  311.  if( xy_cnt == 0 ){\
  312.   if( num  == 0 ){\
  313.    userdraw_x[0]=x;userdraw_y[0]=y;userdraw_radius[0]=4;\
  314.   }\
  315.   else\
  316.   {\
  317.    userdraw_x.push(x);userdraw_y.push(y);userdraw_radius.push(4);\
  318.   };\
  319.  };\
  320.  xy_cnt++;\
  321. }\
  322. else\
  323. {\
  324.  if( xy_cnt == 1 ){\
  325.   userdraw_radius[last] = parseInt(Math.sqrt( (x - xc)*(x - xc) + (y - yc)*(y - yc) ));\
  326.  };\
  327. };\
  328. if( xy_cnt == 2 ){\
  329.  xy_cnt = 0;\
  330.  if( num == 0 ){\
  331.   userdraw_x = [];userdraw_y = [];\
  332.   userdraw_x[0] = xc;userdraw_y[0] = yc;\
  333.  };\
  334. };\
  335. draw_circles();\
  336. };\
  337. function draw_circles(){\
  338. context_userdraw.clearRect(0,0,xsize,ysize);\
  339. var len = userdraw_x.length;\
  340. var r = 2*Math.PI;\
  341. for(var p = 0 ; p < len ; p++ ){\
  342.  context_userdraw.beginPath();\
  343.  context_userdraw.arc(userdraw_x[p],userdraw_y[p],userdraw_radius[p],0,r,false);\
  344.  context_userdraw.closePath();\
  345.  if(use_filled!=0){context_userdraw.fill();};\
  346.  context_userdraw.stroke();\
  347. };\
  348. return;\
  349. };");
  350.  break;
  351.  
  352.   /* segment/segments */
  353.  case 6 ... 7 :
  354.  fprintf(js_include_file,"\
  355. function redraw_userdraw(){draw_segments();};\
  356. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<2;p++){userdraw_x.pop();userdraw_y.pop();};draw_segments();};return;};\
  357. function segments(x,y,event_which,num){\
  358. if(event_which == 0){\
  359.  if( num == 0 && xy_cnt == 0 ){userdraw_x = [];userdraw_y = [];};\
  360.  userdraw_x.push(x);userdraw_y.push(y);\
  361.  xy_cnt++;\
  362. }\
  363. else\
  364. {\
  365.  if( xy_cnt == 1 ){\
  366.   userdraw_x.push(x);userdraw_y.push(y);\
  367.   draw_segments();\
  368.    userdraw_x.pop();userdraw_y.pop();\
  369.  };\
  370. };\
  371. if( xy_cnt == 2 ){\
  372.  xy_cnt = 0;\
  373.  draw_segments();\
  374. };\
  375. };\
  376. function draw_segments(){\
  377. var len = userdraw_x.length;\
  378. if( len%%2 == 0 ){\
  379.  context_userdraw.clearRect(0,0,xsize,ysize);\
  380.  for(var p = 0 ; p < len ; p = p+2 ){\
  381.   context_userdraw.beginPath();\
  382.   context_userdraw.moveTo(userdraw_x[p],userdraw_y[p]);\
  383.   context_userdraw.lineTo(userdraw_x[p+1],userdraw_y[p+1]);\
  384.   context_userdraw.closePath();\
  385.   context_userdraw.stroke();\
  386.  };\
  387. };\
  388. return;\
  389. };");
  390.  
  391.  /* "demiline","demilines","halfline","halflines"  8,9,10,11 */
  392.  case 8 ... 11 :
  393.  fprintf(js_include_file,"\
  394. function redraw_userdraw(){draw_demilines();};\
  395. function find_inf_point(x1,y1,x2,y2){\
  396. if(x1<x2+2 && x1>x2-2){if(y1<y2){return [x1,y1,x1,ysize];}else{return [x1,0,x1,y1];};};\
  397. var rc = (y2 - y1)/(x2 - x1);var q = y1 - (x1)*rc;\
  398. if( x1 < x2 ){ return [x1,y1,xsize,rc*xsize+q];}else{return [x1,y1,0,q];};\
  399. };\
  400. function calc_lines(){\
  401. var len = userdraw_x.length;\
  402. var points = find_inf_point(userdraw_x[len-2],userdraw_y[len-2],userdraw_x[len-1],userdraw_y[len-1]);\
  403. userdraw_x[len-2] = points[0];\
  404. userdraw_y[len-2] = points[1];\
  405. userdraw_x[len-1] = points[2];\
  406. userdraw_y[len-1] = points[3];\
  407. };\
  408. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<2;p++){userdraw_x.pop();userdraw_y.pop();};draw_demilines();};return;};\
  409. function demilines(x,y,event_which,num){\
  410. if(event_which == 0){\
  411.  if( num == 0 && xy_cnt == 0 ){userdraw_x = [];userdraw_y = [];};\
  412.  userdraw_x.push(x);userdraw_y.push(y);\
  413.  xy_cnt++;\
  414. }\
  415. else\
  416. {\
  417.  if( xy_cnt == 1 ){\
  418.   userdraw_x.push(x);userdraw_y.push(y);\
  419.   draw_demilines();\
  420.   userdraw_x.pop();userdraw_y.pop();\
  421.  };\
  422. };\
  423. if( xy_cnt == 2 ){\
  424.  xy_cnt = 0;\
  425.  calc_lines();\
  426.  draw_demilines();\
  427. };\
  428. };\
  429. function draw_demilines(){\
  430. var len = userdraw_x.length;\
  431. if( len %%2 == 0 ){\
  432.  context_userdraw.clearRect(0,0,xsize,ysize);\
  433.  for(var p = 0 ; p < len ; p = p+2 ){\
  434.   context_userdraw.beginPath();\
  435.   context_userdraw.moveTo(userdraw_x[p],userdraw_y[p]);\
  436.   context_userdraw.lineTo(userdraw_x[p+1],userdraw_y[p+1]);\
  437.   context_userdraw.closePath();\
  438.   context_userdraw.stroke();\
  439.  };\
  440. };\
  441. return;\
  442. };");
  443.  break;
  444.   /* line/lines */
  445.  case 12 ... 13 :
  446.  fprintf(js_include_file,"\
  447. function redraw_userdraw(){calc_lines();draw_lines();};\
  448. function calc_lines(){\
  449. var marge = 2;var len = userdraw_x.length;\
  450. var tmp_x = new Array(len);\
  451. var tmp_y = new Array(len);\
  452. var pp;\
  453. for(var p = 0 ; p < len ;p = p+2){\
  454.  pp = p+1;\
  455.  if(userdraw_x[p] < userdraw_x[pp]+marge && userdraw_x[p] > userdraw_x[pp]-marge){\
  456.   tmp_x[p] = userdraw_x[p];tmp_x[pp] = userdraw_x[pp];\
  457.   tmp_y[p] = 0;tmp_y[pp] = ysize;\
  458.  }\
  459.  else\
  460.  {\
  461.   if(userdraw_y[p] < userdraw_y[pp]+marge && userdraw_y[p] > userdraw_y[pp]-marge){\
  462.    tmp_x[p] = 0;tmp_x[pp] = xsize;\
  463.    tmp_y[p] = userdraw_y[p];tmp_y[pp] = userdraw_y[pp];\
  464.   }\
  465.   else\
  466.   {\
  467.    tmp_x[p] = 0;tmp_x[pp] = xsize;\
  468.    tmp_y[p] = userdraw_y[p] - (userdraw_x[p])*(userdraw_y[pp] - userdraw_y[p])/(userdraw_x[pp] - userdraw_x[p]);\
  469.    tmp_y[pp] = userdraw_y[p] + (xsize - userdraw_x[p])*(userdraw_y[pp] - userdraw_y[p])/(userdraw_x[pp] - userdraw_x[p]);\
  470.   };\
  471.  };\
  472. };\
  473. return {x:tmp_x,y:tmp_y};\
  474. };\
  475. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<2;p++){userdraw_x.pop();userdraw_y.pop();};draw_lines();};return;};\
  476. function lines(x,y,event_which,num){\
  477. if(event_which == 0){\
  478.  if( num == 0 && xy_cnt == 0 ){userdraw_x = [];userdraw_y = [];};\
  479.  userdraw_x.push(x);userdraw_y.push(y);\
  480.  xy_cnt++;\
  481. }\
  482. else\
  483. {\
  484.  if( xy_cnt == 1 ){\
  485.   userdraw_x.push(x);userdraw_y.push(y);\
  486.   draw_lines();\
  487.   userdraw_x.pop();userdraw_y.pop();\
  488.  };\
  489. };\
  490. if( xy_cnt == 2 ){\
  491.  xy_cnt = 0;\
  492.  draw_lines();\
  493. };\
  494. };\
  495. function draw_lines(){\
  496. var len = userdraw_x.length;\
  497. if( len %%2 == 0 ){\
  498.  var xy = calc_lines();\
  499.  context_userdraw.clearRect(0,0,xsize,ysize);\
  500.  for(var p = 0 ; p < len ; p = p+2 ){\
  501.   context_userdraw.beginPath();\
  502.   context_userdraw.moveTo(xy.x[p],xy.y[p]);\
  503.   context_userdraw.lineTo(xy.x[p+1],xy.y[p+1]);\
  504.   context_userdraw.closePath();\
  505.   context_userdraw.stroke();\
  506.  };\
  507. };\
  508. return;\
  509. };");
  510.  break;
  511.  /* hline/hlines 14,15 */
  512.  case 14 ... 15:
  513. fprintf(js_include_file,"\
  514. function redraw_userdraw(){draw_hlines();};\
  515. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<2;p++){userdraw_x.pop();userdraw_y.pop();};draw_hlines();};return;};\
  516. function hlines(x,y,event_which,num){\
  517. if(event_which == 0){\
  518.  if( num == 0 ){userdraw_x = [];userdraw_y = [];};\
  519.  userdraw_x.push(0);userdraw_y.push(y);\
  520.  userdraw_x.push(xsize);userdraw_y.push(y);\
  521.  draw_hlines();\
  522. };\
  523. };\
  524. function draw_hlines(){\
  525. var len = userdraw_x.length;\
  526. if( len %%2 == 0 ){\
  527.  context_userdraw.clearRect(0,0,xsize,ysize);\
  528.  for(var p = 0 ; p < len ; p = p+2 ){\
  529.   context_userdraw.beginPath();\
  530.   context_userdraw.moveTo(userdraw_x[p],userdraw_y[p]);\
  531.   context_userdraw.lineTo(userdraw_x[p+1],userdraw_y[p+1]);\
  532.   context_userdraw.closePath();\
  533.   context_userdraw.stroke();\
  534.  };\
  535. };\
  536. return;\
  537. };");
  538.  
  539.  break;
  540.  /* vline,vlines  16,17 */
  541.  case 16 ... 17:
  542. fprintf(js_include_file,"\
  543. function redraw_userdraw(){draw_vlines();};\
  544. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<2;p++){userdraw_x.pop();userdraw_y.pop();};draw_vlines();};return;};\
  545. function vlines(x,y,event_which,num){\
  546. if(event_which == 0){\
  547.  if( num == 0 ){userdraw_x = [];userdraw_y = [];};\
  548.  userdraw_x.push(x);userdraw_y.push(0);\
  549.  userdraw_x.push(x);userdraw_y.push(ysize);\
  550.  draw_vlines();\
  551. };\
  552. };\
  553. function draw_vlines(){\
  554. var len = userdraw_x.length;\
  555. if( len %%2 == 0 ){\
  556.  context_userdraw.clearRect(0,0,xsize,ysize);\
  557.  for(var p = 0 ; p < len ; p = p+2 ){\
  558.   context_userdraw.beginPath();\
  559.   context_userdraw.moveTo(userdraw_x[p],userdraw_y[p]);\
  560.   context_userdraw.lineTo(userdraw_x[p+1],userdraw_y[p+1]);\
  561.   context_userdraw.closePath();\
  562.   context_userdraw.stroke();\
  563.  };\
  564. };\
  565. return;};");
  566.  
  567.  break;
  568.  /* arrow/arrows */
  569.  case 18 ... 19 :
  570.  fprintf(js_include_file,"\
  571. function redraw_userdraw(){draw_arrows();};\
  572. context_userdraw.fillStyle = \"rgba(%s,%.2f)\";\
  573. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<2;p++){userdraw_x.pop();userdraw_y.pop();};draw_arrows();};return;};\
  574. function arrows(x,y,event_which,num){\
  575. if(event_which == 0){\
  576.  if( num == 0 && xy_cnt == 0 ){userdraw_x = [];userdraw_y = [];};\
  577.  userdraw_x.push(x);userdraw_y.push(y);\
  578.  xy_cnt++;\
  579. }\
  580. else\
  581. {\
  582.  if( xy_cnt == 1 ){\
  583.   userdraw_x.push(x);userdraw_y.push(y);\
  584.   draw_arrows();\
  585.   userdraw_x.pop();userdraw_y.pop();\
  586.  };\
  587. };\
  588. if( xy_cnt == 2 ){\
  589.  xy_cnt = 0;\
  590.  draw_arrows();\
  591. };\
  592. };\
  593. function draw_arrows(){\
  594. var arrow_head = %d;\
  595. var len = userdraw_x.length;\
  596. var x1,y1,x2,y2,dx,dy,h;\
  597. if( len%%2 == 0 ){\
  598.  context_userdraw.clearRect(0,0,xsize,ysize);\
  599.  for(var p = 0 ; p < len ; p = p+2 ){\
  600.   context_userdraw.save();\
  601.   x1 = userdraw_x[p];y1 = userdraw_y[p];x2 = userdraw_x[p+1];y2 = userdraw_y[p+1];dx = x2 - x1;dy = y2 - y1;\
  602.   context_userdraw.beginPath();\
  603.   context_userdraw.moveTo(x1,y1);\
  604.   context_userdraw.lineTo(x2,y2);\
  605.   context_userdraw.closePath();\
  606.   context_userdraw.stroke();\
  607.   context_userdraw.translate(x2,y2);\
  608.   context_userdraw.rotate(Math.atan2(dy,dx));\
  609.   context_userdraw.beginPath();\
  610.   context_userdraw.moveTo(0,0);\
  611.   context_userdraw.lineTo(-1*arrow_head,-0.5*arrow_head);\
  612.   context_userdraw.lineTo(-1*arrow_head, 0.5*arrow_head);\
  613.   context_userdraw.closePath();\
  614.   context_userdraw.fill();\
  615.   context_userdraw.stroke();\
  616.   context_userdraw.restore();\
  617.  };\
  618. };\
  619. return;\
  620. };",stroke_color,stroke_opacity,arrow_head);
  621.  break;
  622.  /* arrow/arrows */
  623.  case 20 ... 21 :
  624.  fprintf(js_include_file,"\
  625. function redraw_userdraw(){draw_arrows2();};\
  626. context_userdraw.fillStyle = \"rgba(%s,%.2f)\";\
  627. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<2;p++){userdraw_x.pop();userdraw_y.pop();};draw_arrows();};return;};\
  628. function arrows2(x,y,event_which,num){\
  629. if(event_which == 0){\
  630.  if( num == 0 && xy_cnt == 0 ){userdraw_x = [];userdraw_y = [];};\
  631.  userdraw_x.push(x);userdraw_y.push(y);\
  632.  xy_cnt++;\
  633. }\
  634. else\
  635. {\
  636.  if( xy_cnt == 1 ){\
  637.   userdraw_x.push(x);userdraw_y.push(y);\
  638.   draw_arrows2();\
  639.   userdraw_x.pop();userdraw_y.pop();\
  640.  };\
  641. };\
  642. if( xy_cnt == 2 ){\
  643.  xy_cnt = 0;\
  644.  draw_arrows2();\
  645. };\
  646. };\
  647. function draw_arrows2(){\
  648. var arrow_head = %d;\
  649. var len = userdraw_x.length;\
  650. var x1,y1,x2,y2,dx,dy,h;\
  651. if( len%%2 == 0 ){\
  652.  context_userdraw.clearRect(0,0,xsize,ysize);\
  653.  for(var p = 0 ; p < len ; p = p+2 ){\
  654.   context_userdraw.save();\
  655.   x1 = userdraw_x[p];y1 = userdraw_y[p];x2 = userdraw_x[p+1];y2 = userdraw_y[p+1];dx = x2 - x1;dy = y2 - y1;\
  656.   context_userdraw.save();\
  657.   context_userdraw.beginPath();\
  658.   context_userdraw.moveTo(x1,y1);\
  659.   context_userdraw.lineTo(x2,y2);\
  660.   context_userdraw.closePath();\
  661.   context_userdraw.stroke();\
  662.   context_userdraw.translate(x2,y2);\
  663.   context_userdraw.rotate(Math.atan2(dy,dx));\
  664.   context_userdraw.beginPath();\
  665.   context_userdraw.moveTo(0,0);\
  666.   context_userdraw.lineTo(-1*arrow_head,-0.5*arrow_head);\
  667.   context_userdraw.lineTo(-1*arrow_head, 0.5*arrow_head);\
  668.   context_userdraw.closePath();\
  669.   context_userdraw.fill();\
  670.   context_userdraw.stroke();\
  671.   context_userdraw.restore();\
  672.   context_userdraw.translate(x1,y1);\
  673.   context_userdraw.rotate(Math.atan2(-dy,-dx));\
  674.   context_userdraw.beginPath();\
  675.   context_userdraw.moveTo(0,0);\
  676.   context_userdraw.lineTo(-1*arrow_head,-0.5*arrow_head);\
  677.   context_userdraw.lineTo(-1*arrow_head, 0.5*arrow_head);\
  678.   context_userdraw.closePath();\
  679.   context_userdraw.fill();\
  680.   context_userdraw.stroke();\
  681.   context_userdraw.restore();\
  682.  };\
  683. };\
  684. return;\
  685. };",stroke_color,stroke_opacity,arrow_head);
  686.  break;
  687.  /* curvedarrow/curvedarrows */
  688.  case 22 ... 23:
  689. fprintf(js_include_file,"\
  690. function redraw_userdraw(){draw_curvedarrows();};\
  691. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<3;p++){userdraw_x.pop();userdraw_y.pop();};draw_curvedarrows();};return;};\
  692. function curvedarrows(x,y,event_which,num){\
  693. if(event_which == 0){\
  694.  if(num == 0 && xy_cnt == 0){\
  695.   userdraw_x = [];userdraw_y = [];userdraw_x[0] = x;userdraw_y[0] = y;\
  696.  }\
  697.  else\
  698.  {\
  699.   userdraw_x.push(x);userdraw_y.push(y);\
  700.  };\
  701.  xy_cnt++;\
  702. }\
  703. else\
  704. {\
  705.  if( xy_cnt < 3 ){userdraw_x.push(x);userdraw_y.push(y);draw_curvedarrows();userdraw_x.pop();userdraw_y.pop();};\
  706.  if( xy_cnt == 3 ){userdraw_x.pop();userdraw_y.pop();userdraw_x.push(x);userdraw_y.push(y);xy_cnt = 0;draw_curvedarrows();};\
  707. };\
  708. };\
  709. var arrow_head = %d;\
  710. function draw_curvedarrows(){\
  711. var len = userdraw_x.length;var x1,y1,x2,y2,x3,y3;\
  712. context_userdraw.clearRect(0,0,xsize,ysize);\
  713. for(var p = 0 ; p < len ; p = p+3){\
  714.  x1 = userdraw_x[p];x2 = userdraw_x[p+1];x3 = userdraw_x[p+2];y1 = userdraw_y[p];y2 = userdraw_y[p+1];y3 = userdraw_y[p+2];\
  715.  var angle1 = Math.atan2(x3 - x2,y3 - y2) + Math.PI;\
  716.  context_userdraw.beginPath();\
  717.  context_userdraw.moveTo(x1,y1);\
  718.  context_userdraw.quadraticCurveTo(x3,y3,x2,y2);\
  719.  context_userdraw.moveTo(x2 - (arrow_head * Math.sin(angle1 - Math.PI / 6)),y2 - (arrow_head * Math.cos(angle1 - Math.PI / 6)));\
  720.  context_userdraw.lineTo(x2, y2);\
  721.  context_userdraw.lineTo(x2 - (arrow_head * Math.sin(angle1 + Math.PI / 6)),y2 - (arrow_head * Math.cos(angle1 + Math.PI / 6)));\
  722.  context_userdraw.stroke();\
  723.  context_userdraw.closePath();\
  724. };\
  725. return;};",arrow_head);
  726.  break;
  727.  /* curvedarrow2/curvedarrows2 */
  728.  case 24 ... 25:
  729. fprintf(js_include_file,"\
  730. function redraw_userdraw(){draw_curvedarrows2();};\
  731. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<3;p++){userdraw_x.pop();userdraw_y.pop();};draw_curvedarrows2();};return;};\
  732. function curvedarrows2(x,y,event_which,num){\
  733. if(event_which == 0){\
  734.  if(num == 0 && xy_cnt == 0){userdraw_x = [];userdraw_y = [];userdraw_x[0] = x;userdraw_y[0] = y;}else{userdraw_x.push(x);userdraw_y.push(y);};xy_cnt++;\
  735. }\
  736. else\
  737. {\
  738.  if( xy_cnt < 3 ){userdraw_x.push(x);userdraw_y.push(y);draw_curvedarrows2();userdraw_x.pop();userdraw_y.pop();};\
  739.  if( xy_cnt == 3 ){userdraw_x.pop();userdraw_y.pop();userdraw_x.push(x);userdraw_y.push(y);xy_cnt = 0;draw_curvedarrows2();};\
  740. };\
  741. };\
  742. var arrow_head = %d;\
  743. function draw_curvedarrows2(){\
  744. var len = userdraw_x.length;var x1,y1,x2,y2,x3,y3;\
  745. context_userdraw.clearRect(0,0,xsize,ysize);\
  746. for(var p = 0 ; p < len ; p = p+3){\
  747.  x1 = userdraw_x[p];x2 = userdraw_x[p+1];x3 = userdraw_x[p+2];y1 = userdraw_y[p];y2 = userdraw_y[p+1];y3 = userdraw_y[p+2];\
  748.  var angle1 = Math.atan2(x3 - x2,y3 - y2) + Math.PI;\
  749.  var angle2 = Math.atan2(x3 - x1,y3 - y1) + Math.PI;\
  750.  context_userdraw.beginPath();\
  751.  context_userdraw.moveTo(x1,y1);\
  752.  context_userdraw.moveTo(x1 - (arrow_head * Math.sin(angle2 - Math.PI / 6)),y1 - (arrow_head * Math.cos(angle2 - Math.PI / 6)));\
  753.  context_userdraw.lineTo(x1, y1);\
  754.  context_userdraw.lineTo(x1 - (arrow_head * Math.sin(angle2 + Math.PI / 6)),y1 - (arrow_head * Math.cos(angle2 + Math.PI / 6)));\
  755.  context_userdraw.moveTo(x1,y1);\
  756.  context_userdraw.quadraticCurveTo(x3,y3,x2,y2);\
  757.  context_userdraw.moveTo(x2 - (arrow_head * Math.sin(angle1 - Math.PI / 6)),y2 - (arrow_head * Math.cos(angle1 - Math.PI / 6)));\
  758.  context_userdraw.lineTo(x2, y2);\
  759.  context_userdraw.lineTo(x2 - (arrow_head * Math.sin(angle1 + Math.PI / 6)),y2 - (arrow_head * Math.cos(angle1 + Math.PI / 6)));\
  760.  context_userdraw.stroke();\
  761.  context_userdraw.closePath();\
  762. };\
  763. return;\
  764. };",arrow_head);
  765.  break;
  766.  
  767.  /* freehandline/freehandlines/path/paths 0,1  26,27,28,29  */
  768.  case 26 ... 29:
  769.  fprintf(js_include_file,"\
  770. var stop = 1;\
  771. function remove_last(){userdraw_x = [];userdraw_y = []; context_userdraw.clearRect(0,0,xsize,ysize);return;};\
  772. function paths(x,y,event_which,num){\
  773. if(event_which == 0 && stop == 0 ){stop = 1;return;};\
  774. if(event_which == 1 && stop == 1 ){return;}; \
  775. if(event_which == 0 && stop == 1 ){\
  776. stop = 0;userdraw_x = [];userdraw_y = [];return;};\
  777. userdraw_x.push(x);userdraw_y.push(y);\
  778. draw_paths();\
  779. };\
  780. function draw_paths(){\
  781. context_userdraw.clearRect(0,0,xsize,ysize);\
  782. var len = userdraw_x.length ;\
  783. context_userdraw.beginPath();\
  784. context_userdraw.moveTo(userdraw_x[0],userdraw_y[0]);\
  785. for(var p = 1 ; p < len ; p++ ){\
  786.  context_userdraw.lineTo(userdraw_x[p],userdraw_y[p]);\
  787. };\
  788. if(use_filled!=0){context_userdraw.fill();};\
  789. context_userdraw.stroke();\
  790. return;\
  791. };");
  792.  
  793.  break;
  794.  
  795.  /* poly/polys poly[3]...polys[9] 30,31 */
  796.  case 30 ... 31:
  797.  fprintf(js_include_file,"\
  798. var polynum = %d;\
  799. function redraw_userdraw(){draw_polys();};\
  800. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<polynum;p++){userdraw_x.pop();userdraw_y.pop();};draw_polys();};return;};\
  801. function polys(x,y,event_which,num){\
  802. if(event_which == 0){\
  803.  if(num == 0 && xy_cnt == 0){\
  804.   userdraw_x = [];userdraw_y = [];\
  805.   userdraw_x[0] = x;userdraw_y[0] = y;\
  806.  }\
  807.  else\
  808.  {\
  809.   userdraw_x.push(x);userdraw_y.push(y);\
  810.  };\
  811.  xy_cnt++;\
  812. }\
  813. else\
  814. {\
  815.  if( xy_cnt < polynum ){\
  816.   userdraw_x.push(x);userdraw_y.push(y);\
  817.   draw_polys();\
  818.   userdraw_x.pop();userdraw_y.pop();\
  819.  };\
  820. };\
  821. if( xy_cnt == polynum ){\
  822.  userdraw_x.pop();userdraw_y.pop();\
  823.  userdraw_x.push(x);userdraw_y.push(y);\
  824.  xy_cnt = 0;\
  825.  draw_polys();\
  826. };\
  827. };\
  828. function draw_polys(){\
  829. var len = userdraw_x.length;\
  830. context_userdraw.clearRect(0,0,xsize,ysize);\
  831. for(var p = 0 ; p < len ; p = p+polynum){\
  832.  context_userdraw.beginPath();\
  833.  context_userdraw.moveTo(userdraw_x[p],userdraw_y[p]);\
  834.  for( var m = p+1 ;m < p+polynum ; m++){\
  835.  if(typeof(userdraw_x[m]) !== 'undefined' ){context_userdraw.lineTo(userdraw_x[m],userdraw_y[m]);};};\
  836.  context_userdraw.lineTo(userdraw_x[p],userdraw_y[p]);\
  837.  context_userdraw.stroke();\
  838.  context_userdraw.closePath();\
  839.  if(use_filled!=0){context_userdraw.fill();};\
  840. };\
  841. return;\
  842. };",polynum);
  843.  break;
  844.  case 32 ... 33:
  845.  /* polygon/polygon  32,33 */
  846.  /* multiple polygons are now working as expected : no problems with duplicated/closing points*/
  847.  fprintf(js_include_file,"\
  848. var poly_closed = [];\
  849. var do_not_pop = 0;\
  850. function redraw_userdraw(){do_not_pop = 1;draw_polygon();};\
  851. function remove_last(){var len = poly_closed.length;if(len > 1 ){var last = poly_closed[len-1]-poly_closed[len-2];for(var p=0;p<last-1;p++){userdraw_x.pop();userdraw_y.pop();};poly_closed.pop();}else{poly_closed = [];userdraw_x = [];userdraw_y = [];};draw_polygon();return;};\
  852. function check_closed(x1,y1,X,Y){\
  853. var marge=10;\
  854. var len = X.length-1;\
  855. for(var p = 0 ; p < len ; p++){\
  856.  if(x1 < X[p] + marge && x1 > X[p] - marge ){\
  857.   if(y1 < Y[p] + marge && y1 > Y[p] - marge ){\
  858.    return 1;\
  859.   };\
  860.  };\
  861. };\
  862. return 0;\
  863. };\
  864. \
  865. function polygon(x,y,event_which,num){\
  866. do_not_pop = 0;\
  867. if(event_which == 0){\
  868.  if(num == 0 && xy_cnt == 0){\
  869.   userdraw_x = [];userdraw_y = [];\
  870.   userdraw_x[0] = x;userdraw_y[0] = y;\
  871.  }\
  872.  else\
  873.  {\
  874.   userdraw_x.push(x);userdraw_y.push(y);\
  875.  };\
  876.  xy_cnt++;\
  877.  if( xy_cnt > 2 ){\
  878.   if( check_closed(x,y,userdraw_x,userdraw_y) == 1){\
  879.    poly_closed.push(userdraw_x.length - 1);\
  880.    draw_polygon();\
  881.    xy_cnt = 0;\
  882.   };\
  883.  };\
  884. }\
  885. else\
  886. {\
  887.  if( xy_cnt > 0 ){\
  888.   userdraw_x.push(x);userdraw_y.push(y);\
  889.   draw_polygon();\
  890.  };\
  891. };\
  892. };\
  893. function draw_polygon(){\
  894. var len = userdraw_x.length;\
  895. context_userdraw.clearRect(0,0,xsize,ysize);\
  896. context_userdraw.beginPath();\
  897. var begin = 0;\
  898. context_userdraw.moveTo(userdraw_x[0],userdraw_y[0]);\
  899. for( var p = 0 ; p < len ; p++){\
  900.  if( poly_closed.indexOf(p) != -1 ){\
  901.   context_userdraw.lineTo(userdraw_x[begin],userdraw_y[begin]);\
  902.   begin = p;\
  903.   context_userdraw.closePath();\
  904.   if(use_filled!=0){context_userdraw.fill();};\
  905.   context_userdraw.stroke();\
  906.   context_userdraw.beginPath();\
  907.  }else{ context_userdraw.lineTo(userdraw_x[p],userdraw_y[p]);};\
  908. };\
  909. context_userdraw.lineTo(userdraw_x[begin],userdraw_y[begin]);\
  910. context_userdraw.closePath();\
  911. if(use_filled!=0){context_userdraw.fill();};\
  912. context_userdraw.stroke();\
  913. if(do_not_pop == 0){ userdraw_x.pop();userdraw_y.pop();};\
  914. return;\
  915. };");
  916.  break;
  917.  
  918.  /*
  919.  polyline/brokenline 34,35
  920.  there is just a single polyline/brokenline possible !
  921.  */
  922.  case 34 ... 35:
  923.  fprintf(js_include_file,"\
  924. function redraw_userdraw(){draw_polylines();};\
  925. function remove_last(){if( userdraw_x.length > 0 ){userdraw_x.pop();userdraw_y.pop();draw_polylines();};return;};\
  926. function polylines(x,y,event_which,num){\
  927. if(event_which == 0){\
  928.  if(num == 0  && xy_cnt == 0 ){ userdraw_x = [];userdraw_y = [];};\
  929.  userdraw_x.push(x);userdraw_y.push(y);\
  930.  xy_cnt++;\
  931. }\
  932. else\
  933. {\
  934.  if( xy_cnt == 1 ){\
  935.   userdraw_x.push(x);userdraw_y.push(y);\
  936.   userdraw_x.pop();userdraw_y.pop();\
  937.  };\
  938. };\
  939. if( xy_cnt == 2 ){xy_cnt = 0;};\
  940. draw_polylines();\
  941. };\
  942. var full_circle = 2*Math.PI;\
  943. function draw_polylines(){\
  944. var len = userdraw_x.length;\
  945. context_userdraw.clearRect(0,0,xsize,ysize);\
  946. context_userdraw.beginPath();\
  947. context_userdraw.moveTo(userdraw_x[0],userdraw_y[0]);\
  948. for( var p = 0 ; p < len ; p++){\
  949.  context_userdraw.lineTo(userdraw_x[p],userdraw_y[p]);\
  950.  context_userdraw.arc(userdraw_x[p],userdraw_y[p],2,0,full_circle,false);\
  951. };\
  952.  context_userdraw.stroke();\
  953. context_userdraw.closePath();\
  954. if(use_filled != 0 ){if(use_filled!=0){context_userdraw.fill();};};\
  955. return;\
  956. };");
  957.  break;
  958.  
  959.  /* triangle/triangles 36,37 */
  960.  case 36 ... 37:
  961.   fprintf(js_include_file,"\
  962. function redraw_userdraw(){draw_triangles();};\
  963. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<3;p++){userdraw_x.pop();userdraw_y.pop();};draw_triangles();};return;};\
  964. function triangles(x,y,event_which,num){\
  965. var last = userdraw_x.length - 1;\
  966. if(event_which == 0){\
  967.  if(num == 0 && xy_cnt == 0){\
  968.   userdraw_x = [];userdraw_y = [];userdraw_x[0] = x;userdraw_y[0] = y;\
  969.  }\
  970.  else\
  971.  {\
  972.   userdraw_x.push(x);userdraw_y.push(y);\
  973.  };\
  974.  xy_cnt++;\
  975. }\
  976. else\
  977. {\
  978.  if( xy_cnt < 3 ){\
  979.   userdraw_x.push(x);userdraw_y.push(y);\
  980.   draw_triangles();\
  981.   userdraw_x.pop();userdraw_y.pop();\
  982.   return;\
  983.  };\
  984. };\
  985. if( xy_cnt == 3 ){\
  986.  userdraw_x.pop();userdraw_y.pop();\
  987.  userdraw_x.push(x);userdraw_y.push(y);\
  988.  xy_cnt = 0;\
  989.  draw_triangles();\
  990. };\
  991. };\
  992. function draw_triangles(){\
  993. var len = userdraw_x.length - 1;\
  994. context_userdraw.clearRect(0,0,xsize,ysize);\
  995. for(var p = 0 ; p < len ; p = p+3){\
  996.  context_userdraw.beginPath();\
  997.  context_userdraw.moveTo(userdraw_x[p],userdraw_y[p]);\
  998.  for( var m = p+1 ;m < p+3 ; m++){\
  999.   context_userdraw.lineTo(userdraw_x[m],userdraw_y[m]);\
  1000.  };\
  1001.  context_userdraw.lineTo(userdraw_x[p],userdraw_y[p]);\
  1002.  context_userdraw.closePath();\
  1003.  if(use_filled!=0){context_userdraw.fill();};\
  1004.  context_userdraw.stroke();\
  1005. };\
  1006. return;\
  1007. };");
  1008.  break;
  1009.  
  1010.  /* rect/rects 38,39 : NOT USING A PATH !!*/
  1011.  case 38 ... 39 :
  1012.  fprintf(js_include_file,"\
  1013. function redraw_userdraw(){draw_rects();};\
  1014. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<2;p++){userdraw_x.pop();userdraw_y.pop();};draw_rects();};return;};\
  1015. function rects(x,y,event_which,num){\
  1016. if(event_which == 0){\
  1017.  if( num == 0 && xy_cnt == 0 ){userdraw_x = [];userdraw_y = [];};\
  1018.  userdraw_x.push(x);userdraw_y.push(y);\
  1019.  xy_cnt++;\
  1020. }\
  1021. else\
  1022. {\
  1023.  if( xy_cnt == 1 ){\
  1024.   userdraw_x.push(x);userdraw_y.push(y);\
  1025.   draw_rects();\
  1026.   userdraw_x.pop();userdraw_y.pop();\
  1027.  };\
  1028. };\
  1029. if( xy_cnt == 2 ){\
  1030.  xy_cnt = 0;\
  1031.  draw_rects();\
  1032. };\
  1033. };\
  1034. function draw_rects(){\
  1035. var len = userdraw_x.length;\
  1036. if( len %%2 == 0 ){\
  1037.  context_userdraw.clearRect(0,0,xsize,ysize);\
  1038.  for(var p = 0 ; p < len ; p = p+2 ){\
  1039.   context_userdraw.beginPath();\
  1040.   context_userdraw.rect(userdraw_x[p],userdraw_y[p],userdraw_x[p+1]-userdraw_x[p],userdraw_y[p+1]-userdraw_y[p]);\
  1041.   context_userdraw.closePath();\
  1042.   if(use_filled!=0){context_userdraw.fill();};\
  1043.   context_userdraw.stroke();\
  1044.  };\
  1045. };\
  1046. return;\
  1047. };");
  1048.  break;  
  1049.  /* roundrect/roundrects 40,41  : NOT USING A PATH !!*/
  1050.  case 40 ... 41:
  1051.  fprintf(js_include_file,"\
  1052. function redraw_userdraw(){draw_roundrects();};\
  1053. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<2;p++){userdraw_x.pop();userdraw_y.pop();};draw_roundrects();};return;};\
  1054. function roundrects(x,y,event_which,num){\
  1055. if(event_which == 0){\
  1056.  if( num == 0 && xy_cnt == 0 ){userdraw_x = [];userdraw_y = [];};\
  1057.  userdraw_x.push(x);userdraw_y.push(y);\
  1058.  xy_cnt++;\
  1059. }\
  1060. else\
  1061. {\
  1062.  if( xy_cnt == 1 ){\
  1063.   userdraw_x.push(x);userdraw_y.push(y);\
  1064.   draw_roundrects();\
  1065.   userdraw_x.pop();userdraw_y.pop();\
  1066.  };\
  1067. };\
  1068. if( xy_cnt == 2 ){\
  1069.  xy_cnt = 0;\
  1070.  draw_roundrects();\
  1071. };\
  1072. };\
  1073. function draw_roundrects(){\
  1074. var len = userdraw_x.length;\
  1075. if( len %%2 == 0 ){\
  1076.  context_userdraw.clearRect(0,0,xsize,ysize);\
  1077.  var x,y,w,h,r;\
  1078.  for(var p = 0; p < len; p = p+2){\
  1079.   x = userdraw_x[p];y = userdraw_y[p];w = userdraw_x[p+1] - x;h = userdraw_y[p+1] - y;r = parseInt(0.1*w);\
  1080.   context_userdraw.beginPath();\
  1081.   context_userdraw.moveTo(x + r, y);\
  1082.   context_userdraw.lineTo(x + w - r, y);\
  1083.   context_userdraw.quadraticCurveTo(x + w, y, x + w, y + r);\
  1084.   context_userdraw.lineTo(x + w, y + h - r);\
  1085.   context_userdraw.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\
  1086.   context_userdraw.lineTo(x + r, y + h);\
  1087.   context_userdraw.quadraticCurveTo(x, y + h, x, y + h - r);\
  1088.   context_userdraw.lineTo(x, y + r);\
  1089.   context_userdraw.quadraticCurveTo(x, y, x + r, y);\
  1090.   context_userdraw.closePath();\
  1091.   if(use_filled!=0){context_userdraw.fill();};\
  1092.   context_userdraw.stroke();\
  1093.  };\
  1094. };\
  1095. return;\
  1096. };");
  1097.  break;
  1098.  /* arc/arcs  42,43 */
  1099.  case 42 ... 43:
  1100.  fprintf(js_include_file,"\
  1101. function redraw_userdraw(){draw_arcs();};\
  1102. var temp_point_x = new Array(3);\
  1103. var temp_point_y = new Array(3);\
  1104. context_userdraw.fillStyle = context_userdraw.strokeStyle;\
  1105. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<3;p++){userdraw_x.pop();userdraw_y.pop();userdraw_radius.pop();temp_point_x = [];temp_point_y = [];};draw_arcs();};return;};\
  1106. function arcs(x,y,event_which,num){\
  1107. var last = userdraw_x.length - 1;\
  1108. var xc = userdraw_x[last];\
  1109. var yc = userdraw_y[last];\
  1110. if(event_which == 0){\
  1111.  if(num == 0 && xy_cnt == 3 ){xy_cnt = 0;userdraw_x = [];userdraw_y = [];};\
  1112.  userdraw_x.push(x);userdraw_y.push(y);\
  1113.  temp_point_x.push(x);\
  1114.  temp_point_y.push(y);\
  1115.  draw_points();\
  1116.  xy_cnt++;\
  1117. };\
  1118. if( xy_cnt%%3 == 0 ){ draw_arcs();temp_point_x = [];temp_point_y = [];};\
  1119. return;\
  1120. };\
  1121. function draw_points(){\
  1122. var len = temp_point_x.length;\
  1123. var radius = 4*(context_userdraw.lineWidth);\
  1124. var r = 2*Math.PI;\
  1125. for(var p = 0 ; p < len ; p++ ){\
  1126.  context_userdraw.beginPath();\
  1127.  context_userdraw.arc(temp_point_x[p],temp_point_y[p],radius,0,r,false);\
  1128.  context_userdraw.closePath();\
  1129.  context_userdraw.fill();\
  1130. };\
  1131. return;\
  1132. };\
  1133. function draw_arcs(){\
  1134. var xc,x1,x2,yc,y1,y2,radius,end,start,direction,p1,p2;\
  1135. var len = userdraw_x.length;\
  1136. context_userdraw.clearRect(0,0,xsize,ysize);\
  1137. var idx = 0;\
  1138. for(var p=0; p< len;p = p+3){\
  1139.  p1=p+1;p2=p+2;\
  1140.  xc = userdraw_x[p1];x1 = userdraw_x[p];x2 = userdraw_x[p2];yc = userdraw_y[p1];y1 = userdraw_y[p];y2 = userdraw_y[p2];\
  1141.  radius = distance(x1,y1,xc,yc);\
  1142.  start = Math.atan2(y1-yc, x1-xc);\
  1143.  end = Math.atan2(y2-yc, x2-xc);\
  1144.  direction = ( start > end);\
  1145.  userdraw_radius[idx] = Math.abs( end - start );idx++;\
  1146.  context_userdraw.beginPath();\
  1147.  context_userdraw.moveTo(xc,yc);\
  1148.  context_userdraw.arc(xc, yc,radius,start,end,direction);\
  1149.  context_userdraw.closePath();\
  1150.  context_userdraw.stroke();\
  1151.  if(use_filled!=0){context_userdraw.fill();};\
  1152. };\
  1153. return;\
  1154. };");
  1155.  break;  
  1156.  /* text : 44 always uses user input field !! */
  1157.  case 44:
  1158.  fprintf(js_include_file,"\
  1159. function redraw_userdraw(){draw_text();};\
  1160. var userdraw_text = new Array();\
  1161. var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
  1162. var inner_html = tooltip_div.innerHTML;\
  1163. tooltip_div.innerHTML = inner_html + \"<input class='%s' type='text' size='4' value='' id='userdraw_text_abc' />\";\
  1164. context_userdraw.fillStyle = \"rgba(%s,%f)\";\
  1165. var userdraw_textheight = 0.3 * (context_userdraw.measureText('M').width);\
  1166. function remove_last(){if(userdraw_x.length > 0 ){userdraw_x.pop();userdraw_y.pop();userdraw_text.pop();draw_text();return;};};\
  1167. function text(x,y,event_which,num){\
  1168. if(event_which == 1){ return; };\
  1169. if( num == 0 ){\
  1170.  userdraw_x[0] = x;\
  1171.  userdraw_y[0] = y;\
  1172. }else{\
  1173.  userdraw_x.push(x);\
  1174.  userdraw_y.push(y);\
  1175. };\
  1176. var txt = document.getElementById('userdraw_text_abc').value;\
  1177. if( ! txt ){userdraw_x.pop();userdraw_y.pop();userdraw_text.pop();return;};\
  1178. txt = conv_to_unicode(txt);userdraw_text.push(txt.replace(/\\\\/g,' '));\
  1179. draw_text();\
  1180. };\
  1181. function conv_to_unicode(str){return str.replace(/\\u[\\dA-F]{4}/gi,function(match){return String.fromCharCode(parseInt(match.replace(/\\u/g,''), 16));});};\
  1182. function draw_text(){\
  1183. var len = userdraw_x.length;\
  1184. var half = 0;\
  1185. context_userdraw.clearRect(0,0,xsize,ysize);\
  1186. for(var p = 0 ; p < len ; p++ ){\
  1187.   half = 0.5*( context_userdraw.measureText(userdraw_text[p]).width );\
  1188.   context_userdraw.fillText(userdraw_text[p],userdraw_x[p] - half,userdraw_y[p] + userdraw_textheight);\
  1189. };\
  1190. };",canvas_root_id,css_class,stroke_color,stroke_opacity);
  1191.  break;
  1192.  /* images 45,46  replyformat is same as 'userdraw text,color' e.g. 17 === x,y,image_id  */
  1193.  case 45 ... 46:
  1194.  fprintf(js_include_file,"\
  1195. function redraw_userdraw(){draw_images(0);};\
  1196. var userdraw_text = new Array();\
  1197. var current_id = null;var external_div_cnt=0;\
  1198. function remove_last(){draw_images(1);return;};\
  1199. function image_adjust(image,x,y){\
  1200. var centered = %d;\
  1201. var w = parseInt(image.width);var h = parseInt(image.height);\
  1202. switch(centered){\
  1203.  case 0: return [x,y];break;\
  1204.  case 1: return [x,parseInt(y-0.5*h)];break;\
  1205.  case 2: return [parseInt(x+0.5*h),y];break;\
  1206.  case 3: return [parseInt(x+0.5*h),parseInt(y-0.5*h)];break;\
  1207.  case 4: return [parseInt(x-0.5*w),parseInt(y-0.5*h)];break;\
  1208.  default: return [x,y];break;\
  1209. };\
  1210. };\
  1211. place_image_on_canvas = function(id){\
  1212. var thing = document.getElementById(id);\
  1213. var tag = thing.tagName;\
  1214. if(tag == 'SVG'){draw_mathml_svg(thing,id);return;};\
  1215. if(tag == 'DIV' || tag == 'SPAN' || tag == 'P' || tag == 'TD' || tag == 'TH' ){draw_mathml_div(thing,id);return;};\
  1216. var src = thing.src;\
  1217. var image = new Image();\
  1218. image.src = src;\
  1219. image.id = 'placed_'+id;\
  1220. image.width = thing.width;\
  1221. image.height = thing.height;\
  1222. image.onload = function(){ current_id = id; };\
  1223. return;\
  1224. };\
  1225. function draw_mathml_div(thing,id){\
  1226. var fix_div = document.createElement('DIV');\
  1227. var new_id='placed_'+external_div_cnt+'_'+id;\
  1228. fix_div.setAttribute('id',new_id);\
  1229. var w = parseInt(thing.clientWidth);\
  1230. var h = parseInt(thing.clientHeight);\
  1231. fix_div.innerHTML = thing.innerHTML;\
  1232. fix_div.setAttribute('style','display:none;position;absolute;width:'+w+'px;height:'+h+'px');\
  1233. fix_div.width = w;fix_div.height = h;\
  1234. canvas_div.appendChild(fix_div);\
  1235. current_id = new_id;\
  1236. external_div_cnt++;\
  1237. return;\
  1238. };\
  1239. function draw_mathml_svg(thing,id){\
  1240. var fix_div = document.createElement('DIV');\
  1241. fix_div.setAttribute('style','display:none;position;relative');\
  1242. canvas_div.appendChild(fix_div);\
  1243. var image = new Image();\
  1244. var svg_string = new XMLSerializer().serializeToString(thing);\
  1245. var dom = self.URL || self.webkitURL || self;\
  1246. var svg = new Blob([svg_string], {type: \"image/svg+xml;charset=utf-8\"});\
  1247. var url = dom.createObjectURL(svg);\
  1248. image.src= url;\
  1249. image.id = 'placed_'+id;\
  1250. image.onload = function(){\
  1251.  current_id = image.id;\
  1252.  fix_div.innerHTML='<img src='+image.src+' id='+image.id+' alt=\"this should not happen today...!\"/>';\
  1253. };\
  1254. return;\
  1255. };\
  1256. function images(x,y,event_which,num){\
  1257. if(event_which == 1){ return;};\
  1258. if( current_id ){\
  1259.  if(num == 0 ){ \
  1260.   userdraw_x[0] = x;\
  1261.   userdraw_y[0] = y;\
  1262.   userdraw_text[0] = current_id;\
  1263.   external_div_cnt = 0;\
  1264.  }else{\
  1265.   userdraw_x.push(x);\
  1266.   userdraw_y.push(y);\
  1267.   userdraw_text.push(current_id);\
  1268.  };\
  1269.  current_id = null;\
  1270.  draw_images(0);\
  1271. };\
  1272. };\
  1273. function draw_images(remove){\
  1274. var last = userdraw_x.length - 1;\
  1275. if(last < 0 ){return;};\
  1276. var x = userdraw_x[last];\
  1277. var y = userdraw_y[last];\
  1278. var id =  userdraw_text[last];\
  1279. var img = document.getElementById(id);\
  1280. var tag = img.tagName;\
  1281. var xy = image_adjust(img,x,y);\
  1282. if( tag == 'DIV' || tag == 'SPAN' || tag == 'P' || tag == 'TD' || tag == 'TH'){\
  1283.  if( remove == 1 ){\
  1284.   img.setAttribute('style','display:none');\
  1285.   userdraw_x.pop();userdraw_y.pop();userdraw_text.pop();external_div_cnt--;\
  1286.  }\
  1287.  else\
  1288.  {\
  1289.   img.setAttribute('style','display:inline-block;position:absolute;top:'+xy[1]+'px;left:'+xy[0]+'px;');\
  1290.  };\
  1291.  return;\
  1292. }else{\
  1293.  context_userdraw.clearRect(0,0,xsize,ysize);\
  1294.  if(remove == 1){\
  1295.   userdraw_x.pop();userdraw_y.pop();userdraw_text.pop();\
  1296.  };\
  1297.  var len = userdraw_x.length;\
  1298.  for(var p = 0 ; p < len; p++){\
  1299.   if( userdraw_text[p] ){\
  1300.    img = document.getElementById(userdraw_text[p]);\
  1301.    tag = img.tagName;\
  1302.    xy = image_adjust(img,userdraw_x[p],userdraw_y[p]);\
  1303.    if( tag == 'IMG' || tag == 'SVG' ){\
  1304.     context_userdraw.drawImage(img,xy[0],xy[1],img.width,img.height);\
  1305.    };\
  1306.   };\
  1307.  };\
  1308. };\
  1309. };",use_offset);
  1310.  break;
  1311.  /* input/inputs" 46,47
  1312.  if(use_offset != 0 ){ center_input('canvas_input'+input_cnt,x,y,style);};\
  1313.   inp.addEventListener(\"touchstart\", function(e){this.focus();},false);\
  1314.   if( wims_status == \"done\" ){ inp.setAttribute(\"readonly\",\"readonly\");};
  1315.  */
  1316.  case 47 ... 48:
  1317.  /*
  1318.  input_cnt keeps track of all inputfields INCLUDING static inputfields
  1319.  xy_cnt keeps track of the dynamically added userdraw inputfields
  1320.  */
  1321.  fprintf(js_include_file,"\
  1322. var current_id = null;\
  1323. var current_obj = null;\
  1324. var inputs_width = 16;\
  1325. var inputs_height = 8;\
  1326. function redraw_userdraw(){console.log('userdraw inputs not zooming...');};\
  1327. if(typeof(input_cnt) !== 'undefined'){var input_cnt = 0;};\
  1328. function remove_last(){console.log('input_cnt ='+input_cnt);\
  1329. var input = document.getElementById('canvas_input'+input_cnt);try{ canvas_div.removeChild(input);userdraw_x.pop();userdraw_y.pop();xy_cnt--;input_cnt--;}catch(e){console.log('removal failed...'+e);};};\
  1330. function check_overlap(x,y,obj){\
  1331. var inputs;var xi,yi;\
  1332. for(var p = 0 ; p < xy_cnt ; p++ ){\
  1333.  xi = userdraw_x[p];yi = userdraw_y[p];\
  1334.  if( x > xi - 5 && x < xi + inputs_width &&  y > yi-5 && y < yi + inputs_height){\
  1335.   try{canvas_div.removeChild(obj);\
  1336.    current_obj = null;userdraw_x.pop();userdraw_y.pop();xy_cnt--;input_cnt--;\
  1337.   }catch(e){console.log('failed removing overlap: '+e);};\
  1338.   return;\
  1339.  };\
  1340. };\
  1341. return;\
  1342. };\
  1343. function inputs(x,y,event_which,num){\
  1344. if( document.getElementById('canvas_input0')){\
  1345.  var inputs = document.getElementById('canvas_input0');\
  1346.  inputs_width = 5+parseInt(inputs.clientWidth);\
  1347.  inputs_height = 5+ parseInt(inputs.clientHeight);\
  1348. };\
  1349. if(event_which == 0){\
  1350.  if(num == 0 && xy_cnt == 1 ){try{ canvas_div.removeChild(document.getElementById('canvas_input0'));\
  1351.  userdraw_x = [];userdraw_y = [];xy_cnt=0;}catch(e){console.log('removal first input failed...'+e);};};\
  1352.  userdraw_x.push(x);userdraw_y.push(y);\
  1353.  current_id = 'canvas_input'+input_cnt;\
  1354.  current_obj = document.getElementById(current_id);\
  1355.  draw_inputs(x,y);\
  1356.  if(input_cnt > 0){check_overlap(x,y,current_obj);};\
  1357.  input_cnt++;\
  1358.  xy_cnt++;\
  1359.  if(isTouch){current_obj.addEventListener(\"touchstart\", function(e){this.focus();},false);}else{\
  1360.  current_obj.autofocus = true;};\
  1361. };\
  1362. return;\
  1363. };\
  1364. function draw_inputs(x,y){\
  1365. var input_size = parseInt(context_userdraw.lineWidth);\
  1366. current_obj = document.createElement(\"input\");\
  1367. current_obj.setAttribute(\"id\",current_id);\
  1368. current_obj.setAttribute(\"size\",input_size);\
  1369. var xx = x - 0.5*inputs_width;\
  1370. var yy = y - 0.5*inputs_height;\
  1371. current_obj.setAttribute(\"style\",\"position:absolute;left:\"+xx+\"px;top:\"+yy+\"px;\");\
  1372. canvas_div.appendChild(current_obj);\
  1373. return;\
  1374. };");
  1375.  break;
  1376. // current_obj.setAttribute(\"class\",\"%s\");
  1377.  
  1378.  // input.setAttribute(\"style\",\"position:absolute;left:\"+userdraw_x[p]+\"px;top:\"+userdraw_y[p]+\"px;%s\");
  1379.  /* gridfill/diamondfill/dotfill/hatchfill/textfill  48,49,50,51,52
  1380.   0:no fill, 1:fill,2=grid?,3=hatch?,4=diamond?,5=dot?,6=image?
  1381.  if( draw_num == 50 ){js_function[DRAW_GRIDFILL] = 1;use_filled = 2;}
  1382.  else{
  1383.  if( draw_num == 51 ){js_function[DRAW_DIAMONDFILL] = 1;use_filled = 4;}
  1384.  else{
  1385.  if( draw_num == 52 ){js_function[DRAW_DOTFILL] = 1;use_filled = 5;}
  1386.  else{
  1387.  if( draw_num == 53 ){js_function[DRAW_HATCHFILL] = 1;use_filled = 3;}
  1388.  else{
  1389.  if( draw_num == 54 ){js_function[DRAW_TEXTFILL] = 1;use_filled = 7;}
  1390.  else{ use_filled = 1;}}}}}
  1391.  
  1392.  
  1393.  
  1394.  */
  1395.  case 49 ... 54:
  1396. /* handling rare case of clickfill using a pattern in stead of a single color...*/
  1397.  add_js_filltoborder(canvas_type);
  1398.  fprintf(stdout,"USE_FILLED = %d<br />",use_filled);
  1399.  switch(use_filled){
  1400.  case 1:
  1401.   p = 1 + snprintf(NULL,0,"var use_pattern_ctx = false;");
  1402.   check_string_length(p);
  1403.   tmp_buffer = my_newmem(p);
  1404.   snprintf(tmp_buffer,p,  "var use_pattern_ctx = false;");
  1405.   break;
  1406.  case 2:
  1407.   p = 1 + snprintf(NULL,0,"draw_gridfill(%d,0,0,%d,%d,%d,'%s',%d,xsize,ysize,1);var use_pattern_ctx = true;var pattern_ctx = grid_fill_pattern;",CLICKFILL_CANVAS,5*line_width,5*line_width,line_width,fill_color,(int) (fill_opacity/0.0039215));
  1408.   check_string_length(p);
  1409.   tmp_buffer = my_newmem(p);
  1410.   snprintf(tmp_buffer,p,  "draw_gridfill(%d,0,0,%d,%d,%d,'%s',%d,xsize,ysize,1);var use_pattern_ctx = true;var pattern_ctx = grid_fill_pattern;",CLICKFILL_CANVAS,5*line_width,5*line_width,line_width,fill_color,(int) (fill_opacity/0.0039215));
  1411.   break;
  1412.  case 3:
  1413.   p = 1 + snprintf(NULL,0,"draw_hatchfill(%d,0,0,%d,%d,%d,'%s',%d,xsize,ysize,1);var use_pattern_ctx = true;var pattern_ctx = hatch_fill_pattern;",CLICKFILL_CANVAS,5*line_width,5*line_width,line_width,fill_color,(int) (fill_opacity/0.0039215));
  1414.   check_string_length(p);
  1415.   tmp_buffer = my_newmem(p);
  1416.   snprintf(tmp_buffer,p,"draw_hatchfill(%d,0,0,%d,%d,%d,'%s',%d,xsize,ysize,1);var use_pattern_ctx = true;var pattern_ctx = hatch_fill_pattern;",CLICKFILL_CANVAS,5*line_width,5*line_width,line_width,fill_color,(int) (fill_opacity/0.0039215));
  1417.   break;
  1418.  case 4:
  1419.   p = 1 + snprintf(NULL,0,"draw_diamondfill(%d,0,0,%d,%d,%d,'%s',%d,xsize,ysize,1);var use_pattern_ctx = true;var pattern_ctx = diamond_fill_pattern;",CLICKFILL_CANVAS,5*line_width,5*line_width,line_width,fill_color,(int) (fill_opacity/0.0039215));
  1420.   check_string_length(p);
  1421.   tmp_buffer = my_newmem(p);
  1422.   snprintf(tmp_buffer,p,"draw_diamondfill(%d,0,0,%d,%d,%d,'%s',%d,xsize,ysize,1);var use_pattern_ctx = true;var pattern_ctx = diamond_fill_pattern;",CLICKFILL_CANVAS,5*line_width,5*line_width,line_width,fill_color,(int) (fill_opacity/0.0039215));
  1423.   break;
  1424.  case 5:
  1425.   p = 1 + snprintf(NULL,0,"draw_dotfill(%d,0,0,%d,%d,%d,'%s',%d,xsize,ysize,1);var use_pattern_ctx = true;var pattern_ctx = dot_fill_pattern;",CLICKFILL_CANVAS,5*line_width,5*line_width,line_width,fill_color,(int) (fill_opacity/0.0039215));
  1426.   check_string_length(p);
  1427.   tmp_buffer = my_newmem(p);
  1428.   snprintf(tmp_buffer,p,"draw_dotfill(%d,0,0,%d,%d,%d,'%s',%d,xsize,ysize,1);var use_pattern_ctx = true;var pattern_ctx = dot_fill_pattern;",CLICKFILL_CANVAS,5*line_width,5*line_width,line_width,fill_color,(int) (fill_opacity/0.0039215));
  1429.   break;
  1430.  case 6:
  1431.    p = 1 + snprintf(NULL,0,"draw_imagefill(%d,0,0,%d,%d,%d,'%s',%d,xsize,ysize,1);var use_pattern_ctx = true;var pattern_ctx = image_fill_pattern;",CLICKFILL_CANVAS,5*line_width,5*line_width,line_width,fill_color,(int) (fill_opacity/0.0039215));
  1432.   check_string_length(p);
  1433.   tmp_buffer = my_newmem(p);
  1434.   snprintf(tmp_buffer,p,"draw_imagefill(%d,0,0,%d,%d,%d,'%s',%d,xsize,ysize,1);var use_pattern_ctx = true;var pattern_ctx = image_fill_pattern;",CLICKFILL_CANVAS,5*line_width,5*line_width,line_width,fill_color,(int) (fill_opacity/0.0039215));
  1435.   break;
  1436.   case 7:
  1437. /*var draw_textfill = function(canvas_type,x0,y0,color,fontfamily,xsize,ysize,txt,use_userdraw)*/
  1438.   p = 1 + snprintf(NULL,0,"draw_textfill(%d,0,0,'%s','%s',xsize,ysize,userdraw_text_string,1);var use_pattern_ctx = true;var pattern_ctx = text_fill_pattern;",CLICKFILL_CANVAS,stroke_color,font_family);
  1439.   check_string_length(p);
  1440.   tmp_buffer = my_newmem(p);
  1441.   snprintf(tmp_buffer,p,"draw_textfill(%d,0,0,'%s','%s',xsize,ysize,userdraw_text_string,1);var use_pattern_ctx = true;var pattern_ctx = text_fill_pattern;",CLICKFILL_CANVAS,stroke_color,font_family);
  1442.   break;
  1443.  }
  1444.   add_to_buffer(tmp_buffer);
  1445.  
  1446. fprintf(js_include_file,"function redraw_userdraw(){console.log('userdraw fill not zooming...');return;};\
  1447. function remove_last(){var last = fill_canvas_no;\
  1448. console.log('last = '+last);\
  1449. if(last > %d){\
  1450. var last_canvas = document.getElementById('wims_canvas%d'+last);\
  1451. if( last_canvas == null ){fill_canvas_no--;return;};\
  1452. var last_ctx = last_canvas.getContext('2d');\
  1453. last_ctx.clearRect(0,0,xsize,ysize);\
  1454. canvas_div.removeChild(last_canvas);\
  1455. userdraw_x.pop();userdraw_y.pop();\
  1456. fill_canvas_no--;\
  1457. };return;};\
  1458. if( typeof(fill_canvas_no) === 'undefined' ){ var fill_canvas_no = %d; };\
  1459. function clickfill(x,y,event_which,num){\
  1460. var color = [%s,255];\
  1461. if( typeof(multifillcolors) === 'object'){\
  1462.  var numx = userdraw_x.length;\
  1463.  var numc = multifillcolors.length-1;var num = numx%%numc;\
  1464.  if( ! multifillcolors[num] ){alert('first select a colour...');return;};\
  1465.  var tc = (multifillcolors[num]).split(',');\
  1466.  color = [ tc[0],tc[1],tc[2],255 ];\
  1467.  if( typeof( palettecolors ) === 'object'){\
  1468.   var idx = palettecolors.indexOf( multifillcolors[num]);\
  1469.   userdraw_radius.push(idx);\
  1470.  }else{ userdraw_radius.push(num);};\
  1471. }\
  1472. else\
  1473. {\
  1474.  userdraw_radius.push(0);\
  1475. };\
  1476. document.body.style.cursor = 'wait';\
  1477. if( use_pattern_ctx ){\
  1478.  setTimeout(function(){ filltoborder( px2x(x),px2y(y),color,color,fill_canvas_no,true,pattern_ctx);},500);\
  1479. }\
  1480. else\
  1481. {\
  1482.  setTimeout(function(){ filltoborder(px2x(x),px2y(y),color,color,fill_canvas_no,false,null);},500);\
  1483. };\
  1484. userdraw_x.push(x);\
  1485. userdraw_y.push(y);\
  1486. fill_canvas_no++;\
  1487. document.body.style.cursor = 'default';\
  1488. return;\
  1489. };",CLICKFILL_CANVAS,canvas_root_id,CLICKFILL_CANVAS,stroke_color);
  1490. /*(int) (stroke_opacity/0.0039215),(int) (stroke_opacity/0.0039215) */
  1491.  break;
  1492.  /* parallelogram/parallelograms */
  1493.  case 55 ... 56:
  1494.  fprintf(js_include_file,"\
  1495. function redraw_userdraw(){draw_parallelograms();};\
  1496. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<4;p++){userdraw_x.pop();userdraw_y.pop();};draw_parallelograms();};return;};\
  1497. function parallelograms(x,y,event_which,num){\
  1498. var l2 = userdraw_x.length;\
  1499. var l1 = l2 - 1;var l0 = l2 - 2;\
  1500. var xxyy;\
  1501. if(event_which == 0){\
  1502.  if(xy_cnt == 0){\
  1503.   if(num == 0){userdraw_x = [];userdraw_y = [];};\
  1504.   userdraw_x.push(x);userdraw_y.push(y);\
  1505.  }\
  1506.  else\
  1507.  {\
  1508.   userdraw_x.push(x);userdraw_y.push(y);\
  1509.   if(xy_cnt == 2){\
  1510.    var xy = multisnap_check(userdraw_x[l2] - userdraw_x[l1] + userdraw_x[l0],userdraw_y[l2] - userdraw_y[l1] + userdraw_y[l0],use_snap);\
  1511.    userdraw_x.push(xy[0]);\
  1512.    userdraw_y.push(xy[1]);\
  1513.   };\
  1514.  };\
  1515.  xy_cnt++;\
  1516. }\
  1517. else\
  1518. {\
  1519.  if(xy_cnt == 1){\
  1520.   var xxyy = multisnap_check(userdraw_x[l1],userdraw_y[l1],use_snap);\
  1521.   userdraw_x.push(xxyy[0]);\
  1522.   userdraw_y.push(xxyy[1]);\
  1523.   userdraw_x.push(x);\
  1524.   userdraw_y.push(y);\
  1525.   draw_parallelograms();\
  1526.   userdraw_x.pop();userdraw_y.pop();\
  1527.   userdraw_x.pop();userdraw_y.pop();\
  1528.  }\
  1529.  else\
  1530.  {\
  1531.   if(xy_cnt == 2){\
  1532.    xxyy = multisnap_check(userdraw_x[l2]-userdraw_x[l1] + userdraw_x[l0],userdraw_y[l2]-userdraw_y[l1] + userdraw_y[l0],use_snap);\
  1533.    userdraw_x.push(x);userdraw_y.push(y);\
  1534.    userdraw_x.push(xxyy[0]);\
  1535.    userdraw_y.push(xxyy[1]);\
  1536.    draw_parallelograms();\
  1537.    userdraw_x.pop();userdraw_y.pop();\
  1538.    userdraw_x.pop();userdraw_y.pop();\
  1539.   };\
  1540.  };\
  1541. };\
  1542. if( xy_cnt == 3 ){\
  1543.  userdraw_x.pop();userdraw_y.pop();\
  1544.  xxyy = multisnap_check(userdraw_x[l2]-userdraw_x[l1] + userdraw_x[l0],userdraw_y[l2]-userdraw_y[l1] + userdraw_y[l0],use_snap);\
  1545.  userdraw_x.push(xxyy[0]);userdraw_y.push(xxyy[1]);\
  1546.  userdraw_x.push(x);userdraw_y.push(y);\
  1547.  userdraw_x.pop();userdraw_y.pop();\
  1548.  xy_cnt = 0;\
  1549.  draw_parallelograms();\
  1550. };\
  1551. };\
  1552. function draw_parallelograms(){\
  1553. var len = userdraw_x.length-1;\
  1554. context_userdraw.clearRect(0,0,xsize,ysize);\
  1555. for(var p = 0 ; p < len ; p = p+4){\
  1556.  context_userdraw.beginPath();\
  1557.  context_userdraw.moveTo(userdraw_x[p],userdraw_y[p]);\
  1558.  for( var m = p+1 ;m < p+4 ; m++){\
  1559.   context_userdraw.lineTo(userdraw_x[m],userdraw_y[m]);\
  1560.  };\
  1561.  context_userdraw.lineTo(userdraw_x[p],userdraw_y[p]);\
  1562.  context_userdraw.closePath();\
  1563.  if(use_filled!=0){context_userdraw.fill();};\
  1564.  context_userdraw.stroke();\
  1565. };\
  1566. return;};");
  1567.  break;
  1568.  
  1569.   case 57 ... 58:
  1570.    if( js_function[DRAW_JSFUNCTION] != 1 ){
  1571.     js_function[JS_RAWMATH] = 1;js_function[DRAW_JSFUNCTION] = 1;
  1572.     js_function[JS_MATH] = 1;js_function[JS_PLOT] = 1;
  1573.     if(reply_format == 0 || reply_format != -1){reply_format = 24;}/* read canvas_input values */
  1574.     if(polynum == -1 ){polynum = 1; } /* functions5 --> polynum = 5 */
  1575.     for(int n=0;n<polynum;n++){
  1576.      add_input_jsfunction(css_class,function_label,input_cnt,stroke_color,stroke_opacity,
  1577.      line_width,use_dashed,dashtype[0],dashtype[1],font_size);
  1578.      input_cnt++;
  1579.      jsplot_cnt++;
  1580.     }
  1581.    }
  1582.   fprintf(js_include_file,"if(typeof(all_jsplots) !== 'number'){var all_jsplots;};all_jsplots = %d;function redraw_userdraw(){redraw_jsplot();return;};",jsplot_cnt);
  1583.  
  1584.  break;
  1585.  
  1586.  default:canvas_error("unknown drawtype?? this should not happen...");break;
  1587. }/* einde switch */
  1588.  
  1589.  
  1590. }/* einde add_js_userdraw */
  1591.  
  1592.  
  1593.