Subversion Repositories wimsdev

Rev

Rev 15128 | Rev 15432 | 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,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;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.   context_userdraw.save();\
  612.   x1 = userdraw_x[p];y1 = userdraw_y[p];x2 = userdraw_x[p+1];y2 = userdraw_y[p+1];dx = x2 - x1;dy = y2 - y1;\
  613.   context_userdraw.beginPath();\
  614.   context_userdraw.moveTo(x1,y1);\
  615.   context_userdraw.lineTo(x2,y2);\
  616.   context_userdraw.closePath();\
  617.   context_userdraw.stroke();\
  618.   context_userdraw.translate(x2,y2);\
  619.   context_userdraw.rotate(Math.atan2(dy,dx));\
  620.   context_userdraw.beginPath();\
  621.   context_userdraw.moveTo(0,0);\
  622.   context_userdraw.lineTo(-1*arrow_head,-0.5*arrow_head);\
  623.   context_userdraw.lineTo(-1*arrow_head, 0.5*arrow_head);\
  624.   context_userdraw.closePath();\
  625.   context_userdraw.fill();\
  626.   context_userdraw.stroke();\
  627.   context_userdraw.restore();\
  628.  };\
  629. };\
  630. return;\
  631. };",stroke_color,stroke_opacity,arrow_head);
  632.  break;
  633.  /* arrow/arrows */
  634.  case 20 ... 21 :
  635.  fprintf(js_include_file,"\
  636. function redraw_userdraw(){draw_arrows2();};\
  637. context_userdraw.fillStyle = \"rgba(%s,%.2f)\";\
  638. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<2;p++){userdraw_x.pop();userdraw_y.pop();};draw_arrows();};return;};\
  639. function arrows2(x,y,event_which,num){\
  640. if(event_which == 0){\
  641.  if( num == 0 && xy_cnt == 0 ){userdraw_x = [];userdraw_y = [];};\
  642.  userdraw_x.push(x);userdraw_y.push(y);\
  643.  xy_cnt++;\
  644. }\
  645. else\
  646. {\
  647.  if( xy_cnt == 1 ){\
  648.   userdraw_x.push(x);userdraw_y.push(y);\
  649.   draw_arrows2();\
  650.   userdraw_x.pop();userdraw_y.pop();\
  651.  };\
  652. };\
  653. if( xy_cnt == 2 ){\
  654.  xy_cnt = 0;\
  655.  draw_arrows2();\
  656. };\
  657. };\
  658. function draw_arrows2(){\
  659. var arrow_head = %d;\
  660. var len = userdraw_x.length;\
  661. var x1,y1,x2,y2,dx,dy,h;\
  662. if( len%%2 == 0 ){\
  663.  context_userdraw.clearRect(0,0,xsize,ysize);\
  664.  for(var p = 0 ; p < len ; p = p+2 ){\
  665.   context_userdraw.save();\
  666.   x1 = userdraw_x[p];y1 = userdraw_y[p];x2 = userdraw_x[p+1];y2 = userdraw_y[p+1];dx = x2 - x1;dy = y2 - y1;\
  667.   context_userdraw.save();\
  668.   context_userdraw.beginPath();\
  669.   context_userdraw.moveTo(x1,y1);\
  670.   context_userdraw.lineTo(x2,y2);\
  671.   context_userdraw.closePath();\
  672.   context_userdraw.stroke();\
  673.   context_userdraw.translate(x2,y2);\
  674.   context_userdraw.rotate(Math.atan2(dy,dx));\
  675.   context_userdraw.beginPath();\
  676.   context_userdraw.moveTo(0,0);\
  677.   context_userdraw.lineTo(-1*arrow_head,-0.5*arrow_head);\
  678.   context_userdraw.lineTo(-1*arrow_head, 0.5*arrow_head);\
  679.   context_userdraw.closePath();\
  680.   context_userdraw.fill();\
  681.   context_userdraw.stroke();\
  682.   context_userdraw.restore();\
  683.   context_userdraw.translate(x1,y1);\
  684.   context_userdraw.rotate(Math.atan2(-dy,-dx));\
  685.   context_userdraw.beginPath();\
  686.   context_userdraw.moveTo(0,0);\
  687.   context_userdraw.lineTo(-1*arrow_head,-0.5*arrow_head);\
  688.   context_userdraw.lineTo(-1*arrow_head, 0.5*arrow_head);\
  689.   context_userdraw.closePath();\
  690.   context_userdraw.fill();\
  691.   context_userdraw.stroke();\
  692.   context_userdraw.restore();\
  693.  };\
  694. };\
  695. return;\
  696. };",stroke_color,stroke_opacity,arrow_head);
  697.  break;
  698.  /* curvedarrow/curvedarrows */
  699.  case 22 ... 23:
  700. fprintf(js_include_file,"\
  701. function redraw_userdraw(){draw_curvedarrows();};\
  702. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<3;p++){userdraw_x.pop();userdraw_y.pop();};draw_curvedarrows();};return;};\
  703. function curvedarrows(x,y,event_which,num){\
  704. if(event_which == 0){\
  705.  if(num == 0 && xy_cnt == 0){\
  706.   userdraw_x = [];userdraw_y = [];userdraw_x[0] = x;userdraw_y[0] = y;\
  707.  }\
  708.  else\
  709.  {\
  710.   userdraw_x.push(x);userdraw_y.push(y);\
  711.  };\
  712.  xy_cnt++;\
  713. }\
  714. else\
  715. {\
  716.  if( xy_cnt < 3 ){userdraw_x.push(x);userdraw_y.push(y);draw_curvedarrows();userdraw_x.pop();userdraw_y.pop();};\
  717.  if( xy_cnt == 3 ){userdraw_x.pop();userdraw_y.pop();userdraw_x.push(x);userdraw_y.push(y);xy_cnt = 0;draw_curvedarrows();};\
  718. };\
  719. };\
  720. var arrow_head = %d;\
  721. function draw_curvedarrows(){\
  722. var len = userdraw_x.length;var x1,y1,x2,y2,x3,y3;\
  723. context_userdraw.clearRect(0,0,xsize,ysize);\
  724. for(var p = 0 ; p < len ; p = p+3){\
  725.  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];\
  726.  var angle1 = Math.atan2(x3 - x2,y3 - y2) + Math.PI;\
  727.  context_userdraw.beginPath();\
  728.  context_userdraw.moveTo(x1,y1);\
  729.  context_userdraw.quadraticCurveTo(x3,y3,x2,y2);\
  730.  context_userdraw.moveTo(x2 - (arrow_head * Math.sin(angle1 - Math.PI / 6)),y2 - (arrow_head * Math.cos(angle1 - Math.PI / 6)));\
  731.  context_userdraw.lineTo(x2, y2);\
  732.  context_userdraw.lineTo(x2 - (arrow_head * Math.sin(angle1 + Math.PI / 6)),y2 - (arrow_head * Math.cos(angle1 + Math.PI / 6)));\
  733.  context_userdraw.stroke();\
  734.  context_userdraw.closePath();\
  735. };\
  736. return;};",arrow_head);
  737.  break;
  738.  /* curvedarrow2/curvedarrows2 */
  739.  case 24 ... 25:
  740. fprintf(js_include_file,"\
  741. function redraw_userdraw(){draw_curvedarrows2();};\
  742. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<3;p++){userdraw_x.pop();userdraw_y.pop();};draw_curvedarrows2();};return;};\
  743. function curvedarrows2(x,y,event_which,num){\
  744. if(event_which == 0){\
  745.  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++;\
  746. }\
  747. else\
  748. {\
  749.  if( xy_cnt < 3 ){userdraw_x.push(x);userdraw_y.push(y);draw_curvedarrows2();userdraw_x.pop();userdraw_y.pop();};\
  750.  if( xy_cnt == 3 ){userdraw_x.pop();userdraw_y.pop();userdraw_x.push(x);userdraw_y.push(y);xy_cnt = 0;draw_curvedarrows2();};\
  751. };\
  752. };\
  753. var arrow_head = %d;\
  754. function draw_curvedarrows2(){\
  755. var len = userdraw_x.length;var x1,y1,x2,y2,x3,y3;\
  756. context_userdraw.clearRect(0,0,xsize,ysize);\
  757. for(var p = 0 ; p < len ; p = p+3){\
  758.  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];\
  759.  var angle1 = Math.atan2(x3 - x2,y3 - y2) + Math.PI;\
  760.  var angle2 = Math.atan2(x3 - x1,y3 - y1) + Math.PI;\
  761.  context_userdraw.beginPath();\
  762.  context_userdraw.moveTo(x1,y1);\
  763.  context_userdraw.moveTo(x1 - (arrow_head * Math.sin(angle2 - Math.PI / 6)),y1 - (arrow_head * Math.cos(angle2 - Math.PI / 6)));\
  764.  context_userdraw.lineTo(x1, y1);\
  765.  context_userdraw.lineTo(x1 - (arrow_head * Math.sin(angle2 + Math.PI / 6)),y1 - (arrow_head * Math.cos(angle2 + Math.PI / 6)));\
  766.  context_userdraw.moveTo(x1,y1);\
  767.  context_userdraw.quadraticCurveTo(x3,y3,x2,y2);\
  768.  context_userdraw.moveTo(x2 - (arrow_head * Math.sin(angle1 - Math.PI / 6)),y2 - (arrow_head * Math.cos(angle1 - Math.PI / 6)));\
  769.  context_userdraw.lineTo(x2, y2);\
  770.  context_userdraw.lineTo(x2 - (arrow_head * Math.sin(angle1 + Math.PI / 6)),y2 - (arrow_head * Math.cos(angle1 + Math.PI / 6)));\
  771.  context_userdraw.stroke();\
  772.  context_userdraw.closePath();\
  773. };\
  774. return;\
  775. };",arrow_head);
  776.  break;
  777.  
  778.  /* freehandline/freehandlines/path/paths 0,1  26,27,28,29  */
  779.  case 26 ... 29:
  780.  fprintf(js_include_file,"\
  781. var stop = 1;\
  782. function remove_last(){userdraw_x = [];userdraw_y = []; context_userdraw.clearRect(0,0,xsize,ysize);return;};\
  783. function paths(x,y,event_which,num){\
  784. if(event_which == 0 && stop == 0 ){stop = 1;return;};\
  785. if(event_which == 1 && stop == 1 ){return;}; \
  786. if(event_which == 0 && stop == 1 ){\
  787. stop = 0;userdraw_x = [];userdraw_y = [];return;};\
  788. userdraw_x.push(x);userdraw_y.push(y);\
  789. draw_paths();\
  790. };\
  791. function draw_paths(){\
  792. context_userdraw.clearRect(0,0,xsize,ysize);\
  793. var len = userdraw_x.length ;\
  794. context_userdraw.beginPath();\
  795. context_userdraw.moveTo(userdraw_x[0],userdraw_y[0]);\
  796. for(var p = 1 ; p < len ; p++ ){\
  797.  context_userdraw.lineTo(userdraw_x[p],userdraw_y[p]);\
  798. };\
  799. if(use_filled!=0){context_userdraw.fill();};\
  800. context_userdraw.stroke();\
  801. return;\
  802. };");
  803.  
  804.  break;
  805.  
  806.  /* poly/polys poly[3]...polys[9] 30,31 */
  807.  case 30 ... 31:
  808.  fprintf(js_include_file,"\
  809. var polynum = %d;\
  810. function redraw_userdraw(){draw_polys();};\
  811. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<polynum;p++){userdraw_x.pop();userdraw_y.pop();};draw_polys();};return;};\
  812. function polys(x,y,event_which,num){\
  813. if(event_which == 0){\
  814.  if(num == 0 && xy_cnt == 0){\
  815.   userdraw_x = [];userdraw_y = [];\
  816.   userdraw_x[0] = x;userdraw_y[0] = y;\
  817.  }\
  818.  else\
  819.  {\
  820.   userdraw_x.push(x);userdraw_y.push(y);\
  821.  };\
  822.  xy_cnt++;\
  823. }\
  824. else\
  825. {\
  826.  if( xy_cnt < polynum ){\
  827.   userdraw_x.push(x);userdraw_y.push(y);\
  828.   draw_polys();\
  829.   userdraw_x.pop();userdraw_y.pop();\
  830.  };\
  831. };\
  832. if( xy_cnt == polynum ){\
  833.  userdraw_x.pop();userdraw_y.pop();\
  834.  userdraw_x.push(x);userdraw_y.push(y);\
  835.  xy_cnt = 0;\
  836.  draw_polys();\
  837. };\
  838. };\
  839. function draw_polys(){\
  840. var len = userdraw_x.length;\
  841. context_userdraw.clearRect(0,0,xsize,ysize);\
  842. for(var p = 0 ; p < len ; p = p+polynum){\
  843.  context_userdraw.beginPath();\
  844.  context_userdraw.moveTo(userdraw_x[p],userdraw_y[p]);\
  845.  for( var m = p+1 ;m < p+polynum ; m++){\
  846.  if(typeof(userdraw_x[m]) !== 'undefined' ){context_userdraw.lineTo(userdraw_x[m],userdraw_y[m]);};};\
  847.  context_userdraw.lineTo(userdraw_x[p],userdraw_y[p]);\
  848.  context_userdraw.stroke();\
  849.  context_userdraw.closePath();\
  850.  if(use_filled!=0){context_userdraw.fill();};\
  851. };\
  852. return;\
  853. };",polynum);
  854.  break;
  855.  case 32 ... 33:
  856.  /* polygon/polygon  32,33 */
  857.  /* multiple polygons are now working as expected : no problems with duplicated/closing points*/
  858.  fprintf(js_include_file,"\
  859. var poly_closed = [];\
  860. var do_not_pop = 0;\
  861. function redraw_userdraw(){do_not_pop = 1;draw_polygon();};\
  862. 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;};\
  863. function check_closed(x1,y1,X,Y){\
  864. var marge=10;\
  865. var len = X.length-1;\
  866. for(var p = 0 ; p < len ; p++){\
  867.  if(x1 < X[p] + marge && x1 > X[p] - marge ){\
  868.   if(y1 < Y[p] + marge && y1 > Y[p] - marge ){\
  869.    return 1;\
  870.   };\
  871.  };\
  872. };\
  873. return 0;\
  874. };\
  875. \
  876. function polygon(x,y,event_which,num){\
  877. do_not_pop = 0;\
  878. if(event_which == 0){\
  879.  if(num == 0 && xy_cnt == 0){\
  880.   userdraw_x = [];userdraw_y = [];\
  881.   userdraw_x[0] = x;userdraw_y[0] = y;\
  882.  }\
  883.  else\
  884.  {\
  885.   userdraw_x.push(x);userdraw_y.push(y);\
  886.  };\
  887.  xy_cnt++;\
  888.  if( xy_cnt > 2 ){\
  889.   if( check_closed(x,y,userdraw_x,userdraw_y) == 1){\
  890.    poly_closed.push(userdraw_x.length - 1);\
  891.    draw_polygon();\
  892.    xy_cnt = 0;\
  893.   };\
  894.  };\
  895. }\
  896. else\
  897. {\
  898.  if( xy_cnt > 0 ){\
  899.   userdraw_x.push(x);userdraw_y.push(y);\
  900.   draw_polygon();\
  901.  };\
  902. };\
  903. };\
  904. function draw_polygon(){\
  905. var len = userdraw_x.length;\
  906. context_userdraw.clearRect(0,0,xsize,ysize);\
  907. context_userdraw.beginPath();\
  908. var begin = 0;\
  909. context_userdraw.moveTo(userdraw_x[0],userdraw_y[0]);\
  910. for( var p = 0 ; p < len ; p++){\
  911.  if( poly_closed.indexOf(p) != -1 ){\
  912.   context_userdraw.lineTo(userdraw_x[begin],userdraw_y[begin]);\
  913.   begin = p;\
  914.   context_userdraw.closePath();\
  915.   if(use_filled!=0){context_userdraw.fill();};\
  916.   context_userdraw.stroke();\
  917.   context_userdraw.beginPath();\
  918.  }else{ context_userdraw.lineTo(userdraw_x[p],userdraw_y[p]);};\
  919. };\
  920. context_userdraw.lineTo(userdraw_x[begin],userdraw_y[begin]);\
  921. context_userdraw.closePath();\
  922. if(use_filled!=0){context_userdraw.fill();};\
  923. context_userdraw.stroke();\
  924. if(do_not_pop == 0){ userdraw_x.pop();userdraw_y.pop();};\
  925. return;\
  926. };");
  927.  break;
  928.  
  929.  /*
  930.  polyline/brokenline 34,35
  931.  there is just a single polyline/brokenline possible !
  932.  */
  933.  case 34 ... 35:
  934.  fprintf(js_include_file,"\
  935. function redraw_userdraw(){draw_polylines();};\
  936. function remove_last(){if( userdraw_x.length > 0 ){userdraw_x.pop();userdraw_y.pop();draw_polylines();};return;};\
  937. function polylines(x,y,event_which,num){\
  938. if(event_which == 0){\
  939.  if(num == 0  && xy_cnt == 0 ){ userdraw_x = [];userdraw_y = [];};\
  940.  userdraw_x.push(x);userdraw_y.push(y);\
  941.  xy_cnt++;\
  942. }\
  943. else\
  944. {\
  945.  if( xy_cnt == 1 ){\
  946.   userdraw_x.push(x);userdraw_y.push(y);\
  947.   userdraw_x.pop();userdraw_y.pop();\
  948.  };\
  949. };\
  950. if( xy_cnt == 2 ){xy_cnt = 0;};\
  951. draw_polylines();\
  952. };\
  953. var full_circle = 2*Math.PI;\
  954. function draw_polylines(){\
  955. var len = userdraw_x.length;\
  956. context_userdraw.clearRect(0,0,xsize,ysize);\
  957. context_userdraw.beginPath();\
  958. context_userdraw.moveTo(userdraw_x[0],userdraw_y[0]);\
  959. for( var p = 0 ; p < len ; p++){\
  960.  context_userdraw.lineTo(userdraw_x[p],userdraw_y[p]);\
  961.  context_userdraw.arc(userdraw_x[p],userdraw_y[p],2,0,full_circle,false);\
  962. };\
  963.  context_userdraw.stroke();\
  964. context_userdraw.closePath();\
  965. if(use_filled != 0 ){if(use_filled!=0){context_userdraw.fill();};};\
  966. return;\
  967. };");
  968.  break;
  969.  
  970.  /* triangle/triangles 36,37 */
  971.  case 36 ... 37:
  972.   fprintf(js_include_file,"\
  973. function redraw_userdraw(){draw_triangles();};\
  974. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<3;p++){userdraw_x.pop();userdraw_y.pop();};draw_triangles();};return;};\
  975. function triangles(x,y,event_which,num){\
  976. var last = userdraw_x.length - 1;\
  977. if(event_which == 0){\
  978.  if(num == 0 && xy_cnt == 0){\
  979.   userdraw_x = [];userdraw_y = [];userdraw_x[0] = x;userdraw_y[0] = y;\
  980.  }\
  981.  else\
  982.  {\
  983.   userdraw_x.push(x);userdraw_y.push(y);\
  984.  };\
  985.  xy_cnt++;\
  986. }\
  987. else\
  988. {\
  989.  if( xy_cnt < 3 ){\
  990.   userdraw_x.push(x);userdraw_y.push(y);\
  991.   draw_triangles();\
  992.   userdraw_x.pop();userdraw_y.pop();\
  993.   return;\
  994.  };\
  995. };\
  996. if( xy_cnt == 3 ){\
  997.  userdraw_x.pop();userdraw_y.pop();\
  998.  userdraw_x.push(x);userdraw_y.push(y);\
  999.  xy_cnt = 0;\
  1000.  draw_triangles();\
  1001. };\
  1002. };\
  1003. function draw_triangles(){\
  1004. var len = userdraw_x.length - 1;\
  1005. context_userdraw.clearRect(0,0,xsize,ysize);\
  1006. for(var p = 0 ; p < len ; p = p+3){\
  1007.  context_userdraw.beginPath();\
  1008.  context_userdraw.moveTo(userdraw_x[p],userdraw_y[p]);\
  1009.  for( var m = p+1 ;m < p+3 ; m++){\
  1010.   context_userdraw.lineTo(userdraw_x[m],userdraw_y[m]);\
  1011.  };\
  1012.  context_userdraw.lineTo(userdraw_x[p],userdraw_y[p]);\
  1013.  context_userdraw.closePath();\
  1014.  if(use_filled!=0){context_userdraw.fill();};\
  1015.  context_userdraw.stroke();\
  1016. };\
  1017. return;\
  1018. };");
  1019.  break;
  1020.  
  1021.  /* rect/rects 38,39 : NOT USING A PATH !!*/
  1022.  case 38 ... 39 :
  1023.  fprintf(js_include_file,"\
  1024. function redraw_userdraw(){draw_rects();};\
  1025. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<2;p++){userdraw_x.pop();userdraw_y.pop();};draw_rects();};return;};\
  1026. function rects(x,y,event_which,num){\
  1027. if(event_which == 0){\
  1028.  if( num == 0 && xy_cnt == 0 ){userdraw_x = [];userdraw_y = [];};\
  1029.  userdraw_x.push(x);userdraw_y.push(y);\
  1030.  xy_cnt++;\
  1031. }\
  1032. else\
  1033. {\
  1034.  if( xy_cnt == 1 ){\
  1035.   userdraw_x.push(x);userdraw_y.push(y);\
  1036.   draw_rects();\
  1037.   userdraw_x.pop();userdraw_y.pop();\
  1038.  };\
  1039. };\
  1040. if( xy_cnt == 2 ){\
  1041.  xy_cnt = 0;\
  1042.  draw_rects();\
  1043. };\
  1044. };\
  1045. function draw_rects(){\
  1046. var len = userdraw_x.length;\
  1047. if( len %%2 == 0 ){\
  1048.  context_userdraw.clearRect(0,0,xsize,ysize);\
  1049.  for(var p = 0 ; p < len ; p = p+2 ){\
  1050.   context_userdraw.beginPath();\
  1051.   context_userdraw.rect(userdraw_x[p],userdraw_y[p],userdraw_x[p+1]-userdraw_x[p],userdraw_y[p+1]-userdraw_y[p]);\
  1052.   context_userdraw.closePath();\
  1053.   if(use_filled!=0){context_userdraw.fill();};\
  1054.   context_userdraw.stroke();\
  1055.  };\
  1056. };\
  1057. return;\
  1058. };");
  1059.  break;
  1060.  /* roundrect/roundrects 40,41  : NOT USING A PATH !!*/
  1061.  case 40 ... 41:
  1062.  fprintf(js_include_file,"\
  1063. function redraw_userdraw(){draw_roundrects();};\
  1064. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<2;p++){userdraw_x.pop();userdraw_y.pop();};draw_roundrects();};return;};\
  1065. function roundrects(x,y,event_which,num){\
  1066. if(event_which == 0){\
  1067.  if( num == 0 && xy_cnt == 0 ){userdraw_x = [];userdraw_y = [];};\
  1068.  userdraw_x.push(x);userdraw_y.push(y);\
  1069.  xy_cnt++;\
  1070. }\
  1071. else\
  1072. {\
  1073.  if( xy_cnt == 1 ){\
  1074.   userdraw_x.push(x);userdraw_y.push(y);\
  1075.   draw_roundrects();\
  1076.   userdraw_x.pop();userdraw_y.pop();\
  1077.  };\
  1078. };\
  1079. if( xy_cnt == 2 ){\
  1080.  xy_cnt = 0;\
  1081.  draw_roundrects();\
  1082. };\
  1083. };\
  1084. function draw_roundrects(){\
  1085. var len = userdraw_x.length;\
  1086. if( len %%2 == 0 ){\
  1087.  context_userdraw.clearRect(0,0,xsize,ysize);\
  1088.  var x,y,w,h,r;\
  1089.  for(var p = 0; p < len; p = p+2){\
  1090.   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);\
  1091.   context_userdraw.beginPath();\
  1092.   context_userdraw.moveTo(x + r, y);\
  1093.   context_userdraw.lineTo(x + w - r, y);\
  1094.   context_userdraw.quadraticCurveTo(x + w, y, x + w, y + r);\
  1095.   context_userdraw.lineTo(x + w, y + h - r);\
  1096.   context_userdraw.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\
  1097.   context_userdraw.lineTo(x + r, y + h);\
  1098.   context_userdraw.quadraticCurveTo(x, y + h, x, y + h - r);\
  1099.   context_userdraw.lineTo(x, y + r);\
  1100.   context_userdraw.quadraticCurveTo(x, y, x + r, y);\
  1101.   context_userdraw.closePath();\
  1102.   if(use_filled!=0){context_userdraw.fill();};\
  1103.   context_userdraw.stroke();\
  1104.  };\
  1105. };\
  1106. return;\
  1107. };");
  1108.  break;
  1109.  /* arc/arcs  42,43 */
  1110.  case 42 ... 43:
  1111.  fprintf(js_include_file,"\
  1112. function redraw_userdraw(){draw_arcs();};\
  1113. var temp_point_x = new Array(3);\
  1114. var temp_point_y = new Array(3);\
  1115. context_userdraw.fillStyle = context_userdraw.strokeStyle;\
  1116. 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;};\
  1117. function arcs(x,y,event_which,num){\
  1118. var last = userdraw_x.length - 1;\
  1119. var xc = userdraw_x[last];\
  1120. var yc = userdraw_y[last];\
  1121. if(event_which == 0){\
  1122.  if(num == 0 && xy_cnt == 3 ){xy_cnt = 0;userdraw_x = [];userdraw_y = [];};\
  1123.  userdraw_x.push(x);userdraw_y.push(y);\
  1124.  temp_point_x.push(x);\
  1125.  temp_point_y.push(y);\
  1126.  draw_points();\
  1127.  xy_cnt++;\
  1128. };\
  1129. if( xy_cnt%%3 == 0 ){ draw_arcs();temp_point_x = [];temp_point_y = [];};\
  1130. return;\
  1131. };\
  1132. function draw_points(){\
  1133. var len = temp_point_x.length;\
  1134. var radius = 4*(context_userdraw.lineWidth);\
  1135. var r = 2*Math.PI;\
  1136. for(var p = 0 ; p < len ; p++ ){\
  1137.  context_userdraw.beginPath();\
  1138.  context_userdraw.arc(temp_point_x[p],temp_point_y[p],radius,0,r,false);\
  1139.  context_userdraw.closePath();\
  1140.  context_userdraw.fill();\
  1141. };\
  1142. return;\
  1143. };\
  1144. function draw_arcs(){\
  1145. var xc,x1,x2,yc,y1,y2,radius,end,start,direction,p1,p2;\
  1146. var len = userdraw_x.length;\
  1147. context_userdraw.clearRect(0,0,xsize,ysize);\
  1148. var idx = 0;\
  1149. for(var p=0; p< len;p = p+3){\
  1150.  p1=p+1;p2=p+2;\
  1151.  xc = userdraw_x[p1];x1 = userdraw_x[p];x2 = userdraw_x[p2];yc = userdraw_y[p1];y1 = userdraw_y[p];y2 = userdraw_y[p2];\
  1152.  radius = distance(x1,y1,xc,yc);\
  1153.  start = Math.atan2(y1-yc, x1-xc);\
  1154.  end = Math.atan2(y2-yc, x2-xc);\
  1155.  direction = ( start > end);\
  1156.  userdraw_radius[idx] = Math.abs( end - start );idx++;\
  1157.  context_userdraw.beginPath();\
  1158.  context_userdraw.moveTo(xc,yc);\
  1159.  context_userdraw.arc(xc, yc,radius,start,end,direction);\
  1160.  context_userdraw.closePath();\
  1161.  context_userdraw.stroke();\
  1162.  if(use_filled!=0){context_userdraw.fill();};\
  1163. };\
  1164. return;\
  1165. };");
  1166.  break;
  1167.  /* text : 44 always uses user input field !! */
  1168.  case 44:
  1169.  fprintf(js_include_file,"\
  1170. function redraw_userdraw(){draw_text();};\
  1171. var userdraw_text = new Array();\
  1172. var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
  1173. var inner_html = tooltip_div.innerHTML;\
  1174. tooltip_div.innerHTML = inner_html + \"<input class='%s' type='text' size='4' value='' id='userdraw_text_abc' />\";\
  1175. context_userdraw.fillStyle = \"rgba(%s,%f)\";\
  1176. var userdraw_textheight = 0.3 * (context_userdraw.measureText('M').width);\
  1177. function remove_last(){if(userdraw_x.length > 0 ){userdraw_x.pop();userdraw_y.pop();userdraw_text.pop();draw_text();return;};};\
  1178. function text(x,y,event_which,num){\
  1179. if(event_which == 1){ return; };\
  1180. if( num == 0 ){\
  1181.  userdraw_x[0] = x;\
  1182.  userdraw_y[0] = y;\
  1183. }else{\
  1184.  userdraw_x.push(x);\
  1185.  userdraw_y.push(y);\
  1186. };\
  1187. var txt = document.getElementById('userdraw_text_abc').value;\
  1188. if( ! txt ){userdraw_x.pop();userdraw_y.pop();userdraw_text.pop();return;};\
  1189. txt = conv_to_unicode(txt);userdraw_text.push(txt.replace(/\\\\/g,' '));\
  1190. draw_text();\
  1191. };\
  1192. function conv_to_unicode(str){return str.replace(/\\u[\\dA-F]{4}/gi,function(match){return String.fromCharCode(parseInt(match.replace(/\\u/g,''), 16));});};\
  1193. function draw_text(){\
  1194. var len = userdraw_x.length;\
  1195. var half = 0;\
  1196. context_userdraw.clearRect(0,0,xsize,ysize);\
  1197. for(var p = 0 ; p < len ; p++ ){\
  1198.   half = 0.5*( context_userdraw.measureText(userdraw_text[p]).width );\
  1199.   context_userdraw.fillText(userdraw_text[p],userdraw_x[p] - half,userdraw_y[p] + userdraw_textheight);\
  1200. };\
  1201. };",canvas_root_id,css_class,stroke_color,stroke_opacity);
  1202.  break;
  1203.  /* images 45,46  replyformat is same as 'userdraw text,color' e.g. 17 === x,y,image_id  */
  1204.  case 45 ... 46:
  1205.  fprintf(js_include_file,"\
  1206. function redraw_userdraw(){draw_images(0);};\
  1207. var userdraw_text = new Array();\
  1208. var current_id = null;var external_div_cnt=0;\
  1209. function remove_last(){draw_images(1);return;};\
  1210. function image_adjust(image,x,y){\
  1211. var centered = %d;\
  1212. var w = parseInt(image.width);var h = parseInt(image.height);\
  1213. switch(centered){\
  1214.  case 0: return [x,y];break;\
  1215.  case 1: return [x,parseInt(y-0.5*h)];break;\
  1216.  case 2: return [parseInt(x+0.5*h),y];break;\
  1217.  case 3: return [parseInt(x+0.5*h),parseInt(y-0.5*h)];break;\
  1218.  case 4: return [parseInt(x-0.5*w),parseInt(y-0.5*h)];break;\
  1219.  default: return [x,y];break;\
  1220. };\
  1221. };\
  1222. place_image_on_canvas = function(id){\
  1223. var thing = document.getElementById(id);\
  1224. var tag = thing.tagName;\
  1225. if(tag == 'SVG'){draw_mathml_svg(thing,id);return;};\
  1226. if(tag == 'DIV' || tag == 'SPAN' || tag == 'P' || tag == 'TD' || tag == 'TH' ){draw_mathml_div(thing,id);return;};\
  1227. var src = thing.src;\
  1228. var image = new Image();\
  1229. image.src = src;\
  1230. image.id = 'placed_'+id;\
  1231. image.width = thing.width;\
  1232. image.height = thing.height;\
  1233. image.onload = function(){ current_id = id; };\
  1234. return;\
  1235. };\
  1236. function draw_mathml_div(thing,id){\
  1237. var fix_div = document.createElement('DIV');\
  1238. var new_id='placed_'+external_div_cnt+'_'+id;\
  1239. fix_div.setAttribute('id',new_id);\
  1240. var w = parseInt(thing.clientWidth);\
  1241. var h = parseInt(thing.clientHeight);\
  1242. fix_div.innerHTML = thing.innerHTML;\
  1243. fix_div.setAttribute('style','display:none;position;absolute;width:'+w+'px;height:'+h+'px');\
  1244. fix_div.width = w;fix_div.height = h;\
  1245. canvas_div.appendChild(fix_div);\
  1246. current_id = new_id;\
  1247. external_div_cnt++;\
  1248. return;\
  1249. };\
  1250. function draw_mathml_svg(thing,id){\
  1251. var fix_div = document.createElement('DIV');\
  1252. fix_div.setAttribute('style','display:none;position;relative');\
  1253. canvas_div.appendChild(fix_div);\
  1254. var image = new Image();\
  1255. var svg_string = new XMLSerializer().serializeToString(thing);\
  1256. var dom = self.URL || self.webkitURL || self;\
  1257. var svg = new Blob([svg_string], {type: \"image/svg+xml;charset=utf-8\"});\
  1258. var url = dom.createObjectURL(svg);\
  1259. image.src= url;\
  1260. image.id = 'placed_'+id;\
  1261. image.onload = function(){\
  1262.  current_id = image.id;\
  1263.  fix_div.innerHTML='<img src='+image.src+' id='+image.id+' alt=\"this should not happen today...!\"/>';\
  1264. };\
  1265. return;\
  1266. };\
  1267. function images(x,y,event_which,num){\
  1268. if(event_which == 1){ return;};\
  1269. if( current_id ){\
  1270.  if(num == 0 ){ \
  1271.   userdraw_x[0] = x;\
  1272.   userdraw_y[0] = y;\
  1273.   userdraw_text[0] = current_id;\
  1274.   external_div_cnt = 0;\
  1275.  }else{\
  1276.   userdraw_x.push(x);\
  1277.   userdraw_y.push(y);\
  1278.   userdraw_text.push(current_id);\
  1279.  };\
  1280.  current_id = null;\
  1281.  draw_images(0);\
  1282. };\
  1283. };\
  1284. function draw_images(remove){\
  1285. var last = userdraw_x.length - 1;\
  1286. if(last < 0 ){return;};\
  1287. var x = userdraw_x[last];\
  1288. var y = userdraw_y[last];\
  1289. var id =  userdraw_text[last];\
  1290. var img = document.getElementById(id);\
  1291. var tag = img.tagName;\
  1292. var xy = image_adjust(img,x,y);\
  1293. if( tag == 'DIV' || tag == 'SPAN' || tag == 'P' || tag == 'TD' || tag == 'TH'){\
  1294.  if( remove == 1 ){\
  1295.   img.setAttribute('style','display:none');\
  1296.   userdraw_x.pop();userdraw_y.pop();userdraw_text.pop();external_div_cnt--;\
  1297.  }\
  1298.  else\
  1299.  {\
  1300.   img.setAttribute('style','display:inline-block;position:absolute;top:'+xy[1]+'px;left:'+xy[0]+'px;');\
  1301.  };\
  1302.  return;\
  1303. }else{\
  1304.  context_userdraw.clearRect(0,0,xsize,ysize);\
  1305.  if(remove == 1){\
  1306.   userdraw_x.pop();userdraw_y.pop();userdraw_text.pop();\
  1307.  };\
  1308.  var len = userdraw_x.length;\
  1309.  for(var p = 0 ; p < len; p++){\
  1310.   if( userdraw_text[p] ){\
  1311.    img = document.getElementById(userdraw_text[p]);\
  1312.    tag = img.tagName;\
  1313.    xy = image_adjust(img,userdraw_x[p],userdraw_y[p]);\
  1314.    if( tag == 'IMG' || tag == 'SVG' ){\
  1315.     context_userdraw.drawImage(img,xy[0],xy[1],img.width,img.height);\
  1316.    };\
  1317.   };\
  1318.  };\
  1319. };\
  1320. };",use_offset);
  1321.  break;
  1322.  /* input/inputs" 46,47
  1323.  if(use_offset != 0 ){ center_input('canvas_input'+input_cnt,x,y,style);};\
  1324.   inp.addEventListener(\"touchstart\", function(e){this.focus();},false);\
  1325.   if( wims_status == \"done\" ){ inp.setAttribute(\"readonly\",\"readonly\");};
  1326.  */
  1327.  case 47 ... 48:
  1328.  /*
  1329.  input_cnt keeps track of all inputfields INCLUDING static inputfields
  1330.  xy_cnt keeps track of the dynamically added userdraw inputfields
  1331.  */
  1332.  fprintf(js_include_file,"\
  1333. var current_id = null;\
  1334. var current_obj = null;\
  1335. var inputs_width = 16;\
  1336. var inputs_height = 8;\
  1337. function redraw_userdraw(){console.log('userdraw inputs not zooming...');};\
  1338. if(typeof(input_cnt) !== 'undefined'){var input_cnt = 0;};\
  1339. function remove_last(){console.log('input_cnt ='+input_cnt);\
  1340. 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);};};\
  1341. function check_overlap(x,y,obj){\
  1342. var inputs;var xi,yi;\
  1343. for(var p = 0 ; p < xy_cnt ; p++ ){\
  1344.  xi = userdraw_x[p];yi = userdraw_y[p];\
  1345.  if( x > xi - 5 && x < xi + inputs_width &&  y > yi-5 && y < yi + inputs_height){\
  1346.   try{canvas_div.removeChild(obj);\
  1347.    current_obj = null;userdraw_x.pop();userdraw_y.pop();xy_cnt--;input_cnt--;\
  1348.   }catch(e){console.log('failed removing overlap: '+e);};\
  1349.   return;\
  1350.  };\
  1351. };\
  1352. return;\
  1353. };\
  1354. function inputs(x,y,event_which,num){\
  1355. if( document.getElementById('canvas_input0')){\
  1356.  var inputs = document.getElementById('canvas_input0');\
  1357.  inputs_width = 5+parseInt(inputs.clientWidth);\
  1358.  inputs_height = 5+ parseInt(inputs.clientHeight);\
  1359. };\
  1360. if(event_which == 0){\
  1361.  if(num == 0 && xy_cnt == 1 ){try{ canvas_div.removeChild(document.getElementById('canvas_input0'));\
  1362.  userdraw_x = [];userdraw_y = [];xy_cnt=0;}catch(e){console.log('removal first input failed...'+e);};};\
  1363.  userdraw_x.push(x);userdraw_y.push(y);\
  1364.  current_id = 'canvas_input'+input_cnt;\
  1365.  current_obj = document.getElementById(current_id);\
  1366.  draw_inputs(x,y);\
  1367.  if(input_cnt > 0){check_overlap(x,y,current_obj);};\
  1368.  input_cnt++;\
  1369.  xy_cnt++;\
  1370.  if(isTouch){current_obj.addEventListener(\"touchstart\", function(e){this.focus();},false);}else{\
  1371.  current_obj.autofocus = true;};\
  1372. };\
  1373. return;\
  1374. };\
  1375. function draw_inputs(x,y){\
  1376. var input_size = parseInt(context_userdraw.lineWidth);\
  1377. current_obj = document.createElement(\"input\");\
  1378. current_obj.setAttribute(\"id\",current_id);\
  1379. current_obj.setAttribute(\"size\",input_size);\
  1380. var xx = x - 0.5*inputs_width;\
  1381. var yy = y - 0.5*inputs_height;\
  1382. current_obj.setAttribute(\"style\",\"position:absolute;left:\"+xx+\"px;top:\"+yy+\"px;\");\
  1383. canvas_div.appendChild(current_obj);\
  1384. return;\
  1385. };");
  1386.  break;
  1387. // current_obj.setAttribute(\"class\",\"%s\");
  1388.  
  1389.  // input.setAttribute(\"style\",\"position:absolute;left:\"+userdraw_x[p]+\"px;top:\"+userdraw_y[p]+\"px;%s\");
  1390.  /* gridfill/diamondfill/dotfill/hatchfill/textfill  48,49,50,51,52
  1391.   0:no fill, 1:fill,2=grid?,3=hatch?,4=diamond?,5=dot?,6=image?
  1392.  if( draw_num == 50 ){js_function[DRAW_GRIDFILL] = 1;use_filled = 2;}
  1393.  else{
  1394.  if( draw_num == 51 ){js_function[DRAW_DIAMONDFILL] = 1;use_filled = 4;}
  1395.  else{
  1396.  if( draw_num == 52 ){js_function[DRAW_DOTFILL] = 1;use_filled = 5;}
  1397.  else{
  1398.  if( draw_num == 53 ){js_function[DRAW_HATCHFILL] = 1;use_filled = 3;}
  1399.  else{
  1400.  if( draw_num == 54 ){js_function[DRAW_TEXTFILL] = 1;use_filled = 7;}
  1401.  else{ use_filled = 1;}}}}}
  1402.  
  1403.  
  1404.  
  1405.  */
  1406.  case 49 ... 54:
  1407. /* handling rare case of clickfill using a pattern in stead of a single color...*/
  1408.  add_js_filltoborder(canvas_type);
  1409.  fprintf(stdout,"USE_FILLED = %d<br />",use_filled);
  1410.  switch(use_filled){
  1411.  case 1:
  1412.   p = 1 + snprintf(NULL,0,"var use_pattern_ctx = false;");
  1413.   check_string_length(p);
  1414.   tmp_buffer = my_newmem(p);
  1415.   snprintf(tmp_buffer,p,  "var use_pattern_ctx = false;");
  1416.   break;
  1417.  case 2:
  1418.   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));
  1419.   check_string_length(p);
  1420.   tmp_buffer = my_newmem(p);
  1421.   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));
  1422.   break;
  1423.  case 3:
  1424.   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));
  1425.   check_string_length(p);
  1426.   tmp_buffer = my_newmem(p);
  1427.   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));
  1428.   break;
  1429.  case 4:
  1430.   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));
  1431.   check_string_length(p);
  1432.   tmp_buffer = my_newmem(p);
  1433.   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));
  1434.   break;
  1435.  case 5:
  1436.   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));
  1437.   check_string_length(p);
  1438.   tmp_buffer = my_newmem(p);
  1439.   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));
  1440.   break;
  1441.  case 6:
  1442.    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));
  1443.   check_string_length(p);
  1444.   tmp_buffer = my_newmem(p);
  1445.   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));
  1446.   break;
  1447.   case 7:
  1448. /*var draw_textfill = function(canvas_type,x0,y0,color,fontfamily,xsize,ysize,txt,use_userdraw)*/
  1449.   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);
  1450.   check_string_length(p);
  1451.   tmp_buffer = my_newmem(p);
  1452.   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);
  1453.   break;
  1454.  }
  1455.   add_to_buffer(tmp_buffer);
  1456.  
  1457. fprintf(js_include_file,"function redraw_userdraw(){console.log('userdraw fill not zooming...');return;};\
  1458. function remove_last(){var last = fill_canvas_no;\
  1459. console.log('last = '+last);\
  1460. if(last > %d){\
  1461. var last_canvas = document.getElementById('wims_canvas%d'+last);\
  1462. if( last_canvas == null ){fill_canvas_no--;return;};\
  1463. var last_ctx = last_canvas.getContext('2d');\
  1464. last_ctx.clearRect(0,0,xsize,ysize);\
  1465. canvas_div.removeChild(last_canvas);\
  1466. userdraw_x.pop();userdraw_y.pop();\
  1467. fill_canvas_no--;\
  1468. };return;};\
  1469. if( typeof(fill_canvas_no) === 'undefined' ){ var fill_canvas_no = %d; };\
  1470. function clickfill(x,y,event_which,num){\
  1471. var color = [%s,255];\
  1472. if( typeof(multifillcolors) === 'object'){\
  1473.  var numx = userdraw_x.length;\
  1474.  var numc = multifillcolors.length-1;var num = numx%%numc;\
  1475.  if( ! multifillcolors[num] ){alert('first select a colour...');return;};\
  1476.  var tc = (multifillcolors[num]).split(',');\
  1477.  color = [ tc[0],tc[1],tc[2],255 ];\
  1478.  if( typeof( palettecolors ) === 'object'){\
  1479.   var idx = palettecolors.indexOf( multifillcolors[num]);\
  1480.   userdraw_radius.push(idx);\
  1481.  }else{ userdraw_radius.push(num);};\
  1482. }\
  1483. else\
  1484. {\
  1485.  userdraw_radius.push(0);\
  1486. };\
  1487. document.body.style.cursor = 'wait';\
  1488. if( use_pattern_ctx ){\
  1489.  setTimeout(function(){ filltoborder( px2x(x),px2y(y),color,color,fill_canvas_no,true,pattern_ctx);},500);\
  1490. }\
  1491. else\
  1492. {\
  1493.  setTimeout(function(){ filltoborder(px2x(x),px2y(y),color,color,fill_canvas_no,false,null);},500);\
  1494. };\
  1495. userdraw_x.push(x);\
  1496. userdraw_y.push(y);\
  1497. fill_canvas_no++;\
  1498. document.body.style.cursor = 'default';\
  1499. return;\
  1500. };",CLICKFILL_CANVAS,canvas_root_id,CLICKFILL_CANVAS,stroke_color);
  1501. /*(int) (stroke_opacity/0.0039215),(int) (stroke_opacity/0.0039215) */
  1502.  break;
  1503.  /* parallelogram/parallelograms */
  1504.  case 55 ... 56:
  1505.  fprintf(js_include_file,"\
  1506. function redraw_userdraw(){draw_parallelograms();};\
  1507. function remove_last(){if( userdraw_x.length > 0 ){for(var p=0;p<4;p++){userdraw_x.pop();userdraw_y.pop();};draw_parallelograms();};return;};\
  1508. function parallelograms(x,y,event_which,num){\
  1509. var l2 = userdraw_x.length;\
  1510. var l1 = l2 - 1;var l0 = l2 - 2;\
  1511. var xxyy;\
  1512. if(event_which == 0){\
  1513.  if(xy_cnt == 0){\
  1514.   if(num == 0){userdraw_x = [];userdraw_y = [];};\
  1515.   userdraw_x.push(x);userdraw_y.push(y);\
  1516.  }\
  1517.  else\
  1518.  {\
  1519.   userdraw_x.push(x);userdraw_y.push(y);\
  1520.   if(xy_cnt == 2){\
  1521.    var xy = multisnap_check(userdraw_x[l2] - userdraw_x[l1] + userdraw_x[l0],userdraw_y[l2] - userdraw_y[l1] + userdraw_y[l0],use_snap);\
  1522.    userdraw_x.push(xy[0]);\
  1523.    userdraw_y.push(xy[1]);\
  1524.   };\
  1525.  };\
  1526.  xy_cnt++;\
  1527. }\
  1528. else\
  1529. {\
  1530.  if(xy_cnt == 1){\
  1531.   var xxyy = multisnap_check(userdraw_x[l1],userdraw_y[l1],use_snap);\
  1532.   userdraw_x.push(xxyy[0]);\
  1533.   userdraw_y.push(xxyy[1]);\
  1534.   userdraw_x.push(x);\
  1535.   userdraw_y.push(y);\
  1536.   draw_parallelograms();\
  1537.   userdraw_x.pop();userdraw_y.pop();\
  1538.   userdraw_x.pop();userdraw_y.pop();\
  1539.  }\
  1540.  else\
  1541.  {\
  1542.   if(xy_cnt == 2){\
  1543.    xxyy = multisnap_check(userdraw_x[l2]-userdraw_x[l1] + userdraw_x[l0],userdraw_y[l2]-userdraw_y[l1] + userdraw_y[l0],use_snap);\
  1544.    userdraw_x.push(x);userdraw_y.push(y);\
  1545.    userdraw_x.push(xxyy[0]);\
  1546.    userdraw_y.push(xxyy[1]);\
  1547.    draw_parallelograms();\
  1548.    userdraw_x.pop();userdraw_y.pop();\
  1549.    userdraw_x.pop();userdraw_y.pop();\
  1550.   };\
  1551.  };\
  1552. };\
  1553. if( xy_cnt == 3 ){\
  1554.  userdraw_x.pop();userdraw_y.pop();\
  1555.  xxyy = multisnap_check(userdraw_x[l2]-userdraw_x[l1] + userdraw_x[l0],userdraw_y[l2]-userdraw_y[l1] + userdraw_y[l0],use_snap);\
  1556.  userdraw_x.push(xxyy[0]);userdraw_y.push(xxyy[1]);\
  1557.  userdraw_x.push(x);userdraw_y.push(y);\
  1558.  userdraw_x.pop();userdraw_y.pop();\
  1559.  xy_cnt = 0;\
  1560.  draw_parallelograms();\
  1561. };\
  1562. };\
  1563. function draw_parallelograms(){\
  1564. var len = userdraw_x.length-1;\
  1565. context_userdraw.clearRect(0,0,xsize,ysize);\
  1566. for(var p = 0 ; p < len ; p = p+4){\
  1567.  context_userdraw.beginPath();\
  1568.  context_userdraw.moveTo(userdraw_x[p],userdraw_y[p]);\
  1569.  for( var m = p+1 ;m < p+4 ; m++){\
  1570.   context_userdraw.lineTo(userdraw_x[m],userdraw_y[m]);\
  1571.  };\
  1572.  context_userdraw.lineTo(userdraw_x[p],userdraw_y[p]);\
  1573.  context_userdraw.closePath();\
  1574.  if(use_filled!=0){context_userdraw.fill();};\
  1575.  context_userdraw.stroke();\
  1576. };\
  1577. return;};");
  1578.  break;
  1579.  
  1580.   case 57 ... 58:
  1581.    if( js_function[DRAW_JSFUNCTION] != 1 ){
  1582.     js_function[JS_RAWMATH] = 1;js_function[DRAW_JSFUNCTION] = 1;
  1583.     js_function[JS_MATH] = 1;js_function[JS_PLOT] = 1;
  1584.     if(reply_format == 0 || reply_format != -1){reply_format = 24;}/* read canvas_input values */
  1585.     if(polynum == -1 ){polynum = 1; } /* functions5 --> polynum = 5 */
  1586.     for(n=0;n<polynum;n++){
  1587.      add_input_jsfunction(css_class,function_label,input_cnt,stroke_color,stroke_opacity,
  1588.      line_width,use_dashed,dashtype[0],dashtype[1],font_size);
  1589.      input_cnt++;
  1590.      jsplot_cnt++;
  1591.     }
  1592.    }
  1593.   fprintf(js_include_file,"if(typeof(all_jsplots) !== 'number'){var all_jsplots;};all_jsplots = %d;function redraw_userdraw(){redraw_jsplot();return;};",jsplot_cnt);
  1594.  
  1595.  break;
  1596.  
  1597.  default:canvas_error("unknown drawtype?? this should not happen...");break;
  1598. }/* einde switch */
  1599.  
  1600.  
  1601. }/* einde add_js_userdraw */
  1602.  
  1603.  
  1604.