Subversion Repositories wimsdev

Rev

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