Subversion Repositories wimsdev

Rev

Rev 14958 | Rev 15309 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 14958 Rev 15111
Line 1... Line 1...
1
#include "canvasdraw.h"
1
#include "canvasdraw.h"
2
 
2
 
3
/* not used ?? */
-
 
4
/*
-
 
5
char *data2js_array(int data[],int len);
-
 
6
char *xy2js_array(int xy[],int len);
-
 
7
*/
-
 
8
 
-
 
9
/*
-
 
10
 
-
 
11
just for the javascript switches():
-
 
12
point = 0       points =1
-
 
13
circle = 2      circles = 3
-
 
14
line =4         lines = 5
-
 
15
segment = 6     segments = 7
-
 
16
arrow = 8       arrows = 9
-
 
17
triangle = 10   triangles = 11
-
 
18
polygon = 12
-
 
19
text = 13
-
 
20
rect = 14
-
 
21
rects =15
-
 
22
poly = 16
-
 
23
polys = 17
-
 
24
paralelogram = 18
-
 
25
images = 20
-
 
26
28/6/2015:
-
 
27
the next js-code block (parsing/scanning the multidraw objects array) is -for now- generic,
-
 
28
e.g. not responsive to the actual draw_types used.
-
 
29
 
-
 
30
TODO: examine/parse the *draw_Types and make the js-code accordingly (e.g. specific and not generic)
-
 
31
 
-
 
32
Firefox does not support drawing SVGimages to canvas unless the svg file
-
 
33
has width/height attributes on the root <svg> element and those width/height attributes are not percentages
-
 
34
 
-
 
35
 container_div.addEventListener( 'mouseup'    , mouseup,  false);\
-
 
36
 container_div.addEventListener( 'mousemove'  , mousemove,false);\
-
 
37
 container_div.addEventListener( 'mousedown'  , mousedown,false);\
-
 
38
 container_div.addEventListener( 'touchstart' , function(e) { e.preventDefault(); mousedown(e.changedTouches[0]);},false);\
-
 
39
 container_div.addEventListener( 'touchmove'  , function(e) { e.preventDefault(); mousemove(e.changedTouches[0]);},false);\
-
 
40
 container_div.addEventListener( 'touchend'   , function(e) { e.preventDefault(); mouseup(  e.changedTouches[0]);},false);\
-
 
41
 
-
 
42
replace:
-
 
43
 var canvas_rect = canvas_userdraw.getBoundingClientRect();\
-
 
44
 var y = evt.clientY - canvas_rect.top;\
-
 
45
 var x = evt.clientX - canvas_rect.left;\
-
 
46
by:
-
 
47
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
48
 var x = mouse.x;\
-
 
49
 var y = mouse.y;\
-
 
50
 
-
 
51
*/
-
 
52
 
-
 
53
void add_js_multidraw(FILE *js_include_file,int canvas_root_id,char *draw_types,char *button_style,int use_offset){
-
 
54
fprintf(js_include_file,"\n/* begin multidraw  */\n\
-
 
55
var canvas_userdraw = create_canvas%d(999,xsize,ysize);\
-
 
56
var context_userdraw = canvas_userdraw.getContext(\"2d\");\
-
 
57
var multidraw_click_cnt = 0;\
-
 
58
if(wims_status != \"done\"){\
-
 
59
 canvas_div.addEventListener('mousedown'  , user_draw, false);\
-
 
60
 canvas_div.addEventListener('mousemove'  , user_drag, false);\
-
 
61
 canvas_div.addEventListener('touchstart' , function(e) { e.preventDefault(); user_draw(e.changedTouches[0]);},false);\
-
 
62
 canvas_div.addEventListener('touchmove'  , function(e) { e.preventDefault(); user_drag(e.changedTouches[0]);},false);\
-
 
63
};\
-
 
64
clear_draw_area%d = function(type,name){\
-
 
65
  switch(type){\
-
 
66
   case 0: context_points.clearRect(0,0,xsize,ysize);points_x = [];points_y = [];break;\
-
 
67
   case 1: points_x.pop();points_y.pop();draw_points();break;\
-
 
68
   case 2: context_circles.clearRect(0,0,xsize,ysize);circles_x = [];circles_y = []; multi_radius = [];break;\
-
 
69
   case 3: circles_x.pop();circles_y.pop(); multi_radius.pop();draw_circles();break;\
-
 
70
   case 4: context_lines.clearRect(0,0,xsize,ysize);lines_x = [];lines_y = [];break;\
-
 
71
   case 5: lines_x.pop();lines_y.pop();lines_x.pop();lines_y.pop();draw_lines();break;\
-
 
72
   case 6: context_segments.clearRect(0,0,xsize,ysize);segments_x = [];segments_y = [];break;\
-
 
73
   case 7: segments_x.pop();segments_y.pop();segments_x.pop();segments_y.pop();draw_segments();break;\
-
 
74
   case 8: context_arrows.clearRect(0,0,xsize,ysize);arrows_x = [];arrows_y = [];break;\
-
 
75
   case 9: arrows_x.pop();arrows_y.pop();arrows_x.pop();arrows_y.pop();draw_arrows();break;\
-
 
76
   case 10:context_triangles.clearRect(0,0,xsize,ysize); triangles_x = [];triangles_y = [];break;\
-
 
77
   case 11:for(var p=0;p<3;p++){triangles_x.pop();triangles_y.pop();};draw_triangles();break;\
-
 
78
   case 12:context_closedpoly.clearRect(0,0,xsize,ysize);closedpoly_x = [];closedpoly_y = [];break;\
-
 
79
   case 13:context_text.clearRect(0,0,xsize,ysize);text_x.pop();text_y.pop();text_abc.pop();draw_text();break;\
-
 
80
   case 14:context_rects.clearRect(0,0,xsize,ysize);rects_x = [];rects_y = [];break;\
-
 
81
   case 15:rects_x.pop();rects_y.pop();rects_x.pop();rects_y.pop();draw_rects();break;\
-
 
82
   case 16:context_polys.clearRect(0,0,xsize,ysize); polys_x = [];polys_y = [];break;\
-
 
83
   case 17:for(var p=0;p<polynum;p++){polys_x.pop();polys_y.pop();};draw_polys();break;\
-
 
84
   case 18:context_parallelogram.clearRect(0,0,xsize,ysize); parallelogram_x = [];parallelogram_y = [];break;\
-
 
85
   case 19:for(var p = 0; p < 4;p++){ parallelogram_x.pop();parallelogram_y.pop();};draw_parallelogram();break;\
-
 
86
   case 20:var len = images_id.length;if( len == 0 ){return;};var img = document.getElementById(images_id[len-1]);if( img.tagName == 'DIV' ){ img.innerHTML=null;};images_x.pop();images_y.pop();images_id.pop();draw_images();break;\
-
 
87
   case 21:context_curvedarrows.clearRect(0,0,xsize,ysize);curvedarrows_x = [];curvedarrows_y = [];break;\
-
 
88
   case 22:curvedarrows_x.pop();curvedarrows_y.pop();curvedarrows_x.pop();curvedarrows_y.pop();curvedarrows_x.pop();curvedarrows_y.pop();draw_curvedarrows();break;\
-
 
89
   case 23:context_curvedarrows2.clearRect(0,0,xsize,ysize);curvedarrows2_x = [];curvedarrows2_y = [];break;\
-
 
90
   case 24:curvedarrows2_x.pop();curvedarrows2_y.pop();curvedarrows2_x.pop();curvedarrows2_y.pop();curvedarrows2_x.pop();curvedarrows2_y.pop();draw_curvedarrows2();break;\
-
 
91
   default:break;\
-
 
92
 };\
-
 
93
};\
-
 
94
function user_draw(evt){\
-
 
95
 if(evt.button == 2){clear_draw_area%d(userdraw_primitive,0);return;};\
-
 
96
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
97
 var x = mouse.x;\
-
 
98
 var y = mouse.y;\
-
 
99
 switch(userdraw_primitive){\
-
 
100
  case 0: points(x,y,0,0);break;\
-
 
101
  case 1: points(x,y,0,1);break;\
-
 
102
  case 2: circles(x,y,0,0);break;\
-
 
103
  case 3: circles(x,y,0,1);break;\
-
 
104
  case 4: lines(x,y,0,0);break;\
-
 
105
  case 5: lines(x,y,0,1);break;\
-
 
106
  case 6: segments(x,y,0,0);break;\
-
 
107
  case 7: segments(x,y,0,1);break;\
-
 
108
  case 8: arrows(x,y,0,0);break;\
-
 
109
  case 9: arrows(x,y,0,1);break;\
-
 
110
  case 10: triangles(x,y,0,0);break;\
-
 
111
  case 11: triangles(x,y,0,1);break;\
-
 
112
  case 12: closedpoly(x,y,0,0);break;\
-
 
113
  case 13: text(x,y,0,1);break;\
-
 
114
  case 14: rects(x,y,0,0);break;\
-
 
115
  case 15: rects(x,y,0,1);break;\
-
 
116
  case 16: polys(x,y,0,0);break;\
-
 
117
  case 17: polys(x,y,0,1);break;\
-
 
118
  case 18: parallelogram(x,y,0,0);break;\
-
 
119
  case 19: parallelogram(x,y,0,1);break;\
-
 
120
  case 20: images(x,y,0,1);break;\
-
 
121
  case 21: curvedarrows(x,y,0,0);break;\
-
 
122
  case 22: curvedarrows(x,y,0,1);break;\
-
 
123
  case 23: curvedarrows2(x,y,0,0);break;\
-
 
124
  case 24: curvedarrows2(x,y,0,1);break;\
-
 
125
  default:break;\
-
 
126
 };\
-
 
127
};\
-
 
128
function user_drag(evt){\
-
 
129
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
130
 var x = mouse.x;\
-
 
131
 var y = mouse.y;\
-
 
132
 switch(userdraw_primitive){\
-
 
133
  case 0: break;\
-
 
134
  case 1: break;\
-
 
135
  case 2: circles(x,y,1,0);break;\
-
 
136
  case 3: circles(x,y,1,1);break;\
-
 
137
  case 4: lines(x,y,1,0);break;\
-
 
138
  case 5: lines(x,y,1,1);break;\
-
 
139
  case 6: segments(x,y,1,0);break;\
-
 
140
  case 7: segments(x,y,1,1);break;\
-
 
141
  case 8: arrows(x,y,1,0);break;\
-
 
142
  case 9: arrows(x,y,1,1);break;\
-
 
143
  case 10: triangles(x,y,1,0);break;\
-
 
144
  case 11: triangles(x,y,1,1);break;\
-
 
145
  case 12: closedpoly(x,y,1,0);break;\
-
 
146
  case 13: break;\
-
 
147
  case 14: rects(x,y,1,0);break;\
-
 
148
  case 15: rects(x,y,1,1);break;\
-
 
149
  case 16: polys(x,y,1,0);break;\
-
 
150
  case 17: polys(x,y,1,1);break;\
-
 
151
  case 18: parallelogram(x,y,1,0);break;\
-
 
152
  case 19: parallelogram(x,y,1,1);break;\
-
 
153
  case 20: images(x,y,1,1);break;\
-
 
154
  case 21: curvedarrows(x,y,1,0);break;\
-
 
155
  case 22: curvedarrows(x,y,1,1);break;\
-
 
156
  case 23: curvedarrows2(x,y,1,0);break;\
-
 
157
  case 24: curvedarrows2(x,y,1,1);break;\
-
 
158
  default:break;\
-
 
159
 };\
-
 
160
};\
-
 
161
var draw_things = [\"%s\"];\
-
 
162
var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
-
 
163
var inner_html=\"\";\
-
 
164
var button_style = \"%s\";\
-
 
165
var id_x;\
-
 
166
var id_y;\
-
 
167
var id_r;\
-
 
168
var curvedarrow_type_cnt=0;\
-
 
169
var use_controls = 1;\
-
 
170
var draw_things_length =  draw_things.length;\
-
 
171
if(multilabel[0] == 'NOCONTROLS'){use_controls = 0;}else{ if( typeof(multilabel[multilabel.length - 1 ]) === 'undefined' ){multilabel[multilabel.length - 1] = 'stop drawing';};};\
-
 
172
for(var p = 0;p < draw_things_length;p++){\
-
 
173
 var desc;\
-
 
174
 id_r = 0;\
-
 
175
 if( multistrokeopacity[p] > 1 ){ multistrokeopacity[p] = (0.0039215*multistrokeopacity[p]).toFixed(2); };\
-
 
176
 if( multifillopacity[p] > 1 ){ multifillopacity[p] =  (0.0039215*multifillopacity[p]).toFixed(2); };\
-
 
177
 if( draw_things[p] == 'point' || draw_things[p] == 'points' ){\
-
 
178
  var canvas_points = create_canvas%d(1000,xsize,ysize);\
-
 
179
  var context_points = canvas_points.getContext(\"2d\");\
-
 
180
  context_points.strokeStyle = \"rgba(\"+multistrokecolors[p]+\",\"+multistrokeopacity[p]+\")\";\
-
 
181
  context_points.fillStyle = context_points.strokeStyle;\
-
 
182
  context_points.lineWidth = multilinewidth[p];\
-
 
183
  if(multilinewidth[p]%%2 == 1){ context_points.translate(0.5,0.5);};\
-
 
184
  var points_x = new Array();var points_y = new Array();\
-
 
185
  var points_snap = multisnaptogrid[p];\
-
 
186
  if(draw_things[p] == 'point' ){desc = 0;}else{desc = 1;};\
-
 
187
  id_x = 'input_points_x';id_y = 'input_points_y';\
-
 
188
 }\
-
 
189
 else\
-
 
190
 {\
-
 
191
  if( draw_things[p] == 'circle' || draw_things[p] == 'circles' ){\
-
 
192
   var canvas_circles = create_canvas%d(1001,xsize,ysize);\
-
 
193
   var context_circles = canvas_circles.getContext(\"2d\");\
-
 
194
   context_circles.lineWidth = multilinewidth[p];\
-
 
195
   if(multilinewidth[p]%%2 == 1){ context_circles.translate(0.5,0.5);};\
-
 
196
   context_circles.strokeStyle = \"rgba(\"+multistrokecolors[p]+\",\"+multistrokeopacity[p]+\")\";\
-
 
197
   if(multifill[p] == '1' ){ context_circles.fillStyle = \"rgba(\"+multifillcolors[p]+\",\"+multifillopacity[p]+\")\";}else{context_circles.fillStyle = \"rgba( 255,255,255,0)\"; };\
-
 
198
   if(multidash[p] == '1' ){ if( context_circles.setLineDash ){context_circles.setLineDash([2,4]);}else{if(context_circles.mozDash){context_circles.mozDash = [2,4]};};};\
-
 
199
   var circles_x = new Array();var circles_y = new Array();var multi_radius = new Array();\
-
 
200
   var circles_snap = multisnaptogrid[p];\
-
 
201
   if( draw_things[p] == 'circle' ){desc = 2;}else{desc = 3;};\
-
 
202
   id_x = 'input_circles_x';id_y = 'input_circles_y';id_r = 'input_circles_r';\
-
 
203
  }\
-
 
204
  else\
-
 
205
  {\
-
 
206
   if( draw_things[p] == 'line' || draw_things[p] == 'lines' ){\
-
 
207
    var canvas_lines = create_canvas%d(1002,xsize,ysize);\
-
 
208
    var context_lines = canvas_lines.getContext(\"2d\");\
-
 
209
    context_lines.lineWidth = multilinewidth[p];\
-
 
210
    if(multilinewidth[p]%%2 == 1){ context_lines.translate(0.5,0.5);};\
-
 
211
    context_lines.strokeStyle = \"rgba(\"+multistrokecolors[p]+\",\"+multistrokeopacity[p]+\")\";\
-
 
212
    if(multidash[p] == '1' ){ if( context_lines.setLineDash ){context_lines.setLineDash([2,4]);}else{if(context_lines.mozDash){context_lines.mozDash = [2,4]};};};\
-
 
213
    var lines_x = new Array();var lines_y = new Array();\
-
 
214
    var lines_snap = multisnaptogrid[p];\
-
 
215
    if(draw_things[p] == 'line' ){desc = 4;}else{desc = 5;};\
-
 
216
    id_x = 'input_lines_x';id_y = 'input_lines_y';\
-
 
217
   }\
-
 
218
   else\
-
 
219
   {\
-
 
220
    if( draw_things[p] == 'segment' || draw_things[p] == 'segments' ){\
-
 
221
     var canvas_segments = create_canvas%d(1003,xsize,ysize);\
-
 
222
     var context_segments = canvas_segments.getContext(\"2d\");\
-
 
223
     context_segments.lineWidth = multilinewidth[p];\
-
 
224
     if(multilinewidth[p]%%2 == 1){ context_segments.translate(0.5,0.5);};\
-
 
225
     context_segments.strokeStyle = \"rgba(\"+multistrokecolors[p]+\",\"+multistrokeopacity[p]+\")\";\
-
 
226
     if(multidash[p] == '1' ){ if( context_segments.setLineDash ){context_segments.setLineDash([2,4]);}else{if(context_segments.mozDash){context_segments.mozDash = [2,4]};};};\
-
 
227
     var segments_x = new Array();var segments_y = new Array();\
-
 
228
     var segments_snap = multisnaptogrid[p];\
-
 
229
     if( draw_things[p] == 'segment' ){desc = 6;}else{ desc = 7;};\
-
 
230
     id_x = 'input_segments_x';id_y = 'input_segments_y';\
-
 
231
    }\
-
 
232
    else\
-
 
233
    {\
-
 
234
     if( draw_things[p] == 'arrow' || draw_things[p] == 'arrows' ){\
-
 
235
      var canvas_arrows = create_canvas%d(1004,xsize,ysize);\
-
 
236
      var context_arrows =  canvas_arrows.getContext(\"2d\");\
-
 
237
      context_arrows.lineWidth = multilinewidth[p];\
-
 
238
      if(multilinewidth[p]%%2 == 1){ context_arrows.translate(0.5,0.5);};\
-
 
239
      context_arrows.lineCap = \"round\";\
-
 
240
      context_arrows.strokeStyle = \"rgba(\"+multistrokecolors[p]+\",\"+multistrokeopacity[p]+\")\";\
-
 
241
      context_arrows.fillStyle = context_arrows.strokeStyle;\
-
 
242
      if(multidash[p] == '1' ){ if( context_arrows.setLineDash ){context_arrows.setLineDash([2,4]);}else{if(context_arrows.mozDash){context_arrows.mozDash = [2,4]};};};\
-
 
243
      var arrows_x = new Array();var arrows_y = new Array();\
-
 
244
      var arrows_snap = multisnaptogrid[p];\
-
 
245
      if( draw_things[p] == 'arrow' ){desc = 8;}else{desc = 9;};\
-
 
246
      id_x = 'input_arrows_x';id_y = 'input_arrows_y';\
-
 
247
     }\
-
 
248
     else\
-
 
249
     {\
-
 
250
      if( draw_things[p] == 'rect' || draw_things[p] == 'rects' ){\
-
 
251
       var canvas_rects = create_canvas%d(1005,xsize,ysize);\
-
 
252
       var context_rects = canvas_rects.getContext(\"2d\");\
-
 
253
       context_rects.lineWidth = multilinewidth[p];\
-
 
254
       if(multilinewidth[p]%%2 == 1){ context_rects.translate(0.5,0.5);};\
-
 
255
       context_rects.strokeStyle = \"rgba(\"+multistrokecolors[p]+\",\"+multistrokeopacity[p]+\")\";\
-
 
256
       if(multidash[p] == '1' ){ if( context_rects.setlineDash ){context_rects.setlineDash([2,4]);}else{if(context_rects.mozDash){context_rects.mozDash = [2,4]};};};\
-
 
257
       if(multifill[p] == '1' ){ context_rects.fillStyle = \"rgba(\"+multifillcolors[p]+\",\"+multifillopacity[p]+\")\";}else{context_rects.fillStyle = \"rgba( 255,255,255,0)\"; };\
-
 
258
       var rects_x = new Array();var rects_y = new Array();\
-
 
259
       var rects_snap = multisnaptogrid[p];\
-
 
260
       if(draw_things[p] == 'rect' ){desc = 14;}else{desc = 15;};\
-
 
261
       id_x = 'input_rects_x';id_y = 'input_rects_y';\
-
 
262
      }\
-
 
263
      else\
-
 
264
      {\
-
 
265
       if( draw_things[p] == 'closedpoly'){\
-
 
266
        var canvas_closedpoly = create_canvas%d(1006,xsize,ysize);\
-
 
267
        var context_closedpoly =  canvas_closedpoly.getContext(\"2d\");\
-
 
268
        context_closedpoly.lineCap = \"round\";\
-
 
269
        context_closedpoly.lineWidth = multilinewidth[p];\
-
 
270
        if(multilinewidth[p]%%2 == 1){ context_closedpoly.translate(0.5,0.5);};\
-
 
271
        context_closedpoly.lineCap = \"round\";\
-
 
272
        context_closedpoly.strokeStyle = \"rgba(\"+multistrokecolors[p]+\",\"+multistrokeopacity[p]+\")\";\
-
 
273
        if(multifill[p] == '1' ){ context_closedpoly.fillStyle = \"rgba(\"+multifillcolors[p]+\",\"+multifillopacity[p]+\")\";}else{context_closedpoly.fillStyle = \"rgba( 255,255,255,0)\"; };\
-
 
274
        if(multidash[p] == '1' ){ if( context_closedpoly.setLineDash ){context_closedpoly.setLineDash([2,4]);}else{if(context_closedpoly.mozDash){context_closedpoly.mozDash = [2,4]};};};\
-
 
275
        var closedpoly_x = new Array();var closedpoly_y = new Array();\
-
 
276
        var closedpoly_snap = multisnaptogrid[p];\
-
 
277
        desc = 12;\
-
 
278
        id_x = 'input_closedpoly_x';id_y = 'input_closedpoly_y';\
-
 
279
       }\
-
 
280
       else\
-
 
281
       {\
-
 
282
        if( draw_things[p] == 'triangle' || draw_things[p] == 'triangles' ){\
-
 
283
         var canvas_triangles = create_canvas%d(1007,xsize,ysize);\
-
 
284
         var context_triangles = canvas_triangles.getContext(\"2d\");\
-
 
285
         context_triangles.lineCap = \"round\";\
-
 
286
         context_triangles.lineWidth = multilinewidth[p];\
-
 
287
         if(multilinewidth[p]%%2 == 1){ context_triangles.translate(0.5,0.5);};\
-
 
288
         context_triangles.strokeStyle = \"rgba(\"+multistrokecolors[p]+\",\"+multistrokeopacity[p]+\")\";\
-
 
289
         if(multifill[p] == '1' ){ context_triangles.fillStyle = \"rgba(\"+multifillcolors[p]+\",\"+multifillopacity[p]+\")\";}else{context_triangles.fillStyle = \"rgba( 255,255,255,0)\"; };\
-
 
290
         if(multidash[p] == '1' ){ if( context_triangles.setLineDash ){context_triangles.setLineDash([2,4]);}else{if(context_triangles.mozDash){context_triangles.mozDash = [2,4]};};};\
-
 
291
         var triangles_x = new Array();var triangles_y = new Array();\
-
 
292
         var triangles_snap = multisnaptogrid[p];\
-
 
293
         if( draw_things[p] == 'triangle'){desc = 10;};\
-
 
294
         if( draw_things[p] == 'triangles'){desc = 11;};\
-
 
295
         id_x = 'input_triangles_x';id_y = 'input_triangles_y';id_r = 'input_triangles_r';\
-
 
296
        }\
-
 
297
        else\
-
 
298
        {\
-
 
299
         if( draw_things[p] == 'curvedarrow' || draw_things[p] == 'curvedarrows'){\
-
 
300
          var canvas_curvedarrows = create_canvas%d(1008,xsize,ysize);\
-
 
301
          var context_curvedarrows =  canvas_curvedarrows.getContext(\"2d\");\
-
 
302
          context_curvedarrows.lineWidth = multilinewidth[p];\
-
 
303
          if(multilinewidth[p]%%2 == 1){ context_curvedarrows.translate(0.5,0.5);};\
-
 
304
          context_curvedarrows.lineCap = \"round\";\
-
 
305
          context_curvedarrows.strokeStyle = \"rgba(\"+multistrokecolors[p]+\",\"+multistrokeopacity[p]+\")\";\
-
 
306
          context_curvedarrows.fillStyle = context_curvedarrows.strokeStyle;\
-
 
307
          if(multidash[p] == '1' ){ if( context_curvedarrows.setLineDash ){context_curvedarrows.setLineDash([2,4]);}else{if(context_curvedarrows.mozDash){context_curvedarrows.mozDash = [2,4]};};};\
-
 
308
          var curvedarrows_x = new Array();var curvedarrows_y = new Array();\
-
 
309
          var curvedarrows_snap = multisnaptogrid[p];\
-
 
310
          if( draw_things[p] == 'curvedarrow' ){desc = 21;}else{desc = 22;};\
-
 
311
          id_x = 'input_curvedarrows_x';id_y = 'input_curvedarrows_y';;id_r = 'input_curvedarrows_r';\
-
 
312
         }\
-
 
313
         else\
-
 
314
         {\
-
 
315
          if( draw_things[p] == 'curvedarrow2' || draw_things[p] == 'curvedarrows2'){\
-
 
316
           if( draw_things[p] == 'curvedarrow2' ){desc = 23;}else{desc = 24;};\
-
 
317
           var canvas_curvedarrows2 = create_canvas%d(1009,xsize,ysize);\
-
 
318
           var context_curvedarrows2 =  canvas_curvedarrows2.getContext(\"2d\");\
-
 
319
           context_curvedarrows2.lineWidth = multilinewidth[p];\
-
 
320
           if(multilinewidth[p]%%2 == 1){ context_curvedarrows2.translate(0.5,0.5);};\
-
 
321
           context_curvedarrows2.lineCap = \"round\";\
-
 
322
           context_curvedarrows2.strokeStyle = \"rgba(\"+multistrokecolors[p]+\",\"+multistrokeopacity[p]+\")\";\
-
 
323
           context_curvedarrows2.fillStyle = context_curvedarrows2.strokeStyle;\
-
 
324
           if(multidash[p] == '1' ){ if( context_curvedarrows2.setLineDash ){context_curvedarrows2.setLineDash([2,4]);}else{if(context_curvedarrows2.mozDash){context_curvedarrows2.mozDash = [2,4]};};};\
-
 
325
           var curvedarrows2_x = new Array();var curvedarrows2_y = new Array();\
-
 
326
           var curvedarrows2_snap = multisnaptogrid[p];\
-
 
327
           id_x = 'input_curvedarrows2_x';id_y = 'input_curvedarrows2_y';id_r = 'input_curvedarrows2_r';\
-
 
328
          }\
-
 
329
          else\
-
 
330
          {\
-
 
331
           if( draw_things[p].indexOf('para') != -1 ){\
-
 
332
            var canvas_parallelogram = create_canvas%d(1010,xsize,ysize);\
-
 
333
            var context_parallelogram = canvas_parallelogram.getContext(\"2d\");\
-
 
334
            context_parallelogram.lineCap = \"round\";\
-
 
335
            context_parallelogram.lineWidth = multilinewidth[p];\
-
 
336
            if(multilinewidth[p]%%2 == 1){ context_parallelogram.translate(0.5,0.5);};\
-
 
337
            context_parallelogram.strokeStyle = \"rgba(\"+multistrokecolors[p]+\",\"+multistrokeopacity[p]+\")\";\
-
 
338
            if(multifill[p] == '1' ){ context_parallelogram.fillStyle = \"rgba(\"+multifillcolors[p]+\",\"+multifillopacity[p]+\")\";}else{context_parallelogram.fillStyle = \"rgba( 255,255,255,0)\"; };\
-
 
339
            if(multidash[p] == '1' ){ if( context_parallelogram.setLineDash ){context_parallelogram.setLineDash([2,4]);}else{if(context_parallelogram.mozDash){context_parallelogram.mozDash = [2,4]};};};\
-
 
340
            var parallelogram_x = new Array();var parallelogram_y = new Array();\
-
 
341
            var parallelogram_snap = multisnaptogrid[p];\
-
 
342
            if( draw_things[p] == 'parallelogram'){multiuserinput[p] =  0;desc = 18;};\
-
 
343
            if( draw_things[p] == 'parallelograms'){multiuserinput[p] =  0;desc = 19;};\
-
 
344
            id_x = 'input_parallelogram_x';id_y = 'input_parallelogram_y';id_r = 'input_parallelogram_r';\
-
 
345
           }\
-
 
346
           else\
-
 
347
           {\
-
 
348
            if( draw_things[p].indexOf('poly') != -1 ){\
-
 
349
             var canvas_polys = create_canvas%d(1011,xsize,ysize);\
-
 
350
             var context_polys = canvas_polys.getContext(\"2d\");\
-
 
351
             context_polys.lineCap = \"round\";\
-
 
352
             context_polys.lineWidth = multilinewidth[p];\
-
 
353
             if(multilinewidth[p]%%2 == 1){ context_polys.translate(0.5,0.5);};\
-
 
354
             context_polys.strokeStyle = \"rgba(\"+multistrokecolors[p]+\",\"+multistrokeopacity[p]+\")\";\
-
 
355
             if(multifill[p] == '1' ){ context_polys.fillStyle = \"rgba(\"+multifillcolors[p]+\",\"+multifillopacity[p]+\")\";}else{context_polys.fillStyle = \"rgba( 255,255,255,0)\"; };\
-
 
356
             if(multidash[p] == '1' ){ if( context_polys.setLineDash ){context_polys.setLineDash([2,4]);}else{if(context_polys.mozDash){context_polys.mozDash = [2,4]};};};\
-
 
357
             var polys_x = new Array();var polys_y = new Array();\
-
 
358
             var polys_snap = multisnaptogrid[p];\
-
 
359
             if( draw_things[p].indexOf('polys') != -1){desc = 17;}else{desc = 16;}\
-
 
360
             multiuserinput[p] = 0;\
-
 
361
             id_x = 'input_polys_x';id_y = 'input_polys_y';id_r = 'input_polys_r';\
-
 
362
            }\
-
 
363
            else\
-
 
364
            {\
-
 
365
             if( draw_things[p] == 'images' ){\
-
 
366
              var canvas_images = create_canvas%d(1012,xsize,ysize);\
-
 
367
              var context_images = canvas_images.getContext(\"2d\");\
-
 
368
              context_images.font = multifont_family;\
-
 
369
              context_images.fillStyle = \"rgba(\"+multifont_color+\",\"+multistrokeopacity[p]+\")\";\
-
 
370
              var images_snap = multisnaptogrid[p];\
-
 
371
              var images_x = new Array();var images_y = new Array();\
-
 
372
              var images_id = new Array();\
-
 
373
              id_x = 'input_images_x';id_y = 'input_images_y';id_r = 'input_images_r';\
-
 
374
              if( typeof(imagepalette) === 'object' ){multiuserinput[p] = 1;};\
-
 
375
              desc = 20;\
-
 
376
             }\
-
 
377
             else\
-
 
378
             {\
-
 
379
              if( draw_things[p] == 'text' ){\
-
 
380
               var canvas_text = create_canvas%d(1013,xsize,ysize);\
-
 
381
               var context_text = canvas_text.getContext(\"2d\");\
-
 
382
               context_text.font = multifont_family;\
-
 
383
               context_text.fillStyle = \"rgba(\"+multifont_color+\",\"+multistrokeopacity[p]+\")\";\
-
 
384
               var text_snap = multisnaptogrid[p];\
-
 
385
               var text_x = new Array;var text_y = new Array; var text_abc = new Array();\
-
 
386
               id_x = 'input_text_x';id_y = 'input_text_y';id_r = 'input_text_r';\
-
 
387
               desc = 13;\
-
 
388
              };\
-
 
389
             };\
-
 
390
            };\
-
 
391
           };\
-
 
392
          };\
-
 
393
         };\
-
 
394
        };\
-
 
395
       };\
-
 
396
      };\
-
 
397
     };\
-
 
398
    };\
-
 
399
   };\
-
 
400
  };\
-
 
401
 };\
-
 
402
 if( use_controls == 1 ){\
-
 
403
  inner_html+=\"<tr style='background-color:rgba(\"+multistrokecolors[p]+\",0.4)'><td><input type='button' id='canvasdraw_\"+draw_things[p]+\"' style=\"+button_style+\" onclick='javascript:userdraw_primitive=\"+desc+\";multidraw_click_cnt = 0;' value='\"+multilabel[p]+\"' /></td><td><input type='button' style='\"+button_style+\"' onclick='javascript:clear_draw_area%d(\"+desc+\",\"+p+\");' value='delete' /></td>\";\
3
void add_js_zoom_buttons(char *stroke_color,double stroke_opacity){
404
  if(multiuserinput[p] == '1'){ \
-
 
405
   if(desc == 0 || desc == 1 ){\
-
 
406
    inner_html+=\"<td><b>(</b><input type='text' size='5' value='' id='\"+id_x+\"' style='\"+button_style+\"' /><b>:</b> <input type='text' size='5' value='' id='\"+id_y+\"' style='\"+button_style+\"' /> <b>)</b></td>\";\
-
 
407
   }\
-
 
408
   else\
-
 
409
   {\
-
 
410
    if(desc == 2 || desc == 3){\
-
 
411
     inner_html+=\"<td><b>M&nbsp;:&nbsp;(<input type='text' size='5' value='' id='\"+id_x+\"' style='\"+button_style+\"' /> : <input type='text' size='5' value='' id='\"+id_y+\"' style='\"+button_style+\"' />)&nbsp;&nbsp;R</b>&nbsp;:&nbsp;<input type='text' size='3' value='' id='\"+id_r+\"' style='\"+button_style+\"' /></b></td>\";\
-
 
412
    }\
-
 
413
    else\
-
 
414
    {\
-
 
415
     if(desc >3 && desc <10 || desc == 14 || desc == 15){\
-
 
416
      inner_html+=\"<td><b>(</b><input type='text' size='5' value='x1 : y1' id='\"+id_x+\"' style='\"+button_style+\";text-align:center;' /><b>) --- (</b> <input type='text' size='5' value='x2 : y2' id='\"+id_y+\"' style='\"+button_style+\";text-align:center;' /> <b>)</b></td>\";\
-
 
417
     }\
-
 
418
     else\
-
 
419
     {\
-
 
420
      if( desc == 10 || desc == 11 || desc > 20){\
-
 
421
       inner_html+=\"<td><b>(<input type='text' size='5' value='x1 : y1' id='\"+id_x+\"' style='\"+button_style+\"' />) -- (<input type='text' size='5' value='x2 : y2' id='\"+id_y+\"' style='\"+button_style+\"' />) -- (<input type='text' size='5' value='x3 : y3' id='\"+id_r+\"' style='\"+button_style+\"' />)</b></td>\";\
-
 
422
      }\
-
 
423
      else\
-
 
424
      {\
-
 
425
       if( desc == 12 || desc == 16 || desc == 17 || desc == 18 || desc == 19){\
-
 
426
        inner_html+=\"<td><b>(<input type='text' size='8' value='x1,x2...x_n' id='\"+id_x+\"' style='\"+button_style+\"' /> ---- <input type='text' size='8' value='y1,y2...y_n' id='\"+id_y+\"' style='\"+button_style+\"' />)</b></td>\";\
-
 
427
       }\
-
 
428
       else\
-
 
429
       {\
-
 
430
        if( desc == 13 ){\
-
 
431
         inner_html+=\"<td><b>(&nbsp;<input type='text' size='2' value='' id='\"+id_x+\"' style='\"+button_style+\"' /> - <input type='text' size='2' value='' id='\"+id_y+\"' style='\"+button_style+\"' />&nbsp;)</b><input type='text' size='4' value='' id='\"+id_r+\"' style='\"+button_style+\"' /></td>\";\
-
 
432
        }\
-
 
433
        else\
-
 
434
        {\
-
 
435
         if( desc == 20 ){\
-
 
436
          inner_html+=\"<td><table style ='\"+button_style+\"'><tr>\";\
-
 
437
          for(var im=0; im < imagepalette.length; im++){\
-
 
438
           if( im %% 4 == 0 ){ inner_html+=\"</tr><tr>\"};\
-
 
439
           inner_html+=\"<td><img onclick='javascript:place_image_on_canvas(this.id);' src='\"+imagepalette[im]+\"' id='imagepalette_\"+im+\"' alt='none'/></td>\";\
-
 
440
          };\
-
 
441
          inner_html+=\"</table></td>\";\
-
 
442
         };\
-
 
443
        };\
-
 
444
       };\
-
 
445
      };\
-
 
446
     };\
-
 
447
    };\
-
 
448
   };\
-
 
449
   if( desc != 20 ){inner_html+=\"<td><input type='button' id='canvasdraw_ok_button'  style='\"+button_style+\"' onclick='javascript:update_draw_area%d(\"+desc+\",\"+id_x+\",\"+id_y+\",\"+id_r+\")' value='OK'/ ></td></tr>\";};\
-
 
450
  }\
-
 
451
  else\
-
 
452
  {\
-
 
453
   if( desc == 13 ){\
-
 
454
    inner_html+=\"<td><input type='text' size='4' value='' id='\"+id_r+\"' style='\"+button_style+\"' /></td><td></td><td></td></tr>\";\
-
 
455
   }\
-
 
456
   else\
-
 
457
   {\
-
 
458
    inner_html+\"<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>\";\
-
 
459
   };\
-
 
460
  };\
-
 
461
  if( wims_status != 'done' ){\
-
 
462
   tooltip_div.innerHTML = \"<table style='margin: 0 auto;'>\"+inner_html+\"<tr><td>&nbsp;</td><td><input type='button' id='canvasdraw_stop_drawing' style='\"+button_style+\"' value='\"+multilabel[multilabel.length - 1]+\"' onclick='javascript:userdraw_primitive=null;' /></td><td>&nbsp;</td></tr></table>\";\
-
 
463
  };\
-
 
464
 };\
-
 
465
 if( use_controls == 0 && draw_things_length == 1 ){userdraw_primitive= desc;};\
-
 
466
};\
-
 
467
function multi_snap_check(x,y,snap){\
-
 
468
 switch(snap){\
-
 
469
  case 1:return [snap_to_x(x),snap_to_y(y)];break;\
-
 
470
  case 2:return [snap_to_x(x),y];break;\
-
 
471
  case 3:return [x,snap_to_y(y)];break;\
-
 
472
  case 4:return snap_to_points(x,y);break;\
-
 
473
  default: return [x,y];break;\
-
 
474
 };\
-
 
475
};\
-
 
476
function coord_split(coord){if(coord.indexOf(':') > 0 ){return coord.split(':');}else{if(coord.indexOf(';') > 0 ){return coord.split(';');}else{if(coord.indexOf(',') > 0 ){return coord.split(',');}else{alert(coord+'-- X : Y ');return;};};};};\
-
 
477
function scale_xy(type,xy){var tmp_xmin = xmin;var tmp_xmax = xmax;var tmp_ymin = ymin;var tmp_ymax = ymax;xmin=zoom_xy[0];xmax=zoom_xy[1];ymin=zoom_xy[2];ymax=zoom_xy[3];if(type == 1 ){for(var p=0;p<xy.length;p++){xy[p] = px2x(xy[p]);};}else{for(var p=0;p<xy.length;p++){xy[p] = px2y(xy[p]);};};xmin = tmp_xmin;ymin = tmp_ymin;xmax = tmp_xmax;ymax = tmp_ymax;if(type == 1){for(var p=0;p<xy.length;p++){xy[p] = x2px(xy[p]);}}else{for(var p=0;p<xy.length;p++){xy[p] = y2px(xy[p]);};};return xy;};\
-
 
478
function scale_multi_radius(r){for(var p = 0 ; p < r.length;p++ ){r[p] = zoom_xy[0]/xmin*r[p];};return r;};\
-
 
479
redraw_all%d = function(){\
-
 
480
 if( points_x && points_x.length > 0 ){points_x = scale_xy(1,points_x);points_y = scale_xy(1,points_y);draw_points();};\
-
 
481
 if( circles_x && circles_x.length > 0 ){circles_x = scale_xy(1,circles_x);circles_y = scale_xy(1,circles_y);multi_radius = scale_multi_radius(multi_radius);draw_circles();};\
-
 
482
 if( segments_x && segments_x.length > 0 ){segments_x = scale_xy(1,segments_x);segments_y = scale_xy(1,segments_y);draw_segments();};\
-
 
483
 if( arrows_x && arrows_x.length > 0 ){arrows_x = scale_xy(1,arrows_x);arrows_y = scale_xy(2,arrows_y);draw_arrows();};\
-
 
484
 if( lines_x && lines_x.length > 0 ){lines_x = scale_xy(1,lines_x);lines_y = scale_xy(2,lines_y);draw_lines();};\
-
 
485
 if( triangles_x && triangles_x.length > 0 ){triangles_x = scale_xy(1,triangles_x);triangles_y = scale_xy(2,triangles_y);draw_triangles();};\
-
 
486
 if( rects_x && rects_x.length > 0 ){rects_x = scale_xy(1,rects_x);rects_y = scale_xy(2,rects_y);draw_rects();};\
-
 
487
 if( closedpoly_x && closedpoly_x.length > 0 ){closedpoly_x = scale_xy(1,closedpoly_x);closedpoly_y = scale_xy(2,closedpoly_y);draw_closedpoly();};\
-
 
488
 if( text_x && text_x.length > 0 ){text_x = scale_xy(1,text_x);text_y = scale_xy(2,text_y);draw_text();};\
-
 
489
 if( polys_x && polys_x.length > 0 ){polys_x = scale_xy(1,polys_x);polys_y = scale_xy(2,polys_y);draw_polys();};\
-
 
490
 if( parallelogram_x && parallelogram_x.length > 0 ){parallelogram_x = scale_xy(1,parallelogram_x);parallelogram_y = scale_xy(2,parallelogram_y);draw_parallelogram();};\
-
 
491
 if( images_x && images_x.length > 0 ){images_x = scale_xy(1,images_x);images_y = scale_xy(2,images_y);draw_images();};\
-
 
492
 if( curvedarrows_x && curvedarrows_x.length > 0 ){curvedarrows_x = scale_xy(1,curvedarrows_x);curvedarrows_y = scale_xy(2,curvedarrows_y);draw_curvedarrows();};\
-
 
493
 if( curvedarrows2_x && curvedarrows2_x.length > 0 ){curvedarrows2_x = scale_xy(1,curvedarrows2_x);curvedarrows2_y = scale_xy(2,curvedarrows2_y);draw_curvedarrows2();};\
-
 
494
return;\
-
 
495
};\
-
 
496
update_draw_area%d = function(desc,id_x,id_y,id_r){\
-
 
497
 if( desc == 20 ){ draw_images();return;};\
-
 
498
 var x1,x2,x3,y1,y2,y3,r,A,B,C;\
-
 
499
 x1 = document.getElementById(id_x.id).value;y1 = document.getElementById(id_y.id).value;\
-
 
500
 if(desc > 3 && desc < 12 || desc == 14 || desc == 15){A = coord_split(x1);B = coord_split(y1);if(A.length != 2 || B.length != 2){alert(' X : Y ');return;};x1 = x2px(safe_eval(A[0]));y1 = y2px(safe_eval(A[1]));x2 = x2px(safe_eval(B[0]));y2 = y2px(safe_eval(B[1]));\
-
 
501
 if(desc == 10 || desc == 11 ){r = document.getElementById(id_r.id).value;A = coord_split(r);x3 = x2px(safe_eval(A[0]));y3 = y2px(safe_eval(A[1]));};\
-
 
502
 }\
-
 
503
 else\
-
 
504
 {\
-
 
505
  if( desc < 4 ){\
-
 
506
   x1 = x2px(safe_eval(x1));y1 = y2px( safe_eval(y1));\
-
 
507
  };\
-
 
508
 };\
-
 
509
 if(desc > 20 ){\
-
 
510
  r = document.getElementById(id_r.id).value;\
-
 
511
  A = coord_split(x1);B = coord_split(y1);C = coord_split(r);\
-
 
512
  x1 = x2px(safe_eval(A[0]));y1 = y2px(safe_eval(A[1]));\
-
 
513
  x2 = x2px(safe_eval(B[0]));y2 = y2px(safe_eval(B[1]));\
-
 
514
  x3 = x2px(safe_eval(C[0]));y3 = y2px(safe_eval(C[1]));\
-
 
515
 };\
-
 
516
 switch(desc){\
-
 
517
  case 0: points(x1,y1,0,0);break;\
-
 
518
  case 1: points(x1,y1,0,1);break;\
-
 
519
  case 2: r = scale_x_radius(safe_eval(document.getElementById(id_r.id).value));multi_radius[0] = r;circles_x[0] = x1;circles_y[0] = y1;draw_circles();break;\
-
 
520
  case 3: r = scale_x_radius(safe_eval(document.getElementById(id_r.id).value));multi_radius.push(r);circles_x.push(x1);circles_y.push(y1);draw_circles();break;\
-
 
521
  case 4: lines_x[0] = x1;lines_x[1] = x2;lines_y[0] = y1;lines_y[1] = y2;calc_lines();draw_lines();break;\
-
 
522
  case 5: lines_x.push(x1);lines_x.push(x2);lines_y.push(y1);lines_y.push(y2);calc_lines();draw_lines();break;\
-
 
523
  case 6: segments_x[0] = x1;segments_x[1] = x2;segments_y[0] = y1;segments_y[1] = y2;draw_segments();break;\
-
 
524
  case 7: segments_x.push(x1);segments_x.push(x2);segments_y.push(y1);segments_y.push(y2);draw_segments();break;\
-
 
525
  case 8: arrows_x[0] = x1;arrows_x[1] = x2;arrows_y[0] = y1;arrows_y[1] = y2;draw_arrows();break;\
-
 
526
  case 9: arrows_x.push(x1);arrows_x.push(x2);arrows_y.push(y1);arrows_y.push(y2);draw_arrows();break;\
-
 
527
  case 10: triangles_x[0] = x1;triangles_x[1] = x2;triangles_x[2] = x3;triangles_y[0] = y1;triangles_y[1] = y2;triangles_y[2] = y3;draw_triangles();break;\
-
 
528
  case 11: triangles_x.push(x1);triangles_x.push(x2);triangles_x.push(x3);triangles_y.push(y1);triangles_y.push(y2);triangles_y.push(y3);draw_triangles();break;\
-
 
529
  case 12: A = coord_split(x1);B = coord_split(y1);var plus_len = A.length;if( plus_len != B.length){alert('mismatch between the number of x-values and  y-values');return;};for(var p = 0 ; p < plus_len ; p++){x1 = x2px(safe_eval(A[p]));y1 = y2px(safe_eval(B[p]));closedpoly_x.push(x1);closedpoly_y.push(y1);};x1 = x2px(safe_eval(A[0]));y1 = y2px(safe_eval(B[0]));closedpoly_x.push(x1);closedpoly_y.push(y1);draw_closedpoly();break;\
-
 
530
  case 13: text_abc.push( document.getElementById(id_r.id).value);text(x2px(safe_eval(x1)),y2px(safe_eval(y1)),0,1);draw_text();break;\
-
 
531
  case 14: rects_x[0] = x1;rects_x[1] = x2;rects_y[0] = y1;rects_y[1] = y2;draw_rects();break;\
-
 
532
  case 15: rects_x.push(x1);rects_x.push(x2);rects_y.push(y1);rects_y.push(y2);draw_rects();break;\
-
 
533
  case 16: polys_x[0] = x1;polys_x[1] = x2;polys_x[2] = x3;polys_y[0] = y1;polys_y[1] = y2;polys_y[2] = y3;draw_polys();break;\
-
 
534
  case 17: polys_x.push(x1);polys_x.push(x2);polys_x.push(x3);polys_y.push(y1);polys_y.push(y2);polys_y.push(y3);draw_polys();break;\
-
 
535
  case 18: parallelogram_x[0] = x1;parallelogram_x[1] = x2;parallelogram_x[2] = x3;parallelogram_y[0] = y1;parallelogram_y[1] = y2;parallelogram_y[2] = y3;draw_parallelogram();break;\
-
 
536
  case 19: parallelogram_x.push(x1);parallelogram_x.push(x2);parallelogram_x.push(x3);parallelogram_y.push(y1);parallelogram_y.push(y2);parallelogram_y.push(y3);draw_parallelogram();break;\
-
 
537
  case 20: draw_images();break;\
-
 
538
  case 21: curvedarrows_x[0] = x1;curvedarrows_x[1] = x2;curvedarrows_x[2] = x3;curvedarrows_y[0] = y1;curvedarrows_y[1] = y2;curvedarrows_y[2] = y3;draw_curvedarrows();break;\
-
 
539
  case 22: curvedarrows_x.push(x1);curvedarrows_x.push(x2);curvedarrows_x.push(x3);curvedarrows_y.push(y1);curvedarrows_y.push(y2);curvedarrows_y.push(y3);draw_curvedarrows();break;\
-
 
540
  case 23: curvedarrows2_x[0] = x1;curvedarrows2_x[1] = x2;curvedarrows2_x[2] = x3;curvedarrows2_y[0] = y1;curvedarrows2_y[1] = y2;curvedarrows2_y[2] = y3;draw_curvedarrows2();break;\
-
 
541
  case 24: curvedarrows2_x.push(x1);curvedarrows2_x.push(x2);curvedarrows2_x.push(x3);curvedarrows2_y.push(y1);curvedarrows2_y.push(y2);curvedarrows2_y.push(y3);draw_curvedarrows2();break;\
-
 
542
  default:break;\
-
 
543
 };\
-
 
544
};",canvas_root_id,canvas_root_id,canvas_root_id,draw_types,canvas_root_id,button_style,
-
 
545
 canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,
-
 
546
 canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id);
-
 
547
 
-
 
548
/*
-
 
549
 now add specific draw functions according to draw_types
-
 
550
 these will be somewhat simpler and less fancy-full than for the 'single object' userdraw command...
-
 
551
 the 'switch function' in the mouselisteners will probably eat more CPU...so the rest needs to be faster:
-
 
552
 we don't want to imitate these horribly slow js-libraries like JSXgraph
-
 
553
 
-
 
554
28/6/2015
-
 
555
TODO: add a selection of the 'generic js-code' from above into these C-code selector parts !
-
 
556
*/
-
 
557
 
-
 
558
/*
-
 
559
 3/8/2017 : multidraw text is allways centered on click-coordinates !
-
 
560
  use_offset : 0=none; 1=yoffset; 2=xoffset; 3=xyoffset; 4=centered
-
 
561
*/
-
 
562
 if( strstr(draw_types,"images") != 0){
-
 
563
  fprintf(js_include_file,"var current_id = null;var external_div_cnt=0;\
-
 
564
  function image_adjust(image,x,y){\
-
 
565
   var centered = %d;\
-
 
566
   var w = parseInt(image.width);var h = parseInt(image.height);\
-
 
567
   switch(centered){\
-
 
568
    case 0: return [x,y];break;\
-
 
569
    case 1: return [x,parseInt(y-0.5*h)];break;\
-
 
570
    case 2: return [parseInt(x+0.5*h),y];break;\
-
 
571
    case 3: return [parseInt(x+0.5*h),parseInt(y-0.5*h)];break;\
-
 
572
    case 4: return [parseInt(x-0.5*w),parseInt(y-0.5*h)];break;\
-
 
573
    default: return [x,y];break;\
-
 
574
   };\
-
 
575
  };\
-
 
576
  place_image_on_canvas = function(id){\
-
 
577
   var thing = document.getElementById(id);\
-
 
578
   var tag = thing.tagName;\
-
 
579
   if(tag == 'SVG'){draw_mathml_svg(thing,id);return;};\
-
 
580
   if(tag == 'DIV' || tag == 'SPAN' || tag == 'P'){draw_mathml_div(thing,id);return;};\
-
 
581
   var src = thing.src;\
-
 
582
   var image = new Image();\
-
 
583
   image.src = src;\
-
 
584
   image.id = 'placed_'+id;\
-
 
585
   image.width = thing.width;\
-
 
586
   image.height = thing.height;\
-
 
587
   image.onload = function(){ current_id = id; };\
-
 
588
   return;\
-
 
589
  };\
-
 
590
  function draw_mathml_div(thing,id){\
-
 
591
   var fix_div = document.createElement('DIV');\
-
 
592
   var new_id='placed_'+external_div_cnt+'_'+id;\
-
 
593
   fix_div.setAttribute('id',new_id);\
-
 
594
   var w = parseInt(thing.clientWidth);\
-
 
595
   var h = parseInt(thing.clientHeight);\
-
 
596
   fix_div.innerHTML = thing.innerHTML;\
-
 
597
   fix_div.setAttribute('style','display:none;position;absolute;width:'+w+'px;height:'+h+'px');\
-
 
598
   fix_div.width = w;fix_div.height = h;\
-
 
599
   canvas_div.appendChild(fix_div);\
-
 
600
   current_id = new_id;\
-
 
601
   external_div_cnt++;\
-
 
602
   return;\
-
 
603
  };\
-
 
604
  function draw_mathml_svg(thing,id){\
-
 
605
   var fix_div = document.createElement('DIV');\
-
 
606
   fix_div.setAttribute('style','display:none;position;relative');\
-
 
607
   canvas_div.appendChild(fix_div);\
-
 
608
   var image = new Image();\
-
 
609
   var svg_string = new XMLSerializer().serializeToString(thing);\
-
 
610
   var dom = self.URL || self.webkitURL || self;\
-
 
611
   var svg = new Blob([svg_string], {type: \"image/svg+xml;charset=utf-8\"});\
-
 
612
   var url = dom.createObjectURL(svg);\
-
 
613
   image.src= url;\
-
 
614
   image.id = 'placed_'+id;\
-
 
615
   image.onload = function(){\
-
 
616
    current_id = image.id;\
-
 
617
    fix_div.innerHTML='<img src='+image.src+' id='+image.id+' alt=\"this should not happen today...!\"/>';\
-
 
618
   };\
-
 
619
   return;\
-
 
620
  };\
-
 
621
  function images(x,y,event_which,num){\
-
 
622
   if(event_which == 1){ return;};\
-
 
623
   if(num == 1 && current_id){\
-
 
624
    var xy = multi_snap_check(x,y,images_snap);\
-
 
625
    images_x.push(xy[0]);\
-
 
626
    images_y.push(xy[1]);\
-
 
627
    images_id.push(current_id);\
-
 
628
    current_id = null;\
-
 
629
   };\
-
 
630
   draw_images();\
-
 
631
  };\
-
 
632
  function draw_images(){\
-
 
633
   context_images.clearRect(0,0,xsize,ysize);\
-
 
634
   var xy;var img;var tag;\
-
 
635
   for(var p = 0 ; p < images_x.length; p++){\
-
 
636
    if( images_id[p] ){\
-
 
637
     img = document.getElementById(images_id[p]);\
-
 
638
     tag = img.tagName;\
-
 
639
     xy = image_adjust(img,images_x[p],images_y[p]);\
-
 
640
     if( tag != 'IMG' ){\
-
 
641
       img.setAttribute('style','display:inline-block;position:absolute;top:'+xy[1]+'px;left:'+xy[0]+'px;');\
-
 
642
     }else{\
-
 
643
      context_images.drawImage(img,xy[0],xy[1],img.width,img.height);\
-
 
644
     };\
-
 
645
    };\
-
 
646
   };\
-
 
647
  };",use_offset);
-
 
648
 }
-
 
649
 
-
 
650
 if( strstr(draw_types,"text") != 0){
-
 
651
  fprintf(js_include_file,"function text(x,y,event_which,num){\
-
 
652
   if(event_which == 1){ return; };\
-
 
653
   var xy = multi_snap_check(x,y,text_snap);\
-
 
654
   if( num == 0 ){\
-
 
655
    text_x[0] = xy[0];\
-
 
656
    text_y[0] =xy[1];\
-
 
657
   }else{\
-
 
658
    text_x.push(xy[0]);\
-
 
659
    text_y.push(xy[1]);\
-
 
660
   };\
-
 
661
   draw_text();\
-
 
662
  };\
-
 
663
  function conv_to_unicode(str){\
-
 
664
   return str.replace(/\\u[\\dA-F]{4}/gi,function(match){\
-
 
665
   return String.fromCharCode(parseInt(match.replace(/\\u/g,''), 16));});\
-
 
666
  };\
-
 
667
  function draw_text(){\
-
 
668
   var half = 0;\
-
 
669
   var height = 0.3 * (context_text.measureText('M').width);\
-
 
670
   context_text.clearRect(0,0,xsize,ysize);\
-
 
671
   for(var p = 0 ; p < text_x.length ; p++ ){\
-
 
672
    if( typeof(text_abc[p]) === 'undefined'){\
-
 
673
     var txt = conv_to_unicode(document.getElementById('input_text_r').value);\
-
 
674
     text_abc.push(txt);\
-
 
675
    };\
-
 
676
    half = 0.5*( context_text.measureText(text_abc[p]).width );\
-
 
677
    context_text.fillText(text_abc[p],text_x[p] - half,text_y[p] + height);\
-
 
678
   };\
-
 
679
  };");
-
 
680
 }
-
 
681
 
-
 
682
 if( strstr(draw_types,"point") != 0){
-
 
683
  fprintf(js_include_file,"function points(x,y,event_which,num){\
-
 
684
   if(event_which == 1){ return; };\
-
 
685
   var xy = multi_snap_check(x,y,points_snap);\
-
 
686
   if( num == 0 ){\
-
 
687
     points_x[0] = xy[0];\
-
 
688
     points_y[0] = xy[1];\
-
 
689
   }else{\
-
 
690
    points_x.push(xy[0]);\
-
 
691
    points_y.push(xy[1]);\
-
 
692
   };\
-
 
693
   draw_points();\
-
 
694
  };\
-
 
695
  function draw_points(){\
-
 
696
   var radius = 2*(context_points.lineWidth);\
-
 
697
   context_points.clearRect(0,0,xsize,ysize);\
-
 
698
   for(var p = 0 ; p < points_x.length ; p++ ){\
-
 
699
    context_points.beginPath();\
-
 
700
    context_points.arc(points_x[p],points_y[p],radius,0,2*Math.PI,false);\
-
 
701
    context_points.closePath();\
-
 
702
    context_points.fill();\
-
 
703
   };\
-
 
704
  };");
-
 
705
 }
-
 
706
 
-
 
707
 if( strstr(draw_types,"circle") != 0){
-
 
708
  fprintf(js_include_file,"function circles(x,y,event_which,num){\
-
 
709
   var xy = multi_snap_check(x,y,circles_snap);\
-
 
710
   var last = circles_x.length - 1;\
-
 
711
   var xc = circles_x[last];\
-
 
712
   var yc = circles_y[last];\
-
 
713
   if(event_which == 0){\
-
 
714
    if( multidraw_click_cnt == 0 ){\
-
 
715
     if( num  == 0 ){\
-
 
716
       circles_x[0]=xy[0];circles_y[0]=xy[1];multi_radius[0]=4;\
-
 
717
     }\
-
 
718
     else\
-
 
719
     {\
-
 
720
       circles_x.push(xy[0]);circles_y.push(xy[1]);multi_radius.push(4);\
-
 
721
     };\
-
 
722
    };\
-
 
723
    multidraw_click_cnt++;\
-
 
724
   }\
-
 
725
   else\
-
 
726
   {\
-
 
727
    if( multidraw_click_cnt == 1 ){\
-
 
728
     multi_radius[last] = parseInt(Math.sqrt( (xy[0] - xc)*(xy[0] - xc) + (xy[1] - yc)*(xy[1] - yc) ));\
-
 
729
    };\
-
 
730
   };\
-
 
731
   if( multidraw_click_cnt == 2 ){\
-
 
732
    multidraw_click_cnt = 0;\
-
 
733
    if( num == 0 ){\
-
 
734
        circles_x = [];circles_y = [];\
-
 
735
        circles_x[0] = xc;circles_y[0] = yc;\
-
 
736
    }\
-
 
737
   };\
-
 
738
   draw_circles();\
-
 
739
 };\
-
 
740
 function draw_circles(){\
-
 
741
   context_circles.clearRect(0,0,xsize,ysize);\
-
 
742
   for(var p = 0 ; p < circles_x.length ; p++ ){\
-
 
743
    context_circles.beginPath();\
-
 
744
    context_circles.arc(circles_x[p],circles_y[p],multi_radius[p],0,2*Math.PI,false);\
-
 
745
    context_circles.closePath();\
-
 
746
    context_circles.fill();\
-
 
747
    context_circles.stroke();\
-
 
748
   };\
-
 
749
   return;\
-
 
750
 };");
-
 
751
 }
-
 
752
 
-
 
753
 if( strstr(draw_types,"segment") != 0){
-
 
754
  fprintf(js_include_file,"function segments(x,y,event_which,num){\
-
 
755
   var last = segments_x.length - 1;\
-
 
756
   var xy = multi_snap_check(x,y,segments_snap);\
-
 
757
   if(event_which == 0){\
-
 
758
    if(num == 0){\
-
 
759
     segments_x[0] = xy[0];segments_y[0] = xy[1];\
-
 
760
    }\
-
 
761
    else\
-
 
762
    {\
-
 
763
     segments_x.push(xy[0]);segments_y.push(xy[1]);\
-
 
764
    };\
-
 
765
    multidraw_click_cnt++;\
-
 
766
   }\
-
 
767
   else\
-
 
768
   {\
-
 
769
    if( multidraw_click_cnt == 1 ){\
-
 
770
     segments_x.push(xy[0]);segments_y.push(xy[1]);\
-
 
771
     draw_segments();\
-
 
772
     segments_x.pop();segments_y.pop();\
-
 
773
    };\
-
 
774
   };\
-
 
775
   if( multidraw_click_cnt == 2 ){\
-
 
776
    segments_x[last+num] = xy[0];segments_y[last+num] = xy[1];\
-
 
777
    multidraw_click_cnt = 0;\
-
 
778
    draw_segments();\
-
 
779
   };\
-
 
780
  };\
-
 
781
  function draw_segments(){\
-
 
782
   var len = segments_x.length;\
-
 
783
   if( len%%2 == 0 ){\
-
 
784
    context_segments.clearRect(0,0,xsize,ysize);\
-
 
785
    for(var p = 0 ; p < len ; p = p+2 ){\
-
 
786
     context_segments.beginPath();\
-
 
787
     context_segments.moveTo(segments_x[p],segments_y[p]);\
-
 
788
     context_segments.lineTo(segments_x[p+1],segments_y[p+1]);\
-
 
789
     context_segments.closePath();\
-
 
790
     context_segments.stroke();\
-
 
791
    };\
-
 
792
   };\
-
 
793
   return;\
-
 
794
  };");
-
 
795
 }
-
 
796
 
-
 
797
 if( strstr(draw_types,"arrow") != 0){
-
 
798
  fprintf(js_include_file,"function arrows(x,y,event_which,num){\
-
 
799
   var last = arrows_x.length - 1;\
-
 
800
   var xy = multi_snap_check(x,y,arrows_snap);\
-
 
801
   if(event_which == 0){\
-
 
802
    if(num == 0){\
-
 
803
     arrows_x[0] = xy[0];arrows_y[0] = xy[1];\
-
 
804
    }\
-
 
805
    else\
-
 
806
    {\
-
 
807
     arrows_x.push(xy[0]);arrows_y.push(xy[1]);\
-
 
808
    };\
-
 
809
    multidraw_click_cnt++;\
-
 
810
   }\
-
 
811
   else\
-
 
812
   {\
-
 
813
    if( multidraw_click_cnt == 1 ){\
-
 
814
     arrows_x.push(xy[0]);arrows_y.push(xy[1]);\
-
 
815
     draw_arrows();\
-
 
816
     arrows_x.pop();arrows_y.pop();\
-
 
817
    };\
-
 
818
   };\
-
 
819
   if( multidraw_click_cnt == 2 ){\
-
 
820
    arrows_x[last+num] = xy[0];arrows_y[last+num] = xy[1];\
-
 
821
    multidraw_click_cnt = 0;\
-
 
822
    draw_arrows();\
-
 
823
   };\
-
 
824
  };\
-
 
825
  function draw_arrows(){\
-
 
826
   var len = arrows_x.length;\
-
 
827
   var x1,y1,x2,y2,dx,dy,h;\
-
 
828
   if( len%%2 == 0 ){\
-
 
829
    context_arrows.clearRect(0,0,xsize,ysize);\
-
 
830
    for(var p = 0 ; p < len ; p = p+2 ){\
-
 
831
     context_arrows.save();\
-
 
832
     x1 = arrows_x[p];y1 = arrows_y[p];x2 = arrows_x[p+1];y2 = arrows_y[p+1];dx = x2 - x1;dy = y2 - y1;\
-
 
833
     h = Math.sqrt(dx*dx+dy*dy);\
-
 
834
     context_arrows.beginPath();\
-
 
835
     context_arrows.moveTo(x1,y1);\
-
 
836
     context_arrows.lineTo(x2,y2);\
-
 
837
     context_arrows.closePath();\
-
 
838
     context_arrows.stroke();\
-
 
839
     context_arrows.translate(x2,y2);\
-
 
840
     context_arrows.rotate(Math.atan2(dy,dx));\
-
 
841
     context_arrows.beginPath();\
-
 
842
     context_arrows.moveTo(0,0);\
-
 
843
     context_arrows.lineTo(-1*arrow_head,-0.5*arrow_head);\
-
 
844
     context_arrows.lineTo(-1*arrow_head, 0.5*arrow_head);\
-
 
845
     context_arrows.closePath();\
-
 
846
     context_arrows.fill();\
-
 
847
     context_arrows.stroke();\
-
 
848
     context_arrows.restore();\
-
 
849
    };\
-
 
850
   };\
-
 
851
  return;\
-
 
852
 };");
-
 
853
 }
-
 
854
 
-
 
855
 if( strstr(draw_types,"curvedarrow") != 0 ){
-
 
856
  fprintf(js_include_file,"\
-
 
857
  function curvedarrows(x,y,event_which,num){\
-
 
858
  var xy = multi_snap_check(x,y,curvedarrows_snap);\
-
 
859
   if(event_which == 0){\
-
 
860
    if(num == 0 && multidraw_click_cnt == 0){curvedarrows_x = [];curvedarrows_y = [];curvedarrows_x[0] = xy[0];curvedarrows_y[0] = xy[1];}\
-
 
861
    else{curvedarrows_x.push(xy[0]);curvedarrows_y.push(xy[1]);};multidraw_click_cnt++;\
-
 
862
   }\
-
 
863
   else\
-
 
864
   {\
-
 
865
   if( multidraw_click_cnt < 3 ){curvedarrows_x.push(xy[0]);curvedarrows_y.push(xy[1]);draw_curvedarrows();curvedarrows_x.pop();curvedarrows_y.pop();};\
-
 
866
   if( multidraw_click_cnt == 3 ){curvedarrows_x.pop();curvedarrows_y.pop();curvedarrows_x.push(xy[0]);curvedarrows_y.push(xy[1]);multidraw_click_cnt = 0;draw_curvedarrows();};\
-
 
867
   };\
-
 
868
  };\
-
 
869
  function draw_curvedarrows(){\
-
 
870
   var len = curvedarrows_x.length;var x1,y1,x2,y2,x3,y3;\
-
 
871
   context_curvedarrows.clearRect(0,0,xsize,ysize);\
-
 
872
   for(var p = 0 ; p < len ; p = p+3){\
-
 
873
     x1 = curvedarrows_x[p];x2 = curvedarrows_x[p+1];x3 = curvedarrows_x[p+2];y1 = curvedarrows_y[p];y2 = curvedarrows_y[p+1];y3 = curvedarrows_y[p+2];\
-
 
874
     var angle1 = Math.atan2(x3 - x2,y3 - y2) + Math.PI;\
-
 
875
     context_curvedarrows.beginPath();\
-
 
876
     context_curvedarrows.moveTo(x1,y1);\
-
 
877
     context_curvedarrows.quadraticCurveTo(x3,y3,x2,y2);\
-
 
878
     context_curvedarrows.moveTo(x2 - (arrow_head * Math.sin(angle1 - Math.PI / 6)),y2 - (arrow_head * Math.cos(angle1 - Math.PI / 6)));\
-
 
879
     context_curvedarrows.lineTo(x2, y2);\
-
 
880
     context_curvedarrows.lineTo(x2 - (arrow_head * Math.sin(angle1 + Math.PI / 6)),y2 - (arrow_head * Math.cos(angle1 + Math.PI / 6)));\
-
 
881
     context_curvedarrows.stroke();\
-
 
882
     context_curvedarrows.closePath();\
-
 
883
    };\
-
 
884
    return;\
-
 
885
   };");
-
 
886
 }
-
 
887
 
-
 
888
 if( strstr(draw_types,"curvedarrow2") != 0 ||  strstr(draw_types,"curvedarrows2") != 0 ){
-
 
889
  fprintf(js_include_file,"\
-
 
890
  function curvedarrows2(x,y,event_which,num){\
-
 
891
   var xy = multi_snap_check(x,y,curvedarrows2_snap);\
-
 
892
   if(event_which == 0){\
-
 
893
    if(num == 0 && multidraw_click_cnt == 0){curvedarrows2_x = [];curvedarrows2_y = [];curvedarrows2_x[0] = xy[0];curvedarrows2_y[0] = xy[1];}\
-
 
894
    else{curvedarrows2_x.push(xy[0]);curvedarrows2_y.push(xy[1]);};multidraw_click_cnt++;\
-
 
895
   }\
-
 
896
   else\
-
 
897
   {\
-
 
898
   if( multidraw_click_cnt < 3 ){curvedarrows2_x.push(xy[0]);curvedarrows2_y.push(xy[1]);draw_curvedarrows2();curvedarrows2_x.pop();curvedarrows2_y.pop();};\
-
 
899
   if( multidraw_click_cnt == 3 ){curvedarrows2_x.pop();curvedarrows2_y.pop();curvedarrows2_x.push(xy[0]);curvedarrows2_y.push(xy[1]);multidraw_click_cnt = 0;draw_curvedarrows2();};\
-
 
900
   };\
-
 
901
  };\
-
 
902
  function draw_curvedarrows2(){\
-
 
903
   var len = curvedarrows2_x.length;var x1,y1,x2,y2,x3,y3;\
-
 
904
   context_curvedarrows2.clearRect(0,0,xsize,ysize);\
-
 
905
   for(var p = 0 ; p < len ; p = p+3){\
-
 
906
     x1 = curvedarrows2_x[p];x2 = curvedarrows2_x[p+1];x3 = curvedarrows2_x[p+2];y1 = curvedarrows2_y[p];y2 = curvedarrows2_y[p+1];y3 = curvedarrows2_y[p+2];\
-
 
907
     var angle1 = Math.atan2(x3 - x2,y3 - y2) + Math.PI;\
-
 
908
     var angle2 = Math.atan2(x3 - x1,y3 - y1) + Math.PI;\
-
 
909
     context_curvedarrows2.beginPath();\
-
 
910
     context_curvedarrows2.moveTo(x1,y1);\
-
 
911
     context_curvedarrows2.moveTo(x1 - (arrow_head * Math.sin(angle2 - Math.PI / 6)),y1 - (arrow_head * Math.cos(angle2 - Math.PI / 6)));\
-
 
912
     context_curvedarrows2.lineTo(x1, y1);\
-
 
913
     context_curvedarrows2.lineTo(x1 - (arrow_head * Math.sin(angle2 + Math.PI / 6)),y1 - (arrow_head * Math.cos(angle2 + Math.PI / 6)));\
-
 
914
     context_curvedarrows2.moveTo(x1,y1);\
-
 
915
     context_curvedarrows2.quadraticCurveTo(x3,y3,x2,y2);\
-
 
916
      context_curvedarrows2.moveTo(x2 - (arrow_head * Math.sin(angle1 - Math.PI / 6)),y2 - (arrow_head * Math.cos(angle1 - Math.PI / 6)));\
-
 
917
     context_curvedarrows2.lineTo(x2, y2);\
-
 
918
     context_curvedarrows2.lineTo(x2 - (arrow_head * Math.sin(angle1 + Math.PI / 6)),y2 - (arrow_head * Math.cos(angle1 + Math.PI / 6)));\
-
 
919
     context_curvedarrows2.stroke();\
-
 
920
     context_curvedarrows2.closePath();\
-
 
921
    };\
-
 
922
    return;\
-
 
923
   };");
-
 
924
 }
-
 
925
 
-
 
926
 if( strstr(draw_types,"line") != 0){
-
 
927
  fprintf(js_include_file,"function calc_lines(){\
-
 
928
   var marge = 2;var len = lines_x.length;\
-
 
929
   var x = lines_x;var y = lines_y;\
-
 
930
   lines_x = new Array(len);\
-
 
931
   lines_y = new Array(len);\
-
 
932
   var pp;\
-
 
933
   for(var p = 0 ; p< len ;p = p+2){\
-
 
934
    pp = p+1;\
-
 
935
    if(x[p] < x[pp]+marge && x[p] > x[pp]-marge){\
-
 
936
     lines_x[p] = x[p];lines_x[pp] = x[pp];\
-
 
937
     lines_y[p] = 0;lines_y[pp] = ysize;\
-
 
938
    }\
-
 
939
    else\
-
 
940
    {\
-
 
941
     if(y[p] < y[pp]+marge && y[p] > y[pp]-marge){\
-
 
942
      lines_x[p] = 0;lines_x[pp] = xsize;\
-
 
943
      lines_y[p] = y[p];lines_y[pp] = y[pp];\
-
 
944
     }\
-
 
945
     else\
-
 
946
     {\
-
 
947
      lines_x[p] = 0;lines_x[pp] = xsize;\
-
 
948
      lines_y[p] = y[p] - (x[p])*(y[pp] - y[p])/(x[pp] - x[p]);\
-
 
949
      lines_y[pp] = y[p] + (xsize - x[p])*(y[pp] - y[p])/(x[pp] - x[p]);\
-
 
950
     };\
-
 
951
    };\
-
 
952
   };\
-
 
953
   return;\
-
 
954
  }\
-
 
955
  function lines(x,y,event_which,num){\
-
 
956
   var xy = multi_snap_check(x,y,lines_snap);\
-
 
957
   if(event_which == 0){\
-
 
958
    if( num == 0 && multidraw_click_cnt == 0 ){lines_x = [];lines_y = [];};\
-
 
959
    lines_x.push(xy[0]);lines_y.push(xy[1]);\
-
 
960
    multidraw_click_cnt++;\
-
 
961
   }\
-
 
962
   else\
-
 
963
   {\
-
 
964
    if( multidraw_click_cnt == 1 ){\
-
 
965
     lines_x.push(xy[0]);lines_y.push(xy[1]);\
-
 
966
     draw_lines();\
-
 
967
     lines_x.pop();lines_y.pop();\
-
 
968
    };\
-
 
969
   };\
-
 
970
   if( multidraw_click_cnt == 2 ){\
-
 
971
    multidraw_click_cnt = 0;\
-
 
972
    calc_lines();\
-
 
973
    draw_lines();\
-
 
974
   };\
-
 
975
  };\
-
 
976
  function draw_lines(){\
-
 
977
   var len = lines_x.length;\
-
 
978
   if( len %%2 == 0 ){\
-
 
979
    context_lines.clearRect(0,0,xsize,ysize);\
-
 
980
    for(var p = 0 ; p < len ; p = p+2 ){\
-
 
981
     context_lines.beginPath();\
-
 
982
     context_lines.moveTo(lines_x[p],lines_y[p]);\
-
 
983
     context_lines.lineTo(lines_x[p+1],lines_y[p+1]);\
-
 
984
     context_lines.closePath();\
-
 
985
     context_lines.stroke();\
-
 
986
    };\
-
 
987
   };\
-
 
988
   return;\
-
 
989
  };");
-
 
990
 }
-
 
991
 
-
 
992
 if( strstr(draw_types,"rect") != 0){
-
 
993
  fprintf(js_include_file,"\
-
 
994
  function rects(x,y,event_which,num){\
-
 
995
   var xy = multi_snap_check(x,y,rects_snap);\
-
 
996
   if(event_which == 0){\
-
 
997
    if( num == 0 && multidraw_click_cnt == 0 ){rects_x = [];rects_y = [];};\
-
 
998
    rects_x.push(xy[0]);rects_y.push(xy[1]);\
-
 
999
    multidraw_click_cnt++;\
-
 
1000
   }\
-
 
1001
   else\
-
 
1002
   {\
-
 
1003
    if( multidraw_click_cnt == 1 ){\
-
 
1004
     rects_x.push(xy[0]);rects_y.push(xy[1]);\
-
 
1005
     draw_rects();\
-
 
1006
     rects_x.pop();rects_y.pop();\
-
 
1007
    };\
-
 
1008
   };\
-
 
1009
   if( multidraw_click_cnt == 2 ){\
-
 
1010
    multidraw_click_cnt = 0;\
-
 
1011
    draw_rects();\
-
 
1012
   };\
-
 
1013
  };\
-
 
1014
  function draw_rects(){\
-
 
1015
   var len = rects_x.length;\
-
 
1016
   if( len %%2 == 0 ){\
-
 
1017
    context_rects.clearRect(0,0,xsize,ysize);\
-
 
1018
    for(var p = 0 ; p < len ; p = p+2 ){\
-
 
1019
     context_rects.beginPath();\
-
 
1020
     context_rects.rect(rects_x[p],rects_y[p],rects_x[p+1]-rects_x[p],rects_y[p+1]-rects_y[p]);\
-
 
1021
     context_rects.closePath();\
-
 
1022
     context_rects.fill();\
-
 
1023
     context_rects.stroke();\
-
 
1024
    };\
-
 
1025
   };\
-
 
1026
   return;\
-
 
1027
  };");
-
 
1028
 }
-
 
1029
 
-
 
1030
 if( strstr(draw_types,"closedpoly") != 0 ){
-
 
1031
  fprintf(js_include_file,"\
-
 
1032
  function check_closed(x1,y1,X,Y){\
-
 
1033
   var marge=10;\
-
 
1034
   var len = X.length-1;\
-
 
1035
   for(var p = 0 ; p < len ; p++){\
-
 
1036
    if(x1 < X[p] + marge && x1 > X[p] - marge ){\
-
 
1037
     if(y1 < Y[p] + marge && y1 > Y[p] - marge ){\
-
 
1038
      return 1;\
-
 
1039
     };\
-
 
1040
    };\
-
 
1041
   };\
-
 
1042
   return 0;\
-
 
1043
  };\
-
 
1044
  function closedpoly(x,y,event_which,num){\
-
 
1045
   var xy = multi_snap_check(x,y,closedpoly_snap);\
-
 
1046
   if(event_which == 0){\
-
 
1047
    if(multidraw_click_cnt == 0){\
-
 
1048
     closedpoly_x = [];closedpoly_y = [];\
-
 
1049
     closedpoly_x[0] = xy[0];closedpoly_y[0] = xy[1];\
-
 
1050
    }\
-
 
1051
    else\
-
 
1052
    {\
-
 
1053
     closedpoly_x.push(xy[0]);closedpoly_y.push(xy[1]);\
-
 
1054
    };\
-
 
1055
    multidraw_click_cnt++;\
-
 
1056
    if( multidraw_click_cnt > 2 ){\
-
 
1057
     if( check_closed(x,y,closedpoly_x,closedpoly_y) == 1){\
-
 
1058
      draw_closedpoly();\
-
 
1059
      multidraw_click_cnt = 0;\
-
 
1060
     };\
-
 
1061
    }\
-
 
1062
   }\
-
 
1063
   else\
-
 
1064
   {\
-
 
1065
    if( multidraw_click_cnt > 0 ){\
-
 
1066
     closedpoly_x.push(xy[0]);closedpoly_y.push(xy[1]);\
-
 
1067
     draw_closedpoly();\
-
 
1068
     closedpoly_x.pop();closedpoly_y.pop();\
-
 
1069
    };\
-
 
1070
   };\
-
 
1071
  };\
-
 
1072
  function draw_closedpoly(){\
-
 
1073
   var len = closedpoly_x.length;\
-
 
1074
   context_closedpoly.clearRect(0,0,xsize,ysize);\
-
 
1075
   var p = 0;\
-
 
1076
   context_closedpoly.beginPath();\
-
 
1077
   context_closedpoly.moveTo(closedpoly_x[0],closedpoly_y[0]);\
-
 
1078
   for(var p = 1 ; p < len ; p++){\
-
 
1079
    context_closedpoly.lineTo(closedpoly_x[p],closedpoly_y[p]);\
-
 
1080
   };\
-
 
1081
   context_closedpoly.lineTo(closedpoly_x[0],closedpoly_y[0]);\
-
 
1082
   context_closedpoly.closePath();\
-
 
1083
   context_closedpoly.fill();\
-
 
1084
   context_closedpoly.stroke();\
-
 
1085
   return;\
-
 
1086
  };");
-
 
1087
 }
-
 
1088
/* the next : just one type allowed triangel;.poly[3-9],parallelogram */
-
 
1089
 if( strstr(draw_types,"triangle") != 0 ){
-
 
1090
   fprintf(js_include_file,"\
-
 
1091
   function triangles(x,y,event_which,num){\
-
 
1092
    var xy = multi_snap_check(x,y,triangles_snap);\
-
 
1093
    var last = triangles_x.length - 1;\
-
 
1094
    if(event_which == 0){\
-
 
1095
     if(num == 0 && multidraw_click_cnt == 0){\
-
 
1096
      triangles_x = [];triangles_y = [];\
-
 
1097
      triangles_x[0] = xy[0];triangles_y[0] = xy[1];\
-
 
1098
     }\
-
 
1099
     else\
-
 
1100
     {\
-
 
1101
      triangles_x.push(xy[0]);triangles_y.push(xy[1]);\
-
 
1102
     };\
-
 
1103
     multidraw_click_cnt++;\
-
 
1104
    }\
-
 
1105
    else\
-
 
1106
    {\
-
 
1107
     if( multidraw_click_cnt < 3 ){\
-
 
1108
      triangles_x.push(xy[0]);triangles_y.push(xy[1]);\
-
 
1109
      draw_triangles();\
-
 
1110
      triangles_x.pop();triangles_y.pop();\
-
 
1111
     };\
-
 
1112
    };\
-
 
1113
    if( multidraw_click_cnt == 3 ){\
-
 
1114
     triangles_x.pop();triangles_y.pop();\
-
 
1115
     triangles_x.push(xy[0]);triangles_y.push(xy[1]);\
-
 
1116
     multidraw_click_cnt = 0;\
-
 
1117
     draw_triangles();\
-
 
1118
    };\
-
 
1119
   };\
-
 
1120
   function draw_triangles(){\
-
 
1121
    var len = triangles_x.length - 1;\
-
 
1122
    context_triangles.clearRect(0,0,xsize,ysize);\
-
 
1123
    for(var p = 0 ; p < len ; p = p+3){\
-
 
1124
     context_triangles.beginPath();\
-
 
1125
     context_triangles.moveTo(triangles_x[p],triangles_y[p]);\
-
 
1126
     for( var m = p+1 ;m < p+3 ; m++){\
-
 
1127
      context_triangles.lineTo(triangles_x[m],triangles_y[m]);\
-
 
1128
     };\
-
 
1129
     context_triangles.lineTo(triangles_x[p],triangles_y[p]);\
-
 
1130
     context_triangles.closePath();\
-
 
1131
     context_triangles.fill();\
-
 
1132
     context_triangles.stroke();\
-
 
1133
    };\
-
 
1134
    return;\
-
 
1135
   };");
-
 
1136
 }
-
 
1137
   /* need to rethink the parallelogram !!! 26/6/2015 */
-
 
1138
 if(strstr( draw_types,"parallelogram") != 0){
-
 
1139
  fprintf(js_include_file,"\
-
 
1140
    function parallelogram(x,y,event_which,num){\
-
 
1141
     var l2 = parallelogram_x.length;\
-
 
1142
     var l1 = l2 - 1;\
-
 
1143
     var l0 = l2 - 2;\
-
 
1144
     var xy = multi_snap_check(x,y,parallelogram_snap);\
-
 
1145
    if(event_which == 0){\
-
 
1146
     if(multidraw_click_cnt == 0){\
-
 
1147
      if(num == 0){parallelogram_x = [];parallelogram_y = [];};\
-
 
1148
      parallelogram_x.push(xy[0]);parallelogram_y.push(xy[1]);\
-
 
1149
     }\
-
 
1150
     else\
-
 
1151
     {\
-
 
1152
      parallelogram_x.push(xy[0]);parallelogram_y.push(xy[1]);\
-
 
1153
      if(multidraw_click_cnt == 2){\
-
 
1154
       var xy = multi_snap_check(parallelogram_x[l2] - parallelogram_x[l1] + parallelogram_x[l0],parallelogram_y[l2] - parallelogram_y[l1] + parallelogram_y[l0],parallelogram_snap);\
-
 
1155
       parallelogram_x.push(xy[0]);\
-
 
1156
       parallelogram_y.push(xy[1]);\
-
 
1157
      };\
-
 
1158
     };\
-
 
1159
     multidraw_click_cnt++;\
-
 
1160
    }\
-
 
1161
    else\
-
 
1162
    {\
-
 
1163
     if(multidraw_click_cnt == 1){\
-
 
1164
      var xxyy = multi_snap_check(parallelogram_x[l1],parallelogram_y[l1],parallelogram_snap);\
-
 
1165
      parallelogram_x.push(xxyy[0]);\
-
 
1166
      parallelogram_y.push(xxyy[1]);\
-
 
1167
      parallelogram_x.push(xy[0]);\
-
 
1168
      parallelogram_y.push(xy[1]);\
-
 
1169
      draw_parallelogram();\
-
 
1170
      parallelogram_x.pop();parallelogram_y.pop();\
-
 
1171
      parallelogram_x.pop();parallelogram_y.pop();\
-
 
1172
     }\
-
 
1173
     else\
-
 
1174
     {\
-
 
1175
      if(multidraw_click_cnt == 2){\
-
 
1176
       var xxyy = multi_snap_check(parallelogram_x[l2]-parallelogram_x[l1] + parallelogram_x[l0],parallelogram_y[l2]-parallelogram_y[l1] + parallelogram_y[l0],parallelogram_snap);\
-
 
1177
       parallelogram_x.push(xy[0]);parallelogram_y.push(xy[1]);\
-
 
1178
       parallelogram_x.push(xxyy[0]);\
-
 
1179
       parallelogram_y.push(xxyy[1]);\
-
 
1180
       draw_parallelogram();\
-
 
1181
       parallelogram_x.pop();parallelogram_y.pop();\
-
 
1182
       parallelogram_x.pop();parallelogram_y.pop();\
-
 
1183
      };\
-
 
1184
     };\
-
 
1185
    };\
-
 
1186
    if( multidraw_click_cnt == 3 ){\
-
 
1187
     parallelogram_x.pop();parallelogram_y.pop();\
-
 
1188
     var xxyy = multi_snap_check(parallelogram_x[l2]-parallelogram_x[l1] + parallelogram_x[l0],parallelogram_y[l2]-parallelogram_y[l1] + parallelogram_y[l0],parallelogram_snap);\
-
 
1189
     parallelogram_x.push(xxyy[0]);\
-
 
1190
     parallelogram_y.push(xxyy[1]);\
-
 
1191
     parallelogram_x.push(xy[0]);parallelogram_y.push(xy[1]);\
-
 
1192
     parallelogram_x.pop();parallelogram_y.pop();\
-
 
1193
     multidraw_click_cnt = 0;\
-
 
1194
     draw_parallelogram();\
-
 
1195
    };\
-
 
1196
   };\
-
 
1197
   function draw_parallelogram(){\
-
 
1198
    var len = parallelogram_x.length-1;\
-
 
1199
    context_parallelogram.clearRect(0,0,xsize,ysize);\
-
 
1200
    for(var p = 0 ; p < len ; p = p+4){\
-
 
1201
     context_parallelogram.beginPath();\
-
 
1202
     context_parallelogram.moveTo(parallelogram_x[p],parallelogram_y[p]);\
-
 
1203
     for( var m = p+1 ;m < p+4 ; m++){\
-
 
1204
      context_parallelogram.lineTo(parallelogram_x[m],parallelogram_y[m]);\
-
 
1205
     };\
-
 
1206
     context_parallelogram.lineTo(parallelogram_x[p],parallelogram_y[p]);\
-
 
1207
     context_parallelogram.closePath();\
-
 
1208
     context_parallelogram.fill();\
-
 
1209
     context_parallelogram.stroke();\
-
 
1210
    };\
-
 
1211
    return;\
-
 
1212
   };");
-
 
1213
  }
-
 
1214
 
-
 
1215
  if( strstr( draw_types,("poly")) != 0 ){
-
 
1216
   char *p = draw_types; int polynum=-1;while( *p ){ if( isdigit(*p) ){ polynum = atoi(p);break; } else { p++;} }
-
 
1217
   if(polynum != -1 ){
-
 
1218
    fprintf(js_include_file,"var polynum = %d;\
-
 
1219
    function polys(x,y,event_which,num){\
-
 
1220
     var last = polys_x.length - 1;\
-
 
1221
     var xy = multi_snap_check(x,y,polys_snap);\
-
 
1222
     if(event_which == 0){\
-
 
1223
      if(num == 0 && multidraw_click_cnt == 0){\
-
 
1224
       polys_x = [];polys_y = [];\
-
 
1225
       polys_x[0] = xy[0];polys_y[0] = xy[1];\
-
 
1226
      }\
-
 
1227
      else\
-
 
1228
      {\
-
 
1229
       polys_x.push(xy[0]);polys_y.push(xy[1]);\
-
 
1230
      };\
-
 
1231
      multidraw_click_cnt++;\
-
 
1232
     }\
-
 
1233
     else\
-
 
1234
     {\
-
 
1235
      if( multidraw_click_cnt < polynum ){\
-
 
1236
       polys_x.push(xy[0]);polys_y.push(xy[1]);\
-
 
1237
       draw_polys();\
-
 
1238
       polys_x.pop();polys_y.pop();\
-
 
1239
      };\
-
 
1240
     };\
-
 
1241
     if( multidraw_click_cnt == polynum ){\
-
 
1242
      polys_x.pop();polys_y.pop();\
-
 
1243
      polys_x.push(xy[0]);polys_y.push(xy[1]);\
-
 
1244
      multidraw_click_cnt = 0;\
-
 
1245
      draw_polys();\
-
 
1246
     };\
-
 
1247
    };\
-
 
1248
    function draw_polys(){\
-
 
1249
     var len = polys_x.length - 1;\
-
 
1250
     context_polys.clearRect(0,0,xsize,ysize);\
-
 
1251
     for(var p = 0 ; p < len ; p = p+polynum){\
-
 
1252
      context_polys.beginPath();\
-
 
1253
      context_polys.moveTo(polys_x[p],polys_y[p]);\
-
 
1254
      for( var m = p+1 ;m < p+polynum ; m++){\
-
 
1255
       context_polys.lineTo(polys_x[m],polys_y[m]);\
-
 
1256
      };\
-
 
1257
      context_polys.lineTo(polys_x[p],polys_y[p]);\
-
 
1258
      context_polys.closePath();\
-
 
1259
      context_polys.fill();\
-
 
1260
      context_polys.stroke();\
-
 
1261
     };\
-
 
1262
     return;\
-
 
1263
    };",polynum);
-
 
1264
   }
-
 
1265
  }
-
 
1266
}
-
 
1267
/* end 'void add_js_multidraw()' */
-
 
1268
 
-
 
1269
void add_js_circles(FILE *js_include_file,int num,char *draw_type,int line_width, int radius ,char *stroke_color,double stroke_opacity,int use_filled,char *fill_color,double fill_opacity,int use_dashed,int dashtype0,int dashtype1,int use_snap){
-
 
1270
fprintf(js_include_file,"\n/* begin userdraw \"%s\" on final canvas */\n\
-
 
1271
var num = %d;\
-
 
1272
var use_snap = %d;\
-
 
1273
userdraw_radius[0] = %d;\
-
 
1274
var line_width = %d;\
-
 
1275
var stroke_color = \"%s\";\
-
 
1276
var stroke_opacity = %f;\
-
 
1277
var use_filled = %d;\
-
 
1278
var fill_color = \"%s\";\
-
 
1279
var fill_opacity = %f;\
-
 
1280
var use_dashed = %d;\
-
 
1281
var dashtype1 = %d;\
-
 
1282
var dashtype0 = %d;\
-
 
1283
var click_cnt = 0;\
-
 
1284
var x0,y0,x1,y1;\
-
 
1285
/* Draw circles */\
-
 
1286
function user_draw(evt){\
-
 
1287
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1288
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1289
 x0 = xy[0];y0 = xy[1];\
-
 
1290
 if(y0 < ysize + 1){\
-
 
1291
  if(evt.button == 0 || typeof(evt.identifier) != 'undefined' ){\
-
 
1292
   if( click_cnt == 0 ){\
-
 
1293
    userdraw_x[xy_cnt] = x0;\
-
 
1294
    userdraw_y[xy_cnt] = y0;\
-
 
1295
    userdraw_radius[xy_cnt] = line_width;\
-
 
1296
    click_cnt = 1;\
-
 
1297
    draw_circles(context_userdraw,userdraw_x,userdraw_y,userdraw_radius,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1298
   }\
-
 
1299
   else\
-
 
1300
   {\
-
 
1301
    click_cnt = 0;\
-
 
1302
    if( num != 1 ){ xy_cnt++; }\
-
 
1303
   }\
-
 
1304
  }\
-
 
1305
  else\
-
 
1306
  {\
-
 
1307
    canvas_remove(x0,y0);\
-
 
1308
  }\
-
 
1309
 }\
-
 
1310
};\
-
 
1311
function user_drag(evt){\
-
 
1312
 if( click_cnt == 1 ){\
-
 
1313
  var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1314
  var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1315
  x1 = xy[0];y1 = xy[1];\
-
 
1316
  userdraw_radius[xy_cnt] = parseInt(Math.sqrt( (x1-x0)*(x1-x0) + (y1-y0)*(y1-y0) ));\
-
 
1317
  userdraw_x[xy_cnt] = x0;\
-
 
1318
  userdraw_y[xy_cnt] = y0;\
-
 
1319
  context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
1320
  draw_circles(context_userdraw,userdraw_x,userdraw_y,userdraw_radius,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1321
 };\
-
 
1322
};\
-
 
1323
function canvas_remove(x,y){\
-
 
1324
 var marge = 10*line_width;\
-
 
1325
 var diff1;var diff2;\
-
 
1326
 for(var p = 0;p < userdraw_x.length ; p++){\
-
 
1327
  diff1 = (x-userdraw_x[p])*(x - userdraw_x[p]) + (y - userdraw_y[p])*(y - userdraw_y[p]) - userdraw_radius[p]*userdraw_radius[p];\
-
 
1328
  diff2 = (x-userdraw_x[p])*(x - userdraw_x[p]) + (y - userdraw_y[p])*(y - userdraw_y[p]) - (userdraw_radius[p] - marge)*(userdraw_radius[p] - marge);\
-
 
1329
  if( diff1 < 0 && diff2 > 0 ){\
-
 
1330
   if(confirm(\"remove circle ?\")){\
-
 
1331
    if( num == 1 ){ userdraw_x = [];userdraw_y = []; userdraw_radius = [];xy_cnt = 0;context_userdraw.clearRect(0,0,xsize,ysize); return;}\
-
 
1332
    else\
-
 
1333
    {\
-
 
1334
     userdraw_x.splice(p,1);\
-
 
1335
     userdraw_y.splice(p,1);\
-
 
1336
     userdraw_radius.splice(p,1);\
-
 
1337
     xy_cnt--;\
-
 
1338
     context_userdraw = null;context_userdraw = canvas_userdraw.getContext(\"2d\");context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
1339
     draw_circles(context_userdraw,userdraw_x,userdraw_y,userdraw_radius,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1340
    };\
-
 
1341
   };\
-
 
1342
   return;\
-
 
1343
  }\
-
 
1344
 }\
-
 
1345
};",draw_type,num,use_snap,radius,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1);
-
 
1346
}
-
 
1347
 
-
 
1348
void add_js_points(FILE *js_include_file,int num,char *draw_type,int line_width, int radius ,char *stroke_color,double stroke_opacity,int use_filled,char *fill_color,double fill_opacity,int use_dashed,int dashtype0,int dashtype1,int use_snap){
-
 
1349
fprintf(js_include_file,"\n/* begin userdraw \"%s\" on final canvas */\n\
-
 
1350
var num = %d;\
-
 
1351
var use_snap = %d;\
-
 
1352
userdraw_radius[0] = %d;\
-
 
1353
var line_width = %d;\
-
 
1354
var stroke_color = \"%s\";\
-
 
1355
var stroke_opacity = %f;\
-
 
1356
var use_filled = %d;\
-
 
1357
var fill_color = \"%s\";\
-
 
1358
var fill_opacity = %f;\
-
 
1359
var use_dashed = %d;\
-
 
1360
var dashtype1 = %d;\
-
 
1361
var dashtype0 = %d;\
-
 
1362
var x0,y0,x1,y1;\
-
 
1363
var canvas_rect;\
-
 
1364
function user_draw(evt){\
-
 
1365
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1366
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1367
 x0 = xy[0];y0 = xy[1];\
-
 
1368
 if(evt.button == 0 || typeof(evt.identifier) != 'undefined' ){\
-
 
1369
  userdraw_x[xy_cnt] = x0;\
-
 
1370
  userdraw_y[xy_cnt] = y0;\
-
 
1371
  userdraw_radius[xy_cnt] = line_width;\
-
 
1372
  if( num != 1 ){ xy_cnt++; }else{context_userdraw.clearRect(0,0,xsize,ysize);};\
-
 
1373
  draw_circles(context_userdraw,userdraw_x,userdraw_y,userdraw_radius,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1374
 }\
-
 
1375
 else\
-
 
1376
 {\
-
 
1377
  canvas_remove(x0,y0);\
-
 
1378
 };\
-
 
1379
};\
-
 
1380
function user_drag(evt){ return;};\
-
 
1381
function canvas_remove(x,y){\
-
 
1382
 var marge = 4*line_width;\
-
 
1383
 for(var p = 0;p < userdraw_x.length ; p++){\
-
 
1384
  if(userdraw_x[p] < x + marge && userdraw_x[p] > x - marge ){\
-
 
1385
   if(userdraw_y[p] < y + marge && userdraw_y[p] > y - marge ){\
-
 
1386
    userdraw_x.splice(p,1);userdraw_y.splice(p,1);\
-
 
1387
    context_userdraw = null;context_userdraw = canvas_userdraw.getContext(\"2d\");context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
1388
    draw_circles(context_userdraw,userdraw_x,userdraw_y,userdraw_radius,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1389
    xy_cnt--;\
-
 
1390
    return;\
-
 
1391
   };\
-
 
1392
  };\
-
 
1393
 };\
-
 
1394
};",draw_type,num,use_snap,radius,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1);
-
 
1395
}
-
 
1396
 
-
 
1397
void add_js_inputs(FILE *js_include_file,int canvas_root_id,int num,int input_cnt,char *input_style,int line_width,int use_offset,int use_snap){
-
 
1398
fprintf(js_include_file,"\n/* user draw inputfields */\n\
-
 
1399
var canvas_rect = canvas_userdraw.getBoundingClientRect();\
-
 
1400
var use_snap = %d;\
-
 
1401
var input_cnt = %d;\
-
 
1402
var start_input_cnt = input_cnt;\
-
 
1403
function user_drag(evt){return;}\
-
 
1404
function user_draw(evt){\
-
 
1405
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1406
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1407
 var x = xy[0];\
-
 
1408
 var y = xy[1];\
-
 
1409
 var num = %d;var inputs;\
-
 
1410
 if(evt.button == 0){\
-
 
1411
  var inputs;var xi;var yi;var wi;var hi;\
-
 
1412
  var found = 0;\
-
 
1413
  if( start_input_cnt < input_cnt){\
-
 
1414
   for(var p = start_input_cnt ; p < input_cnt ; p++ ){\
-
 
1415
    inputs = document.getElementById(\"canvas_input\"+p);\
-
 
1416
    xi = findPosX(inputs) - canvas_rect.left;\
-
 
1417
    yi = findPosY(inputs) - canvas_rect.top;\
-
 
1418
    wi = 4 + inputs.clientWidth;\
-
 
1419
    hi = 4 + inputs.clientHeight;\
-
 
1420
    if( x > xi - wi && x < xi + wi && y > yi - hi && y < yi + hi ){\
-
 
1421
     found = 1;\
-
 
1422
    };\
-
 
1423
   };\
-
 
1424
  };\
-
 
1425
  if( found == 0 ){\
-
 
1426
   if( num == 1 ){\
-
 
1427
    inputs = document.getElementById(\"canvas_input\"+start_input_cnt);\
-
 
1428
    try{canvas_div.removeChild(inputs);}catch(e){};\
-
 
1429
    input_cnt = 0;\
-
 
1430
   };\
-
 
1431
   userdraw_x.push(x);userdraw_y.push(y);\
-
 
1432
   draw_inputs(%d,input_cnt,x,y,%d,1,\"%s\",\"?\",%d);\
-
 
1433
   input_cnt++;\
-
 
1434
  };\
-
 
1435
 }\
-
 
1436
 else\
-
 
1437
 {\
-
 
1438
  for(var p = start_input_cnt ; p < input_cnt; p++){\
-
 
1439
   inputs = document.getElementById(\"canvas_input\"+p);\
-
 
1440
   try{canvas_div.removeChild(inputs);}catch(e){};\
-
 
1441
  };\
-
 
1442
  userdraw_x = [];userdraw_y = [];\
-
 
1443
  input_cnt = start_input_cnt;\
-
 
1444
 };\
-
 
1445
};",use_snap,input_cnt,num,canvas_root_id,line_width,input_style,use_offset);
-
 
1446
}
-
 
1447
 
-
 
1448
 
-
 
1449
void add_zoom_buttons(FILE *js_include_file,int canvas_root_id,char *stroke_color,double stroke_opacity){
-
 
1450
fprintf(js_include_file,"\n/* draw zoom buttons */\n\
4
fprintf(js_include_file,"\n/* draw zoom buttons */\
1451
var draw_zoom_buttons = function(){\
5
var draw_zoom_buttons = function(){\
1452
 var obj;var canvas_type =%d;\
6
 var obj;var canvas_type =%d;\
1453
 if( document.getElementById(\"wims_canvas%d\"+canvas_type) ){\
7
 if( document.getElementById(\"wims_canvas%d\"+canvas_type) ){\
1454
  obj = document.getElementById(\"wims_canvas%d\"+canvas_type);\
8
  obj = document.getElementById(\"wims_canvas%d\"+canvas_type);\
1455
 }\
9
 }\
1456
 else\
10
 else\
1457
 {\
11
 {\
1458
  obj = create_canvas%d(canvas_type,xsize,ysize);\
12
  obj = create_canvas%d(canvas_type,xsize,ysize);\
1459
 };\
13
 };\
1460
 var ctx = obj.getContext(\"2d\");\
14
 var ctx = obj.getContext(\"2d\");\
1461
 ctx.font =\"22px Ariel\";\
15
 ctx.font =\"20px Ariel\";\
1462
 ctx.textAlign = \"right\";\
16
 ctx.textAlign = \"right\";\
1463
 ctx.fillStyle=\"rgba(%s,%f)\";\
17
 ctx.fillStyle=\"rgba(%s,%f)\";\
1464
 ctx.fillText(\"+\",xsize,ysize);\
18
 ctx.fillText(\"+\",xsize,ysize);\
1465
 ctx.fillText(\"\\u2212\",xsize - 15,ysize);\
19
 ctx.fillText(\"\\u2212\",xsize - 15,ysize-2);\
1466
 ctx.fillText(\"\\u2192\",xsize - 30,ysize-2);\
20
 ctx.fillText(\"\\u2192\",xsize - 30,ysize-2);\
1467
 ctx.fillText(\"\\u2190\",xsize - 45,ysize-2);\
21
 ctx.fillText(\"\\u2190\",xsize - 45,ysize-2);\
1468
 ctx.fillText(\"\\u2191\",xsize - 60,ysize-2);\
22
 ctx.fillText(\"\\u2191\",xsize - 60,ysize-2);\
1469
 ctx.fillText(\"\\u2193\",xsize - 75,ysize-2);\
23
 ctx.fillText(\"\\u2193\",xsize - 75,ysize-2);\
1470
 ctx.fillText(\"\\u00D7\",xsize - 90,ysize-2);\
24
 ctx.fillText(\"\\u00D7\",xsize - 90,ysize-2);\
1471
 ctx.stroke();\
25
 ctx.stroke();\
1472
};\ndraw_zoom_buttons();",BG_CANVAS,canvas_root_id,canvas_root_id,canvas_root_id,stroke_color,stroke_opacity);
26
};draw_zoom_buttons();",BG_CANVAS,canvas_root_id,canvas_root_id,canvas_root_id,stroke_color,stroke_opacity);
1473
}
27
}
1474
 
28
 
1475
void add_js_crosshairs(FILE *js_include_file,int num,char *draw_type,int line_width, int crosshair_size ,char *stroke_color,double stroke_opacity,int use_snap){
-
 
1476
fprintf(js_include_file,"\n/* begin userdraw \"%s\" on currect active canvas */\n\
-
 
1477
var num = %d;\
-
 
1478
var use_snap = %d;\
-
 
1479
var crosshair_size = %d;\
-
 
1480
var line_width = %d;\
-
 
1481
var stroke_color = \"%s\";\
-
 
1482
var stroke_opacity = %f;\
-
 
1483
context_userdraw.lineWidth = line_width;\
-
 
1484
context_userdraw.strokeStyle=\"rgba(\"+stroke_color+\",\"+stroke_opacity+\")\";\
-
 
1485
function user_drag(evt){return;}\
-
 
1486
function user_draw(evt){\
-
 
1487
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1488
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1489
 var x = xy[0];var y = xy[1];var x1,y1,x2,y2;\
-
 
1490
 if(evt.button == 0 || typeof(evt.identifier) != 'undefined' ){\
-
 
1491
   userdraw_x[xy_cnt] = x;\
-
 
1492
   userdraw_y[xy_cnt] = y;\
-
 
1493
   x1 = x - crosshair_size;\
-
 
1494
   x2 = x + crosshair_size;\
-
 
1495
   y1 = y - crosshair_size;\
-
 
1496
   y2 = y + crosshair_size;\
-
 
1497
   if( num != 1 ){ xy_cnt++;\
-
 
1498
    for(var p = 0; p < xy_cnt - 1 ;p++){\
-
 
1499
     if(x1 < userdraw_x[p] && x2 > userdraw_x[p]){\
-
 
1500
      if(y1 < userdraw_y[p] && y2 > userdraw_y[p]){\
-
 
1501
       canvas_remove(x,y);\
-
 
1502
       context_userdraw = null;context_userdraw = canvas_userdraw.getContext(\"2d\");\
-
 
1503
      }\
-
 
1504
     }\
-
 
1505
    }\
-
 
1506
   };\
-
 
1507
   context_userdraw.beginPath();\
-
 
1508
   context_userdraw.moveTo(x1,y1);\
-
 
1509
   context_userdraw.lineTo(x2,y2);\
-
 
1510
   context_userdraw.closePath();\
-
 
1511
   context_userdraw.stroke();\
-
 
1512
   context_userdraw.beginPath();\
-
 
1513
   context_userdraw.moveTo(x2,y1);\
-
 
1514
   context_userdraw.lineTo(x1,y2);\
-
 
1515
   context_userdraw.closePath();\
-
 
1516
   context_userdraw.stroke();\
-
 
1517
   context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
1518
   draw_crosshairs(context_userdraw,userdraw_x,userdraw_y,line_width,crosshair_size,stroke_color,stroke_opacity,0,0,0,[0,0]);\
-
 
1519
 }\
-
 
1520
 else\
-
 
1521
 {\
-
 
1522
 canvas_remove(x,y);\
-
 
1523
 }\
-
 
1524
}\
-
 
1525
function canvas_remove(x,y){\
-
 
1526
 var marge = 2*crosshair_size;\
-
 
1527
 for(var p = 0;p < userdraw_x.length ; p++){\
-
 
1528
  if(userdraw_x[p] < x + marge && userdraw_x[p] > x - marge ){\
-
 
1529
   if(userdraw_y[p] < y + marge && userdraw_y[p] > y - marge ){\
-
 
1530
    userdraw_x.splice(p,1);userdraw_y.splice(p,1);\
-
 
1531
    context_userdraw = null;context_userdraw = canvas_userdraw.getContext(\"2d\");context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
1532
    xy_cnt--;\
-
 
1533
    draw_crosshairs(context_userdraw,userdraw_x,userdraw_y,line_width,crosshair_size,stroke_color,stroke_opacity,0,0,0,[0,0]);\
-
 
1534
    return;\
-
 
1535
   }\
-
 
1536
  }\
-
 
1537
 }\
-
 
1538
};",draw_type,num,use_snap,crosshair_size,line_width,stroke_color,stroke_opacity);
-
 
1539
}
-
 
1540
 
-
 
1541
/* need to rewrite not using clickcnt and xy_cnt */
-
 
1542
void add_js_rect(FILE *js_include_file,int num,int roundrect,char *draw_type,int line_width,char *stroke_color,double stroke_opacity,int use_filled,char *fill_color,double fill_opacity,int use_dashed,int dashtype0,int dashtype1,int use_snap){
-
 
1543
fprintf(js_include_file,"\n/* begin userdraw \"%s\" on currect active canvas */\n\
-
 
1544
var use_snap = %d;\
-
 
1545
var roundrect = %d;\
-
 
1546
var line_width = %d;\
-
 
1547
var stroke_color = \"%s\";\
-
 
1548
var stroke_opacity = %f;\
-
 
1549
var use_filled = %d;\
-
 
1550
var fill_color = \"%s\";\
-
 
1551
var fill_opacity = %f;\
-
 
1552
var use_dashed = %d;\
-
 
1553
var dashtype0 = %d;\
-
 
1554
var dashtype1 = %d;\
-
 
1555
var num = %d;\
-
 
1556
var use_rotate = 0;\
-
 
1557
var angle = 0;\
-
 
1558
var closed_path = 1;\
-
 
1559
var clickcnt = 0;\
-
 
1560
xy_cnt = 0;\
-
 
1561
var x0,y0,x1,y1;\
-
 
1562
var marge = 10*line_width;\
-
 
1563
function user_draw(evt){\
-
 
1564
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1565
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1566
 x0 = xy[0];\
-
 
1567
 y0 = xy[0];\
-
 
1568
 if( evt.button == 0 || typeof(evt.identifier) != 'undefined' ){\
-
 
1569
  if(clickcnt == 0 ){\
-
 
1570
   clickcnt = 1;\
-
 
1571
   userdraw_x[xy_cnt] = x0;userdraw_y[xy_cnt] = y0;xy_cnt++;\
-
 
1572
  }\
-
 
1573
  else\
-
 
1574
  {\
-
 
1575
   clickcnt = 0;\
-
 
1576
   var lu = userdraw_x.length - 1;\
-
 
1577
   if( userdraw_x[lu] == userdraw_x[lu-1] && userdraw_y[lu] == userdraw_y[lu-1]){userdraw_x.pop();userdraw_y.pop();clickcnt=1;return;};\
-
 
1578
   if(roundrect == 0 ){\
-
 
1579
    draw_rects(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1,use_rotate,angle,0,[1,0,0,1,0,0]);\
-
 
1580
   }\
-
 
1581
   else\
-
 
1582
   {\
-
 
1583
    draw_roundrects(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1,use_rotate,angle,0,[1,0,0,1,0,0]);\
-
 
1584
   }\
-
 
1585
   if( num != 1 ){ xy_cnt++; }else{xy_cnt--;}\
-
 
1586
  }\
-
 
1587
 }\
-
 
1588
 else\
-
 
1589
 {\
-
 
1590
  canvas_remove(x0,y0);\
-
 
1591
 };\
-
 
1592
};\
-
 
1593
function user_drag(evt){\
-
 
1594
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1595
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1596
 x1 = xy[0];\
-
 
1597
 y1 = xy[1];\
-
 
1598
 if( clickcnt == 1 ){\
-
 
1599
  userdraw_x[xy_cnt] = x1;\
-
 
1600
  userdraw_y[xy_cnt] = y1;\
-
 
1601
  context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
1602
  if( roundrect == 0 ){\
-
 
1603
   draw_rects(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1,use_rotate,angle,0,[1,0,0,1,0,0]);\
-
 
1604
  }\
-
 
1605
  else\
-
 
1606
  {\
-
 
1607
   draw_roundrects(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1,use_rotate,angle,0,[1,0,0,1,0,0]);\
-
 
1608
  };\
-
 
1609
 };\
-
 
1610
};\
-
 
1611
function canvas_remove(x,y){\
-
 
1612
 for(var p = 0;p < userdraw_x.length ; p++){\
-
 
1613
  if(userdraw_x[p] < x + marge && userdraw_x[p] > x - marge ){\
-
 
1614
   if(userdraw_y[p] < y + marge && userdraw_y[p] > y - marge ){\
-
 
1615
    if( confirm(\"remove rectangle ?\" )){\
-
 
1616
     if( p%%2 == 0 ){\
-
 
1617
      userdraw_x.splice(p,2);userdraw_y.splice(p,2);\
-
 
1618
     }\
-
 
1619
     else\
-
 
1620
     {\
-
 
1621
      userdraw_x.splice(p-1,2);userdraw_y.splice(p-1,2);\
-
 
1622
     }\
-
 
1623
     xy_cnt = xy_cnt - 2;\
-
 
1624
     context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
1625
     if(xy_cnt < 2){xy_cnt = 0;click_cnt = 0;userdraw_x = [];userdraw_y = [];return;};\
-
 
1626
     if( roundrect == 0 ){\
-
 
1627
      draw_rects(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1,use_rotate,angle,0,[1,0,0,1,0,0]);\
-
 
1628
     }\
-
 
1629
     else\
-
 
1630
     {\
-
 
1631
      draw_roundrects(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1,use_rotate,angle,0,[1,0,0,1,0,0]);\
-
 
1632
     }\
-
 
1633
     return;\
-
 
1634
    };\
-
 
1635
   };\
-
 
1636
  };\
-
 
1637
 };\
-
 
1638
};",draw_type,use_snap,roundrect,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1,num);
-
 
1639
}
-
 
1640
 
-
 
1641
void add_js_poly(FILE *js_include_file,int num,char *draw_type,int line_width,char *stroke_color,double stroke_opacity,int use_filled,char *fill_color,double fill_opacity,int use_dashed,int dashtype0,int dashtype1, int use_snap){
-
 
1642
fprintf(js_include_file,"\n/* begin userdraw \"%s\" on currect active canvas */\n\
-
 
1643
var num = %d;\
-
 
1644
var use_snap = %d;\
-
 
1645
var line_width = %d;\
-
 
1646
var stroke_color = \"%s\";\
-
 
1647
var stroke_opacity = %f;\
-
 
1648
var use_filled = %d;\
-
 
1649
var fill_color = \"%s\";\
-
 
1650
var fill_opacity = %f;\
-
 
1651
var use_dashed = %d;\
-
 
1652
var dashtype0 = %d;\
-
 
1653
var dashtype1 = %d;\
-
 
1654
var use_rotate = 0;\
-
 
1655
var angle = 0;\
-
 
1656
var use_translate = 0;\
-
 
1657
var vector=[0,0];\
-
 
1658
var closed_path = 1;\
-
 
1659
var done = 1;\
-
 
1660
var x,y;\
-
 
1661
var marge = 10*line_width;\
-
 
1662
var canvas_rect;\
-
 
1663
function user_draw(evt){\
-
 
1664
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1665
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1666
 x = xy[0];\
-
 
1667
 y = xy[1];\
-
 
1668
 if( evt.button == 0 || typeof(evt.identifier) != 'undefined' ){\
-
 
1669
  if( num == -1 && xy_cnt > 2 ){\
-
 
1670
   if( x - marge < userdraw_x[0] && x + marge > userdraw_x[0]){\
-
 
1671
    if( y - marge < userdraw_y[0] && y + marge > userdraw_y[0]){\
-
 
1672
     userdraw_x.splice(xy_cnt,1);userdraw_y.splice(xy_cnt,1);\
-
 
1673
     draw_paths(context_userdraw,userdraw_x,userdraw_y,line_width,closed_path,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1,use_rotate,angle,0,[1,0,0,1,0,0]);\
-
 
1674
     done = 1;return;\
-
 
1675
    };\
-
 
1676
   };\
-
 
1677
  }\
-
 
1678
  else\
-
 
1679
  {\
-
 
1680
   if( xy_cnt == num - 1){\
-
 
1681
    draw_paths(context_userdraw,userdraw_x,userdraw_y,line_width,closed_path,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1,use_rotate,angle,0,[1,0,0,1,0,0]);\
-
 
1682
    done = 1;return;\
-
 
1683
   };\
-
 
1684
  };\
-
 
1685
  done = 0;\
-
 
1686
  userdraw_x[xy_cnt] = x;userdraw_y[xy_cnt] = y;xy_cnt++;\
-
 
1687
  user_drag(evt);\
-
 
1688
 }\
-
 
1689
 else\
-
 
1690
 {\
-
 
1691
  canvas_remove(x,y);\
-
 
1692
  return;\
-
 
1693
 }\
-
 
1694
};\
-
 
1695
function user_drag(evt){\
-
 
1696
 if( done == 0 ){\
-
 
1697
  var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1698
  var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1699
  x = xy[0];\
-
 
1700
  y = xy[1];\
-
 
1701
  context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
1702
  userdraw_x[xy_cnt] = x;userdraw_y[xy_cnt] = y;\
-
 
1703
  draw_paths(context_userdraw,userdraw_x,userdraw_y,line_width,closed_path,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1,use_rotate,angle,0,[1,0,0,1,0,0]);\
-
 
1704
 }\
-
 
1705
}\
-
 
1706
function canvas_remove(x,y){\
-
 
1707
 for(var p = 0;p < userdraw_x.length ; p++){\
-
 
1708
  if(userdraw_x[p] < x + marge && userdraw_x[p] > x - marge ){\
-
 
1709
   if(userdraw_y[p] < y + marge && userdraw_y[p] > y - marge ){\
-
 
1710
    if( confirm(\"remove polygone ?\" )){\
-
 
1711
     context_userdraw = null;context_userdraw = canvas_userdraw.getContext(\"2d\");context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
1712
     xy_cnt = 0;userdraw_x = [];userdraw_y = [];done = 1;\
-
 
1713
    }\
-
 
1714
    return;\
-
 
1715
   }\
-
 
1716
  }\
-
 
1717
 }\
-
 
1718
};",draw_type,num,use_snap,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1);
-
 
1719
}
-
 
1720
 
-
 
1721
/*
-
 
1722
  canvas_rect = canvas_userdraw.getBoundingClientRect();\
-
 
1723
  var x = evt.clientX - canvas_rect.left;\
-
 
1724
  var y = evt.clientY - canvas_rect.top;\
-
 
1725
*/
-
 
1726
void add_js_polyline(FILE *js_include_file,char *draw_type,int line_width, char *stroke_color,double stroke_opacity,int use_dashed,int dashtype0,int dashtype1,int use_snap){
-
 
1727
fprintf(js_include_file,"\n/* begin userdraw \"%s\" on final canvas */\n\
-
 
1728
var use_snap = %d;\
-
 
1729
var cnt = 0;\
-
 
1730
var line_width = %d;\
-
 
1731
var stroke_color = \"%s\";\
-
 
1732
var stroke_opacity = %f;\
-
 
1733
var use_dashed = %d;\
-
 
1734
var dashtype0 = %d;\
-
 
1735
var dashtype1 = %d;\
-
 
1736
var x,y;\
-
 
1737
function user_draw(evt){\
-
 
1738
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1739
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1740
 x = xy[0];\
-
 
1741
 y = xy[1];\
-
 
1742
 var lu = userdraw_x.length;\
-
 
1743
 if( evt.button == 0 || typeof(evt.identifier) != 'undefined' ){\
-
 
1744
  userdraw_x[lu] = x;userdraw_y[lu] = y;\
-
 
1745
  if( cnt == 0 ){\
-
 
1746
   user_drag(evt);\
-
 
1747
   cnt = 1;\
-
 
1748
  }\
-
 
1749
  else\
-
 
1750
  {\
-
 
1751
    cnt = 0;\
-
 
1752
    draw_polyline(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1753
  }\
-
 
1754
 }\
-
 
1755
 else\
-
 
1756
 {\
-
 
1757
  canvas_remove(x,y);\
-
 
1758
 }\
-
 
1759
};\
-
 
1760
function user_drag(evt){\
-
 
1761
 if( cnt == 0){\
-
 
1762
  var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1763
  var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1764
  x = xy[0];\
-
 
1765
  y = xy[1];\
-
 
1766
  var lu = userdraw_x.length;\
-
 
1767
  if( lu > 0 ){\
-
 
1768
   userdraw_x[lu - 1] = x; userdraw_y[lu - 1] = y;\
-
 
1769
   draw_polyline(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1770
  };\
-
 
1771
 }\
-
 
1772
};\
-
 
1773
function canvas_remove(x,y){\
-
 
1774
 if( confirm(\"remove line ?\" )){\
-
 
1775
  context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
1776
  userdraw_x = [];userdraw_y = [];cnt = 1;\
-
 
1777
  xy_cnt=0;\
-
 
1778
  return;\
-
 
1779
 }\
-
 
1780
};",draw_type,use_snap,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);
-
 
1781
}
-
 
1782
 
-
 
1783
void add_js_segments(FILE *js_include_file,int num,char *draw_type,int line_width, char *stroke_color,double stroke_opacity,int use_dashed,int dashtype0,int dashtype1,int use_snap){
-
 
1784
fprintf(js_include_file,"\n/* begin userdraw \"%s\" on final canvas */\n\
-
 
1785
var num = %d;\
-
 
1786
var use_snap = %d;\
-
 
1787
var line_width = %d;\
-
 
1788
var stroke_color = \"%s\";\
-
 
1789
var stroke_opacity = %f;\
-
 
1790
var use_dashed = %d;\
-
 
1791
var dashtype0 = %d;\
-
 
1792
var dashtype1 = %d;\
-
 
1793
var x0,y0;\
-
 
1794
function user_draw(evt){\
-
 
1795
 var lu = userdraw_x.length;\
-
 
1796
 if( lu != 0 && lu%%2 == 0){\
-
 
1797
  draw_segments(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1798
 }\
-
 
1799
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1800
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1801
 var x = xy[0];\
-
 
1802
 var y = xy[1];\
-
 
1803
 if( evt.button == 0 || typeof(evt.identifier) != 'undefined' ){\
-
 
1804
  if( lu%%2 == 0){\
-
 
1805
   x0 = x;y0 = y;\
-
 
1806
   if(num == 1){ userdraw_x = [];userdraw_y = [];userdraw_x[0] = x0;userdraw_y[0] = y0;} else {userdraw_x[lu] = x0;userdraw_y[lu] = y0;};\
-
 
1807
   draw_circles(context_userdraw,[x0],[y0],[line_width],line_width,stroke_color,stroke_opacity,1,stroke_color,stroke_opacity,0,1,1);\
-
 
1808
   user_drag(evt);\
-
 
1809
  }\
-
 
1810
  else\
-
 
1811
  {\
-
 
1812
   if( num == 1 ){ userdraw_x[1] = x;userdraw_y[1] = y;} else {userdraw_x[lu] = x;userdraw_y[lu] = y;};\
-
 
1813
   if( userdraw_x[lu] == userdraw_x[lu-1] && userdraw_y[lu] == userdraw_y[lu-1]){userdraw_x.splice(lu,2);userdraw_y.splice(lu,2);};\
-
 
1814
   draw_segments(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1815
  }\
-
 
1816
 }\
-
 
1817
 else\
-
 
1818
 {\
-
 
1819
  canvas_remove(x,y);\
-
 
1820
 }\
-
 
1821
};\
-
 
1822
function user_drag(evt){\
-
 
1823
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1824
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1825
 var x = xy[0];\
-
 
1826
 var y = xy[1];\
-
 
1827
 var lu = userdraw_x.length;\
-
 
1828
 if( lu%%2 != 0 ){\
-
 
1829
  context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
1830
  draw_circles(context_userdraw,[x0],[y0],[line_width],line_width,stroke_color,stroke_opacity,1,stroke_color,stroke_opacity,0,1,1);\
-
 
1831
  draw_circles(context_userdraw,[x],[y],[line_width],line_width,stroke_color,stroke_opacity,1,stroke_color,stroke_opacity,0,1,1);\
-
 
1832
  draw_segments(context_userdraw,[x0,x],[y0,y],line_width,stroke_color,stroke_opacity);\
-
 
1833
  if( lu > 0){\
-
 
1834
   draw_segments(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1835
  }\
-
 
1836
 }\
-
 
1837
};\
-
 
1838
function canvas_remove(x,y){\
-
 
1839
 var marge = 10*line_width;\
-
 
1840
 for(var p = 0;p < userdraw_x.length ; p++){\
-
 
1841
  if(userdraw_x[p] < x + marge && userdraw_x[p] > x - marge ){\
-
 
1842
   if(userdraw_y[p] < y + marge && userdraw_y[p] > y - marge ){\
-
 
1843
    if( confirm(\"remove line ?\" )){\
-
 
1844
     context_userdraw = null;context_userdraw = canvas_userdraw.getContext(\"2d\");context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
1845
     if( p%%2 == 0 ){\
-
 
1846
      userdraw_x.splice(p,2);userdraw_y.splice(p,2);\
-
 
1847
     }\
-
 
1848
     else\
-
 
1849
     {\
-
 
1850
      userdraw_x.splice(p-1,2);userdraw_y.splice(p-1,2);\
-
 
1851
     }\
-
 
1852
     if(userdraw_x.length < 2){ userdraw_x = [];userdraw_y = [];return;};\
-
 
1853
     xy_cnt = xy_cnt - 2;\
-
 
1854
     draw_segments(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1855
    }\
-
 
1856
    return;\
-
 
1857
   }\
-
 
1858
  }\
-
 
1859
 }\
-
 
1860
};",draw_type,num,use_snap,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);
-
 
1861
}
-
 
1862
 
-
 
1863
void add_js_demilines(FILE *js_include_file,int num,char *draw_type,int line_width, char *stroke_color,double stroke_opacity,int use_dashed,int dashtype0,int dashtype1,int use_snap){
-
 
1864
fprintf(js_include_file,"\n/* begin userdraw \"%s\" on final canvas */\n\
-
 
1865
var num = %d;\
-
 
1866
var use_snap = %d;\
-
 
1867
var line_width = %d;\
-
 
1868
var stroke_color = \"%s\";\
-
 
1869
var stroke_opacity = %f;\
-
 
1870
var use_dashed = %d;\
-
 
1871
var dashtype0 = %d;\
-
 
1872
var dashtype1 = %d;\
-
 
1873
var x0,y0;\
-
 
1874
function user_draw(evt){\
-
 
1875
 var lu = userdraw_x.length;\
-
 
1876
 if( lu != 0 && lu%%2 == 0){\
-
 
1877
  draw_demilines(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1878
 }\
-
 
1879
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1880
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1881
 var x = xy[0];\
-
 
1882
 var y = xy[1];\
-
 
1883
 if( evt.button == 0 || typeof(evt.identifier) != 'undefined' ){\
-
 
1884
  if( lu%%2 == 0){\
-
 
1885
   x0 = x;y0 = y;\
-
 
1886
   if(num == 1){ userdraw_x = [];userdraw_y = [];userdraw_x[0] = x0;userdraw_y[0] = y0;} else {userdraw_x[lu] = x0;userdraw_y[lu] = y0;}\
-
 
1887
   draw_circles(context_userdraw,[x0],[y0],[line_width],line_width,stroke_color,stroke_opacity,1,stroke_color,stroke_opacity,0,1,1);\
-
 
1888
   user_drag(evt);\
-
 
1889
  }\
-
 
1890
  else\
-
 
1891
  {\
-
 
1892
   if( num == 1 ){ userdraw_x[1] = x;userdraw_y[1] = y;} else {userdraw_x[lu] = x;userdraw_y[lu] = y;};\
-
 
1893
   if( userdraw_x[lu] == userdraw_x[lu-1] && userdraw_y[lu] == userdraw_y[lu-1]){userdraw_x.splice(lu,2);userdraw_y.splice(lu,2);};\
-
 
1894
   draw_demilines(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1895
  }\
-
 
1896
 }\
-
 
1897
 else\
-
 
1898
 {\
-
 
1899
  canvas_remove(x,y);\
-
 
1900
 }\
-
 
1901
};\
-
 
1902
function user_drag(evt){\
-
 
1903
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1904
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1905
 var x = xy[0];\
-
 
1906
 var y = xy[1];\
-
 
1907
 var lu = userdraw_x.length;\
-
 
1908
 if( lu%%2 != 0 ){\
-
 
1909
  context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
1910
  draw_circles(context_userdraw,[x0],[y0],[line_width],line_width,stroke_color,stroke_opacity,1,stroke_color,stroke_opacity,0,1,1);\
-
 
1911
  draw_circles(context_userdraw,[x],[y],[line_width],line_width,stroke_color,stroke_opacity,1,stroke_color,stroke_opacity,0,1,1);\
-
 
1912
  draw_demilines(context_userdraw,[x0,x],[y0,y],line_width,stroke_color,stroke_opacity);\
-
 
1913
  if( lu > 0){\
-
 
1914
   draw_demilines(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1915
  }\
-
 
1916
 }\
-
 
1917
};\
-
 
1918
function canvas_remove(x,y){\
-
 
1919
 var marge = 10*line_width;\
-
 
1920
 for(var p = 0;p < userdraw_x.length ; p++){\
-
 
1921
  if(userdraw_x[p] < x + marge && userdraw_x[p] > x - marge ){\
-
 
1922
   if(userdraw_y[p] < y + marge && userdraw_y[p] > y - marge ){\
-
 
1923
    if( confirm(\"remove line ?\" )){\
-
 
1924
     context_userdraw = null;context_userdraw = canvas_userdraw.getContext(\"2d\");context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
1925
     if( p%%2 == 0 ){\
-
 
1926
      userdraw_x.splice(p,2);userdraw_y.splice(p,2);\
-
 
1927
     }\
-
 
1928
     else\
-
 
1929
     {\
-
 
1930
      userdraw_x.splice(p-1,2);userdraw_y.splice(p-1,2);\
-
 
1931
     }\
-
 
1932
     xy_cnt = xy_cnt - 2;\
-
 
1933
     if(userdraw_x.length < 2){ userdraw_x = [];userdraw_y = [];return;};\
-
 
1934
     draw_demilines(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1935
    }\
-
 
1936
    return;\
-
 
1937
   }\
-
 
1938
  }\
-
 
1939
 }\
-
 
1940
};",draw_type,num,use_snap,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);
-
 
1941
}
-
 
1942
 
-
 
1943
 
-
 
1944
/*
-
 
1945
num=1 single horizontal line
-
 
1946
num=2 multiple horizontal lines
-
 
1947
num=3 single vertical line
-
 
1948
num=4 multiple vertical lines
-
 
1949
*/
-
 
1950
void add_js_hlines(FILE *js_include_file,int num,char *draw_type,int line_width, char *stroke_color,double stroke_opacity,int use_dashed,int dashtype0,int dashtype1,int use_snap){
-
 
1951
fprintf(js_include_file,"\n/* begin userdraw \"%s\" on final canvas */\n\
-
 
1952
var num = %d;\
-
 
1953
var use_snap = %d;\
-
 
1954
var line_width = %d;\
-
 
1955
var stroke_color = \"%s\";\
-
 
1956
var stroke_opacity = %f;\
-
 
1957
var use_dashed = %d;\
-
 
1958
var dashtype0 = %d;\
-
 
1959
var dashtype1 = %d;\
-
 
1960
var x0,y0;\
-
 
1961
function user_draw(evt){\
-
 
1962
 if( evt.button == 0 || typeof(evt.identifier) != 'undefined' ){\
-
 
1963
  var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
1964
  var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
1965
  var x = xy[0];\
-
 
1966
  var y = xy[1];\
-
 
1967
  var lu = userdraw_x.length;\
-
 
1968
  switch(num){\
-
 
1969
   case 1: userdraw_x[0] = x;userdraw_x[1] = xmax;userdraw_y[0] = y; userdraw_y[1] = y;break;\
-
 
1970
   case 2: userdraw_x[lu] = x;userdraw_x[lu+1] = xmax;userdraw_y[lu] = y;userdraw_y[lu+1] = y;break;\
-
 
1971
   case 3: userdraw_x[0] = x;userdraw_x[1] = x;userdraw_y[0] = y; userdraw_y[1] = ymax;break;\
-
 
1972
   case 4: userdraw_x[lu] = x;userdraw_x[lu+1] = x;userdraw_y[lu] = y;userdraw_y[lu+1] = ymax;break;\
-
 
1973
  };\
-
 
1974
  context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
1975
  draw_lines(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
1976
 }\
-
 
1977
 else\
-
 
1978
 {\
-
 
1979
  userdraw_x = [];userdraw_y = [];context_userdraw.clearRect(0,0,xsize,ysize);return;\
-
 
1980
 };\
-
 
1981
};\
-
 
1982
function user_drag(evt){ return evt; };",draw_type,num,use_snap,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);
-
 
1983
}
-
 
1984
 
-
 
1985
 
-
 
1986
 
-
 
1987
void add_js_lines(FILE *js_include_file,int num,char *draw_type,int line_width, char *stroke_color,double stroke_opacity,int use_dashed,int dashtype0,int dashtype1,int use_snap){
-
 
1988
fprintf(js_include_file,"\n/* begin userdraw \"%s\" on final canvas */\n\
-
 
1989
var num = %d;\
-
 
1990
var use_snap =%d;\
-
 
1991
var line_width = %d;\
-
 
1992
var stroke_color = \"%s\";\
-
 
1993
var stroke_opacity = %f;\
-
 
1994
var use_dashed = %d;\
-
 
1995
var dashtype0 = %d;\
-
 
1996
var dashtype1 = %d;\
-
 
1997
var x0,y0;\
-
 
1998
function user_draw(evt){\
-
 
1999
 var lu = userdraw_x.length;\
-
 
2000
 if( lu != 0 && lu%%2 == 0){\
-
 
2001
  draw_lines(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
2002
 }\
-
 
2003
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
2004
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
2005
 var x = xy[0];\
-
 
2006
 var y = xy[1];\
-
 
2007
 if( evt.button == 0 || typeof(evt.identifier) != 'undefined' ){\
-
 
2008
  if( lu%%2 == 0){\
-
 
2009
   x0 = x;y0 = y;\
-
 
2010
   if(num == 1){ userdraw_x = [];userdraw_y = [];userdraw_x[0] = x0;userdraw_y[0] = y0;} else {userdraw_x[lu] = x0;userdraw_y[lu] = y0;}\
-
 
2011
   draw_circles(context_userdraw,[x0],[y0],[line_width],line_width,stroke_color,stroke_opacity,1,stroke_color,stroke_opacity,0,1,1);\
-
 
2012
   user_drag(evt);\
-
 
2013
  }\
-
 
2014
  else\
-
 
2015
  {\
-
 
2016
   if( num == 1 ){ userdraw_x[1] = x;userdraw_y[1] = y;} else {userdraw_x[lu] = x;userdraw_y[lu] = y;};\
-
 
2017
   if( userdraw_x[lu] == userdraw_x[lu-1] && userdraw_y[lu] == userdraw_y[lu-1]){userdraw_x.splice(lu,2);userdraw_y.splice(lu,2);};\
-
 
2018
   draw_lines(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
2019
  };\
-
 
2020
 }\
-
 
2021
 else\
-
 
2022
 {\
-
 
2023
  canvas_remove(x,y);\
-
 
2024
 };\
-
 
2025
};\
-
 
2026
function user_drag(evt){\
-
 
2027
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
2028
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
2029
 var x = xy[0];\
-
 
2030
 var y = xy[1];\
-
 
2031
 var lu = userdraw_x.length;\
-
 
2032
 if( lu%%2 != 0 ){\
-
 
2033
  context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
2034
  draw_circles(context_userdraw,[x0],[y0],[line_width],line_width,stroke_color,stroke_opacity,1,stroke_color,stroke_opacity,0,1,1);\
-
 
2035
  draw_circles(context_userdraw,[x],[y],[line_width],line_width,stroke_color,stroke_opacity,1,stroke_color,stroke_opacity,0,1,1);\
-
 
2036
  draw_lines(context_userdraw,[x0,x],[y0,y],line_width,stroke_color,stroke_opacity);\
-
 
2037
  if( lu > 0){\
-
 
2038
   draw_lines(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
2039
  }\
-
 
2040
 }\
-
 
2041
};\
-
 
2042
function canvas_remove(x,y){\
-
 
2043
 var marge = 10*line_width;\
-
 
2044
 for(var p = 0;p < userdraw_x.length ; p++){\
-
 
2045
  if(userdraw_x[p] < x + marge && userdraw_x[p] > x - marge ){\
-
 
2046
   if(userdraw_y[p] < y + marge && userdraw_y[p] > y - marge ){\
-
 
2047
    if( confirm(\"remove line ?\" )){\
-
 
2048
     context_userdraw = null;context_userdraw = canvas_userdraw.getContext(\"2d\");context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
2049
     if( p%%2 == 0 ){\
-
 
2050
      userdraw_x.splice(p,2);userdraw_y.splice(p,2);\
-
 
2051
     }\
-
 
2052
     else\
-
 
2053
     {\
-
 
2054
      userdraw_x.splice(p-1,2);userdraw_y.splice(p-1,2);\
-
 
2055
     }\
-
 
2056
     xy_cnt--;\
-
 
2057
     if(userdraw_x.length < 2){ userdraw_x = [];userdraw_y = [];return;};\
-
 
2058
     draw_lines(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
2059
    }\
-
 
2060
    return;\
-
 
2061
   }\
-
 
2062
  }\
-
 
2063
 }\
-
 
2064
};",draw_type,num,use_snap,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);
-
 
2065
}
-
 
2066
 
-
 
2067
 
-
 
2068
void add_js_arrows(FILE *js_include_file,int num,char *draw_type,int line_width,int type, char *stroke_color,double stroke_opacity,int use_dashed,int dashtype0,int dashtype1,int arrow_head,int use_snap){
-
 
2069
/*
-
 
2070
constants in draw_arrows() ... for this moment: ;var use_rotate = 0;var angle = 0;var use_translate = 0 ;var vector = [0,0];\
-
 
2071
*/
-
 
2072
fprintf(js_include_file,"\n/* begin userdraw \"%s\" on final canvas */\n\
-
 
2073
var num = %d;\
-
 
2074
var use_snap = %d;\
-
 
2075
var line_width = %d;\
-
 
2076
var stroke_color = \"%s\";\
-
 
2077
var stroke_opacity = %f;\
-
 
2078
var use_dashed = %d;\
-
 
2079
var dashtype0 = %d;\
-
 
2080
var dashtype1 = %d;\
-
 
2081
var arrow_head = %d;\
-
 
2082
var x0,y0;\
-
 
2083
var type = %d;\
-
 
2084
var use_rotate = 0;var angle = 0;var use_translate = 0 ;var vector = [0,0];\
-
 
2085
function user_draw(evt){\
-
 
2086
 var lu = userdraw_x.length;\
-
 
2087
 if( lu != 0 && lu%%2 == 0){\
-
 
2088
  draw_arrows(context_userdraw,userdraw_x,userdraw_y,arrow_head,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1,type,use_rotate,angle,0,[1,0,0,1,0,0]);\
-
 
2089
 }\
-
 
2090
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
2091
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
2092
 var x = xy[0];\
-
 
2093
 var y = xy[1];\
-
 
2094
 if( evt.button == 0 || typeof(evt.identifier) != 'undefined' ){\
-
 
2095
  if( lu%%2 == 0){\
-
 
2096
   x0 = x;y0 = y;\
-
 
2097
   if(num == 1){ userdraw_x = [];userdraw_y = [];userdraw_x[0] = x0;userdraw_y[0] = y0;} else {userdraw_x[lu] = x0;userdraw_y[lu] = y0;}\
-
 
2098
   user_drag(evt);\
-
 
2099
  }\
-
 
2100
  else\
-
 
2101
  {\
-
 
2102
   if( num == 1 ){ userdraw_x[1] = x;userdraw_y[1] = y;} else {userdraw_x[lu] = x;userdraw_y[lu] = y;};\
-
 
2103
   if( userdraw_x[lu] == userdraw_x[lu-1] && userdraw_y[lu] == userdraw_y[lu-1]){userdraw_x.splice(lu,2);userdraw_y.splice(lu,2);};\
-
 
2104
   draw_arrows(context_userdraw,userdraw_x,userdraw_y,arrow_head,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1,type,use_rotate,angle,0,[1,0,0,1,0,0]);\
-
 
2105
  };\
-
 
2106
 }\
-
 
2107
 else\
-
 
2108
 {\
-
 
2109
  canvas_remove(x,y);\
-
 
2110
 };\
-
 
2111
};\
-
 
2112
function user_drag(evt){\
-
 
2113
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
2114
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
2115
 var x = xy[0];\
-
 
2116
 var y = xy[1];\
-
 
2117
 var lu = userdraw_x.length;\
-
 
2118
 if( lu%%2 != 0 ){\
-
 
2119
  context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
2120
  draw_arrows(context_userdraw,[x0,x],[y0,y],arrow_head,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1,type,use_rotate,angle,0,[1,0,0,1,0,0]);\
-
 
2121
  if( lu > 0){\
-
 
2122
    draw_arrows(context_userdraw,userdraw_x,userdraw_y,arrow_head,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1,type,use_rotate,angle,0,[1,0,0,1,0,0]);\
-
 
2123
  }\
-
 
2124
 }\
-
 
2125
};\
-
 
2126
function canvas_remove(x,y){\
-
 
2127
 var marge = 10*line_width;\
-
 
2128
 for(var p = 0;p < userdraw_x.length ; p++){\
-
 
2129
  if(userdraw_x[p] < x + marge && userdraw_x[p] > x - marge ){\
-
 
2130
   if(userdraw_y[p] < y + marge && userdraw_y[p] > y - marge ){\
-
 
2131
    if( confirm(\"remove line ?\" )){\
-
 
2132
     context_userdraw = null;context_userdraw = canvas_userdraw.getContext(\"2d\");context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
2133
     if( p%%2 == 0 ){\
-
 
2134
      userdraw_x.splice(p,2);userdraw_y.splice(p,2);\
-
 
2135
     }\
-
 
2136
     else\
-
 
2137
     {\
-
 
2138
      userdraw_x.splice(p-1,2);userdraw_y.splice(p-1,2);\
-
 
2139
     }\
-
 
2140
     xy_cnt = xy_cnt - 2;\
-
 
2141
     if(userdraw_x.length < 2){ userdraw_x = [];userdraw_y = [];return;};\
-
 
2142
     draw_arrows(context_userdraw,userdraw_x,userdraw_y,arrow_head,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1,type,use_rotate,angle,0,[1,0,0,1,0,0],type,use_rotate,angle,0,[1,0,0,1,0,0]);\
-
 
2143
    }\
-
 
2144
    return;\
-
 
2145
   }\
-
 
2146
  }\
-
 
2147
 }\
-
 
2148
};",draw_type,num,use_snap,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1,arrow_head,type);
-
 
2149
 
-
 
2150
}
-
 
2151
 
-
 
2152
void add_js_curvedarrow(FILE *js_include_file,int canvas_root_id,int num,int line_width,char *stroke_color,double stroke_opacity,int use_dashed,int arrow_head,int type,int use_snap){
-
 
2153
fprintf(js_include_file,"\n<!-- begin userdraw \"curvedarrow\" on final canvas -->\n\
-
 
2154
xy_cnt = 0;\
-
 
2155
var use_snap = %d;\
-
 
2156
function user_draw(evt){\
-
 
2157
 if(evt.button == 0 || typeof(evt.identifier) != 'undefined' ){\
-
 
2158
  var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
2159
  var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
2160
  if(1 == %d){if(xy_cnt == 3){xy_cnt = 0;userdraw_x = [];userdraw_y = [];context_userdraw.clearRect(0,0,xsize,ysize);};};\
-
 
2161
  userdraw_x[xy_cnt] = xy[0];userdraw_y[xy_cnt] = xy[1];\
-
 
2162
  xy_cnt++;\
-
 
2163
 };\
-
 
2164
 return;\
-
 
2165
};\
-
 
2166
function user_drag(evt){\
-
 
2167
 if(evt.button == 0 || typeof(evt.identifier) != 'undefined' ){\
-
 
2168
  var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
2169
  var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
2170
  context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
2171
  userdraw_x[xy_cnt] = xy[0];userdraw_y[xy_cnt] = xy[1];\
-
 
2172
  for(var p=0; p<xy_cnt;p=p+3){\
-
 
2173
   drawCurvedArrow(context_userdraw,userdraw_x[p],userdraw_y[p],userdraw_x[p+1],userdraw_y[p+1],userdraw_x[p+2],userdraw_y[p+2],%d,%d,'%s',%f,%d,%d);\
-
 
2174
  };\
-
 
2175
  userdraw_x.pop();userdraw_y.pop();\
-
 
2176
 };\
-
 
2177
 return;\
-
 
2178
};\
-
 
2179
function drawCurvedArrow(ctx,x1,y1,x2,y2,xm,ym,linewidth,arrowhead,color,opacity,use_dashed,type){\
-
 
2180
 if(use_dashed == 1 ){ if( ctx.setLineDash ){ctx.setLineDash([2,4]);}else{if(ctx.mozDash){context_circles.mozDash = [2,4]};};};\
-
 
2181
 ctx.save();\
-
 
2182
 ctx.strokeStyle = \"rgba(\"+color+\",\"+opacity+\")\";\
-
 
2183
 ctx.lineWidth = linewidth;\
-
 
2184
 var angle1 = Math.atan2(xm - x2,ym - y2) + Math.PI;\
-
 
2185
 ctx.beginPath();\
-
 
2186
 ctx.moveTo(x1,y1);\
-
 
2187
 if(type == 2){\
-
 
2188
  var angle2 = Math.atan2(xm - x1,ym - y1) + Math.PI;\
-
 
2189
  ctx.moveTo(x1 - (arrowhead * Math.sin(angle2 - Math.PI / 6)),y1 - (arrowhead * Math.cos(angle2 - Math.PI / 6)));\
-
 
2190
  ctx.lineTo(x1, y1);\
-
 
2191
  ctx.lineTo(x1 - (arrowhead * Math.sin(angle2 + Math.PI / 6)),y1 - (arrowhead * Math.cos(angle2 + Math.PI / 6)));\
-
 
2192
 };\
-
 
2193
 ctx.moveTo(x1,y1);\
-
 
2194
 ctx.quadraticCurveTo(xm,ym,x2,y2);\
-
 
2195
 ctx.moveTo(x2 - (arrowhead * Math.sin(angle1 - Math.PI / 6)),y2 - (arrowhead * Math.cos(angle1 - Math.PI / 6)));\
-
 
2196
 ctx.lineTo(x2, y2);\
-
 
2197
 ctx.lineTo(x2 - (arrowhead * Math.sin(angle1 + Math.PI / 6)),y2 - (arrowhead * Math.cos(angle1 + Math.PI / 6)));\
-
 
2198
 ctx.stroke();\
-
 
2199
 ctx.closePath();\
-
 
2200
 ctx.restore();\
-
 
2201
};",use_snap,num,line_width,arrow_head,stroke_color,stroke_opacity,use_dashed,type);
-
 
2202
}
-
 
2203
 
-
 
2204
 
-
 
2205
void add_js_paths(FILE *js_include_file,int num,char *draw_type,int line_width, int closed_path,char *stroke_color,double stroke_opacity,int use_filled, char *fill_color,double fill_opacity,int use_dashed,int dashtype0,int dashtype1,int use_snap){
-
 
2206
fprintf(js_include_file,"\n/* begin userdraw \"%s\" on final canvas */\n\
-
 
2207
var path_cnt = 0;\
-
 
2208
var temp_x = [];\
-
 
2209
var temp_y = [];\
-
 
2210
var use_snap = %d;\
-
 
2211
var num = %d;\
-
 
2212
xy_cnt=0;\
-
 
2213
var line_width = %d;\
-
 
2214
var stroke_color = \"%s\";\
-
 
2215
var stroke_opacity = %f;\
-
 
2216
var fill_color = \"%s\";\
-
 
2217
var fill_opacity = %f;\
-
 
2218
var use_filled = %d;\
-
 
2219
var use_dashed = %d;\
-
 
2220
var dashtype0 = %d;\
-
 
2221
var dashtype1 = %d;\
-
 
2222
var closed_path = 0;\
-
 
2223
var click_cnt=0;\
-
 
2224
function user_draw(evt){\
-
 
2225
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
2226
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
2227
 var x = xy[0];var y = xy[1];\
-
 
2228
 if(evt.button == 0 || typeof(evt.identifier) != 'undefined' ){\
-
 
2229
  if( click_cnt == 0 ){\
-
 
2230
   click_cnt = 1;\
-
 
2231
   user_drag(evt);\
-
 
2232
  }\
-
 
2233
  else\
-
 
2234
  {\
-
 
2235
   userdraw_x[path_cnt] = new Array();\
-
 
2236
   userdraw_y[path_cnt] = new Array();\
-
 
2237
   userdraw_x[path_cnt] = temp_x;\
-
 
2238
   userdraw_y[path_cnt] = temp_y;\
-
 
2239
   path_cnt++;\
-
 
2240
   temp_x = [];\
-
 
2241
   temp_y = [];\
-
 
2242
   click_cnt = 0;\
-
 
2243
   xy_cnt = 0;\
-
 
2244
  };\
-
 
2245
 }\
-
 
2246
 else\
-
 
2247
 {\
-
 
2248
   canvas_remove(x,y);\
-
 
2249
 };\
-
 
2250
 context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
2251
 for(var p=0; p < path_cnt; p++){\
-
 
2252
  if(userdraw_x[p] != null){\
-
 
2253
   draw_paths(context_userdraw,userdraw_x[p],userdraw_y[p],line_width,0,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1);\
-
 
2254
  };\
-
 
2255
 };\
-
 
2256
};\
-
 
2257
function user_drag(evt){\
-
 
2258
 if(click_cnt == 1 ){\
-
 
2259
  var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
2260
  var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
2261
  temp_x[xy_cnt] = xy[0];temp_y[xy_cnt] = xy[1];\
-
 
2262
  xy_cnt++;\
-
 
2263
  draw_paths(context_userdraw,temp_x,temp_y,line_width,0,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1);\
-
 
2264
 };\
-
 
2265
};\
-
 
2266
function canvas_remove(x,y){\
-
 
2267
 var marge = 4*line_width;\
-
 
2268
 var tmpx = [];\
-
 
2269
 var tmpy = [];\
-
 
2270
 for(var i = 0 ; i < path_cnt; i++){\
-
 
2271
  tmpx = userdraw_x[i];\
-
 
2272
  if(tmpx != null){\
-
 
2273
   tmpy = userdraw_y[i];\
-
 
2274
   for(var p = 0;p<tmpx.length;p++){\
-
 
2275
    if( x + marge > tmpx[p] &&  x - marge < tmpx[p] ){\
-
 
2276
     if( y + marge > tmpy[p] &&  y - marge < tmpy[p] ){\
-
 
2277
      if(confirm(\"Remove this drawing ?\")){\
-
 
2278
       userdraw_x[i] = null;\
-
 
2279
       userdraw_y[i] = null;\
-
 
2280
       xy_cnt = 0;click_cnt = 0;\
-
 
2281
       return;\
-
 
2282
      };\
-
 
2283
     };\
-
 
2284
    };\
-
 
2285
   };\
-
 
2286
  };\
-
 
2287
 };\
-
 
2288
};",draw_type,use_snap,num,line_width,stroke_color,stroke_opacity,fill_color,fill_opacity,use_filled,use_dashed,dashtype0,dashtype1);
-
 
2289
}
-
 
2290
void add_js_load_image(FILE *js_include_file,int canvas_root_id){
-
 
2291
fprintf(js_include_file,"\n/* begin get_image_from_url */\n\
-
 
2292
var image_cnt = 0;\
-
 
2293
if( typeof(image_patterns) !== 'object'){var image_patterns = [];};\
-
 
2294
var get_image_from_url = function(url){\
-
 
2295
 var idx = Math.ceil(1000*(Math.random()));\
-
 
2296
 var canvas = create_canvas%d(idx,xsize,ysize);\
-
 
2297
 canvas.style.visibility = 'hidden';\
-
 
2298
 var ctx = canvas.getContext(\"2d\");\
-
 
2299
 var img = new Image();\
-
 
2300
 img.src = url;\
-
 
2301
 img.onload = function(){\
-
 
2302
  var pat = ctx.createPattern(img,\"repeat\");\
-
 
2303
  image_patterns.push(pat);\
-
 
2304
 };\
-
 
2305
};",canvas_root_id);}
-
 
2306
 
-
 
2307
 
-
 
2308
/* almost the same as multidraw images !! */
-
 
2309
void add_js_images(FILE *js_include_file,int canvas_root_id,int use_offset,int snap){
-
 
2310
 fprintf(js_include_file,"var current_id = null;var external_div_cnt=0;\
-
 
2311
  function image_adjust(image,x,y){\
-
 
2312
   var centered = %d;\
-
 
2313
   var w = parseInt(image.width);var h = parseInt(image.height);\
-
 
2314
   switch(centered){\
-
 
2315
    case 0: return [x,y];break;\
-
 
2316
    case 1: return [x,parseInt(y-0.5*h)];break;\
-
 
2317
    case 2: return [parseInt(x+0.5*h),y];break;\
-
 
2318
    case 3: return [parseInt(x+0.5*h),parseInt(y-0.5*h)];break;\
-
 
2319
    case 4: return [parseInt(x-0.5*w),parseInt(y-0.5*h)];break;\
-
 
2320
    default: return [x,y];break;\
-
 
2321
   };\
-
 
2322
  };\
-
 
2323
  place_image_on_canvas = function(id){\
-
 
2324
   var thing = document.getElementById(id);\
-
 
2325
   var tag = thing.tagName;\
-
 
2326
   if(tag == 'SVG'){draw_mathml_svg(thing,id);return;};\
-
 
2327
   if(tag == 'DIV'|| tag == 'SPAN' || tag == 'P'){draw_mathml_div(thing,id);return;};\
-
 
2328
   var src = thing.src;\
-
 
2329
   var image = new Image();\
-
 
2330
   image.src = src;\
-
 
2331
   image.id = 'placed_'+id;\
-
 
2332
   image.width = thing.width;\
-
 
2333
   image.height = thing.height;\
-
 
2334
   image.onload = function(){\
-
 
2335
    current_id = id;\
-
 
2336
   };\
-
 
2337
   return;\
-
 
2338
  };\
-
 
2339
  function draw_mathml_div(thing,id){\
-
 
2340
   var fix_div = document.createElement('DIV');\
-
 
2341
   var new_id='placed_'+external_div_cnt+'_'+id;\
-
 
2342
   fix_div.setAttribute('id',new_id);\
-
 
2343
   var w = parseInt(thing.clientWidth);\
-
 
2344
   var h = parseInt(thing.clientHeight);\
-
 
2345
   fix_div.innerHTML = thing.innerHTML;\
-
 
2346
   fix_div.setAttribute('style','display:none;position;absolute;width:'+w+'px;height:'+h+'px');\
-
 
2347
   fix_div.width = w;fix_div.height = h;\
-
 
2348
   canvas_div.appendChild(fix_div);\
-
 
2349
   current_id = new_id;\
-
 
2350
   external_div_cnt++;\
-
 
2351
   return;\
-
 
2352
  };\
-
 
2353
  function draw_mathml_svg(thing,id){\
-
 
2354
   var fix_div = document.createElement('DIV');\
-
 
2355
   fix_div.setAttribute('style','display:none;position;relative');\
-
 
2356
   canvas_div.appendChild(fix_div);\
-
 
2357
   var image = new Image();\
-
 
2358
   var svg_string = new XMLSerializer().serializeToString(thing);\
-
 
2359
   var dom = self.URL || self.webkitURL || self;\
-
 
2360
   var svg = new Blob([svg_string], {type: \"image/svg+xml;charset=utf-8\"});\
-
 
2361
   var url = dom.createObjectURL(svg);\
-
 
2362
   image.src= url;\
-
 
2363
   image.id = 'placed_'+id;\
-
 
2364
   image.onload = function(){\
-
 
2365
    current_id = image.id;\
-
 
2366
    fix_div.innerHTML='<img src='+image.src+' id='+image.id+' alt=\"this should not happen today...!\"/>';\
-
 
2367
   };\
-
 
2368
   return;\
-
 
2369
  };\
-
 
2370
  function remove_me(evt){\
-
 
2371
   var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
2372
   var x = mouse.x;var y = mouse.y;var x1;var y1;\
-
 
2373
   var marge = 25;\
-
 
2374
   for(var p = 0 ; p < userdraw_x.length; p++){\
-
 
2375
    x1 = userdraw_x[p];y1 = userdraw_y[p];\
-
 
2376
    if( x > x1-marge && x < x1+marge ){\
-
 
2377
     if( y > y1-marge && y < y1+marge ){\
-
 
2378
       try{document.getElementById(userdraw_radius[p]).innerHTML = null;}catch(e){console.log(e);};\
-
 
2379
       userdraw_x.splice(p,1);userdraw_y.splice(p,1);userdraw_radius.splice(p,1);\
-
 
2380
       draw_images();\
-
 
2381
     };\
-
 
2382
    };\
-
 
2383
   };\
-
 
2384
  };\
-
 
2385
  function user_draw(evt){\
-
 
2386
   if( evt.button == 2 ){ remove_me(evt);return;};\
-
 
2387
   if( evt.button != 0 ){ return; };\
-
 
2388
   if(current_id != null){\
-
 
2389
    var centered = %d;\
-
 
2390
    var snap = %d;\
-
 
2391
    var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
2392
    var img = document.getElementById(current_id);\
-
 
2393
    var xy = multisnap_check(mouse.x,mouse.y,snap);\
-
 
2394
    userdraw_x.push(xy[0]);userdraw_y.push(xy[1]);userdraw_radius.push(current_id);\
-
 
2395
    draw_images();\
-
 
2396
   };\
-
 
2397
   return;\
-
 
2398
  };\
-
 
2399
  function user_drag(evt){return;};\
-
 
2400
  function draw_images(){\
-
 
2401
   current_id = null;\
-
 
2402
   context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
2403
   var xy;var img;var tag;\
-
 
2404
   for(var p = 0 ; p < userdraw_x.length; p++){\
-
 
2405
    if( userdraw_radius[p] ){\
-
 
2406
     img = document.getElementById(userdraw_radius[p]);\
-
 
2407
     tag = img.tagName;\
-
 
2408
     xy = image_adjust(img,userdraw_x[p],userdraw_y[p]);\
-
 
2409
     if( tag != 'IMG' ){\
-
 
2410
       img.setAttribute('style','display:inline-block;position:absolute;top:'+xy[1]+'px;left:'+xy[0]+'px;');\
-
 
2411
     }else{\
-
 
2412
      context_userdraw.drawImage(img,xy[0],xy[1],img.width,img.height);\
-
 
2413
     };\
-
 
2414
    };\
-
 
2415
   };\
-
 
2416
  return;\
-
 
2417
  };",use_offset,use_offset,snap);
-
 
2418
}
-
 
2419
 
-
 
2420
void add_js_popup(int canvas_root_id,int xsize,int ysize,char *getfile_cmd){
29
void add_js_popup(char *getfile_cmd){
2421
fprintf(stdout,"\n<!-- begin command popup %d -->\n\
30
fprintf(stdout,"\n<!-- begin command popup %d -->\n\
2422
<script type=\"text/javascript\">\n\
31
<script type=\"text/javascript\">\n\
2423
if( wims_status != 'done'){\
32
if( wims_status != 'done'){\
2424
 var popup = window.open('','','toolbar=no,scrollbars=yes,menubar=no,location=no,resizable=yes,top=4,left=4,status=no, width = %dpx, height = %dpx');\
33
 var popup = window.open('','','toolbar=no,scrollbars=yes,menubar=no,location=no,resizable=yes,top=4,left=4,status=no, width = %dpx, height = %dpx');\
2425
 var popupHTML =\"<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\\n<html><head></head>\\n<body><div style='width:%dpx;height:%dpx;position:relative' id='canvas_div%d'></div><div id='tooltip_placeholder_div%d' style='display:block;position:relative;margin-left:auto;margin-right:auto;margin-bottom:4px;'><span id='tooltip_placeholder%d' style='display:none;'></span></div></body></html>\";\
34
 var popupHTML =\"<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\\n<html><head></head>\\n<body><div style='width:%dpx;height:%dpx;position:relative' id='canvas_div%d'></div><div id='tooltip_placeholder_div%d' style='display:block;position:relative;margin-left:auto;margin-right:auto;margin-bottom:4px;'><span id='tooltip_placeholder%d' style='display:none;'></span></div></body></html>\";\
Line 2433... Line 42...
2433
 popup.document.getElementsByTagName(\"HEAD\")[0].appendChild(s1);\
42
 popup.document.getElementsByTagName(\"HEAD\")[0].appendChild(s1);\
2434
 popup.document.close();\
43
 popup.document.close();\
2435
 }else{\
44
 }else{\
2436
 var canvas_div = document.getElementById('canvas_div%d');\
45
 var canvas_div = document.getElementById('canvas_div%d');\
2437
 canvas_div.style.display='block';\
46
 canvas_div.style.display='block';\
2438
 };\
-
 
2439
 \n</script>\n\
-
 
2440
 <!-- end command popup %d -->\n",
47
 };\n</script>\n<!-- end command popup %d -->\n",
2441
canvas_root_id,
48
canvas_root_id,
2442
xsize+40,ysize+40,
49
xsize+40,ysize+40,
2443
xsize,ysize,
50
xsize,ysize,
2444
canvas_root_id,
51
canvas_root_id,
2445
canvas_root_id,
52
canvas_root_id,
Line 2448... Line 55...
2448
getfile_cmd,
55
getfile_cmd,
2449
canvas_root_id,
56
canvas_root_id,
2450
canvas_root_id);
57
canvas_root_id);
2451
}
58
}
2452
 
59
 
2453
void add_js_tooltip(int canvas_root_id,char *tooltip_text,char *bgcolor,int xsize,int ysize){
60
void add_js_tooltip(char *tooltip_text,char *bgcolor){
2454
fprintf(stdout,"\n<!-- begin command intooltip %d -->\n\
61
fprintf(stdout,"\n<!-- begin command intooltip %d -->\n\
2455
<script type=\"text/javascript\">\n\
62
<script type=\"text/javascript\">\n\
2456
var xsize = %d;\
63
var xsize = %d;\
2457
var ysize = %d;\
64
var ysize = %d;\
2458
var tooltip%d_obj_x = 0;\
65
var tooltip%d_obj_x = 0;\
Line 2479... Line 86...
2479
   tooltip%d_obj.style.top = (ytop - 10) +\"px\";\
86
   tooltip%d_obj.style.top = (ytop - 10) +\"px\";\
2480
  }\
87
  }\
2481
  else\
88
  else\
2482
  {\
89
  {\
2483
   tooltip%d_obj.style.top = parseInt(ytop - 0.8*ysize) +\"px\";\
90
   tooltip%d_obj.style.top = parseInt(ytop - 0.8*ysize) +\"px\";\
2484
  };\
91
  };\
2485
 }\
92
 }\
2486
 else\
93
 else\
2487
 {\
94
 {\
2488
  return null;\
95
  return null;\
2489
 };\
96
 };\
2490
};\
97
};\
2491
function tooltip%d_mouseX(action){\
98
function tooltip%d_mouseX(action){\
2492
 if(action.pageX){\
99
 if(action.pageX){\
Line 2494... Line 101...
2494
 }\
101
 }\
2495
 else\
102
 else\
2496
 {\
103
 {\
2497
  if(action.clientX){\
104
  if(action.clientX){\
2498
   return action.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);\
105
   return action.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);\
2499
  }\
106
  }\
2500
  else\
107
  else\
2501
  {\
108
  {\
2502
   return null;\
109
   return null;\
2503
  };\
110
  };\
2504
 };\
111
 };\
2505
};\
112
};\
2506
function tooltip%d_mouseY(action){\
113
function tooltip%d_mouseY(action){\
Line 2528... Line 135...
2528
  tooltip%d_flipflop = 0;\
135
  tooltip%d_flipflop = 0;\
2529
  tooltip%d_obj.style.display = \"none\";\
136
  tooltip%d_obj.style.display = \"none\";\
2530
 };\
137
 };\
2531
};\n</script>\n<!-- end command intooltip %d -->\n",canvas_root_id,xsize,ysize,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,tooltip_text,canvas_root_id,bgcolor,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id);
138
};\n</script>\n<!-- end command intooltip %d -->\n",canvas_root_id,xsize,ysize,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,tooltip_text,canvas_root_id,bgcolor,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id);
2532
 
139
 
2533
}
-
 
2534
void add_js_arc(FILE *js_include_file,int canvas_root_id,int num,int line_width,char *stroke_color,double stroke_opacity,char *fill_color,double fill_opacity,int use_dashed,int dashtype0,int dashtype1,int use_filled,int use_snap){
-
 
2535
fprintf(js_include_file,"\n/* begin userdraw \"arc\" on final canvas */\n\
-
 
2536
var canvas_rect;\
-
 
2537
var use_filled = %d;\
-
 
2538
function user_draw(evt){\
-
 
2539
 var use_snap = %d;\
-
 
2540
 var num = %d;\
-
 
2541
 var x,xc,x1,x2,y,yc,y1,y2;var lu = userdraw_x.length;\
-
 
2542
 if( num == 1 && lu == 3 ){ userdraw_x = [];userdraw_y = [];userdraw_radius = [];};\
-
 
2543
 if(evt.button == 0 || typeof(evt.identifier) != 'undefined' ){\
-
 
2544
  var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
2545
  var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
2546
  if(num == 1 && lu == 3){userdraw_x = [];userdraw_y = [];userdraw_radius = [];};\
-
 
2547
  lu = userdraw_x.push(xy[0]);userdraw_y.push(xy[1]);\
-
 
2548
  if( lu != 0 && lu%%3 == 0){\
-
 
2549
   context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
2550
   userdraw_radius = [];\
-
 
2551
   for(var p = 0 ; p < lu; p = p + 3){\
-
 
2552
     xc = userdraw_x[p];\
-
 
2553
     yc = userdraw_y[p];\
-
 
2554
     x1 = userdraw_x[p+1];\
-
 
2555
     x2 = userdraw_x[p+2];\
-
 
2556
     y1 = userdraw_y[p+1];\
-
 
2557
     y2 = userdraw_y[p+2];\
-
 
2558
     draw_userarc(context_userdraw,xc,yc,x1,y1,x2,y2,%d,\"%s\",%.2f,\"%s\",%.2f,%d,%d,%d,use_filled);\
-
 
2559
   };\
-
 
2560
  };\
-
 
2561
 }\
-
 
2562
 else\
-
 
2563
 {\
-
 
2564
  if( confirm(\"remove drawing ?\") ){\
-
 
2565
   context_userdraw.clearRect(0,0,xsize,ysize);userdraw_x = [];userdraw_y = [];userdraw_radius = [];return;\
-
 
2566
  };\
-
 
2567
 };\
-
 
2568
};\
-
 
2569
function user_drag(evt){ \
-
 
2570
 var lu = userdraw_x.length;\
-
 
2571
 if( (lu+1)%%3 == 0) {\
-
 
2572
  var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
2573
  var x2 = mouse.x;\
-
 
2574
  var y2 = mouse.y;\
-
 
2575
  var xc = userdraw_x[lu-2];\
-
 
2576
  var yc = userdraw_y[lu-2];\
-
 
2577
  var x1 = userdraw_x[lu-1];\
-
 
2578
  var y1 = userdraw_y[lu-1];\
-
 
2579
  context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
2580
  draw_userarc(context_userdraw,xc,yc,x1,y1,x2,y2,1,\"255,0,0\",0.6,\"255,255,0\",0.4,0,2,2,use_filled);\
-
 
2581
 };\
-
 
2582
 return;\
-
 
2583
};\
-
 
2584
var draw_userarc = function(ctx,xc,yc,x1,y1,x2,y2,line_width,stroke_color,stroke_opacity,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1,use_filled){\
-
 
2585
 ctx.save();\
-
 
2586
 if( use_dashed == 1){if(ctx.setLineDash){ctx.setLineDash([dashtype0,dashtype1]);}else{if(ctx.mozDash){ ctx.mozDash = [dashtype0,dashtype1];};};};\
-
 
2587
 ctx.lineWidth = line_width;\
-
 
2588
 ctx.strokeStyle =  \"rgba(\"+stroke_color+\",\"+stroke_opacity+\")\";\
-
 
2589
 ctx.fillStyle = \"rgba(\"+fill_color+\",\"+fill_opacity+\")\";\
-
 
2590
 var alpha = find_angle(xc,yc,x2,y2);\
-
 
2591
 if( %d == 1 ){userdraw_radius[0] = alpha;ctx.clearRect(0,0,xsize,ysize);}else{userdraw_radius.push(alpha);};\
-
 
2592
 var r = Math.sqrt(Math.pow(xc-x2,2)+Math.pow(yc-y2,2));\
-
 
2593
 var start = find_angle(xc,yc,x1,y1);\
-
 
2594
 ctx.translate(xc,yc);\
-
 
2595
 ctx.rotate(start);\
-
 
2596
 ctx.beginPath();\
-
 
2597
 ctx.arc(0,0,r,0,alpha,false);\
-
 
2598
 ctx.lineTo(0,0);\
-
 
2599
 ctx.closePath();\
-
 
2600
 if(use_filled == 1){ ctx.fill();};\
-
 
2601
 ctx.stroke();\
-
 
2602
 ctx.restore();\
-
 
2603
};",use_filled,use_snap,num,line_width,stroke_color,stroke_opacity,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1,num);
-
 
2604
}
140
}
2605
 
141
 
2606
void add_js_text(FILE *js_include_file,int canvas_root_id,int font_size,char *font_family,char *font_color,double stroke_opacity,int use_snap){
-
 
2607
fprintf(js_include_file,"\n/* begin command userdraw text */\n\
-
 
2608
canvas_div.addEventListener(\"keydown\",function(e){ e.preventDefault();user_text(e);},false);\
-
 
2609
context_userdraw = canvas_userdraw.getContext(\"2d\");\
-
 
2610
var use_snap = %d;\
-
 
2611
var font_color = \"%s\";\
-
 
2612
var font_opacity = %f;\
-
 
2613
var mask_opacity = 0.5*font_opacity;\
-
 
2614
var font_size = %d;\
-
 
2615
var font_family = \"%s\";\
-
 
2616
context_userdraw.fillStyle = \"rgba(\"+font_color+\",\"+font_opacity+\")\";\
-
 
2617
context_userdraw.font = font_family;\
-
 
2618
context_userdraw.save();\
-
 
2619
var tmp_font_size = parseInt(context_userdraw.measureText(\"m\").width);\
-
 
2620
if( font_size > tmp_font_size ){context_userdraw.font = font_size+\"px Ariel\";};\
-
 
2621
var userdraw_text = new Array();\
-
 
2622
var temp_userdraw_txt=\"\";\
-
 
2623
var x_txt = 0;\
-
 
2624
var y_txt = 0;\
-
 
2625
function user_draw(evt){\
-
 
2626
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
2627
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
2628
 x_txt = xy[0];\
-
 
2629
 y_txt = xy[1];\
-
 
2630
 return;\
-
 
2631
};\
-
 
2632
function user_drag(evt){return;};\
-
 
2633
function redraw_all_user_text(){\
-
 
2634
 var len = userdraw_x.length;\
-
 
2635
 context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
2636
 for(var p = 0 ; p < len ; p++){\
-
 
2637
  context_userdraw.fillText(userdraw_text[p],userdraw_x[p],userdraw_y[p]);\
-
 
2638
 };\
-
 
2639
};\
-
 
2640
function user_text(evt){\
-
 
2641
 var kc = evt.keyCode;\
-
 
2642
 if( kc== 8 || kc == 27 || kc == 46 ){\
-
 
2643
  var len = userdraw_x.length;\
-
 
2644
  for( var p=0 ; p < len ; p++){\
-
 
2645
   var tmp = userdraw_text[p];\
-
 
2646
   var w = context_userdraw.measureText(tmp).width;\
-
 
2647
   if( y_txt <= userdraw_y[p] && y_txt > userdraw_y[p] - font_size){\
-
 
2648
    if( x_txt < userdraw_x[p] + w && x_txt > userdraw_x[p] ){\
-
 
2649
     if (confirm(\"delete : \"+tmp+\"?\")){\
-
 
2650
      userdraw_text.splice(p,1);\
-
 
2651
      userdraw_x.splice(p,1);\
-
 
2652
      userdraw_y.splice(p,1);\
-
 
2653
      temp_userdraw_txt = \"\";\
-
 
2654
      redraw_all_user_text();\
-
 
2655
      return;\
-
 
2656
     };\
-
 
2657
    };\
-
 
2658
   };\
-
 
2659
  };\
-
 
2660
 }\
-
 
2661
 else\
-
 
2662
 {\
-
 
2663
  if( kc < 126 && kc > 40 ){\
-
 
2664
   temp_userdraw_txt=temp_userdraw_txt+String.fromCharCode(kc);\
-
 
2665
   context_userdraw.save();\
-
 
2666
   context_userdraw.fillStyle = \"rgba(\"+font_color+\",\"+mask_opacity+\")\";\
-
 
2667
   context_userdraw.fillText(temp_userdraw_txt,x_txt,y_txt);\
-
 
2668
   context_userdraw.restore();\
-
 
2669
  }\
-
 
2670
  else\
-
 
2671
  {\
-
 
2672
   if(kc == 13 ){\
-
 
2673
    w = context_userdraw.measureText(temp_userdraw_txt).width;\
-
 
2674
    if(w < 1){ return;};\
-
 
2675
    userdraw_x.push(x_txt);\
-
 
2676
    userdraw_y.push(y_txt);\
-
 
2677
    userdraw_text.push(temp_userdraw_txt);\
-
 
2678
    redraw_all_user_text();\
-
 
2679
    temp_userdraw_txt=\"\";\
-
 
2680
    return;\
-
 
2681
   };\
-
 
2682
  };\
-
 
2683
 };\
-
 
2684
};",use_snap,font_color,stroke_opacity,font_size,font_family);
-
 
2685
 
-
 
2686
}
-
 
2687
 
142
 
2688
/*
143
/*
2689
 
144
 
2690
type = 0 : x-values only [command mousex]
145
type = 0 : x-values only [command mousex]
2691
type = 1 : y-values only [command mousey]
146
type = 1 : y-values only [command mousey]
2692
type = 2 : (x:y)         [command mouse]
147
type = 2 : (x:y)         [command mouse]
2693
type = 3 : degree        [command mouse_degree]
148
type = 3 : degree        [command mouse_degree]
2694
type = 4 : radian
149
type = 4 : radian
2695
type = 5 : radius
150
type = 5 : radius
2696
 
151
 
2697
  var mouse = dragstuff.getMouse(evt,canvas_div);\
152
  var mouse = getMouse(evt,canvas_div);\
2698
  var x = evt.clientX - mouse_canvas_rect.left;\
153
  var x = evt.clientX - mouse_canvas_rect.left;\
2699
  var y = evt.clientY - mouse_canvas_rect.top;\
154
  var y = evt.clientY - mouse_canvas_rect.top;\
2700
 
155
 
2701
*/
156
*/
2702
void add_js_mouse(FILE *js_include_file,int canvas_cnt,int canvas_root_id,int precision,char *stroke_color,int font_size,double stroke_opacity,int type){
157
void add_js_mouse(int canvas_cnt,int precision,char *stroke_color,int font_size,double stroke_opacity,int type){
2703
fprintf(js_include_file,"\n/* begin command mouse on mouse canvas */\n\
158
fprintf(js_include_file,"\n/* command mouse on mouse canvas */\
2704
function use_mouse_coordinates(){\
159
function use_mouse_coordinates(){\
2705
 var display_type = %d;\
160
 var display_type = %d;\
2706
 var canvas_type = %d;\
161
 var canvas_type = %d;\
2707
 var mouse_canvas = create_canvas%d(canvas_type,xsize,ysize);\
162
 var mouse_canvas = create_canvas%d(canvas_type,xsize,ysize);\
2708
 var mouse_context = mouse_canvas.getContext(\"2d\");\
163
 var mouse_context = mouse_canvas.getContext(\"2d\");\
2709
 mouse_canvas.addEventListener(\"mousemove\", show_coordinate%d,false);\
164
 mouse_canvas.addEventListener(\"mousemove\",show_coordinate%d,false);\
2710
 mouse_canvas.addEventListener(\"touchmove\", function(e){ e.preventDefault();show_coordinate%d(e.changedTouches[0]);},false);\
165
 mouse_canvas.addEventListener(\"touchmove\", function(e){ e.preventDefault();show_coordinate%d(e.changedTouches[0]);},false);\
2711
 var prec = Math.log(%d)/(Math.log(10));\
166
 var prec = Math.log(%d)/(Math.log(10));\
2712
 function show_coordinate%d(evt){\
167
 function show_coordinate%d(evt){\
2713
  var mouse = dragstuff.getMouse(evt,mouse_canvas);\
168
  var mouse = getMouse(evt,mouse_canvas);\
2714
  var x = mouse.x;\
169
  var x = mouse.x;\
2715
  var y = mouse.y;\
170
  var y = mouse.y;\
2716
  var m_data = \"\";\
171
  var m_data = \"\";\
2717
  switch(display_type){\
172
  switch(display_type){\
2718
   case 0: m_data = \" \"+(px2x(x)).toFixed(prec)+\" \"+unit_x;break;\
173
   case 0: m_data = \" \"+(px2x(x)).toFixed(prec)+\" \"+unit_x;break;\
Line 2728... Line 183...
2728
  mouse_context.fillStyle = \"rgba(%s,%f)\";\
183
  mouse_context.fillStyle = \"rgba(%s,%f)\";\
2729
  mouse_context.clearRect(0,0,s,1.2*%d);\
184
  mouse_context.clearRect(0,0,s,1.2*%d);\
2730
  mouse_context.fillText(m_data,0,%d);\
185
  mouse_context.fillText(m_data,0,%d);\
2731
 };\
186
 };\
2732
};",type,MOUSE_CANVAS,canvas_root_id,canvas_root_id,canvas_root_id,precision,canvas_root_id,font_size,font_size,stroke_color,stroke_opacity,font_size,font_size);
187
};",type,MOUSE_CANVAS,canvas_root_id,canvas_root_id,canvas_root_id,precision,canvas_root_id,font_size,font_size,stroke_color,stroke_opacity,font_size,font_size);
2733
}
-
 
2734
/* to avoid easy js-code injection...but is it a real problem ? */
-
 
2735
void add_safe_eval(FILE *js_include_file){
-
 
2736
fprintf(js_include_file," \nfunction safe_eval(exp){\
-
 
2737
 exp = exp.replace(/pi/g,'3.14159');\
-
 
2738
 if(exp.indexOf('^') != -1){\
-
 
2739
  exp = exp.replace(/[a-zA-Z]/g,' ');\
-
 
2740
  exp = exp.replace(/\\*10\\^-/g,'e-');\
-
 
2741
  exp = exp.replace(/\\*10\\^/g,'e+');\
-
 
2742
  exp = exp.replace(/10\\^-/g,'1e-');exp = exp.replace(/10\\^/g,'1e+');\
-
 
2743
  exp = eval(exp);\
-
 
2744
  if(isNaN(exp)){alert(\"invalid input\\ntry just a real number \\ne.g. no calculations...\");return null;}\
-
 
2745
  return exp;\
-
 
2746
 };\
-
 
2747
 var reg = /(?:[a-z$_][a-z0-9$_]*)|(?:[;={}\\[\\]\"'!&<>^\\\\?:])/ig;\
-
 
2748
 var valid = true;\
-
 
2749
 exp = exp.replace(reg,function($0){\
-
 
2750
  if(Math.hasOwnProperty($0)){\
-
 
2751
   return \"Math.\"+$0;\
-
 
2752
  }\
-
 
2753
  else\
-
 
2754
  {\
-
 
2755
   valid = false;\
-
 
2756
  }\
-
 
2757
 }\
-
 
2758
 );\
-
 
2759
 if( !valid ){\
-
 
2760
  alert(\"hmmm \"+exp+\" ?\"); exp = null;\
-
 
2761
 }\
-
 
2762
 else\
-
 
2763
 {\
-
 
2764
  try{ exp = eval(exp); } catch(e){alert(\"Invalid arithmetic expression\"); exp = null;};\
-
 
2765
 };\
-
 
2766
 return exp;\
-
 
2767
};");
-
 
2768
}
188
}
2769
 
189
 
2770
/*
190
/*
2771
Math.sin: angle in radians
191
Math.sin: angle in radians
2772
x1 = x*cos(a) - y*sin(a)
192
x1 = x*cos(a) - y*sin(a)
Line 2777... Line 197...
2777
show_display = 3 delta R radians
197
show_display = 3 delta R radians
2778
show_display = 4 delta degrees
198
show_display = 4 delta degrees
2779
show_display = 5 delta X:Y
199
show_display = 5 delta X:Y
2780
 
200
 
2781
*/
201
*/
2782
void add_slider_display(FILE *js_include_file,int canvas_root_id,int precision,int font_size,char *font_color,double stroke_opacity){
202
void add_slider_display(int precision,int font_size,char *font_color,double stroke_opacity){
2783
fprintf(js_include_file,"\n /* begin add_slider_display */ \n\
203
fprintf(js_include_file,"\n/* add_slider_display */\
2784
var slider_prec = Math.log(%d)/(Math.log(10));\
204
var slider_prec = Math.log(%d)/(Math.log(10));\
2785
 function show_slider_value(value,use_slider_display){\
205
 function show_slider_value(value,use_slider_display){\
2786
 var current_canvas = create_canvas%d(%d,xsize,ysize);\
206
 var current_canvas = create_canvas%d(%d,xsize,ysize);\
2787
 var current_context = current_canvas.getContext(\"2d\");\
207
 var current_context = current_canvas.getContext(\"2d\");\
2788
 current_context.clearRect(0,0,xsize,ysize);\
208
 current_context.clearRect(0,0,xsize,ysize);\
Line 2800... Line 220...
2800
 current_context.font = '%dpx Ariel';\
220
 current_context.font = '%dpx Ariel';\
2801
 current_context.strokeStyle = 'rgba(%s,%.2f)';\
221
 current_context.strokeStyle = 'rgba(%s,%.2f)';\
2802
 current_context.clearRect(0,0,s,1.2*%d);\
222
 current_context.clearRect(0,0,s,1.2*%d);\
2803
 current_context.fillText(string,0,%d);};",precision,canvas_root_id,MOUSE_CANVAS,font_size,font_size,font_color,stroke_opacity,font_size,font_size);
223
 current_context.fillText(string,0,%d);};",precision,canvas_root_id,MOUSE_CANVAS,font_size,font_size,font_color,stroke_opacity,font_size,font_size);
2804
}
224
}
2805
/*
-
 
2806
add slider
-
 
2807
        P1   P2      Center
-
 
2808
0 px ----|-------------|-------------------- width px
-
 
2809
min  ----|-------------|-------------------- max (x/y/rad)
-
 
2810
0 px ----|----|--------|-------------------- width px
-
 
2811
 
225
 
2812
C: slider center (xcenter px)
-
 
2813
P1: x_px = P px
-
 
2814
P1: delta = d(PC) == C - P px == (C - P)/(width)*(max - min) in x/y/rad
-
 
2815
P1: delta = d(PC) == (xcenter - x_px)/width*(max - min);
-
 
2816
P2: increase P2-P1
-
 
2817
P2: display C - P2 =  d(CP2) == (xcenter - x_px)/width*(max - min);
-
 
2818
P2: displacement = P2 - P1 px
-
 
2819
*/
-
 
2820
void add_slider(FILE *js_include_file,int canvas_root_id){
226
void add_slider(int anim){
2821
fprintf(js_include_file,"\n/* begin add_slider */\n\
227
fprintf(js_include_file,"\n/* add_slider aux*/\
2822
 function array_uniq(array){\
-
 
2823
  var seen = {};\
-
 
2824
  var out = [];\
-
 
2825
  var len = array.length;\
-
 
2826
  var j = 0;\
-
 
2827
  for(var i = 0; i < len; i++){\
-
 
2828
   var item = array[i];\
-
 
2829
   if(seen[item] !== 1){\
-
 
2830
    seen[item] = 1;out[j++] = item;\
-
 
2831
   };\
-
 
2832
  };\
-
 
2833
  return out;\
-
 
2834
 };\
-
 
2835
 function contains(array, e){\
-
 
2836
  var len  = array.length;\
-
 
2837
  for (var p = 0; p < len; p++){\
-
 
2838
  if (array[p] == e){\
-
 
2839
   return true;\
-
 
2840
  };\
-
 
2841
 };\
-
 
2842
 return false;\
-
 
2843
};\
-
 
2844
function translateX(obj,dx){\
-
 
2845
 var len = obj.x.length;\
-
 
2846
 for(var p=0;p<len;p++){\
-
 
2847
   obj.x[p]+=dx;\
-
 
2848
 };\
-
 
2849
 return obj;\
-
 
2850
};\
-
 
2851
function translateY(obj,dy){\
-
 
2852
 var len = obj.x.length;\
-
 
2853
 for(var p=0;p<len;p++){\
-
 
2854
   obj.y[p]-=dy;\
-
 
2855
 };\
-
 
2856
 return obj;\
-
 
2857
};\
-
 
2858
function rotateXY(obj,angle){\
228
function rotateXY(obj,angle){\
2859
 if( typeof(angle) === 'undefined' ){console.log('rotateXY() angle undefined');return obj;};\
229
 if( typeof(angle) === 'undefined' ){console.log('rotateXY() angle undefined');return obj;};\
2860
 var len = obj.x.length;\
230
 var len = obj.x.length;\
-
 
231
 if( typeof(len) === 'undefined' ){obj.angle = angle;return obj;};\
2861
 var cos = Math.cos(obj.angle-angle);\
232
 var cos = Math.cos(angle - obj.angle);\
2862
 var sin = Math.sin(obj.angle-angle);\
233
 var sin = Math.sin(angle - obj.angle);\
2863
 obj.angle = angle;\
234
 obj.angle = angle;\
-
 
235
 var xc,yc;\
-
 
236
 if( obj.use_rotation_center == 0 ){\
-
 
237
  xc = obj.x[0];\
-
 
238
  yc = obj.y[0];\
-
 
239
 }else{\
2864
 var xc = obj.rotation_center[0];\
240
  xc = obj.rotation_center[0];\
2865
 var yc = obj.rotation_center[1];\
241
  yc = obj.rotation_center[1];\
-
 
242
 };\
2866
 var x,y;\
243
 var x,y;\
2867
 for(var p = 0 ; p < len ; p++ ){\
244
 for(var p = 0 ; p < len ; p++ ){\
2868
  x = obj.x[p];\
245
  x = obj.x[p];\
2869
  y = obj.y[p];\
246
  y = obj.y[p];\
2870
  obj.x[p] = (cos * (x - xc)) + (sin * (y - yc)) + xc;\
247
  obj.x[p] = (cos * (x - xc)) + (sin * (y - yc)) + xc;\
2871
  obj.y[p] = (cos * (y - yc)) - (sin * (x - xc)) + yc ;\
248
  obj.y[p] = (cos * (y - yc)) - (sin * (x - xc)) + yc;\
2872
 };\
249
 };\
2873
 return obj;\
250
 return obj;\
2874
};\
251
};\
2875
function rotateARC(obj,angle){\
252
function rotateARC(obj,angle){\
2876
 obj.h[0] = angle;\
253
 obj.h[0] = angle;\
2877
 obj.angle = -1*angle;\
254
 obj.angle = -1*angle;\
2878
 return obj;\
255
 return obj;\
2879
};\
256
};\
-
 
257
function slider_show_it(XYR,dx,value,slider_id){\
-
 
258
console.log(slidergroup);\
-
 
259
 if(slidergroup.length != 0){\
-
 
260
  var len = slidergroup.length;var use_xml = false;\
-
 
261
  for(var i = 0;i < len;i++){\
-
 
262
   use_xml = false;var obj = slidergroup[i];\
-
 
263
   if( obj !== null ){\
-
 
264
    if( obj.use_slider[0] != -1 ){\
-
 
265
     var sl = obj.use_slider.length;\
-
 
266
     for(var s = 0 ; s < sl;s++ ){\
-
 
267
      if(obj.use_slider[s] == slider_id ){\
-
 
268
       if( typeof(obj.type) !== 'number' ){use_xml = true;};\
-
 
269
       switch(XYR){\
-
 
270
        case 'X' : obj = move(obj,dx,0);dragdrop_reply[obj.object_cnt].x = obj.x;break;\
-
 
271
        case 'Y' : obj = move(obj,0,dx);dragdrop_reply[obj.object_cnt].y = obj.y;break;\
-
 
272
        case 'R' : if(obj.type == 17 ){obj = rotateARC(obj,value);}else{obj = rotateXY(obj,value);};dragdrop_reply[obj.object_cnt].angle = obj.angle;break;\
-
 
273
        default : break;\
-
 
274
       };\
-
 
275
      };\
-
 
276
     };\
-
 
277
    };\
-
 
278
    if( use_xml ){ draw_xml(obj); }\
-
 
279
    dragstuff.draw();dragstuff.valid = false;\
-
 
280
   };\
-
 
281
  };\
-
 
282
 };\
-
 
283
 return;\
-
 
284
};\
-
 
285
");
-
 
286
 
-
 
287
if(anim == 0){fprintf(js_include_file,"\n/* add_slider */\
2880
if( typeof(unit_x) === 'undefined' ){var unit_x = ' ';};\
288
if( typeof(unit_x) === 'undefined' ){var unit_x = ' ';};\
2881
if( typeof(unit_y) === 'undefined' ){var unit_y = ' ';};\
289
if( typeof(unit_y) === 'undefined' ){var unit_y = ' ';};\
2882
function slider(type,titletext,slider_id,width,height,linewidth,fillcolor,strokecolor,opacity,min,max,fun,fontfamily,show_display){\
290
function slider(XYR,text,slider_id ,width,height,linewidth,fillcolor,strokecolor,opacity,min,max,fontfamily,display){\
2883
 if( wims_status == \"done\" ){return;};\
-
 
2884
 var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
291
 if( wims_status == \"done\" ){return;};var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
2885
 type = type || 'X';\
-
 
2886
 titletext = titletext || 'slider no.'+id;\
-
 
2887
 slider_id = slider_id || 0;\
-
 
2888
 width = width || xsize;\
-
 
2889
 height = height || parseInt(0.1*ysize);\
-
 
2890
 var xcenter = 0.5*width;\
-
 
2891
 var ycenter = 0.5*height;\
-
 
2892
 var previous_position = xcenter;\
-
 
2893
 var radius = 2*linewidth;\
-
 
2894
 opacity = opacity || [0.5,0.8];\
-
 
2895
 fillcolor = 'rgba('+fillcolor+','+opacity[0]+')' || 'rgba(200,200,0,0.2)';\
292
 var xcenter = 0.5*width;var rcenter = 0.5*width;fillcolor = 'rgba('+fillcolor+','+opacity[0]+')' || 'rgba(200,200,0,0.2)';\
2896
 strokecolor = 'rgba('+strokecolor+','+opacity[1]+')' || 'rgba(0,0,0,0.8)';\
293
 strokecolor = 'rgba('+strokecolor+','+opacity[1]+')';var title = document.createTextNode(text);\
2897
 min = min || 0;\
-
 
2898
 max = max || 10;\
-
 
2899
 fun = fun || null;\
-
 
2900
 fontfamily = fontfamily || 'Italic 1.0em Courier';\
-
 
2901
 var span = document.createElement(\"span\");\
-
 
2902
 var button = document.createElement(\"a\");\
-
 
2903
 button.innerHTML = \"<span style='font-size:1.2em;color:red;'>&#x2297;&nbsp;</span>\";\
-
 
2904
 button.onclick = function(){dragstuff.slidergroup = [angle_object];reset_slider();};\
-
 
2905
 var style = 'font:'+fontfamily;\
-
 
2906
 span.setAttribute('style',style);\
-
 
2907
 var title = document.createTextNode(titletext);\
-
 
2908
 var br = document.createElement(\"br\");\
294
 var br = document.createElement('BR');tooltip_div.appendChild(br);tooltip_div.appendChild(title);\
2909
 span.appendChild(title);\
-
 
2910
 span.appendChild(br);\
-
 
2911
 tooltip_div.appendChild(button);\
-
 
2912
 tooltip_div.appendChild(span);\
-
 
2913
 var slider_canvas = document.createElement('canvas');\
295
 var slider_canvas = document.createElement('canvas');slider_canvas.id = 'canvas'+slider_id;tooltip_div.appendChild(slider_canvas);\
2914
 slider_canvas.id = 'canvas'+slider_id;\
-
 
2915
 tooltip_div.appendChild(slider_canvas);\
-
 
2916
 br = document.createElement(\"br\");\
-
 
2917
 tooltip_div.appendChild(br);\
-
 
2918
 var text_begin = 20;\
-
 
2919
 width = width+text_begin;\
-
 
2920
 slider_canvas.width = width;\
-
 
2921
 slider_canvas.height = height;\
-
 
2922
 var slider_ctx = slider_canvas.getContext(\"2d\");\
296
 slider_canvas.width = width;slider_canvas.height = height;var slider_ctx = slider_canvas.getContext(\"2d\");\
2923
 slider_ctx.font = fontfamily;\
-
 
2924
 slider_ctx.strokeStyle = strokecolor;\
297
 slider_ctx.font = fontfamily;slider_ctx.strokeStyle = strokecolor;\
2925
 slider_ctx.fillStyle = fillcolor;\
298
 slider_ctx.fillStyle = fillcolor;slider_ctx.lineWidth = linewidth;slider_ctx.save();\
2926
 slider_ctx.lineWidth = linewidth;\
299
 slider_ctx.beginPath();slider_ctx.moveTo(0,height-10);slider_ctx.lineTo(width,height-10);\
2927
 slider_ctx.save();\
-
 
2928
 slider_ctx.beginPath();\
-
 
2929
 slider_ctx.arc(xcenter,ycenter,radius,0,2*Math.PI,false);\
300
 slider_ctx.moveTo(xcenter-10,10);slider_ctx.lineTo(xcenter+10,10);slider_ctx.lineTo(xcenter,height-10);\
2930
 slider_ctx.rect(0,0,width,height);\
-
 
2931
 slider_ctx.closePath();\
-
 
2932
 slider_ctx.fill();\
-
 
2933
 slider_ctx.stroke();\
-
 
2934
 slider_canvas.addEventListener(\"mousedown\" , slider_on, false);\
301
 slider_ctx.lineTo(xcenter-10,10);slider_ctx.closePath();slider_ctx.stroke();slider_ctx.fill();\
2935
 slider_canvas.addEventListener(\"mouseup\"   , slider_off, false);\
302
 slider_canvas.addEventListener( 'mousemove' ,slide_me,false);\
2936
 slider_canvas.addEventListener(\"mouseout\"  , slider_off, false);\
303
 slider_canvas.addEventListener( 'mouseup' ,stop_slide_me,false);\
2937
 slider_canvas.addEventListener(\"mousemove\" , slide_me, false);\
304
 slider_canvas.addEventListener( 'mousedown' ,start_slide_me,false);\
2938
 slider_canvas.addEventListener(\"touchmove\" , function(e){ e.preventDefault();slide_me(e.changedTouches[0]);},false);\
305
 slider_canvas.addEventListener( 'touchstart', function(e){ e.preventDefault();start_slide_me(e.changedTouches[0]);},false);\
2939
 slider_canvas.addEventListener(\"touchstart\", function(e){ e.preventDefault();slider_on(e.changedTouches[0]);},false);\
306
 slider_canvas.addEventListener( 'touchend',   function(e){ e.preventDefault();stop_slide_me(e.changedTouches[0]);},false);\
2940
 slider_canvas.addEventListener(\"touchend\"  , function(e){ e.preventDefault();slider_off(e.changedTouches[0]);},false);\
307
 slider_canvas.addEventListener( 'touchmove' ,function(e){ e.preventDefault();slide_me(e.changedTouches[0]);},false);\
2941
 var slider_is_active = false;\
308
 var slider_active = false;var value;\
2942
 function slider_on(evt){\
-
 
2943
  slider_is_active = true;\
-
 
2944
 };\
-
 
2945
 function slider_off(evt){\
-
 
2946
  slider_is_active = false;\
309
 function stop_slide_me(evt){slider_active = false;};\
2947
 };\
-
 
2948
 var my_slider_position;\
-
 
2949
 var scale_factor = (max - min)/(xmax - xmin);\
-
 
2950
 var display_factor = 1/width*(max - min);\
-
 
2951
 var angle_object = null;\
-
 
2952
 function reset_slider(){\
310
 function start_slide_me(evt){slider_active = true;};\
2953
  slider_ctx.beginPath();\
-
 
2954
  slider_ctx.arc(xcenter,ycenter,radius,0,2*Math.PI,false);\
-
 
2955
  slider_ctx.rect(0,0,width,height);\
-
 
2956
  slider_ctx.closePath();\
-
 
2957
  slider_ctx.fill();\
-
 
2958
  slider_ctx.stroke();\
-
 
2959
  slider_ctx.restore();\
-
 
2960
  previous_position = xcenter;\
-
 
2961
 };\
-
 
2962
 function slide_me(evt){\
311
 function slide_me(evt){\
2963
  if( ! slider_is_active ){return;};\
312
  if( slider_active == false ){return;};\
2964
  if( ! dragstuff.slidergroup){return;};\
-
 
2965
  var canvas_rect = slider_canvas.getBoundingClientRect();\
313
  var canvas_rect = slider_canvas.getBoundingClientRect();\
2966
  slider_ctx.clearRect(0,0,width,height);\
314
  slider_ctx.clearRect(0,0,width,height);\
2967
  my_slider_position = parseInt(evt.clientX - canvas_rect.left);\
315
  var px = parseInt(evt.clientX - canvas_rect.left);\
2968
  slider_ctx.beginPath();\
316
  slider_ctx.beginPath();slider_ctx.moveTo(0,height-10);slider_ctx.lineTo(width,height-10);\
2969
  slider_ctx.arc(my_slider_position,ycenter,radius,0,2*Math.PI,false);\
317
  slider_ctx.moveTo(px-10,10);slider_ctx.lineTo(px+10,10);slider_ctx.lineTo(px,height-10);\
2970
  slider_ctx.rect(0,0,width,height);\
318
  slider_ctx.lineTo(px-10,10);slider_ctx.closePath();slider_ctx.stroke();slider_ctx.fill();\
2971
  slider_ctx.closePath();\
319
  value = (px - rcenter)/width*(max - min);\
2972
  slider_ctx.fill();\
320
  if( display > 0 ){show_slider_value(value,display);};\
2973
  slider_ctx.stroke();\
321
  var dx = px - xcenter;xcenter = px;\
2974
  slider_ctx.restore();\
322
  slider_show_it(XYR,dx,value,slider_id);\
-
 
323
 };\
2975
  var display_delta = (xcenter - my_slider_position)*display_factor;\
324
};",canvas_root_id);
-
 
325
}
2976
  var delta = scale_factor*(my_slider_position - previous_position );\
326
if( anim == 1){
2977
  previous_position = my_slider_position;\
327
fprintf(js_include_file,"\n/* add_anim_slider */\
2978
  if( show_display > 0 ){show_slider_value(display_delta,show_display);};\
328
function animslider(XYR,text,slider_id ,width,height,linewidth,fillcolor,strokecolor,opacity,min,max,fontfamily,display)\
-
 
329
{\
2979
  dragstuff.slidergroup = array_uniq(dragstuff.slidergroup);\
330
 document.addEventListener('readystatechange',function(event){\
2980
  var len = dragstuff.slidergroup.length;\
331
  if(event.target.readyState === 'complete'){\
2981
  for(var i = 0;i<len;i++){\
-
 
2982
   var idx = dragstuff.slidergroup[i];\
-
 
2983
   if( idx > -1){\
332
   var value= 0;\
2984
    var obj = dragstuff.shapes[idx];\
333
   var timer = setInterval(function(){\
2985
    if( typeof(obj) === 'object' ){\
-
 
2986
     if(type == 'X' ){ obj = translateX(obj,delta);};\
334
    value++;slider_show_it(XYR,value,value,slider_id);\
2987
     if(type == 'Y' ){ obj = translateY(obj,delta);};\
335
    if( value > width ){clearInterval( timer );}\
2988
     if(type == 'R' ){ if(obj.type == 17 ){obj = rotateARC(obj,-1*display_delta);angle_object = idx;}else{obj = rotateXY(obj,display_delta);};};\
-
 
2989
     reply[obj.click_cnt] = obj;\
-
 
2990
    };\
-
 
2991
   };\
336
   },240);\
2992
  };\
337
  };\
2993
  dragstuff.valid = false;\
-
 
2994
  dragstuff.draw();\
338
 },false);\
2995
  return;\
339
};");
2996
 };\
340
}
2997
};\n",canvas_root_id);
-
 
2998
}
341
}
2999
 
-
 
3000
/*
-
 
3001
 
-
 
3002
  if(evt.button == 0 || typeof(evt.identifier) != 'undefined'){dx=0;dy=Math.PI/4;};\
342
/*      dragdrop_reply[obj.object_cnt] = obj;
3003
 
-
 
3004
add xyslider
-
 
3005
 return value is array : value[0] is the actual x-value between value_1 and value_2, value[1] is y-value between value_1 and value_2
-
 
3006
*/
343
*/
3007
void add_xyslider(FILE *js_include_file, int canvas_root_id,double v1,double v2,int width,int height,char *type,char *label,int slider_cnt,char *stroke_color,char *fill_color,int line_width,double opacity,char *font_family,char *font_color,int use_slider_display){
-
 
3008
fprintf(js_include_file,"\n/* begin add_slider no. %d */\n\
-
 
3009
function add_slider_%d(){\
-
 
3010
 if( wims_status == \"done\" ){return;};\
-
 
3011
 var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
-
 
3012
 var slider_type = %s;\
-
 
3013
 var span = document.createElement(\"span\");\
-
 
3014
 span.setAttribute(\"style\",\"font:%s;color:%s\");\
-
 
3015
 var title = document.createTextNode(\" %s \");\
-
 
3016
 var br = document.createElement(\"br\");\
-
 
3017
 span.appendChild(title);\
-
 
3018
 span.appendChild(br);\
-
 
3019
 tooltip_div.appendChild(span);\
-
 
3020
 var slider_fillcolor = \"%s\";\
-
 
3021
 var slider_click = 0;\
-
 
3022
 var slider_strokecolor = \"%s\";\
-
 
3023
 var slider_linewidth = \"%d\";\
-
 
3024
 var this.canvas = document.createElement(\"canvas\");\
-
 
3025
 this.canvas.id = \"this.canvas%d\";\
-
 
3026
 tooltip_div.appendChild(this.canvas);\
-
 
3027
 br = document.createElement(\"br\");\
-
 
3028
 tooltip_div.appendChild(br);\
-
 
3029
 var slider_width = %d;\
-
 
3030
 var slider_height = %d;\
-
 
3031
 var slider_center = %d;\
-
 
3032
 var slider_radius = 4*slider_linewidth;\
-
 
3033
 var slider_opacity = %f;\
-
 
3034
 this.canvas.width = slider_width;\
-
 
3035
 this.canvas.height = slider_height;\
-
 
3036
 var slider_ctx = this.canvas.getContext(\"2d\");\
-
 
3037
 slider_ctx.font = \"%s\";\
-
 
3038
 slider_ctx.strokeStyle = \"rgba(\"+slider_strokecolor+\",\"+slider_opacity+\")\";\
-
 
3039
 slider_ctx.fillStyle = \"rgba(\"+slider_fillcolor+\",\"+slider_opacity+\")\";\
-
 
3040
 slider_ctx.lineWidth = slider_linewidth;\
-
 
3041
 slider_ctx.beginPath();\
-
 
3042
 slider_ctx.arc(10,slider_center,slider_radius,0,2*Math.PI,false);\
-
 
3043
 slider_ctx.fill();\
-
 
3044
 slider_ctx.closePath();\
-
 
3045
 slider_ctx.rect(0,0,slider_width,slider_height);\
-
 
3046
 slider_ctx.stroke();\
-
 
3047
 this.canvas.addEventListener(\"mousemove\", sliderdrag_%d,false);\
-
 
3048
 this.canvas.addEventListener(\"mousedown\", sliderclick_%d,false);\
-
 
3049
 this.canvas.addEventListener(\"touchmove\", function(e){ e.preventDefault();sliderdrag_%d(e.changedTouches[0]);},false);\
-
 
3050
 this.canvas.addEventListener(\"touchstart\", function(e){ e.preventDefault();sliderclick_%d(e.changedTouches[0]);},false);\
-
 
3051
 var canvas_rect = (slider_canvas).getBoundingClientRect();\
-
 
3052
function sliderdrag_%d(evt){\
-
 
3053
 if(slider_click == 1){\
-
 
3054
  var value_1 = %f;\
-
 
3055
  var value_2 = %f;\
-
 
3056
  var canvas_rect = (slider_canvas).getBoundingClientRect();\
-
 
3057
  slider_ctx.clearRect(0,0,slider_width,slider_height);\
-
 
3058
  var x_px = evt.clientX - canvas_rect.left;\
-
 
3059
  var y_px = evt.clientY - canvas_rect.top;\
-
 
3060
  slider_ctx.clearRect(0,0,slider_width,slider_height);\
-
 
3061
  var x = x_px*(value_2 - value_1)/slider_width + value_1;\
-
 
3062
  var y = y_px*(value_2 - value_1)/slider_height + value_1;\
-
 
3063
  x = parseFloat(eval(slider_function%d.x));\
-
 
3064
  y = parseFloat(eval(slider_function%d.y));\
-
 
3065
  slider_ctx.beginPath();\
-
 
3066
  slider_ctx.arc(x_px,y_px,slider_radius,0,2*Math.PI,false);\
-
 
3067
  slider_ctx.fill();\
-
 
3068
  slider_ctx.rect(0,0,slider_width,slider_height);\
-
 
3069
  slider_ctx.closePath();\
-
 
3070
  slider_ctx.stroke();\
-
 
3071
  dragstuff.Slide( [x,y] , %d );\
-
 
3072
  if(%d != 0 ){show_slider_value([x,y],%d);}\
-
 
3073
 };\
-
 
3074
};\
-
 
3075
function sliderclick_%d(evt){\
-
 
3076
  if(slider_click == 1){slider_click = 0;}else{slider_click = 1;};\
-
 
3077
};\
-
 
3078
};add_slider_%d();",slider_cnt,slider_cnt,canvas_root_id,type,font_family,font_color,label,fill_color,stroke_color,line_width,canvas_root_id,width,height,(int)(0.5*height),opacity,font_family,slider_cnt,slider_cnt,slider_cnt,slider_cnt,slider_cnt,v1,v2,slider_cnt,slider_cnt,slider_cnt,use_slider_display,slider_cnt,slider_cnt,slider_cnt);
-
 
3079
}
-
 
3080
 
-
 
3081
 
344
 
3082
/*
345
/*
3083
adds inputfield for x-value: returns the js-calculated y-value after click on 'OK' button
346
adds inputfield for x-value: returns the js-calculated y-value after click on 'OK' button
3084
draws a non-configurable crosshair on this calculated location
347
draws a non-configurable crosshair on this calculated location
3085
*/
348
*/
3086
void add_calc_y(FILE *js_include_file,int canvas_root_id,char *jsmath,int font_size,char *input_style){
349
void add_calc_y(char *jsmath,int font_size,char *css_class){
3087
fprintf(js_include_file,"\n/* begin add_calc_y */\n\
350
fprintf(js_include_file,"\n/* add_calc_y */\
3088
use_jsmath=1;\
351
use_jsmath=1;\
3089
function add_calc_y(){\
352
function add_calc_y(){\
3090
 if( wims_status == \"done\" ){return;};\
353
 if( wims_status == \"done\" ){return;};\
3091
 var fun = to_js_math(\"%s\");if(fun == null){return;};\
354
 var fun = to_js_math(\"%s\");if(fun == null){return;};\
3092
 function eval_jsmath(x){return parseFloat(eval(fun));};\
355
 function eval_jsmath(x){return parseFloat(eval(fun));};\
3093
 var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
356
 var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
3094
 var calc_div = document.createElement('div');\
357
 var calc_div = document.createElement('div');\
3095
 calc_div.id = \"calc_div\";\
358
 calc_div.id = \"calc_div\";\
3096
 tooltip_div.appendChild(calc_div);\
359
 tooltip_div.appendChild(calc_div);\
3097
 var label_x = \"x\";var label_y = \"y\";\
360
 var label_x = \"x\";var label_y = \"y\";\
3098
 if( typeof(xaxislabel) !== 'undefined' ){label_x = xaxislabel;}\
361
 if( typeof(xaxislabel) !== 'undefined' ){label_x = xaxislabel;}\
3099
 if( typeof(yaxislabel) !== 'undefined' ){label_y = yaxislabel;}\
362
 if( typeof(yaxislabel) !== 'undefined' ){label_y = yaxislabel;}\
3100
 calc_div.innerHTML=\"<br /><span style='font-style:italic;font-size:%dpx'>\"+label_x+\" : <input type='text' size='4' value='' id='calc_input_x' style='%s' />&nbsp;\"+ label_y+\" : <input type='text' size='5' value='' id='calc_output_y' style='%s' readonly /><input id='calc_button' type='button' value='OK' onclick=''  style='color:red;background-color:lightblue;' /></span> \";\
363
 calc_div.innerHTML=\"<br /><span style='font-style:italic;font-size:%dpx'>\"+label_x+\" : <input type='text' size='4' value='' id='calc_input_x' style='%s' />&nbsp;\"+ label_y+\" : <input type='text' size='5' value='' id='calc_output_y' style='%s' readonly /><input id='calc_button' type='button' value='OK' onclick=''  style='color:red;background-color:lightblue;' /></span> \";\
3101
 var calc_button = document.getElementById(\"calc_button\");\
364
 var calc_button = document.getElementById(\"calc_button\");\
3102
 calc_button.addEventListener(\"mousedown\", show_it,false);\
365
 calc_button.addEventListener(\"mousedown\",show_it,false);\
3103
 calc_button.addEventListener(\"touchstart\", function(e){ e.preventDefault();show_it(e.changedTouches[0]);},false);\
366
 calc_button.addEventListener(\"touchstart\", function(e){ e.preventDefault();show_it(e.changedTouches[0]);},false);\
3104
 function show_it(){\
367
 function show_it(){\
3105
  var x_value=document.getElementById(\"calc_input_x\").value;\
368
  var x_value=document.getElementById(\"calc_input_x\").value;\
3106
  var y_value = eval_jsmath(x_value);\
369
  var y_value = eval_jsmath(x_value);\
3107
  document.getElementById(\"calc_output_y\").value = y_value;\
370
  document.getElementById(\"calc_output_y\").value = y_value;\
Line 3109... Line 372...
3109
  var canvas = create_canvas%d(123,xsize,ysize);\
372
  var canvas = create_canvas%d(123,xsize,ysize);\
3110
  var ctx = canvas.getContext(\"2d\");\
373
  var ctx = canvas.getContext(\"2d\");\
3111
  draw_crosshairs(ctx,[x2px(x_value)],[y2px(y_value)],1,5,\"#000000\",1,0,0,0,[0,0]);return;\
374
  draw_crosshairs(ctx,[x2px(x_value)],[y2px(y_value)],1,5,\"#000000\",1,0,0,0,[0,0]);return;\
3112
 };\
375
 };\
3113
};\
376
};\
3114
;add_calc_y();",jsmath,canvas_root_id,font_size,input_style,input_style,canvas_root_id);
377
;add_calc_y();",jsmath,canvas_root_id,font_size,css_class,css_class,canvas_root_id);
3115
}
378
}
3116
/*
379
/*
3117
 x-value of the mouse will be used to calculate via javascript the corresponding y-value using the verbatim js-math function
380
 x-value of the mouse will be used to calculate via javascript the corresponding y-value using the verbatim js-math function
3118
 a configurable crosshair and vertical/horizontal crosshair lines will be drawn
381
 a configurable crosshair and vertical/horizontal crosshair lines will be drawn
3119
 function is called "use_mouse_coordinates() and thus can not be combined with command 'mouse'
382
 function is called "use_mouse_coordinates() and thus can not be combined with command 'mouse'
3120
*/
383
*/
3121
void add_trace_js_mouse(FILE *js_include_file,int canvas_cnt,int canvas_root_id,char *stroke_color,char *jsmath,int font_size,double stroke_opacity,int line_width,int crosshair_size,char *input_style){
384
void add_trace_js_mouse(int canvas_cnt,char *stroke_color,char *jsmath,int font_size,double stroke_opacity,int line_width,int crosshair_size,char *css_class){
3122
fprintf(js_include_file,"\n/* begin command add_trace_jsmath  trace_canvas */\n\
385
fprintf(js_include_file,"\n/* add_trace_jsmath */\
3123
use_jsmath=1;\
386
use_jsmath=1;\
3124
function use_trace_jsmath(){\
387
function use_trace_jsmath(){\
3125
if( wims_status == \"done\" ){return;};\
388
if( wims_status == \"done\" ){return;};\
3126
 var label_x = \"x\";var label_y = \"y\";\
389
 var label_x = \"x\";var label_y = \"y\";\
3127
 if( typeof(xaxislabel) !== 'undefined' ){label_x = xaxislabel;}\
390
 if( typeof(xaxislabel) !== 'undefined' ){label_x = xaxislabel;}\
Line 3136... Line 399...
3136
 canvas_div.addEventListener(\"mousemove\",trace,false);\
399
 canvas_div.addEventListener(\"mousemove\",trace,false);\
3137
 canvas_div.addEventListener(\"touchmove\",function(e){ e.preventDefault();trace(e.changedTouches[0]);},false);\
400
 canvas_div.addEventListener(\"touchmove\",function(e){ e.preventDefault();trace(e.changedTouches[0]);},false);\
3138
 var fun = to_js_math(\"%s\");if(fun == null){return;};\
401
 var fun = to_js_math(\"%s\");if(fun == null){return;};\
3139
 function eval_jsmath(x){return parseFloat(eval(fun));};\
402
 function eval_jsmath(x){return parseFloat(eval(fun));};\
3140
 function trace(evt){\
403
 function trace(evt){\
3141
  var mouse = dragstuff.getMouse(evt,trace_canvas);\
404
  var mouse = getMouse(evt,trace_canvas);\
3142
  var x_px = mouse.x;\
405
  var x_px = mouse.x;\
3143
  var x = px2x(x_px);\
406
  var x = px2x(x_px);\
3144
  var y = eval_jsmath(x);\
407
  var y = eval_jsmath(x);\
3145
  if(isNaN(y)){return;};\
408
  if(isNaN(y)){return;};\
3146
  var y_px = y2px(y);\
409
  var y_px = y2px(y);\
Line 3148... Line 411...
3148
  draw_crosshairs(trace_context,[x_px],[y_px],%d,%d,\"%s\",%f,0,0,0,[0,0]);\
411
  draw_crosshairs(trace_context,[x_px],[y_px],%d,%d,\"%s\",%f,0,0,0,[0,0]);\
3149
  document.getElementById(\"trace_input_x\").value = x;\
412
  document.getElementById(\"trace_input_x\").value = x;\
3150
  document.getElementById(\"trace_input_y\").value = y;\
413
  document.getElementById(\"trace_input_y\").value = y;\
3151
 };\
414
 };\
3152
 return;\
415
 return;\
3153
};use_trace_jsmath();",canvas_root_id,canvas_cnt,canvas_root_id,font_size,input_style,input_style,jsmath,line_width,crosshair_size,stroke_color,stroke_opacity);
416
};use_trace_jsmath();",canvas_root_id,canvas_cnt,canvas_root_id,font_size,css_class,css_class,jsmath,line_width,crosshair_size,stroke_color,stroke_opacity);
3154
}
417
}
3155
 
418
 
3156
/*
419
/*
3157
add a table with 2 textarea's labeled 'x' 'y' ( or 'xlabel' 'ylabel' if defined)
420
add a table with 2 textarea's labeled 'x' 'y' ( or 'xlabel' 'ylabel' if defined)
3158
add two buttons: OK and NOK (OK draws; NOK will delete last item pair from userdraw_x / userdraw_y array's
421
add two buttons: OK and NOK (OK draws; NOK will delete last item pair from userdraw_x / userdraw_y array's
3159
*/
422
*/
3160
void add_textarea_xy(FILE *js_include_file, int canvas_root_id, char *input_style){
423
void add_textarea_xy(char *css_class){
3161
fprintf(js_include_file,"\n/* begin add_textarea_xy */\n\
424
fprintf(js_include_file,"\n/* add_textarea_xy */\
3162
function add_textarea_xy(){\
425
function add_textarea_xy(){\
3163
if( wims_status == \"done\" ){return;};\
426
if( wims_status == \"done\" ){return;};\
3164
var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
427
var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
3165
var textarea_div = document.createElement('div');\
428
var textarea_div = document.createElement('div');\
3166
textarea_div.id = \"textarea_div\";\
429
textarea_div.id = \"textarea_div\";\
Line 3183... Line 446...
3183
 <td><textarea rows='5' cols='2' id='userinput_y' style='%s' ></textarea></td>\
446
 <td><textarea rows='5' cols='2' id='userinput_y' style='%s' ></textarea></td>\
3184
</tr>\
447
</tr>\
3185
</table>\";\
448
</table>\";\
3186
var textarea_ok_button = document.getElementById(\"textarea_ok_button\");\
449
var textarea_ok_button = document.getElementById(\"textarea_ok_button\");\
3187
var textarea_nok_button = document.getElementById(\"textarea_nok_button\");\
450
var textarea_nok_button = document.getElementById(\"textarea_nok_button\");\
3188
textarea_ok_button.addEventListener(\"mousedown\",function(e){user_redraw(1);return;},false);\
451
textarea_ok_button.addEventListener(\"mousedown\",function(e){redraw_userdraw();return;},false);\
3189
textarea_nok_button.addEventListener(\"mousedown\",function(e){user_redraw(-1);return;},false);\
452
textarea_nok_button.addEventListener(\"mousedown\",function(e){remove_last();return;},false);\
3190
return;\
453
return;\
3191
};add_textarea_xy();",canvas_root_id,input_style,input_style);
454
};add_textarea_xy();",canvas_root_id,css_class,css_class);
3192
}
455
}
3193
 
456
 
3194
/*
457
/*
3195
 
458
 
3196
*/
459
*/
3197
void add_setlimits(FILE *js_include_file, int canvas_root_id,int font_size,char *input_style){
460
void add_setlimits(int font_size,char *css_class){
3198
fprintf(js_include_file,"\n/* begin add_setlimits */\n\
461
fprintf(js_include_file,"\n/* add_setlimits */\
3199
use_pan_and_zoom = 1;\
-
 
3200
function use_setlimits(){\
462
function use_setlimits(){\
3201
if( wims_status == \"done\" ){return;};\
463
if( wims_status == \"done\" ){return;};\
3202
var label_x = \"x\";var label_y = \"y\";\
464
var label_x = \"x\";var label_y = \"y\";\
3203
if( typeof(xaxislabel) !== 'undefined' ){label_x = xaxislabel;}\
465
if( typeof(xaxislabel) !== 'undefined' ){label_x = xaxislabel;}\
3204
if( typeof(yaxislabel) !== 'undefined' ){label_y = yaxislabel;}\
466
if( typeof(yaxislabel) !== 'undefined' ){label_y = yaxislabel;}\
Line 3212... Line 474...
3212
xmin = safe_eval(document.getElementById('userinput_xmin').value);\
474
xmin = safe_eval(document.getElementById('userinput_xmin').value);\
3213
xmax = safe_eval(document.getElementById('userinput_xmax').value);\
475
xmax = safe_eval(document.getElementById('userinput_xmax').value);\
3214
ymin = safe_eval(document.getElementById('userinput_ymin').value);\
476
ymin = safe_eval(document.getElementById('userinput_ymin').value);\
3215
ymax = safe_eval(document.getElementById('userinput_ymax').value);\
477
ymax = safe_eval(document.getElementById('userinput_ymax').value);\
3216
if(xmin > xmax || ymin > ymax){alert(\"your limits are not correct...\");return;}\
478
if(xmin > xmax || ymin > ymax){alert(\"your limits are not correct...\");return;}\
-
 
479
try{redraw_jsplot();}catch(e){console.log('redraw_jsplot failed:'+e);};\
-
 
480
try{redraw_grid();}catch(e){console.log('redraw_grid failed:'+e);};\
3217
try{start_canvas%d(1234)}catch(e){};try{dragstuff.Zoom(xmin,xmax,ymin,ymax)}catch(e){};return;};\
481
try{dragstuff.Zoom(xmin,xmax,ymin,ymax)}catch(e){console.log('zooming dragstuff failed:'+e);};return;};\
3218
setlimit_button.addEventListener(\"mousedown\",function(e){set_limits();},false);\
482
setlimit_button.addEventListener(\"mousedown\",function(e){set_limits();},false);\
3219
};use_setlimits();",canvas_root_id,font_size,input_style,input_style,input_style,input_style,canvas_root_id);
483
};use_setlimits();",canvas_root_id,font_size,css_class,css_class,css_class,css_class);
3220
}
484
}
3221
 
485
 
3222
 
-
 
3223
void add_rawmath(FILE *js_include_file){
-
 
3224
fprintf(js_include_file,"\n/* begin add_rawmath() */\n\
-
 
3225
function rawmath(i){\
-
 
3226
 i=i.toLowerCase();\
-
 
3227
 i=i.replace(/\\ /g,\"\");i=i.replace(/\\*\\*/g,\"^\");\
-
 
3228
 if(i.indexOf(\"e+\")!=-1){i=i.replace(\"e+\",\"*10^\");};\
-
 
3229
 if(i.indexOf(\"e-\")!=-1){i=i.replace(\"e-\",\"*10^-\");};\
-
 
3230
 i=i.replace(/\\*\\*/g,\"*\");\
-
 
3231
 if(i.charAt(0)==\"*\"){i=i.substring(1,i.length);};\
-
 
3232
 var fun=[\"asin\",\"acos\",\"atan\",\"sin\",\"cos\",\"tan\",\"log\",\"ln\",\"pi\",\"e\",\"x\",\"y\"];\
-
 
3233
 var cons=[\"pi\",\"e\",\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"];\
-
 
3234
 var cntl = 0;var cntr = 0;\
-
 
3235
 var len = i.length;\
-
 
3236
 for( var p = 0;p < len; p++){\
-
 
3237
  if(i.charAt(p) == '('){cntl++;}\
-
 
3238
  if(i.charAt(p) == ')'){cntr++;}\
-
 
3239
 };\
-
 
3240
 if(cntl != cntr){alert(\"unmatched parenthesis !!\");return null;};\
-
 
3241
 for(var p = 0; p < 12 ; p++){\
-
 
3242
  for(var d = 0; d < 12 ; d++){\
-
 
3243
   while(i.indexOf(cons[d]+\"\"+fun[p])!=-1){\
-
 
3244
    i = i.replace(cons[d]+\"\"+fun[p],cons[d]+\"*\"+fun[p]);\
-
 
3245
   };\
-
 
3246
   while(i.indexOf(fun[p]+\"\"+cons[d])!=-1){\
-
 
3247
    i = i.replace(fun[p]+\"\"+cons[d],fun[p]+\"*\"+cons[d]);\
-
 
3248
   };\
-
 
3249
  };\
-
 
3250
 };\
-
 
3251
 if(i.indexOf(\"(\")!=-1){\
-
 
3252
  for(var p = 0;p < 12; p++){\
-
 
3253
   if(i.indexOf(cons[p]+\"(\")!=-1){\
-
 
3254
    i = i.replace(cons[p]+\"(\",cons[p]+\"*(\");\
-
 
3255
   };\
-
 
3256
   if(i.indexOf(\")\"+cons[p])!=-1){\
-
 
3257
    i = i.replace(\")\"+cons[p],\")*\"+cons[p]);\
-
 
3258
   };\
-
 
3259
  };\
-
 
3260
  i = i.replace(/\\)\\(/g,\")*(\");\
-
 
3261
 };\
-
 
3262
 return i;\
-
 
3263
}\n");
-
 
3264
}
-
 
3265
void add_input_jsfunction(FILE *js_include_file, int canvas_root_id,char *input_style,char *input_label,int input_cnt,char *stroke_color,float stroke_opacity,int line_width,int use_dashed,int dashtype0,int dashtype1,int font_size){
486
void add_input_jsfunction(char *css_class,char *input_label,int input_cnt,char *stroke_color,float stroke_opacity,int line_width,int use_dashed,int dashtype0,int dashtype1,int font_size){
3266
fprintf(js_include_file,"\n/* begin add_input_jsfunction */\n\
487
fprintf(js_include_file,"\n/* add_input_jsfunction */\
3267
function clear_jsfunction(canvas_plot_id,input_field){\
488
function clear_jsfunction(canvas_plot_id,input_field){\
3268
 try{\
489
 try{\
3269
  var canvas_plot = document.getElementById(\"wims_canvas%d\"+canvas_plot_id);\
490
  var canvas_plot = document.getElementById(\"wims_canvas%d\"+canvas_plot_id);\
3270
  var canvas_plot_ctx = canvas_plot.getContext(\"2d\");\
491
  var canvas_plot_ctx = canvas_plot.getContext(\"2d\");\
3271
  if( confirm(\"clear function plot?\") ){\
492
  if( confirm(\"clear function plot?\") ){\
Line 3274... Line 495...
3274
  };\
495
  };\
3275
  return;\
496
  return;\
3276
 }catch(e){alert(e+\"nothing to remove...\");};\
497
 }catch(e){alert(e+\"nothing to remove...\");};\
3277
 return;\
498
 return;\
3278
};\
499
};\
3279
function add_input_jsfunction(input_cnt,input_style,input_label,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1){\
500
function add_input_jsfunction(input_cnt,css_class,input_label,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1){\
3280
 var canvas_plot_id = %d+input_cnt;\
501
 var canvas_plot_id = %d+input_cnt;\
-
 
502
 var label = input_label[input_cnt];\
-
 
503
 if( typeof(multistrokecolors) === 'object'){ stroke_color = multistrokecolors[input_cnt];};\
3281
 var input_field = \"canvas_input\"+input_cnt;\
504
 var input_field = \"canvas_input\"+input_cnt;\
3282
 var update_button_id = \"update_button\"+input_cnt;\
505
 var update_button_id = \"update_button\"+input_cnt;\
3283
 var delete_button_id = \"delete_button\"+input_cnt;\
506
 var delete_button_id = \"delete_button\"+input_cnt;\
3284
 if( wims_status == \"done\" ){return;};\
507
 if( wims_status == \"done\" ){return;};\
3285
 var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
508
 var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
3286
 var input_jsfunction_div = document.createElement('div');\
509
 var input_jsfunction_div = document.createElement('div');\
3287
 input_jsfunction_div.id = \"input_jsfunction_div\"+input_cnt;\
510
 input_jsfunction_div.id = \"input_jsfunction_div\"+input_cnt;\
3288
 tooltip_div.appendChild(input_jsfunction_div);\
511
 tooltip_div.appendChild(input_jsfunction_div);\
3289
 input_jsfunction_div.innerHTML=\"<br /><br /><span style='font-style:italic;font-size:%dpx;color:rgb(\"+stroke_color+\")'><b>\"+input_label+\" <input type='text' size='16' value='' id='\"+input_field+\"' style='\"+input_style+\"' /></b><input id='\"+update_button_id+\"' type='button' value='OK' onclick='' style='color:red;background-color:lightblue;'/><input id='\"+delete_button_id+\"' type='button' value='NOK' onclick='' style='color:blue;background-color:red;'/></span> \";\
512
 input_jsfunction_div.innerHTML=\"<br /><span style='font-style:italic;font-size:%dpx;color:rgb(\"+stroke_color+\")'><b>\"+label+\" <input type='text' size='16' value='' id='\"+input_field+\"' style='\"+css_class+\"' /></b><input id='\"+update_button_id+\"' type='button' value='OK' onclick='' style='color:red;background-color:lightblue;'/><input id='\"+delete_button_id+\"' type='button' value='NOK' onclick='' style='color:blue;background-color:red;'/></span> \";\
3290
 var update_button = document.getElementById(update_button_id);\
513
 var update_button = document.getElementById(update_button_id);\
3291
 var delete_button = document.getElementById(delete_button_id);\
514
 var delete_button = document.getElementById(delete_button_id);\
3292
 update_button.addEventListener(\"mousedown\",function(e){jsplot(canvas_plot_id,[rawmath(document.getElementById(input_field).value)],[line_width],[stroke_color],[stroke_opacity],[use_dashed],dashtype0,dashtype1,0,0,300,0,0);return;},false);\
515
 update_button.addEventListener(\"mousedown\",function(e){jsplot(canvas_plot_id,[rawmath(document.getElementById(input_field).value)],[line_width],[stroke_color],[stroke_opacity],[use_dashed],dashtype0,dashtype1,0,0,300,0,1);return;},false);\
3293
 delete_button.addEventListener(\"mousedown\",function(e){clear_jsfunction(canvas_plot_id,input_field);return;},false);\
516
 delete_button.addEventListener(\"mousedown\",function(e){clear_jsfunction(canvas_plot_id,input_field);return;},false);\
3294
};\
517
};\
3295
add_input_jsfunction(%d,\"%s\",\"%s\",%d,\"%s\",%.2f,%d,%d,%d);\n",canvas_root_id,USERDRAW_JSPLOT,canvas_root_id,font_size,input_cnt,input_style,input_label,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);
518
add_input_jsfunction(%d,\"%s\",%s,%d,\"%s\",%.2f,%d,%d,%d);",canvas_root_id,USERDRAW_JSPLOT,canvas_root_id,font_size,input_cnt,css_class,input_label,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);
3296
}
519
}
3297
 
520
 
3298
 
521
 
3299
/*
522
/*
3300
adds 2 inputfields (x:y) and 'ok' | 'nok' button
523
adds 2 inputfields (x:y) and 'ok' | 'nok' button
3301
these are used for user drawing with inputfields...
524
these are used for user drawing with inputfields...
3302
*/
525
*/
3303
 
526
 
3304
void add_input_xy(FILE *js_include_file, int canvas_root_id,int font_size,char *input_style){
527
void add_input_xy(int font_size,char *css_class){
3305
fprintf(js_include_file,"\n/* begin add_input_xy */\n\
528
fprintf(js_include_file,"\n/* add_input_xy */\
-
 
529
function update_me(){\
-
 
530
 var x = document.getElementById('userinput_x').value;\
-
 
531
 var y = document.getElementById('userinput_y').value;\
-
 
532
 userdraw_x.push(x2px(x));userdraw_y.push(y2px(y));\
-
 
533
 return;\
-
 
534
};\
3306
function add_input_xy(){\
535
function add_input_xy(){\
3307
if( wims_status == \"done\" ){return;};\
536
if( wims_status == \"done\" ){return;};\
3308
var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
537
var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
3309
var input_xy_div = document.createElement('div');\
538
var input_xy_div = document.createElement('div');\
3310
input_xy_div.id = \"input_xy_div\";\
539
input_xy_div.id = \"input_xy_div\";\
3311
tooltip_div.appendChild(input_xy_div);\
540
tooltip_div.appendChild(input_xy_div);\
3312
var label_x = \"x\";var label_y = \"y\";\
541
var label_x = \"x\";var label_y = \"y\";\
3313
input_xy_div.innerHTML=\"<br /><span style='font-style:italic;font-size:%dpx'><b>( <input type='text' size='5' value='' id='userinput_x' style='%s' /> : <input type='text' size='5' value='' id='userinput_y' style='%s' /> )</b><input id='update_button' type='button' value='OK' onclick=''  style='color:red;background-color:lightblue;'/><input id='delete_button' type='button' value='NOK' onclick='' style='color:blue;background-color:red;'/></span> \";\
542
input_xy_div.innerHTML=\"<br /><span style='font-style:italic;font-size:%dpx'><b>( <input type='text' size='5' value='' id='userinput_x' style='%s' /> : <input type='text' size='5' value='' id='userinput_y' style='%s' /> )</b><input id='update_button' type='button' value='OK' onclick=''  style='color:red;background-color:lightblue;'/><input id='delete_button' type='button' value='NOK' onclick='' style='color:blue;background-color:red;'/></span> \";\
3314
var update_button = document.getElementById(\"update_button\");\
543
var update_button = document.getElementById(\"update_button\");\
3315
var delete_button = document.getElementById(\"delete_button\");\
544
var delete_button = document.getElementById(\"delete_button\");\
3316
update_button.addEventListener(\"mousedown\",function(e){user_redraw(1);return;},false);\
545
update_button.addEventListener(\"mousedown\",function(e){update_me();redraw_userdraw();return;},false);\
3317
delete_button.addEventListener(\"mousedown\",function(e){user_redraw(-1);return;},false);\
546
delete_button.addEventListener(\"mousedown\",function(e){remove_last();return;},false);\
3318
};add_input_xy();",canvas_root_id,font_size,input_style,input_style);
547
};add_input_xy();",canvas_root_id,font_size,css_class,css_class);
3319
}
548
}
3320
 
549
 
3321
/* adds 4 inputfields (x1:y1) --- (x2:y2) and 'ok' + 'nok' button */
550
/* adds 4 inputfields (x1:y1) --- (x2:y2) and 'ok' + 'nok' button */
3322
void add_input_x1y1x2y2(FILE *js_include_file, int canvas_root_id,int font_size,char *input_style){
551
void add_input_x1y1x2y2(int font_size,char *css_class){
3323
fprintf(js_include_file,"\n/* begin add_input_x1y1x2y2 */\n\
552
fprintf(js_include_file,"\n/* add_input_x1y1x2y2 */\
3324
function add_input_x1y1x2y2(){\
553
function add_input_x1y1x2y2(){\
3325
if( wims_status == \"done\" ){return;};\
554
if( wims_status == \"done\" ){return;};\
3326
var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
555
var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
3327
var input_x1y1x2y2_div = document.createElement('div');\
556
var input_x1y1x2y2_div = document.createElement('div');\
3328
input_x1y1x2y2_div.id = \"input_x1y1x2y2_div\";\
557
input_x1y1x2y2_div.id = \"input_x1y1x2y2_div\";\
3329
tooltip_div.appendChild(input_x1y1x2y2_div);\
558
tooltip_div.appendChild(input_x1y1x2y2_div);\
3330
input_x1y1x2y2_div.innerHTML=\"<br /><span style='font-size:%dpx'><b>( <input type='text' size='5' value='' id='userinput_x1' style='%s' /> : <input type='text' size='5' value='' id='userinput_y1' style='%s' /> ) ----- ( <input type='text' size='5' value='' id='userinput_x2' style='%s' /> : <input type='text' size='5' value='' id='userinput_y2' style='%s'/> )</b><input id='update_button' type='button' value='OK' onclick='' style='color:red;background-color:lightblue;'/><input id='delete_button' type='button' value='NOK' onclick='' style='color:blue;background-color:red;' /></span> \";\
559
input_x1y1x2y2_div.innerHTML=\"<br /><span style='font-size:%dpx'><b>( <input type='text' size='5' value='' id='userinput_x1' style='%s' /> : <input type='text' size='5' value='' id='userinput_y1' style='%s' /> ) ----- ( <input type='text' size='5' value='' id='userinput_x2' style='%s' /> : <input type='text' size='5' value='' id='userinput_y2' style='%s'/> )</b><input id='update_button' type='button' value='OK' onclick='' style='color:red;background-color:lightblue;'/><input id='delete_button' type='button' value='NOK' onclick='' style='color:blue;background-color:red;' /></span> \";\
3331
var update_button = document.getElementById(\"update_button\");\
560
var update_button = document.getElementById(\"update_button\");\
3332
var delete_button = document.getElementById(\"delete_button\");\
561
var delete_button = document.getElementById(\"delete_button\");\
3333
update_button.addEventListener(\"mousedown\",function(e){user_redraw(1);return;},false);\
562
update_button.addEventListener(\"mousedown\",function(e){redraw_userdraw();return;},false);\
3334
delete_button.addEventListener(\"mousedown\",function(e){user_redraw(-1);return;},false);\
563
delete_button.addEventListener(\"mousedown\",function(e){remove_last();return;},false);\
3335
};add_input_x1y1x2y2();",canvas_root_id,font_size,input_style,input_style,input_style,input_style);
564
};add_input_x1y1x2y2();",canvas_root_id,font_size,css_class,css_class,css_class,css_class);
3336
}
565
}
3337
 
566
 
3338
/* adds 3 inputfields Center (x:y) Radius r and 'ok'+'nok' buttons */
567
/* adds 3 inputfields Center (x:y) Radius r and 'ok'+'nok' buttons */
3339
void add_input_xyr(FILE *js_include_file, int canvas_root_id,int font_size,char *input_style){
568
void add_input_xyr(int font_size,char *css_class){
3340
fprintf(js_include_file,"\n/* begin add_input_xyr */\n\
569
fprintf(js_include_file,"\n/* add_input_xyr */\
3341
function add_input_xyr(){\
570
function add_input_xyr(){\
3342
if( wims_status == \"done\" ){return;};\
571
if( wims_status == \"done\" ){return;};\
3343
var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
572
var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
3344
var input_xyr_div = document.createElement('div');\
573
var input_xyr_div = document.createElement('div');\
3345
input_xyr_div.id = \"input_xyr_div\";\
574
input_xyr_div.id = \"input_xyr_div\";\
3346
tooltip_div.appendChild(input_xyr_div);\
575
tooltip_div.appendChild(input_xyr_div);\
3347
input_xyr_div.innerHTML=\"<br /><span style='font-style:italic;font-size:%dpx'><b>Center : ( <input type='text' size='5' value='' id='userinput_x' style='%s' /> : <input type='text' size='5' value='' id='userinput_y' style='%s' /> ) Radius : <input type='text' size='5' value='' id='userinput_r' style='%s' /></b><input id='update_button' type='button' value='OK' onclick='' style='color:red;background-color:lightblue;'/><input id='delete_button' type='button' value='NOK' onclick='' style='color:blue;background-color:red;'/></span> \";\
576
input_xyr_div.innerHTML=\"<br /><span style='font-style:italic;font-size:%dpx'><b>Center : ( <input type='text' size='5' value='' id='userinput_x' style='%s' /> : <input type='text' size='5' value='' id='userinput_y' style='%s' /> ) Radius : <input type='text' size='5' value='' id='userinput_r' style='%s' /></b><input id='update_button' type='button' value='OK' onclick='' style='color:red;background-color:lightblue;'/><input id='delete_button' type='button' value='NOK' onclick='' style='color:blue;background-color:red;'/></span> \";\
3348
var update_button = document.getElementById(\"update_button\");\
577
var update_button = document.getElementById(\"update_button\");\
3349
var delete_button = document.getElementById(\"delete_button\");\
578
var delete_button = document.getElementById(\"delete_button\");\
3350
update_button.addEventListener(\"mousedown\",function(e){user_redraw(1);return;},false);\
579
update_button.addEventListener(\"mousedown\",function(e){redraw_userdraw();return;},false);\
3351
delete_button.addEventListener(\"mousedown\",function(e){user_redraw(-1);return;},false);\
580
delete_button.addEventListener(\"mousedown\",function(e){remove_last();return;},false);\
3352
};add_input_xyr();",canvas_root_id,font_size,input_style,input_style,input_style);
581
};add_input_xyr();",canvas_root_id,font_size,css_class,css_class,css_class);
3353
}
582
}
3354
 
583
 
3355
/* THESE JS-FUNCTIONS COULD BE MADE LESS COPY & PASTE "PROGRAMMING" */
584
/* THESE JS-FUNCTIONS COULD BE MADE LESS COPY & PASTE "PROGRAMMING" */
3356
 
585
 
3357
/* draw circle(s) / point(s) via 3 inputfields */
586
/* draw circle(s) / point(s) via 3 inputfields */
3358
void add_input_circle(FILE *js_include_file,int type,int num){
587
void add_input_circle(int type,int num){
3359
/*
588
/*
3360
type = 0 : a point ...radius is fixed
589
type = 0 : a point ...radius is fixed
3361
type = 1 : a circle ... read inputfield userinput_r
590
type = 1 : a circle ... read inputfield userinput_r
3362
num = 1 : a single point / circle
591
num = 1 : a single point / circle
3363
num = 2 : multiple points / circles
592
num = 2 : multiple points / circles
3364
*/
593
*/
3365
fprintf(js_include_file,"\n/* begin add_input_circle */\n\
594
fprintf(js_include_file,"\n/* add_input_circle */\
3366
function user_redraw(t){\
595
function user_redraw(t){\
3367
 var type = %d;\
596
 var type = %d;\
3368
 var num = %d;\
597
 var num = %d;\
3369
 var lu = userdraw_x.length;\
598
 var lu = userdraw_x.length;\
3370
 if( t == -1 && lu > 0){userdraw_x.splice(lu-1,1);userdraw_y.splice(lu-1,1);if(type == 1){userdraw_radius.splice(lu-1,1);};context_userdraw.clearRect(0,0,xsize,ysize);draw_circles(context_userdraw,userdraw_x,userdraw_y,userdraw_radius,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1);xy_cnt = userdraw_x.length;return;};\
599
 if( t == -1 && lu > 0){userdraw_x.splice(lu-1,1);userdraw_y.splice(lu-1,1);if(type == 1){userdraw_radius.splice(lu-1,1);};context_userdraw.clearRect(0,0,xsize,ysize);draw_circles(context_userdraw,userdraw_x,userdraw_y,userdraw_radius,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1);xy_cnt = userdraw_x.length;return;};\
Line 3373... Line 602...
3373
 if( add_x != null && add_y != null ){if( type == 1 ){var add_r = safe_eval( document.getElementById(\"userinput_r\").value );if( add_r == null ){alert(\"illegal radius input \");return;};if( num == 1 ){userdraw_radius[0] = parseInt(Math.abs(xsize*(add_r)/(xmax - xmin)));}else{userdraw_radius.push( parseInt(Math.abs(xsize*(add_r)/(xmax - xmin))) );};}else{userdraw_radius[lu] = userdraw_radius[0];};if( num == 1 ){userdraw_x[0] = x2px(add_x);userdraw_y[0] = y2px(add_y);xy_cnt=1;}else{userdraw_x.push(x2px(add_x));userdraw_y.push(y2px(add_y));xy_cnt = userdraw_x.length;};context_userdraw.clearRect(0,0,xsize,ysize);draw_circles(context_userdraw,userdraw_x,userdraw_y,userdraw_radius,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1);};\
602
 if( add_x != null && add_y != null ){if( type == 1 ){var add_r = safe_eval( document.getElementById(\"userinput_r\").value );if( add_r == null ){alert(\"illegal radius input \");return;};if( num == 1 ){userdraw_radius[0] = parseInt(Math.abs(xsize*(add_r)/(xmax - xmin)));}else{userdraw_radius.push( parseInt(Math.abs(xsize*(add_r)/(xmax - xmin))) );};}else{userdraw_radius[lu] = userdraw_radius[0];};if( num == 1 ){userdraw_x[0] = x2px(add_x);userdraw_y[0] = y2px(add_y);xy_cnt=1;}else{userdraw_x.push(x2px(add_x));userdraw_y.push(y2px(add_y));xy_cnt = userdraw_x.length;};context_userdraw.clearRect(0,0,xsize,ysize);draw_circles(context_userdraw,userdraw_x,userdraw_y,userdraw_radius,line_width,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,dashtype1);};\
3374
 return;\
603
 return;\
3375
};",type,num);
604
};",type,num);
3376
}
605
}
3377
/* draw crosshairs via inputfields x/y */
606
/* draw crosshairs via inputfields x/y */
3378
void add_input_crosshair(FILE *js_include_file,int num){
607
void add_input_crosshair(int num){
3379
fprintf(js_include_file,"\n/* begin add_input_crosshair */\n\
608
fprintf(js_include_file,"\n/* add_input_crosshair */\
3380
function user_redraw(t){\
609
function user_redraw(t){\
3381
 var lu = userdraw_x.length;\
610
 var lu = userdraw_x.length;\
3382
 if( t == -1 && lu > 0){\
611
 if( t == -1 && lu > 0){\
3383
  userdraw_x.splice(lu-1,1);\
612
  userdraw_x.splice(lu-1,1);\
3384
  userdraw_y.splice(lu-1,1);\
613
  userdraw_y.splice(lu-1,1);\
Line 3405... Line 634...
3405
 return;\
634
 return;\
3406
};",num);
635
};",num);
3407
}
636
}
3408
 
637
 
3409
/* draw arrows via inputfields x/y */
638
/* draw arrows via inputfields x/y */
3410
void add_input_arrow(FILE *js_include_file,int num){
639
void add_input_arrow(int num){
3411
fprintf(js_include_file,"\n/* begin add_input_arrow */\n\
640
fprintf(js_include_file,"\n/* add_input_arrow */\
3412
function user_redraw(t){\
641
function user_redraw(t){\
3413
 var lu = userdraw_x.length;\
642
 var lu = userdraw_x.length;\
3414
 if( t == -1 && lu > 1 ){\
643
 if( t == -1 && lu > 1 ){\
3415
  userdraw_x.splice(lu-2,2);\
644
  userdraw_x.splice(lu-2,2);\
3416
  userdraw_y.splice(lu-2,2);\
645
  userdraw_y.splice(lu-2,2);\
3417
  context_userdraw.clearRect(0,0,xsize,ysize);\
646
  context_userdraw.clearRect(0,0,xsize,ysize);\
3418
  draw_arrows(context_userdraw,userdraw_x,userdraw_y,arrow_head,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1,type,use_rotate,angle,0,[1,0,0,1,0,0]);\
647
  draw_arrows(context_userdraw,userdraw_x,userdraw_y,arrow_head,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1,type,use_rotate,angle,0,[1,0,0,1,0,0]);\
3419
  return;\
648
  return;\
3420
 };\
649
 };\
3421
 var add_x1 = safe_eval( document.getElementById(\"userinput_x1\").value );\
650
 var add_x1 = safe_eval( document.getElementById(\"userinput_x1\").value );\
3422
 var add_y1 = safe_eval( document.getElementById(\"userinput_y1\").value );\
651
 var add_y1 = safe_eval( document.getElementById(\"userinput_y1\").value );\
3423
 var add_x2 = safe_eval( document.getElementById(\"userinput_x2\").value );\
652
 var add_x2 = safe_eval( document.getElementById(\"userinput_x2\").value );\
3424
 var add_y2 = safe_eval( document.getElementById(\"userinput_y2\").value );\
653
 var add_y2 = safe_eval( document.getElementById(\"userinput_y2\").value );\
3425
 if( add_x1 != null && add_y1 != null && add_x2 != null && add_y2 != null ){\
654
 if( add_x1 != null && add_y1 != null && add_x2 != null && add_y2 != null ){\
3426
  if( %d == 2 ){\
655
  if( %d == 2 ){\
3427
    var s = userdraw_x.length;\
656
    var s = userdraw_x.length;\
3428
    userdraw_x[lu] = x2px(add_x1);\
657
    userdraw_x[lu] = x2px(add_x1);\
3429
    userdraw_y[lu] = y2px(add_y1);\
658
    userdraw_y[lu] = y2px(add_y1);\
3430
    userdraw_x[lu+1] = x2px(add_x2);\
659
    userdraw_x[lu+1] = x2px(add_x2);\
3431
    userdraw_y[lu+1] = y2px(add_y2);\
660
    userdraw_y[lu+1] = y2px(add_y2);\
3432
  }\
661
  }\
3433
  else\
662
  else\
3434
  {\
663
  {\
3435
   userdraw_x[0] = x2px(add_x1);\
664
   userdraw_x[0] = x2px(add_x1);\
3436
   userdraw_y[0] = y2px(add_y1);\
665
   userdraw_y[0] = y2px(add_y1);\
3437
   userdraw_x[1] = x2px(add_x2);\
666
   userdraw_x[1] = x2px(add_x2);\
3438
   userdraw_y[1] = y2px(add_y2);\
667
   userdraw_y[1] = y2px(add_y2);\
3439
  };\
668
  };\
3440
  context_userdraw.clearRect(0,0,xsize,ysize);\
669
  context_userdraw.clearRect(0,0,xsize,ysize);\
Line 3443... Line 672...
3443
 return;\
672
 return;\
3444
};",num);
673
};",num);
3445
}
674
}
3446
 
675
 
3447
/* draw line via inputfields x/y */
676
/* draw line via inputfields x/y */
3448
void add_input_line(FILE *js_include_file,int num){
677
void add_input_line(int num){
3449
fprintf(js_include_file,"\n/* begin line via inputfields  */\n\
678
fprintf(js_include_file,"\n/* line via inputfields  */\
3450
function user_redraw(t){\
679
function user_redraw(t){\
3451
 var lu = userdraw_x.length;\
680
 var lu = userdraw_x.length;\
3452
 if( t == -1 && lu > 1){\
681
 if( t == -1 && lu > 1){\
3453
  userdraw_x.splice(lu-2,2);\
682
  userdraw_x.splice(lu-2,2);\
3454
  userdraw_y.splice(lu-2,2);\
683
  userdraw_y.splice(lu-2,2);\
3455
  context_userdraw.clearRect(0,0,xsize,ysize);\
684
  context_userdraw.clearRect(0,0,xsize,ysize);\
3456
  draw_lines(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1,1,0,0);\
685
  draw_lines(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1,1,0,0);\
3457
  return;\
686
  return;\
3458
 };\
687
 };\
3459
 var add_x1 = safe_eval( document.getElementById(\"userinput_x1\").value );\
688
 var add_x1 = safe_eval( document.getElementById(\"userinput_x1\").value );\
Line 3464... Line 693...
3464
  if( %d == 2 ){\
693
  if( %d == 2 ){\
3465
    userdraw_x[lu] = x2px(add_x1);\
694
    userdraw_x[lu] = x2px(add_x1);\
3466
    userdraw_y[lu] = y2px(add_y1);\
695
    userdraw_y[lu] = y2px(add_y1);\
3467
    userdraw_x[lu+1] = x2px(add_x2);\
696
    userdraw_x[lu+1] = x2px(add_x2);\
3468
    userdraw_y[lu+1] = y2px(add_y2);\
697
    userdraw_y[lu+1] = y2px(add_y2);\
3469
  }\
698
  }\
3470
  else\
699
  else\
3471
  {\
700
  {\
3472
   userdraw_x[0] = x2px(add_x1);\
701
   userdraw_x[0] = x2px(add_x1);\
3473
   userdraw_y[0] = y2px(add_y1);\
702
   userdraw_y[0] = y2px(add_y1);\
3474
   userdraw_x[1] = x2px(add_x2);\
703
   userdraw_x[1] = x2px(add_x2);\
3475
   userdraw_y[1] = y2px(add_y2);\
704
   userdraw_y[1] = y2px(add_y2);\
Line 3479... Line 708...
3479
 };\
708
 };\
3480
 return;\
709
 return;\
3481
};",num);
710
};",num);
3482
}
711
}
3483
 
712
 
3484
 
713
 
3485
/* draw polyline via inputfields x/y */
714
/* draw polyline via inputfields x/y */
3486
void add_input_polyline(FILE *js_include_file){
715
void add_input_polyline(){
3487
fprintf(js_include_file,"\n/* begin polyline_segment via inputfields */\n\
716
fprintf(js_include_file,"\n/* polyline_segment via inputfields */\
3488
function user_redraw(t){\
717
function user_redraw(t){\
3489
 var lu = userdraw_x.length;\
718
 var lu = userdraw_x.length;\
3490
 cnt = 1;\
719
 cnt = 1;\
3491
 if( t == -1 && lu > 0){\
720
 if( t == -1 && lu > 0){\
3492
  userdraw_x.splice(lu-1,1);\
721
  userdraw_x.splice(lu-1,1);\
3493
  userdraw_y.splice(lu-1,1);\
722
  userdraw_y.splice(lu-1,1);\
Line 3505... Line 734...
3505
 };\
734
 };\
3506
 return;\
735
 return;\
3507
};");
736
};");
3508
}
737
}
3509
/* draw segment(s) via inputfields x/y */
738
/* draw segment(s) via inputfields x/y */
3510
void add_input_segment(FILE *js_include_file,int num){
739
void add_input_segment(int num){
3511
fprintf(js_include_file,"\n/* begin add_input_segment */\n\
740
fprintf(js_include_file,"\n/* add_input_segment */\
3512
function user_redraw(t){\
741
function user_redraw(t){\
3513
 var lu = userdraw_x.length;\
742
 var lu = userdraw_x.length;\
3514
 if( t == -1 && lu > 1){\
743
 if( t == -1 && lu > 1){\
3515
  userdraw_x.splice(lu-2,2);\
744
  userdraw_x.splice(lu-2,2);\
3516
  userdraw_y.splice(lu-2,2);\
745
  userdraw_y.splice(lu-2,2);\
Line 3536... Line 765...
3536
   userdraw_y[0] = y2px(add_y1);\
765
   userdraw_y[0] = y2px(add_y1);\
3537
   userdraw_x[1] = x2px(add_x2);\
766
   userdraw_x[1] = x2px(add_x2);\
3538
   userdraw_y[1] = y2px(add_y2);\
767
   userdraw_y[1] = y2px(add_y2);\
3539
  };\
768
  };\
3540
  context_userdraw.clearRect(0,0,xsize,ysize);\
769
  context_userdraw.clearRect(0,0,xsize,ysize);\
3541
  draw_segments(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
770
  draw_segments(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
3542
 };\
-
 
3543
 return;\
-
 
3544
};",num);
-
 
3545
}
-
 
3546
 
-
 
3547
/* draw demilines(s) via inputfields x/y */
-
 
3548
void add_input_demiline(FILE *js_include_file,int num){
-
 
3549
fprintf(js_include_file,"\n/* begin add_input_segment */\n\
-
 
3550
function user_redraw(t){\
-
 
3551
 var lu = userdraw_x.length;\
-
 
3552
 if( t == -1 && lu > 1){\
-
 
3553
  userdraw_x.splice(lu-2,2);\
-
 
3554
  userdraw_y.splice(lu-2,2);\
-
 
3555
  context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
3556
  draw_demilines(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
3557
  return;\
-
 
3558
 };\
-
 
3559
 var add_x1 = safe_eval( document.getElementById(\"userinput_x1\").value );\
-
 
3560
 var add_y1 = safe_eval( document.getElementById(\"userinput_y1\").value );\
-
 
3561
 var add_x2 = safe_eval( document.getElementById(\"userinput_x2\").value );\
-
 
3562
 var add_y2 = safe_eval( document.getElementById(\"userinput_y2\").value );\
-
 
3563
 if( add_x1 != null && add_y1 != null && add_x2 != null && add_y2 != null ){\
-
 
3564
  if( %d == 2 ){\
-
 
3565
    var s = userdraw_x.length;\
-
 
3566
    userdraw_x[s] = x2px(add_x1);\
-
 
3567
    userdraw_y[s] = y2px(add_y1);\
-
 
3568
    userdraw_x[s+1] = x2px(add_x2);\
-
 
3569
    userdraw_y[s+1] = y2px(add_y2);\
-
 
3570
  }\
-
 
3571
  else\
-
 
3572
  {\
-
 
3573
   userdraw_x[0] = x2px(add_x1);\
-
 
3574
   userdraw_y[0] = y2px(add_y1);\
-
 
3575
   userdraw_x[1] = x2px(add_x2);\
-
 
3576
   userdraw_y[1] = y2px(add_y2);\
-
 
3577
  };\
-
 
3578
  context_userdraw.clearRect(0,0,xsize,ysize);\
-
 
3579
  draw_demilines(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
-
 
3580
 };\
771
 };\
3581
 return;\
772
 return;\
3582
};",num);
773
};",num);
3583
}
774
}
3584
 
775
 
3585
/* draw polygon via 2 textarea's x/y : split into lines ! */
776
/* draw demilines(s) via inputfields x/y */
3586
void add_textarea_polygon(FILE *js_include_file){
777
void add_input_demiline(int num){
3587
fprintf(js_include_file,"\n/* begin polygon via 2 textareas x / y */\n\
778
fprintf(js_include_file,"\n/* add_input_segment */\
3588
function user_redraw(t){\
779
function user_redraw(t){\
3589
 var lu = userdraw_x.length;\
780
 var lu = userdraw_x.length;\
3590
 if( t == -1 && lu > 0){\
781
 if( t == -1 && lu > 1){\
3591
  if( lu < 3 ){\
-
 
3592
   userdraw_x = [];\
-
 
3593
   userdraw_y = [];\
-
 
3594
  }\
-
 
3595
  else\
-
 
3596
  {\
-
 
3597
  userdraw_x.splice(lu-1,1);\
782
  userdraw_x.splice(lu-2,2);\
3598
  userdraw_y.splice(lu-1,1);\
783
  userdraw_y.splice(lu-2,2);\
3599
  };\
-
 
3600
  context_userdraw.clearRect(0,0,xsize,ysize);\
784
  context_userdraw.clearRect(0,0,xsize,ysize);\
3601
  draw_paths(context_userdraw,userdraw_x,userdraw_y,line_width,closed_path,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,use_rotate,angle,0,[1,0,0,1,0,0]);\
785
  draw_demilines(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
3602
  cnt = 1; return;\
786
  return;\
3603
 };\
787
 };\
3604
 var add_x_values = (document.getElementById(\"userinput_x\").value).split('\\n');\
788
 var add_x1 = safe_eval( document.getElementById(\"userinput_x1\").value );\
3605
 var add_y_values = (document.getElementById(\"userinput_y\").value).split('\\n');\
789
 var add_y1 = safe_eval( document.getElementById(\"userinput_y1\").value );\
3606
 var lx = add_x_values.length;\
790
 var add_x2 = safe_eval( document.getElementById(\"userinput_x2\").value );\
3607
 var ly = add_y_values.length;\
791
 var add_y2 = safe_eval( document.getElementById(\"userinput_y2\").value );\
3608
 if( lx != ly){ if(lx > ly){alert(\'x/y mismatch\\ntoo few y-values\');return}else{alert(\'x/y mismatch\\ntoo many y-values\');return}};\
792
 if( add_x1 != null && add_y1 != null && add_x2 != null && add_y2 != null ){\
3609
 var add_x;var add_y;\
793
  if( %d == 2 ){\
3610
 for(var p = 0 ; p < lx ; p++){\
794
    var s = userdraw_x.length;\
3611
  add_x = safe_eval( add_x_values[p] );\
-
 
3612
  add_y = safe_eval( add_y_values[p] );\
-
 
3613
  if( add_x == null || add_y == null ){return;};\
-
 
3614
  userdraw_x[lu+p] = x2px(add_x);\
795
    userdraw_x[s] = x2px(add_x1);\
3615
  userdraw_y[lu+p] = y2px(add_y);\
796
    userdraw_y[s] = y2px(add_y1);\
3616
  if(p>100){alert(\"hmmmm\");return;};\
-
 
3617
 };\
-
 
3618
 draw_paths(context_userdraw,userdraw_x,userdraw_y,line_width,closed_path,stroke_color,stroke_opacity,use_filled,fill_color,fill_opacity,use_dashed,dashtype0,use_rotate,angle,0,[1,0,0,1,0,0]);\
-
 
3619
 cnt = 1;\
-
 
3620
 return;\
-
 
3621
};");
-
 
3622
}
-
 
3623
 
-
 
3624
void add_jsplot(FILE *js_include_file,int canvas_root_id){
-
 
3625
fprintf(js_include_file,"\n/* begin jsplot() */\n\
-
 
3626
var x_anim_points;var y_anim_points;var animation_steps;var animation_funs;\
-
 
3627
var jsplot = function(canvas_type,funs,linewidth,color,opacity,use_dashed,dashtype0,dashtype1,trange,plotsteps,use_parametric,use_animate){\
-
 
3628
 var obj = create_canvas%d(canvas_type,xsize,ysize);\
-
 
3629
 var ctx = obj.getContext(\"2d\");\
-
 
3630
 ctx.clearRect(0,0,xsize,ysize);\
-
 
3631
 animation_funs = funs.length;\
-
 
3632
 function eval_jsmath(x,func){return parseFloat(eval(func));};\
-
 
3633
 if( typeof(multilinewidth) !== 'undefined' && multilinewidth != null ){ linewidth = multilinewidth;};\
-
 
3634
 if( typeof(multistrokecolors) !== 'undefined' && multistrokecolors != null){ color = multistrokecolors;};\
-
 
3635
 if( typeof(multistrokeopacity) !== 'undefined' && multistrokeopacity != null ){ opacity = multistrokeopacity;};\
-
 
3636
 if( typeof(multidash) !== 'undefined' && multidash != null ){use_dashed = multidash;};\
-
 
3637
 x_anim_points = [];y_anim_points = [];var idx=0;\
-
 
3638
 if( use_parametric == 1){\n\
-
 
3639
  for(var i = 0 ; i < animation_funs; i=i+2){\
-
 
3640
   var fun_x = to_js_math(funs[i]);\
797
    userdraw_x[s+1] = x2px(add_x2);\
3641
   var fun_y = to_js_math(funs[i+1]);\
-
 
3642
   if(fun_x == null || fun_y == null){alert(\"Syntax Error...\\nAttention : try use very precise notation !\\nlike :\\n6*(0.25)^(1.23)\\n1/(sin(5*x))\\n(3*x+4)/(x^(2*pi)) \");return;};\
-
 
3643
   try{ parseFloat( eval_jsmath( px2x(0),fun_x ) );}catch(e){alert(\"\\nSyntax Error...\\nAttention : try use very precise notation !\\nlike :\\n6*(0.25)^(1.23)\\n1/(sin(5*x))\\n(3*x+4)/(x^(2*pi))\");return;};\
-
 
3644
   ctx.lineWidth = linewidth[i] || linewidth;\
-
 
3645
   ctx.strokeStyle='rgba('+color[i] || color +','+opacity[i] || opacity +')';\
-
 
3646
   if(use_dashed[i] == \"1\" || use_dashed == \"1\"){if(ctx.setLineDash){ctx.setLineDash([dashtype0,dashtype1]);}else{ctx.mozDash =[dashtype0,dashtype1];}};\
-
 
3647
   var y1;var x1;var y2;var x2;\
798
    userdraw_y[s+1] = y2px(add_y2);\
3648
   ctx.beginPath();\
-
 
3649
   var tmin = trange[0];var tmax = trange[1];\
-
 
3650
   var step = parseFloat((tmax - tmin)/plotsteps);\
-
 
3651
   for(var p = tmin ; p < tmax; p = p+step ){\
-
 
3652
    x1 = x2px(parseFloat(eval_jsmath(p,fun_x)));\
-
 
3653
    y1 = y2px(parseFloat(eval_jsmath(p,fun_y)));\
-
 
3654
    x2 = x2px(parseFloat(eval_jsmath(p+step,fun_x)));\
-
 
3655
    y2 = y2px(parseFloat(eval_jsmath(p+step,fun_y)));\
-
 
3656
    x_anim_points[idx] = x1;y_anim_points[idx] = y1;idx++;\
-
 
3657
     ctx.moveTo(x1,y1);\
-
 
3658
     ctx.lineTo(x2,y2);\
-
 
3659
     ctx.moveTo(x1,y1);\
-
 
3660
     ctx.lineTo(x2,y2);\
-
 
3661
   };\
-
 
3662
   ctx.closePath();\
-
 
3663
   ctx.stroke();\
-
 
3664
  };\
799
  }\
3665
  animation_funs = 0.5*animation_funs;\
-
 
3666
 }else{\
800
  else\
3667
  for(var i = 0 ; i < animation_funs; i++){\
-
 
3668
   var fun = to_js_math(funs[i]);\
-
 
3669
   if(fun == null){alert(\"Syntax Error...\\nAttention : try use very precise notation !\\nlike :\\n6*(0.25)^(1.23)\\n1/(sin(5*x))\\n(3*x+4)/(x^(2*pi)) \");return;};\
-
 
3670
   try{ parseFloat( eval_jsmath( px2x(0),fun ) );}catch(e){alert(\"\\nSyntax Error...\\nAttention : try use very precise notation !\\nlike :\\n6*(0.25)^(1.23)\\n1/(sin(5*x))\\n(3*x+4)/(x^(2*pi))\");return;};\
-
 
3671
   if(use_dashed[i] == \"1\" || use_dashed == \"1\"){if(ctx.setLineDash){ctx.setLineDash([dashtype0,dashtype1]);}else{ctx.mozDash =[dashtype0,dashtype1];}};\
-
 
3672
   ctx.lineWidth = linewidth[i] || linewidth;\
-
 
3673
   ctx.strokeStyle='rgba('+color[i] || color +','+opacity[i] || opacity +')';\
-
 
3674
   var y1;var x1;var y2;var x2;\
-
 
3675
   ctx.beginPath();\
-
 
3676
   for(var p = 0 ; p<xsize;p++){\
-
 
3677
    x1 = px2x(p);\
-
 
3678
    y1 = y2px(parseFloat(eval_jsmath(x1,fun)));\
-
 
3679
    x2 = px2x(p+1);\
-
 
3680
    y2 = y2px(parseFloat(eval_jsmath(x2,fun)));\
-
 
3681
    x_anim_points[idx] = p;y_anim_points[idx] = y1;idx++;\
-
 
3682
    if(Math.abs(y2-y1) < ysize ){\
-
 
3683
     ctx.moveTo(p,y1);\
-
 
3684
     ctx.lineTo(p+1,y2);\
-
 
3685
    };\
-
 
3686
   };\
-
 
3687
   ctx.closePath();\
-
 
3688
   ctx.stroke();\
-
 
3689
  };\
801
  {\
3690
 };\
-
 
3691
 if( use_animate == 1 ){animation_steps = idx;animate_this();}\
-
 
3692
};",canvas_root_id);
-
 
3693
}
-
 
3694
 
-
 
3695
void add_to_js_math(FILE *js_include_file){
-
 
3696
fprintf(js_include_file,"\n/* begin to_js_math() */\n\
-
 
3697
var to_js_math = function(math_fun){\
802
   userdraw_x[0] = x2px(add_x1);\
3698
 if(math_fun == null){return;};\
-
 
3699
 var infun=[\"sqrt\",\"^\",\"asin\",\"acos\",\"atan\",\"log\",\"pi\",\"abs\",\"sin\",\"cos\",\"tan\",\"e\"];\
-
 
3700
 var outfun=[\"Math.sqrt\",\"Math.pow\",\"Math.asin\",\"Math.acos\",\"Math.atan\",\"Math.log\",\"(3.14159265358979)\",\"Math.abs\",\"Math.sin\",\"Math.cos\",\"Math.tan\",\"(2.718281828459045)\"];\
-
 
3701
 var len = infun.length;var in_fun;var In_Fun;var out_fun;var w_cnt;\
-
 
3702
 for(var p=0 ; p < len ; p++){\
803
   userdraw_y[0] = y2px(add_y1);\
3703
  in_fun = infun[p];In_Fun = in_fun.toUpperCase();out_fun = outfun[p];w_cnt=0;\
-
 
3704
  if(math_fun.indexOf(in_fun) != -1){\
-
 
3705
   if(in_fun == \"^\"){\
804
   userdraw_x[1] = x2px(add_x2);\
3706
    var tab = [];var small_trick = \"___small_trick___\";\
-
 
3707
    while (math_fun.indexOf(\"(\") != -1){\
805
   userdraw_y[1] = y2px(add_y2);\
3708
     math_fun = math_fun.replace(/(\\([^\\(\\)]*\\))/g, function(m, t){tab.push(t);return (small_trick + (tab.length - 1));});\
-
 
3709
     w_cnt++;if(w_cnt>1000){alert(\"hmmm \"+math_fun+\" ?\\nUse command plot for more complex math functions...\");return null;};\
-
 
3710
    };\
-
 
3711
    tab.push(math_fun);w_cnt = 0;math_fun = small_trick + (tab.length - 1);\
-
 
3712
    while (math_fun.indexOf(small_trick) != -1){\
-
 
3713
     math_fun = math_fun.replace(new RegExp(small_trick + \"(\\\\d+)\", \"g\"), function(m, d){return tab[d].replace(/(\\w*)\\^(\\w*)/g, out_fun+\"($1,$2)\");});\
-
 
3714
     w_cnt++;if(w_cnt>1000){alert(\"hmmm \"+math_fun+\" ?\\nUse command plot for more complex math functions...\");return null;};\
-
 
3715
    };\
-
 
3716
   }\
-
 
3717
   else\
-
 
3718
   {\
-
 
3719
    while( math_fun.indexOf(in_fun) != -1 ){\
-
 
3720
     math_fun = math_fun.replace(in_fun,out_fun);\
-
 
3721
     math_fun = math_fun.replace(in_fun,In_Fun);\
-
 
3722
     w_cnt++;if(w_cnt>1000){alert(\"hmmm \"+math_fun+\" ?\\nUse command plot for more complex math functions...\");return null;};\
-
 
3723
    };\
-
 
3724
   };\
-
 
3725
  };\
806
  };\
3726
 };\
-
 
3727
 for(var p=0 ; p < len ; p++){\
-
 
3728
  in_fun = infun[p];In_Fun = in_fun.toUpperCase();w_cnt = 0;\
-
 
3729
  if(math_fun.indexOf(In_Fun) != -1 ){\
-
 
3730
   while(math_fun.indexOf(In_Fun) != -1){\
-
 
3731
    math_fun = math_fun.replace(In_Fun,in_fun);\
807
  context_userdraw.clearRect(0,0,xsize,ysize);\
3732
    w_cnt++;if(w_cnt>1000){alert(\"hmmm \"+math_fun+\" ?\\nUse command plot for more complex math functions...\");return null;};\
808
  draw_demilines(context_userdraw,userdraw_x,userdraw_y,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1);\
3733
   };\
-
 
3734
  };\
-
 
3735
 };\
809
 };\
3736
 return math_fun;\
810
 return;\
3737
};\n");
811
};",num);
3738
}
812
}
3739
 
813
 
3740
void add_clear_button(FILE *js_include_file,int canvas_root_id,char *input_style,char *button_text){
814
void add_clear_button(char *css_class,char *button_text){
3741
/* 25/11/2014 added clearing of reply array
815
/* 25/11/2014 added clearing of reply array
3742
all members will be set to 0 eg reply[0] = 0 , reply[1] = 0 ...
816
all members will be set to 0 eg reply[0] = 0 , reply[1] = 0 ...
3743
hope this does not interfere with existing work...
817
hope this does not interfere with existing work...
3744
*/
818
*/
3745
/*
819
/*
3746
5/2016 changed  to 'setAttribute()' because of trouble on Chromium/Safari/IE
820
5/2016 changed  to 'setAttribute()' because of trouble on Chromium/Safari/IE
3747
10/2016 corrected contex-reset-flaw when using "userdraw text,color" and added inputs to the things we can remove
821
10/2016 corrected contex-reset-flaw when using "userdraw text,color" and added inputs to the things we can remove
3748
7/2017 added 'userdraw clickfill,color' to removable things...one user_filling per click
822
7/2017 added 'userdraw clickfill,color' to removable things...one user_filling per click
3749
*/
823
*/
3750
fprintf(js_include_file,"<!-- add clear button */\n\
824
fprintf(js_include_file,"\n/* add clear button */\
3751
clear_draw_area%d = function(){\
825
clear_draw_area%d = function(){\
3752
 if(typeof(fill_canvas_no) === 'object'){\
826
 if(typeof(fill_canvas_no) === 'number'){\
3753
  var len = fill_canvas_no.length;\
-
 
3754
  for(var p = len; p >= 0; p = p - 1){\
-
 
3755
   var chk = document.getElementById('wims_canvas%d'+fill_canvas_no[p]);\
827
  var chk = document.getElementById('wims_canvas%d'+fill_canvas_no);\
3756
   if( chk ){\
828
  if( chk ){\
3757
     var fill_ctx = chk.getContext(\"2d\");\
-
 
3758
     fill_ctx.clearRect(0,0,xsize,ysize);\
829
   var fill_ctx = chk.getContext(\"2d\");fill_ctx.clearRect(0,0,xsize,ysize);\
3759
     fill_canvas_no.splice(p,1);\
-
 
3760
     userdraw_x.splice(p,1);\
-
 
3761
     userdraw_y.splice(p,1);\
-
 
3762
     userdraw_radius.splice(p,1);\
830
   fill_canvas_no--;userdraw_x.splice(p,1);userdraw_y.splice(p,1);userdraw_radius.splice(p,1);\
3763
     return;\
831
   return;\
3764
   };\
-
 
3765
  };\
832
  };\
3766
  return;\
-
 
3767
 };\
833
 };\
3768
 if( typeof(context_userdraw) === 'object' ){\
834
 if( typeof(context_userdraw) === 'object' ){\
3769
  while( document.getElementById(canvas_div.lastChild.id).tagName == 'DIV'){\
835
  while( document.getElementById(canvas_div.lastChild.id).tagName == 'DIV'){\
3770
   document.getElementById(canvas_div.lastChild.id).innerHTML = null;\
836
   document.getElementById(canvas_div.lastChild.id).innerHTML = null;\
3771
   canvas_div.removeChild(document.getElementById(canvas_div.lastChild.id));\
837
   canvas_div.removeChild(document.getElementById(canvas_div.lastChild.id));\
3772
  };\
838
  };\
3773
  context_userdraw.clearRect(0,0,xsize,ysize);\
839
  context_userdraw.clearRect(0,0,xsize,ysize);\
3774
  if( typeof(userdraw_text) != 'undefined'){ userdraw_text = []; };\
840
  if( typeof(userdraw_text) !== 'undefined'){ userdraw_text = []; };\
3775
  if( document.getElementById(\"canvas_input0\") ){\
841
  if( document.getElementById(\"canvas_input0\") ){\
3776
   var p = 0;var inp;\
842
   var p = 0;var inp;\
3777
   while( document.getElementById(\"canvas_input\"+p) ){\
843
   while( document.getElementById(\"canvas_input\"+p) ){\
3778
    inp = document.getElementById(\"canvas_input\"+p);\
844
    inp = document.getElementById(\"canvas_input\"+p);\
3779
    canvas_div.removeChild(inp);\
845
    canvas_div.removeChild(inp);\
3780
    p++;\
846
    p++;\
3781
   };\
847
   };\
3782
   input_cnt = 0;start_input_cnt = 0; \
848
   input_cnt = 0;start_input_cnt = 0; \
3783
  };\
849
  };\
3784
  userdraw_x = [];userdraw_y = [];userdraw_radius = [];xy_cnt = 0;click_cnt = 0;\
850
  userdraw_x = [];userdraw_y = [];userdraw_radius = [];xy_cnt = 0;\
3785
  for(var p = 0;p < reply.length; p++){\
-
 
3786
   reply[p] = 0;\
-
 
3787
  };\
-
 
3788
 };\
851
 };\
3789
 if( typeof(external_ctx) === 'object'){\
852
 if( typeof(external_ctx) === 'object'){\
3790
  external_ctx.clearRect(0,0,xsize,ysize);\
853
  external_ctx.clearRect(0,0,xsize,ysize);\
3791
  for(var p = 0 ; p < userdraw_x.length; p++){\
854
  for(var p = 0 ; p < userdraw_x.length; p++){\
3792
   userdraw_x[p] = null;userdraw_y[p] = null;\
855
   userdraw_x[p] = null;userdraw_y[p] = null;\
3793
  };\
856
  };\
Line 3797... Line 860...
3797
function add_clear_button(){\
860
function add_clear_button(){\
3798
 var tooltip_placeholder_div = document.getElementById(\"tooltip_placeholder_div%d\");\
861
 var tooltip_placeholder_div = document.getElementById(\"tooltip_placeholder_div%d\");\
3799
 var button = document.createElement('input');\
862
 var button = document.createElement('input');\
3800
 button.setAttribute(\"type\" , \"button\");\
863
 button.setAttribute(\"type\" , \"button\");\
3801
 button.setAttribute(\"id\" , \"clearbutton%d\");\
864
 button.setAttribute(\"id\" , \"clearbutton%d\");\
3802
 button.setAttribute(\"style\" , \"%s\");\
865
 button.setAttribute(\"class\" , \"%s\");\
3803
 button.setAttribute(\"value\" , \"%s\");\
866
 button.setAttribute(\"value\" , \"%s\");\
3804
 button.setAttribute(\"onclick\",\"clear_draw_area%d()\");\
867
 button.setAttribute(\"onclick\",\"clear_draw_area%d()\");\
3805
 tooltip_placeholder_div.appendChild(button);\
868
 tooltip_placeholder_div.appendChild(button);\
3806
};\
869
};\
3807
add_clear_button();\
-
 
3808
",canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,input_style,button_text,canvas_root_id);
870
add_clear_button();",canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,css_class,button_text,canvas_root_id);
3809
}
871
}
3810
 
872
 
3811
void add_color_palette(FILE *js_include_file,int canvas_root_id,char *input_style){
873
void add_color_palette(char *css_class){
3812
fprintf(js_include_file,"<!-- add color palette */\n\
874
fprintf(js_include_file,"\n/* add color palette */\
3813
function add_color_palette(){\
875
function add_color_palette(){\
3814
 var tooltip_placeholder_div = document.getElementById(\"tooltip_placeholder_div%d\");\
876
 var tooltip_placeholder_div = document.getElementById(\"tooltip_placeholder_div%d\");\
3815
 var clen = palettecolors.length;\
877
 var clen = palettecolors.length;\
3816
 for( var p = 0 ; p < clen ; p++ ){\
878
 for( var p = 0 ; p < clen ; p++ ){\
3817
  var button = document.createElement('input');\
879
  var button = document.createElement('input');\
Line 3824... Line 886...
3824
  button.addEventListener('mousedown',function(e){var id = this.getAttribute('id');multifillcolors[0]=id;multifillcolors[1]=id;multifillcolors[2]=id;},false);\
886
  button.addEventListener('mousedown',function(e){var id = this.getAttribute('id');multifillcolors[0]=id;multifillcolors[1]=id;multifillcolors[2]=id;},false);\
3825
  tooltip_placeholder_div.appendChild(button);\
887
  tooltip_placeholder_div.appendChild(button);\
3826
 };\
888
 };\
3827
};\
889
};\
3828
add_color_palette();\
890
add_color_palette();\
3829
",canvas_root_id,input_style);
891
",canvas_root_id,css_class);
3830
}
892
}
3831
 
893
 
3832
 
-
 
3833
char *getMML(char *tex){
-
 
3834
 int my_pipe[2];pid_t pid;
-
 
3835
 if(pipe(my_pipe)){canvas_error("mathml(): pipe() failure.\n");}
-
 
3836
  pid = fork();
-
 
3837
  if (pid == (pid_t) 0){
-
 
3838
   char mml_buffer[MAX_BUFFER+1];
-
 
3839
   char *argv[]={"wims_mathml","--use-zoom","0","--tex-size 100%","--max-mml-size","1024","--tex-string",tex,NULL};
-
 
3840
   close(my_pipe[0]);dup2(my_pipe[1], 1);dup2(my_pipe[1], 2);close(my_pipe[1]);
-
 
3841
   execv("../bin/wims_mathml",argv);canvas_error("could not execute wims_mathml\n");
-
 
3842
  }
-
 
3843
  else
-
 
3844
  {
-
 
3845
  if (pid < (pid_t) 0){
-
 
3846
   close(my_pipe[0]);close(my_pipe[1]);canvas_error("mathml(): fork() failure.\n");
-
 
3847
  }
-
 
3848
  int status;FILE *stream;close(my_pipe[1]);stream = fdopen (my_pipe[0], "r");
-
 
3849
  char buffer[MAX_BUFFER+1];memset(buffer,'\0',MAX_BUFFER);
-
 
3850
  fgets(buffer, MAX_BUFFER, stream);
-
 
3851
  int L0 = 1 + snprintf(NULL,0,"%s", buffer);
-
 
3852
  tex = my_newmem(L0);memset(tex,'\0',L0);
-
 
3853
  snprintf(tex,L0,"%s",buffer);
-
 
3854
  fclose (stream);close(my_pipe[0]);waitpid(pid, &status, 0);
-
 
3855
 }
-
 
3856
 return tex;
-
 
3857
}
-
 
3858
 
-
 
3859
/* GNU libmatheval library for evaluating mathematical functions. */
-
 
3860
char *eval(int xsize,int ysize,char *fun,double xmin,double xmax,double ymin,double ymax,int plotsteps,int precision){
-
 
3861
    void *f;
-
 
3862
    double x;
-
 
3863
    double y;
-
 
3864
    int xv;
-
 
3865
    int i = 0;
-
 
3866
    int xstep =(int)(xsize/plotsteps);
-
 
3867
    if( xstep == 0 ){xstep = 1;}
-
 
3868
    double a = (xmax - xmin)/xsize;
-
 
3869
    f = eval_create(fun);
-
 
3870
    assert (f);
-
 
3871
    if( f == NULL ){canvas_error("I'm having trouble parsing your \"expression\" ") ;}
-
 
3872
    /* we supply the true x/y values...draw_curve() will convert these (x:y) to pixels : used for pan/scale */
-
 
3873
    double xydata[MAX_BUFFER+1];/* hmmm */
-
 
3874
    int lim_ymin =(int)( ymin - 4*fabs(ymin));/* 19-4-2015 replacing "abs" by "fabs"*/
-
 
3875
    int lim_ymax =(int)( ymax + 4*fabs(ymax));/* 19-4-2015 replacing "abs" by "fabs"*/
-
 
3876
    for ( xv = 0 ;xv < xsize ; xv = xv+xstep ){
-
 
3877
        x = (double) (xv*a + xmin);
-
 
3878
        if( i < MAX_BUFFER - 2){
-
 
3879
            y = eval_x(f, x);
-
 
3880
            if(y < lim_ymax && y > lim_ymin ){
-
 
3881
                xydata[i++] = x;
-
 
3882
                xydata[i++] = y;
-
 
3883
            }
-
 
3884
        }
-
 
3885
        else
-
 
3886
        {
-
 
3887
            canvas_error("\nYour curve plotting produces too many data \n Use less plotsteps or some other means to reduce the amount of data... ");
-
 
3888
        }
-
 
3889
    }
-
 
3890
    eval_destroy(f);
-
 
3891
    return double_xy2js_array(xydata,i,find_number_of_digits(precision));
-
 
3892
}
-
 
3893
/* plot a very primitive (!) levelcurve : not to be compared with "flydraw levelcurve" */
-
 
3894
char *eval_levelcurve(int xsize,int ysize,char *fun,double xmin,double xmax,double ymin,double ymax,int plotsteps,int precision,double level){
-
 
3895
    void *f = eval_create(fun);
-
 
3896
    assert (f);
-
 
3897
    if( f == NULL ){canvas_error("I'm having trouble parsing your \"expression\" ") ;}
-
 
3898
    double a = (double)((xmax - xmin)/plotsteps);
-
 
3899
    double b = (double)((ymax - ymin)/plotsteps);
-
 
3900
    double x;double y;double diff;
-
 
3901
    double xydata[MAX_BUFFER+1];
-
 
3902
    int i = 0;
-
 
3903
    ymin = ymin - 1;
-
 
3904
    xmin = xmin - 1;
-
 
3905
    ymax = ymax + 1;
-
 
3906
    xmax = xmax + 1;
-
 
3907
    for( x = xmin ;x < xmax ; x = x + a ){
-
 
3908
        for ( y = ymin ;y < ymax ; y = y + b ){
-
 
3909
            if( i < MAX_BUFFER - 2){
-
 
3910
                diff = level - eval_x_y(f, x,y);
-
 
3911
                if(diff < 0.1 && diff > -0.1){
-
 
3912
                    xydata[i++] = x;
-
 
3913
                    xydata[i++] = y;
-
 
3914
                }
-
 
3915
            }
-
 
3916
            else
-
 
3917
            {
-
 
3918
                canvas_error("\nYour curve plotting produces too many data \n Use less plotsteps, decrease image size...\nor some other means to reduce the amount of data... ");
-
 
3919
            }
-
 
3920
        }
-
 
3921
    }
-
 
3922
    eval_destroy(f);
-
 
3923
    return double_xy2js_array(xydata,i,find_number_of_digits(precision));
-
 
3924
}
-
 
3925
 
-
 
3926
/* plot parametric function */
-
 
3927
char *eval_parametric(int xsize,int ysize,char *fun1,char* fun2,double xmin,double xmax,double ymin,double ymax,
-
 
3928
 double tmin,double tmax,int plotsteps,int precision){
-
 
3929
    void *fx;
-
 
3930
    void *fy;
-
 
3931
    double t;
-
 
3932
    int i = 0;
-
 
3933
    double tstep = (tmax-tmin)/plotsteps;
-
 
3934
    if( tstep == 0 ){canvas_error("zero step for t variable : reduce plotsteps or inrease trange");}
-
 
3935
    fx = eval_create(fun1);
-
 
3936
    fy = eval_create(fun2);
-
 
3937
    assert(fx);
-
 
3938
    assert(fy);
-
 
3939
    if( fx == NULL || fy == NULL ){canvas_error("I'm having trouble parsing your \"expression\" ") ;}
-
 
3940
    /* we supply the true x/y values...draw_curve() will convert these (x:y) to pixels : used for pan/scale */
-
 
3941
    double xydata[MAX_BUFFER+1];/* hmmm */
-
 
3942
    double x; /* real x-values */
-
 
3943
    double y; /* real y-values */
-
 
3944
    int lim_ymin =(int)( ymin - 4*fabs(ymin));/* 19-4-2015 replacing "abs" by "fabs"*/
-
 
3945
    int lim_ymax =(int)( ymax + 4*fabs(ymax));/* 19-4-2015 replacing "abs" by "fabs"*/
-
 
3946
    for( t = tmin ;t <= tmax ; t = t + tstep ){
-
 
3947
        if( i < MAX_BUFFER - 2 ){
-
 
3948
            y = eval_t(fy, t);
-
 
3949
            if(y > lim_ymin && y < lim_ymax){
-
 
3950
                x = eval_t(fx, t);
-
 
3951
                xydata[i++] = x;
-
 
3952
                xydata[i++] = y;
-
 
3953
            }
-
 
3954
        }
-
 
3955
        else
-
 
3956
        {
-
 
3957
            canvas_error("\nYour curve plotting produces too many data \n Use less plotsteps or some other means to reduce the amount of data... ");
-
 
3958
        }
-
 
3959
    }
-
 
3960
    eval_destroy(fx);
-
 
3961
    eval_destroy(fy);
-
 
3962
    return double_xy2js_array(xydata,i,find_number_of_digits(precision));
-
 
3963
}
-
 
3964
 
-
 
3965
char *double_xy2js_array(double xy[],int len,int decimals){
-
 
3966
 /*
-
 
3967
    1,2,3,4,5,6,7,8 --> [1,3,5,7],[2,4,6,8]
-
 
3968
    int xy[] is already checked for errors or overflow in "get_real()"
-
 
3969
    just to be sure we double check the size of "temp"
-
 
3970
*/
-
 
3971
    char temp[2*MAX_BUFFER], *string;
-
 
3972
    char *tmp = my_newmem(16);/* <= 9999999999999999  */
-
 
3973
    memset(temp,'\0',2*MAX_BUFFER);/* clear memory */
-
 
3974
    int i;int space_left;
-
 
3975
    temp[0] = '[';/* start js-array */
-
 
3976
    for(i = 0; i < len;i = i + 2){ /*  x_points[] */
-
 
3977
        if(i == len - 2){sprintf(tmp, "%.*f",decimals, xy[i]);}else{sprintf(tmp, "%.*f,",decimals,xy[i]);}
-
 
3978
        space_left = (int) (sizeof(temp) - strlen(temp) - strlen(tmp) - 1);
-
 
3979
        if( space_left > 0 ){ strncat(temp,tmp,space_left - 1);}else{canvas_error("can not parse integer to js-array:\nYour curve plotting produces too many data \nreduce your image size or plotsteps ");}
-
 
3980
    }
-
 
3981
    strncat(temp,"],[",4); /* close js x_values array and start new */
-
 
3982
    for(i = 1; i < len;i = i + 2){ /* y_points */
-
 
3983
        if(i == len - 1){ sprintf(tmp, "%.*f",decimals,xy[i]);}else{sprintf(tmp, "%.*f,",decimals,xy[i]);}
-
 
3984
        space_left = (int) (sizeof(temp) - strlen(temp) - strlen(tmp) - 1);
-
 
3985
        if( space_left > 0 ){ strncat(temp,tmp,space_left - 1);}else{canvas_error("can not parse integer to js-array:\nYour curve plotting produces too many data \nreduce your image size or plotsteps");}
-
 
3986
    }
-
 
3987
    strncat(temp,"]",2);
-
 
3988
    string=(char *)my_newmem(sizeof(temp));
-
 
3989
    snprintf(string,sizeof(temp),"%s",temp);
-
 
3990
    return string;
-
 
3991
}
-
 
3992
 
-
 
3993
char *xy2js_array(int xy[],int len){
-
 
3994
 /*
-
 
3995
    1,2,3,4,5,6,7,8 --> [1,3,5,7],[2,4,6,8]
-
 
3996
    int xy[] is already checked for errors or overflow in "get_real()"
-
 
3997
    just to be sure we double check the size of "temp"
-
 
3998
*/
-
 
3999
    char temp[MAX_BUFFER], *string;
-
 
4000
    char *tmp = my_newmem(16);/* <= 9999999999999999  */
-
 
4001
    memset(temp,'\0',MAX_BUFFER);/* clear memory */
-
 
4002
    int i;int space_left;
-
 
4003
    temp[0] = '[';/* start js-array */
-
 
4004
    for(i = 0; i < len;i = i + 2){ /*  x_points[] */
-
 
4005
        if(i == len - 2){sprintf(tmp, "%d", xy[i]);}else{sprintf(tmp, "%d,", xy[i]);}
-
 
4006
        space_left = (int) (sizeof(temp) - strlen(temp) - strlen(tmp) - 1);
-
 
4007
        if( space_left > 0 ){ strncat(temp,tmp,space_left - 1);}else{canvas_error("can not parse integer to js-array:\nYour curve plotting produces too many data \nreduce image size or plotsteps ");}
-
 
4008
    }
-
 
4009
    strncat(temp,"],[",4); /* close js x_values array and start new */
-
 
4010
    for(i = 1; i < len;i = i + 2){ /* y_points */
-
 
4011
        if(i == len - 1){ sprintf(tmp, "%d", xy[i]);}else{sprintf(tmp, "%d,", xy[i]);}
-
 
4012
        space_left = (int) (sizeof(temp) - strlen(temp) - strlen(tmp) - 1);
-
 
4013
        if( space_left > 0 ){ strncat(temp,tmp,space_left - 1);}else{canvas_error("can not parse integer to js-array:\nYour curve plotting produces too many data\nreduce image size or plotsteps \n");}
-
 
4014
    }
-
 
4015
    strncat(temp,"]",2);
-
 
4016
    string=(char *)my_newmem(sizeof(temp));
-
 
4017
    snprintf(string,sizeof(temp),"%s",temp);
-
 
4018
    return string;
-
 
4019
}
-
 
4020
 
-
 
4021
char *data2js_array(int data[],int len){
-
 
4022
 /*
-
 
4023
    1,2,3,4,5,6,7,8 --> [1,2,3,4,5,6,7,8]
-
 
4024
    int data[] is already checked for errors or overflow in "get_real()"
-
 
4025
    just to be sure we double check the size of "temp"
-
 
4026
*/
-
 
4027
    char temp[MAX_BUFFER], *string;
-
 
4028
    char *tmp = my_newmem(16);/* <= 9999999999999999  */
-
 
4029
    memset(temp,'\0',MAX_BUFFER);/* clear memory */
-
 
4030
    int i;int space_left;
-
 
4031
    temp[0] = '[';/* start js-array */
-
 
4032
    for(i = 0; i < len; i++){
-
 
4033
        if(i == len - 1){sprintf(tmp, "%d", data[i]);}else{sprintf(tmp, "%d,", data[i]);}
-
 
4034
        space_left = (int) (sizeof(temp) - strlen(temp) - strlen(tmp) - 1);
-
 
4035
        if( space_left > 0 ){ strncat(temp,tmp,space_left - 1);}else{canvas_error("can not parse integer to js-array:\nYour curve plotting produces too many data \nreduce image size or plotsteps ");}
-
 
4036
    }
-
 
4037
    strncat(temp,"]",2);
-
 
4038
    string=(char *)my_newmem(sizeof(temp));
-
 
4039
    snprintf(string,sizeof(temp),"%s",temp);
-
 
4040
    return string;
-
 
4041
}
-
 
4042
 
-
 
4043
 
-
 
4044
void *my_newmem(size_t size){
-
 
4045
        void    *p;
-
 
4046
        if ((p = malloc(size +1)) == NULL){canvas_error("canvasdraw: ran out of memory\n");}
-
 
4047
        return p;
-
 
4048
}
-
 
4049
 
-
 
4050
int find_number_of_digits(int i){
-
 
4051
    if(i < 0 ){ i = -1*i;}
-
 
4052
    int digits = 0;
-
 
4053
    while ( i > 0){
-
 
4054
        digits++;
-
 
4055
        i = i/10;
-
 
4056
    }
-
 
4057
    return digits;
-
 
4058
}
-
 
4059
 
894
 
4060
struct colors colors[]={
895
struct colors colors[]={
4061
 {"#FF0000","red","255,0,0"},
896
 {"#FF0000","red","255,0,0"},
4062
 {"#00FF00","lime","0,255,0"},
897
 {"#00FF00","lime","0,255,0"},
4063
 {"#0000FF","blue","0,0,255"},
898
 {"#0000FF","blue","0,0,255"},
Line 4199... Line 1034...
4199
 {"#FDF5E6","oldlace","253,245,230"},
1034
 {"#FDF5E6","oldlace","253,245,230"},
4200
 {"#FAF0E6","linen","250,240,230"},
1035
 {"#FAF0E6","linen","250,240,230"},
4201
 {"#FAEBD7","antiquewhite","250,235,215"},
1036
 {"#FAEBD7","antiquewhite","250,235,215"},
4202
 };
1037
 };
4203
int NUMBER_OF_COLORNAMES=(sizeof(colors)/sizeof(colors[0]));
1038
int NUMBER_OF_COLORNAMES=(sizeof(colors)/sizeof(colors[0]));
4204
 
-
 
4205
void add_drag_code(FILE *js_include_file,int canvas_cnt,int canvas_root_id ){
-
 
4206
/* in drag& drop / onclick library:
-
 
4207
    obj_type = 1 == rect / rects
-
 
4208
    obj_type = 2 == point / points (do not scale with zoom)
-
 
4209
    obj_type = 3 == ellipse
-
 
4210
    obj_type = 4 == polyline / segment / segments /line / vline / hline
-
 
4211
    obj_type = 5 == closed path (polygon)
-
 
4212
    obj_type = 6 == roundrect /roundrects
-
 
4213
    obj_type = 7 == crosshair / crosshairs
-
 
4214
    obj_type = 8 == arrow / arrows
-
 
4215
    obj_type = 9 == curve
-
 
4216
    obj_type = 10== arrow2 / arrows2
-
 
4217
    obj_type = 11== parallel  (no drag or onclick)
-
 
4218
    obj_type = 12== arc : radius is in pixels , so no zooming in/out
-
 
4219
    obj_type = 13== circle / circles (will scale on zoom)
-
 
4220
    obj_type = 14== text (will not scale or pan on zoom)
-
 
4221
    obj_type = 15== animated point on curve
-
 
4222
    obj_type = 16== pixels
-
 
4223
    obj_type = 17== new arc [command angle] :radius in x-range, so will scale on zooming in/out
-
 
4224
    obj_type = 18== halfline
-
 
4225
    obj_type = 19== yerrorbars
-
 
4226
    obj_type = 20== xerrorbars
-
 
4227
    obj_type = 21== curvedarrow
-
 
4228
 
-
 
4229
    arc
-
 
4230
x[0] = x[1] = xc = double_data[0]
-
 
4231
y[0] = y[1] = yc = double_data[1]
-
 
4232
w[0] = width = int_data[0]
-
 
4233
w[1] = height = int_data[1]
-
 
4234
h[0] = start_angle = double_data[2]
-
 
4235
h[1] = end_angle = double_data[3]
-
 
4236
      myState.selection.line_width = org_line_width;myState.selection.font_family = org_font_family;break;\
-
 
4237
 
-
 
4238
use_offset only for text shape objects...
-
 
4239
 0=none;
-
 
4240
 1=yoffset
-
 
4241
 2=xoffset
-
 
4242
 3=xyoffset
-
 
4243
 4=centered
-
 
4244
 
-
 
4245
int onclick = 0;  0 = noninteractive ; 1 = onclick ; 2 = draggable
-
 
4246
type= object type
-
 
4247
 
-
 
4248
verwijderd: direction : dragging in xy=0 , in x=1 in y=2 vervangen dooor use_snap  en multisnap_check(x,y,use_snap)
-
 
4249
use_snap:   0 = none 1=grid : 2=x-grid : 3=y-grid : 4=snap to points
-
 
4250
 
-
 
4251
obj.angle == RADIANS!
-
 
4252
*/
-
 
4253
fprintf(js_include_file,"\n/* begin drag_drop_onclick shape library */\n\
-
 
4254
if( typeof(dragdrop_precision) == 'undefined' ){var dragdrop_precision = 100;};\
-
 
4255
function Shape(drag_type,click_cnt,onclick,use_snap,type,x,y,w,h,line_width,stroke_color,stroke_opacity,fill_color,fill_opacity,use_filled,use_dashed,dashtype0,dashtype1,use_rotate,angle,text,font_size,font_family,use_affine,affine_matrix,use_slider,rotation_center,use_offset,use_pattern){\
-
 
4256
 this.drag_type = drag_type || 0;\
-
 
4257
 this.stroke_opacity = stroke_opacity || 1.0;\
-
 
4258
 this.stroke_color = \"rgba(\"+stroke_color+\",\"+stroke_opacity+\")\" || '#FF0000';\
-
 
4259
 this.fill_opacity = fill_opacity || 1.0;\
-
 
4260
 this.fill_color = \"rgba(\"+fill_color+\",\"+fill_opacity+\")\" || '#FF0000';\
-
 
4261
 this.use_pattern = use_pattern || 0;\
-
 
4262
 if( use_pattern > 0 ){ this.pattern = create_Pattern(x,y,this.use_pattern,this.fill_color); }else{ this.pattern = 0; }\
-
 
4263
 this.use_slider = use_slider || -1;\
-
 
4264
 this.text = text || 0;\
-
 
4265
 this.font_size = font_size || 12;\
-
 
4266
 this.font_family = font_family || this.font_size+'px Ariel';\
-
 
4267
 this.org_font_family = this.font_family;\
-
 
4268
 this.textwidth = 0;\
-
 
4269
 this.textheight = 0;\
-
 
4270
 this.use_rotate = use_rotate || 0;\
-
 
4271
 this.angle = angle*(Math.PI/180) || 0;\
-
 
4272
 this.use_affine = use_affine || 0;\
-
 
4273
 this.affine_matrix = affine_matrix || [1,0,0,1,0,0];\
-
 
4274
 this.click_cnt = click_cnt || 0;\
-
 
4275
 this.onclick = onclick || 0;\
-
 
4276
 if(this.onclick == 1 ){reply[click_cnt] = 0;};\
-
 
4277
 this.use_snap = use_snap || 0;\
-
 
4278
 this.type = type || 1;\
-
 
4279
 if( type == 17 || type == 12 ){dragstuff.slidergroup.push(click_cnt);};\
-
 
4280
 this.xorg = x;\
-
 
4281
 this.yorg = y;\
-
 
4282
 this.use_once = true;\
-
 
4283
 this.x = [x.length];\
-
 
4284
 this.y = [x.length];\
-
 
4285
 this.w = [x.length];\
-
 
4286
 this.h = [x.length];\
-
 
4287
 for(var p=0;p<x.length;p++){\
-
 
4288
  this.x[p] = x2px(x[p]-xstart);\
-
 
4289
  this.y[p] = y2px(y[p]-ystart);\
-
 
4290
  if( p > w.length){\
-
 
4291
    this.w[p] = w[0];\
-
 
4292
    this.h[p] = h[0];\
-
 
4293
  }\
-
 
4294
  else\
-
 
4295
  {\
-
 
4296
    this.w[p] = w[p];\
-
 
4297
    this.h[p] = h[p];\
-
 
4298
  }\
-
 
4299
 };\
-
 
4300
 if( rotation_center != null ){\
-
 
4301
  this.use_rotation_center = 1;\
-
 
4302
  this.rotation_center = [x2px(rotation_center[0]),y2px(rotation_center[1])];\
-
 
4303
 }else{this.use_rotation_center = 0;this.rotation_center = [this.x[0],this.y[0]];};\
-
 
4304
 this.line_width = line_width || 30;\
-
 
4305
 this.org_line_width = line_width || 30;\
-
 
4306
 this.use_filled = use_filled || 0;\
-
 
4307
 this.use_dashed = use_dashed || 0;\
-
 
4308
 this.dashtype0 = dashtype0 || 4;\
-
 
4309
 this.dashtype1 = dashtype1 || 4;\
-
 
4310
 this.use_offset = use_offset || 0;\
-
 
4311
};\
-
 
4312
var create_Pattern = function(x0,y0,type,color){\
-
 
4313
 document.body.style.cursor = 'wait';\
-
 
4314
 var idx = Math.ceil(1000*(Math.random()));\
-
 
4315
 var canvas = create_canvas%d(idx,xsize,ysize);\
-
 
4316
 canvas.style.visibility = 'hidden';\
-
 
4317
 var ctx = canvas.getContext(\"2d\");\
-
 
4318
 var x;var y;var dx = 6;var dy = 6;\
-
 
4319
 ctx.lineWidth = 1;\
-
 
4320
 ctx.strokeStyle = color;\
-
 
4321
 ctx.fillStyle = color;\
-
 
4322
var pat;\
-
 
4323
 switch(type){\
-
 
4324
  case 2: for( x = 0 ; x < xsize ; x = x + dx ){ctx.beginPath();ctx.moveTo(x,0);ctx.lineTo(x,ysize);ctx.closePath();ctx.stroke();};for( y = 0 ; y < ysize; y = y + dy ){ctx.beginPath();ctx.moveTo(0,y);ctx.lineTo(xsize,y);ctx.closePath();ctx.stroke();}; pat = ctx.createPattern(canvas,\"no-repeat\");break;\
-
 
4325
  case 3: y = ysize;ctx.beginPath();for( x = 0 ; x < xsize ; x = x + dx ){ctx.moveTo(x,0);ctx.lineTo(xsize,y);y = y - dy;};y = 0;for( x = xsize ; x > 0 ; x = x - dx){ctx.moveTo(x,ysize);ctx.lineTo(0,y); y = y + dy;};ctx.closePath();ctx.stroke(); pat = ctx.createPattern(canvas,\"no-repeat\");break;\
-
 
4326
  case 4: y = ysize;ctx.beginPath();for( x = 0 ; x < xsize ; x = x + dx ){ctx.moveTo(x,0); ctx.lineTo(xsize,y); y = y - dy;};y = 0;for( x = xsize ; x > 0 ; x = x - dx){ctx.moveTo(x,ysize);ctx.lineTo(0,y);y = y + dy;};y = 0;for( x = 0 ; x < xsize ; x = x + dx ){ctx.moveTo(x,0); ctx.lineTo(0,y); y = y + dy;};y = 0;for( x = 0 ; x < xsize ; x = x + dx ){ctx.moveTo(xsize,y);ctx.lineTo(x,ysize);y = y + dy;};ctx.closePath(); ctx.stroke(); pat = ctx.createPattern(canvas,\"no-repeat\");break;\
-
 
4327
  case 5: for( x = 0 ; x < xsize ; x = x + dx ){for( y = 0 ; y < ysize ; y = y + dy ){ctx.beginPath();ctx.arc(x,y,1,0,2*Math.PI,false);ctx.closePath();ctx.fill();};}; pat = ctx.createPattern(canvas,\"no-repeat\");break;\
-
 
4328
  case 6: alert('wait for image '+(image_cnt+1)+'...');pat = image_patterns[image_cnt];image_cnt++;break;\
-
 
4329
  default: break;\
-
 
4330
 };\
-
 
4331
 document.body.style.cursor = 'default';\
-
 
4332
 return pat;\
-
 
4333
};\
-
 
4334
Shape.prototype.draw = function(ctx)\
-
 
4335
{\
-
 
4336
 ctx.lineWidth = this.line_width;\
-
 
4337
 ctx.strokeStyle = this.stroke_color;\
-
 
4338
 if( this.use_pattern > 0 ){ ctx.fillStyle = this.pattern; }else{ ctx.fillStyle = this.fill_color; };\
-
 
4339
 ctx.lineJoin = \"round\";\
-
 
4340
 ctx.save();\
-
 
4341
 if(this.use_rotate == 1){\
-
 
4342
   ctx.translate(this.rotation_center[0],this.rotation_center[1]);\
-
 
4343
   ctx.rotate(this.angle);\
-
 
4344
   ctx.translate(-1*(this.rotation_center[0]),-1*(this.rotation_center[1]));\
-
 
4345
 };\
-
 
4346
 if( this.use_affine == 1 ){\
-
 
4347
  ctx.setTransform(this.affine_matrix[0],this.affine_matrix[1],this.affine_matrix[2],this.affine_matrix[3],this.affine_matrix[4],this.affine_matrix[5]);\
-
 
4348
 };\
-
 
4349
 function drawCurvedArrow(x1,y1,x3,y3,x2,y2,arrowhead,type){ctx.save();var angle1 = Math.atan2(x3 - x2,y3 - y2) + Math.PI;ctx.beginPath();if(type == 2){var angle2 =Math.atan2(x3 - x1,y3 - y1) + Math.PI;ctx.moveTo(x1,y1);ctx.moveTo(x1 - (arrowhead * Math.sin(angle2 - Math.PI / 6)),y1 - (arrowhead * Math.cos(angle2 - Math.PI / 6)));ctx.lineTo(x1, y1);ctx.lineTo(x1 - (arrowhead * Math.sin(angle2 + Math.PI / 6)),y1 - (arrowhead * Math.cos(angle2 + Math.PI / 6)));};ctx.moveTo(x1,y1);ctx.quadraticCurveTo(x3,y3,x2,y2);ctx.moveTo(x2 - (arrowhead * Math.sin(angle1 - Math.PI / 6)),y2 - (arrowhead * Math.cos(angle1 - Math.PI / 6)));ctx.lineTo(x2, y2);ctx.lineTo(x2 - (arrowhead * Math.sin(angle1 + Math.PI / 6)),y2 - (arrowhead * Math.cos(angle1 + Math.PI / 6)));ctx.stroke();ctx.closePath();ctx.restore();};\
-
 
4350
 ctx.beginPath();\
-
 
4351
  switch(this.type){\
-
 
4352
  case 1: for(var p = 0 ; p < this.x.length;p = p+4){ctx.rect(this.x[p], this.y[p], this.x[p+1]-this.x[p], this.y[p+2] - this.y[p]);};break;\
-
 
4353
  case 2: ctx.arc(this.x[0],this.y[0],0.5*this.w[0],0,2*Math.PI,false);break;\
-
 
4354
  case 3: ctx.save();var w = 0.5*(scale_x_radius(this.w[0]));var h = 0.5*(scale_y_radius(this.h[0]));ctx.scale(1,h/w);ctx.beginPath();ctx.arc(this.x[0], w/h*this.y[0], w, 0, 2 * Math.PI);if(this.use_filled == 1){ ctx.fillStyle = this.fill_color; ctx.fill(); };ctx.closePath();ctx.stroke();ctx.restore();break;\
-
 
4355
  case 4: for(var p = 0; p < this.x.length - 1;p++){ctx.moveTo(this.x[p], this.y[p]);ctx.lineTo(this.x[p+1],this.y[p+1]);};break;\
-
 
4356
  case 5: ctx.moveTo(this.x[0],this.y[0]);for(var p = 1; p < this.x.length;p++){ctx.lineTo(this.x[p],this.y[p]);};ctx.lineTo(this.x[0],this.y[0]);break;\
-
 
4357
  case 6: var w = this.x[1] - this.x[0];var h = this.y[1] - this.y[0];var r = this.w[0];ctx.beginPath();ctx.moveTo(this.x[0] + r, this.y[0]);ctx.lineTo(this.x[0] + w - r, this.y[0]);ctx.quadraticCurveTo(this.x[0] + w, this.y[0], this.x[0] + w, this.y[0] + r);ctx.lineTo(this.x[0] + w, this.y[0] + h - r);ctx.quadraticCurveTo(this.x[0] + w, this.y[0] + h, this.x[0] + w - r, this.y[0] + h);ctx.lineTo(this.x[0] + r, this.y[0] + h);ctx.quadraticCurveTo(this.x[0], this.y[0] + h, this.x[0], this.y[0] + h - r);ctx.lineTo(this.x[0], this.y[0] + r);ctx.quadraticCurveTo(this.x[0], this.y[0], this.x[0] + r, this.y[0]);ctx.closePath();break;\
-
 
4358
  case 7: ctx.moveTo(this.x[0]-this.w[0],this.y[0]-this.h[0]);ctx.lineTo(this.x[0]+this.w[0],this.y[0]+this.h[0]);ctx.moveTo(this.x[0]-this.w[0],this.y[0]+this.h[0]);ctx.lineTo(this.x[0]+this.w[0],this.y[0]-this.h[0]);break;\
-
 
4359
  case 8: var dx;var dy;var len;var arrow_head = this.w[0];for(var p = 0; p < this.x.length - 1;p++){ctx.save();if(this.use_dashed == 1 ){if( ctx.setLineDash ){ ctx.setLineDash([this.dashtype0,this.dashtype1]);}else{ ctx.mozDash = [this.dashtype0,this.dashtype1];};};dx = this.x[p+1] - this.x[p];dy = this.y[p+1] - this.y[p];len = Math.sqrt(dx*dx+dy*dy);ctx.translate(this.x[p+1],this.y[p+1]);ctx.rotate(Math.atan2(dy,dx));ctx.lineCap = \"round\";ctx.beginPath();ctx.moveTo(0,0);ctx.lineTo(-len,0);ctx.closePath();ctx.stroke();ctx.beginPath();ctx.moveTo(0,0);ctx.lineTo(-1*arrow_head,-0.5*arrow_head);ctx.lineTo(-1*arrow_head, 0.5*arrow_head);ctx.closePath();ctx.fill();ctx.restore();};break;\
-
 
4360
  case 9: ctx.moveTo(this.x[0], this.y[0]);for(var p = 1; p < this.x.length - 1;p++){if( Math.abs(this.y[p] - this.y[p-1]) < ysize && Math.abs(this.y[p+1] - this.y[p]) < ysize ){ctx.lineTo(this.x[p],this.y[p]);}else{ctx.moveTo(this.x[p],this.y[p]);};};break;\
-
 
4361
  case 10: var dx;var dy;var len;ctx.save();if(this.use_dashed == 1 ){if( ctx.setLineDash ){ ctx.setLineDash([this.dashtype0,this.dashtype1]);}else{ ctx.mozDash = [this.dashtype0,this.dashtype1];};};dx = this.x[1] - this.x[0];dy = this.y[1] - this.y[0];len = Math.sqrt(dx*dx+dy*dy);ctx.translate(this.x[1],this.y[1]);ctx.rotate(Math.atan2(dy,dx));ctx.beginPath();ctx.moveTo(0,0);ctx.lineTo(-len,0);ctx.closePath();ctx.stroke();ctx.beginPath();ctx.moveTo(0,0);ctx.lineTo(-1*this.w[0],0.5*this.w[0]);ctx.lineTo(-1*this.w[0],-0.5*this.w[0]);ctx.closePath();ctx.lineCap = \"round\";ctx.fill();ctx.restore();ctx.save();ctx.translate(this.x[0],this.y[0]);ctx.rotate(Math.atan2(dy,dx));ctx.beginPath();ctx.moveTo(0,0);ctx.lineTo(this.w[0],0.4*this.w[0]);ctx.lineTo(this.w[0],-0.4*this.w[0]);ctx.closePath();ctx.lineCap = \"round\";ctx.fill(); break;\
-
 
4362
  case 11: var x1 = this.x[0];var y1 = this.y[0];var x2 = this.x[1];var y2 = this.y[1];var dx = this.x[2];var dy = this.y[2];var n  = this.w[0];for(var p = 0 ; p < n ; p++ ){ctx.beginPath();ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.stroke();x1 = x1 + dx;y1 = y1 + dy;x2 = x2 + dx;y2 = y2 + dy;ctx.closePath();};break;\
-
 
4363
  case 12: ctx.save();var start;var end;if(this.h[0] < this.h[1]){start = this.h[0];end = this.h[1]}else{start = this.h[1];end = this.h[0];};start=(360-start)*Math.PI/180;end=(360-end)*Math.PI/180;var w = 0.5*(scale_x_radius(this.w[0]));var wh = 0.5*(scale_y_radius(this.w[1]));ctx.scale(1,wh/w);ctx.arc(this.x[0], w/(wh)*this.y[0], w,start,end,true);ctx.stroke();if(this.use_filled == 1){ ctx.fillStyle = this.fill_color; ctx.lineTo(this.x[0],this.y[0]);ctx.fill(); };ctx.restore();break;\
-
 
4364
  case 13: for(var p = 0; p < this.x.length; p++){ ctx.arc(this.x[p],this.y[p],scale_x_radius(this.w[p]),0,2*Math.PI,false);};break;\
-
 
4365
  case 14: if( this.font_family == null ){ ctx.font = this.font_size+\"px Ariel\";}else{ctx.font = this.font_family ;};if( this.use_once == true ){this.marge = 2*this.line_width;this.textwidth = ctx.measureText(this.text).width;this.textheight = ctx.measureText('MI').width;};if( this.use_offset > 0 && this.use_once == true ){this.use_once = false;if(this.use_offset == 1){this.y[0] = this.y[0] - this.marge;}else{if(this.use_offset == 2){this.x[0] = this.x[0] + this.marge;}else{if(this.use_offset == 3){this.y[0] = this.y[0] - this.marge;this.x[0] = this.x[0] + this.marge;}else{if(this.use_offset == 4){this.y[0] = parseInt(this.y[0] + 0.25*(this.textheight));this.x[0] = parseInt(this.x[0] - 0.5*(this.textwidth));};};};};};ctx.fillText(this.text,this.x[0],this.y[0]);break;\
-
 
4366
  case 15: break;\
-
 
4367
  case 16: for(var p = 0; p < this.x.length;p++){ctx.fillRect( this.x[p], this.y[p],this.line_width,this.line_width );};break;\
-
 
4368
  case 17: ctx.save();var start;var end;if(this.h[0] < this.h[1]){start = this.h[0];end = this.h[1]}else{start = this.h[1];end = this.h[0];};start=2*Math.PI-start;end=2*Math.PI-end;var r = scale_x_radius(this.w[0]);ctx.arc(this.x[0], this.y[0], r,start,end,true);if(this.use_filled){ctx.lineTo(this.x[0],this.y[0]);ctx.fill();};ctx.restore();break;\
-
 
4369
  case 18: for(var p=0 ; p < this.x.length ;p=p+2){ctx.moveTo(this.x[p], this.y[p]);ctx.lineTo(this.x[p+1],this.y[p+1]);};break;\
-
 
4370
  case 19: ctx.arc(this.x[0],this.y[0],this.line_width,0,2*Math.PI,false);var E1 = y2px(px2y(this.y[0]) - this.h[0]);var E2 = y2px(px2y(this.y[0]) + this.w[0]);ctx.moveTo(this.x[0],E1);ctx.lineTo(this.x[0],E2);ctx.moveTo(this.x[0] - 2*(this.line_width),E1);ctx.lineTo(this.x[0] + 2*(this.line_width),E1);ctx.moveTo(this.x[0] - 2*(this.line_width),E2);ctx.lineTo(this.x[0] + 2*(this.line_width),E2);break;\
-
 
4371
  case 20: ctx.arc(this.x[0],this.y[0],this.line_width,0,2*Math.PI,false);var E1 = x2px(px2x(this.x[0]) - this.w[0]);var E2 = x2px(px2x(this.x[0]) + this.h[0]);ctx.moveTo(E1,this.y[0]);ctx.lineTo(E2,this.y[0]);ctx.moveTo(E1,this.y[0]-2*(this.line_width));ctx.lineTo(E1,this.y[0]+2*(this.line_width));ctx.moveTo(E2,this.y[0]-2*(this.line_width));ctx.lineTo(E2,this.y[0]+2*(this.line_width));break;\
-
 
4372
  case 21: drawCurvedArrow(this.x[0],this.y[0],this.x[1],this.y[1],this.x[2],this.y[2],this.h[0],this.h[1]);break;\
-
 
4373
  default: alert(\"draw primitive unknown\");break;\
-
 
4374
 };\
-
 
4375
 if(this.use_filled == 1){ ctx.fill();}\
-
 
4376
 if(this.use_dashed == 1 ){if( ctx.setLineDash ){ ctx.setLineDash([this.dashtype0,this.dashtype1]);}else{ ctx.mozDash = [this.dashtype0,this.dashtype1];};};\
-
 
4377
 ctx.stroke();\
-
 
4378
 ctx.restore();\
-
 
4379
};\
-
 
4380
Shape.prototype.contains = function(mx, my){\
-
 
4381
 if( this.angle != 0 ){ var m_rot = rotate_mouse(mx,my,this);mx = m_rot.x;my = m_rot.y;};\
-
 
4382
 if( this.use_affine != 0 ){ var m_trans = transform_mouse(mx,my,this);mx = m_trans.x;my = m_trans.y;};\
-
 
4383
 var marge = 2*this.line_width;\
-
 
4384
 switch(this.type){\
-
 
4385
  case 1: for(var p = 0 ; p < this.x.length; p++ ){if( mx < this.x[p] + marge &&  mx > this.x[p] - marge ){if( my < this.y[p]+marge && my > this.y[p] - marge ){return p;};};};break;\
-
 
4386
  case 2: for(var p = 0 ; p < this.x.length; p++ ){if( Math.abs(distance(this.x[p],this.y[p],mx,my) ) < this.w[p] + 4*marge ){return p;break;};};break;\
-
 
4387
  case 3: for(var p = 0 ; p < this.x.length; p++ ){if( Math.abs(distance(this.x[p],this.y[p],mx,my) ) < scale_x_radius(this.w[p]) + marge ){return p;break;};};break;\
-
 
4388
  case 4: var diff;var q;var r;for(var p = 0 ; p < this.x.length-1; p = p+2  ){if( ((this.x[p+1] - this.x[p]) != 0)  && ((this.y[p+1]-this.y[p]) != 0) ){r = (this.y[p+1]-this.y[p])/(this.x[p+1]-this.x[p]);q = this.y[p] - (r)*(this.x[p]);diff = distance_to_line(r,q,mx,my);}else{if( (this.y[p+1]-this.y[p]) != 0 ){diff = Math.abs(this.x[p] - mx);}else{diff = Math.abs(this.y[p] - my);};};if( diff  < marge ){ return p;};}; break;\
-
 
4389
  case 5: marge = 2*marge;for(var p = 0 ; p < this.x.length; p++ ){if( mx < this.x[p] + marge &&  mx > this.x[p] - marge ){if( my < this.y[p]+marge && my > this.y[p] - marge ){return p;};};};break;\
-
 
4390
  case 6: marge = 0.5*this.w[0];for(var p = 0 ; p < this.x.length; p++ ){if( mx < this.x[p] + marge &&  mx > this.x[p] - marge ){if( my < this.y[p]+marge && my > this.y[p] - marge ){return p;};};};break;\
-
 
4391
  case 7: for(var p = 0 ; p < this.x.length; p++ ){if( (this.x[p] - this.w[p] <= mx) && (this.x[p] + this.w[p] >= mx) &&  (this.y[p] - this.h[p] <= my) && (this.y[p] + this.h[p] >= my) ){return p;};};break;\
-
 
4392
  case 8: var diff;var q;var r;for(var p = 0 ; p < this.x.length-1; p = p+2  ){if( ((this.x[p+1] - this.x[p]) != 0)  && ((this.y[p+1]-this.y[p]) != 0) ){r = (this.y[p+1]-this.y[p])/(this.x[p+1]-this.x[p]);q = this.y[p] - (r)*(this.x[p]);diff = distance_to_line(r,q,mx,my);}else{if( (this.y[p+1]-this.y[p]) != 0 ){diff = Math.abs(this.x[p] - mx);}else{diff = Math.abs(this.y[p] - my);};};if( diff  < marge ){ return p;};}; break;\
-
 
4393
  case 9: for(var p = 0 ; p < this.x.length; p++ ){if( (this.x[p] - this.line_width <= mx) && (this.x[p] + this.w[p] + this.line_width >= mx) &&  (this.y[p] - this.line_width <= my) && (this.y[p] + this.h[p] +this.line_width  >= my) ){return p;};};break;\
-
 
4394
  case 10: var diff;var q;var r;for(var p = 0 ; p < this.x.length-1; p = p+2  ){if( ((this.x[p+1] - this.x[p]) != 0)  && ((this.y[p+1]-this.y[p]) != 0) ){r = (this.y[p+1]-this.y[p])/(this.x[p+1]-this.x[p]);q = this.y[p] - (r)*(this.x[p]);diff = distance_to_line(r,q,mx,my);}else{if( (this.y[p+1]-this.y[p]) != 0 ){diff = Math.abs(this.x[p] - mx);}else{diff = Math.abs(this.y[p] - my);};};if( diff  < marge ){ return p;};}; break;\
-
 
4395
  case 11: break;\
-
 
4396
  case 12: break;\
-
 
4397
  case 13: for(var p = 0 ; p < this.x.length; p++ ){if( Math.abs(distance(this.x[p],this.y[p],mx,my) ) < scale_x_radius(this.w[p]) + marge ){return p;break;};};break;\
-
 
4398
  case 14: for(var p = 0 ; p < this.x.length; p++ ){if( my < this.y[p] &&  my > this.y[p] - this.textheight ){if( mx < this.x[p] + this.textwidth && mx > this.x[p] ){ return p;break;};};};break;\
-
 
4399
  case 15: break;\
-
 
4400
  case 16: break;\
-
 
4401
  case 17: break;\
-
 
4402
  case 18: var diff;var q;var r;if(((this.x[1] - this.x[0]) != 0) && ((this.y[1]-this.y[0]) != 0)){r = (this.y[1]-this.y[0])/(this.x[1]-this.x[0]);q = this.y[0] - (r)*(this.x[0]);diff = distance_to_line(r,q,mx,my);}else{if((this.y[1]-this.y[0])!= 0){diff = Math.abs(this.x[0] - mx);}else{diff = Math.abs(this.y[0] - my);};};if( diff  < marge ){ return 0;};break;\
-
 
4403
  case 19: marge = 2*marge;for(var p = 0 ; p < this.x.length; p++ ){if( mx < this.x[p] + marge &&  mx > this.x[p] - marge ){if( my < this.y[p]+marge && my > this.y[p] - marge ){return p;};};};break;\
-
 
4404
  case 21: marge = 2*marge;for(var p = 0 ; p < this.x.length; p++ ){if( mx < this.x[p] + marge &&  mx > this.x[p] - marge ){if( my < this.y[p]+marge && my > this.y[p] - marge ){return p;};};};break;\
-
 
4405
  default: for(var p = 0 ; p < this.x.length; p++ ){if( (this.x[p] - this.line_width <= mx) && (this.x[p] + this.w[p] + this.line_width >= mx) &&  (this.y[p] - this.line_width <= my) && (this.y[p] + this.h[p] +this.line_width  >= my) ){return p;};};break;\
-
 
4406
 };\
-
 
4407
 return -1;\
-
 
4408
};\
-
 
4409
var reply = [];\
-
 
4410
var slidergroup = [];\
-
 
4411
function CanvasState(canvas, container_div){\
-
 
4412
 this.canvas = canvas;\
-
 
4413
 this.width = canvas.width;\
-
 
4414
 this.height = canvas.height;\
-
 
4415
 var ctx = canvas.getContext(\"2d\");\
-
 
4416
 this.ctx = ctx;\
-
 
4417
 this.valid = false;\
-
 
4418
 this.shapes = [];\
-
 
4419
 this.moved = [];\
-
 
4420
 this.dragging = false;\
-
 
4421
 this.selection = null;\
-
 
4422
 this.slidergroup = [];\
-
 
4423
 var myState = this;\
-
 
4424
 container_div.addEventListener( 'mouseup'    , mouseup,  false);\
-
 
4425
 container_div.addEventListener( 'mousemove'  , mousemove,false);\
-
 
4426
 container_div.addEventListener( 'mousedown'  , mousedown,false);\
-
 
4427
 container_div.addEventListener( 'touchstart' , function(e) { e.preventDefault(); mousedown(e.changedTouches[0]);},false);\
-
 
4428
 container_div.addEventListener( 'touchmove'  , function(e) { e.preventDefault(); mousemove(e.changedTouches[0]);},false);\
-
 
4429
 container_div.addEventListener( 'touchend'   , function(e) { e.preventDefault(); mouseup(  e.changedTouches[0]);},false);\
-
 
4430
 function mousedown(e){\
-
 
4431
  var mouse = myState.getMouse(e,canvas);\
-
 
4432
  var mx = mouse.x;\
-
 
4433
  var my = mouse.y;\
-
 
4434
  if( use_pan_and_zoom == 1 && my > ysize - 15){\
-
 
4435
   check_zoom_or_pan(mx);\
-
 
4436
  }\
-
 
4437
  else\
-
 
4438
  {\
-
 
4439
   if( wims_status == \"done\"){return null;};\
-
 
4440
   var shapes = myState.shapes;\
-
 
4441
   var l = shapes.length;\
-
 
4442
   var chk = -1;\
-
 
4443
   for(var i=0;i<l;i++){\
-
 
4444
    chk = shapes[i].contains(mx, my);\
-
 
4445
    if ( chk != -1 ){\
-
 
4446
     if( myState.shapes[i].use_slider != -1 ){ myState.slidergroup.push(i);};\
-
 
4447
     if( myState.moved[shapes[i].click_cnt] != 1){\
-
 
4448
      myState.moved[shapes[i].click_cnt] = 1;\
-
 
4449
      myState.x_start = shapes[i].x[chk];\
-
 
4450
      myState.y_start = shapes[i].y[chk];\
-
 
4451
     };\
-
 
4452
     myState.chk = chk;\
-
 
4453
     myState.selection = shapes[i];\
-
 
4454
     myState.valid = false;\
-
 
4455
     switch(shapes[i].onclick){\
-
 
4456
      case 0: myState.dragging = false;break;\
-
 
4457
      case 1: if( reply[myState.selection.click_cnt] == 0 ){myState.selection.line_width = 3*(myState.selection.org_line_width);myState.selection.font_family = parseInt(myState.selection.font_size+10)+\"px Courier\";reply[myState.selection.click_cnt] = 1;}else{ reply[myState.selection.click_cnt] = 0;myState.selection.font_family = myState.selection.org_font_family;myState.selection.line_width = myState.selection.org_line_width;};myState.dragging = false;myState.draw();break;\
-
 
4458
      case 2: myState.dragging = true;break;\
-
 
4459
      default:break;\
-
 
4460
     };\
-
 
4461
     return;\
-
 
4462
    };\
-
 
4463
   };\
-
 
4464
  };\
-
 
4465
  myState.selection = null;\
-
 
4466
  myState.valid = true;\
-
 
4467
  return;\
-
 
4468
 };\
-
 
4469
 function mouseup(e){;\
-
 
4470
  if(myState.selection != null ){\
-
 
4471
   if(myState.selection.onclick == 2 ){\
-
 
4472
    var dx,dy;\
-
 
4473
    var mouse = myState.getMouse(e,canvas);\
-
 
4474
    var xy = multisnap_check(mouse.x,mouse.y,myState.selection.use_snap);\
-
 
4475
    switch(myState.selection.drag_type){\
-
 
4476
     case 0: dx = xy[0] - myState.selection.x[myState.chk];dy = xy[1] - myState.selection.y[myState.chk];break;\
-
 
4477
     case 1: dx = xy[0] - myState.selection.x[myState.chk];dy = 0;break;\
-
 
4478
     case 2: dx = 0;dy = xy[1] - myState.selection.y[myState.chk];break;\
-
 
4479
     default:break;\
-
 
4480
    };\
-
 
4481
    myState.selection = move(myState.selection,dx,dy);\
-
 
4482
    reply[myState.selection.click_cnt] = myState.selection;\
-
 
4483
    myState.valid = false;\
-
 
4484
    myState.draw();\
-
 
4485
    myState.valid = true;\
-
 
4486
   };\
-
 
4487
  };\
-
 
4488
  myState.dragging = false;\
-
 
4489
 };\
-
 
4490
 function mousemove(e){\
-
 
4491
  if(myState.dragging && (e.button == 0 || typeof(e.identifier) != 'undefined') ){\
-
 
4492
   var dx,dy;\
-
 
4493
   var mouse = myState.getMouse(e,canvas);\
-
 
4494
   var xy = multisnap_check(mouse.x,mouse.y,myState.selection.use_snap);\
-
 
4495
   switch(myState.selection.drag_type){\
-
 
4496
    case 0: dx = xy[0] - myState.selection.x[myState.chk];dy = xy[1] - myState.selection.y[myState.chk];break;\
-
 
4497
    case 1: dx = xy[0] - myState.selection.x[myState.chk];dy = 0;break;\
-
 
4498
    case 2: dx = 0;dy = xy[1] - myState.selection.y[myState.chk];break;\
-
 
4499
    default:break;\
-
 
4500
   };\
-
 
4501
   myState.selection = move(myState.selection,dx,dy);\
-
 
4502
  };\
-
 
4503
  myState.valid = false;\
-
 
4504
 };\
-
 
4505
 function check_zoom_or_pan(x){\
-
 
4506
  var key = -1;\
-
 
4507
  for(var p = 15 ; p < 106 ; p = p+15){\
-
 
4508
    key++;\
-
 
4509
    if(x > xsize - p){start_canvas%d(key);return;}\
-
 
4510
  }\
-
 
4511
  return;\
-
 
4512
 };\
-
 
4513
 this.interval = 30;\
-
 
4514
 setInterval(function() { myState.draw(); }, myState.interval);\
-
 
4515
};\
-
 
4516
CanvasState.prototype.addShape = function(shape){\
-
 
4517
 this.shapes.push(shape);\
-
 
4518
 this.valid = false;\
-
 
4519
};\
-
 
4520
CanvasState.prototype.clear = function(){\
-
 
4521
 this.ctx.clearRect(0, 0, this.width, this.height);\
-
 
4522
};\
-
 
4523
CanvasState.prototype.draw = function(){\
-
 
4524
 if(this.valid == false ){\
-
 
4525
  var shapes = this.shapes;\
-
 
4526
  this.clear();\
-
 
4527
  var l = shapes.length;var shape;\
-
 
4528
  for(var i = 0; i < l; i++){\
-
 
4529
   shape = shapes[i];\
-
 
4530
   shape.draw(this.ctx);\
-
 
4531
  };\
-
 
4532
  this.valid = true;\
-
 
4533
 };\
-
 
4534
};\
-
 
4535
CanvasState.prototype.read_dragdrop = function(){\
-
 
4536
 if( wims_status == \"done\" || use_dragdrop_reply == -1 ){return null;};\
-
 
4537
 function set_precision(val){val = (Math.round(dragdrop_precision*val))/dragdrop_precision;if( Number.isNaN(val) ){return 'null';}else{return val;};};\
-
 
4538
 var x,y,a;\
-
 
4539
 var len = reply.length;\
-
 
4540
 var total = new Array(len);\
-
 
4541
 for(var p = 0 ; p < len ; p++){\
-
 
4542
  var obj = reply[p];\
-
 
4543
  if( typeof(obj) === 'object' ){\
-
 
4544
   x = obj.x || null;\
-
 
4545
   if(x != null){\
-
 
4546
    x = set_precision(px2x(obj.x[0]));\
-
 
4547
    y = set_precision(px2y(obj.y[0]));\
-
 
4548
    a = set_precision(obj.angle*180/Math.PI);\
-
 
4549
    total[p] = obj.xorg[0]+':'+obj.yorg[0]+':'+x+':'+y+':'+a;\
-
 
4550
   }\
-
 
4551
  }else{\
-
 
4552
   if( obj == null ){total[p] = 'not_moved';}else{ total[p] = obj;};\
-
 
4553
  };\
-
 
4554
 };\
-
 
4555
 return total;\
-
 
4556
};\
-
 
4557
CanvasState.prototype.Zoom = function(xmin,xmax,ymin,ymax){\
-
 
4558
 (this.ctx).clearRect(0,0,this.width,this.height);\
-
 
4559
 var len = this.shapes.length;var shape;\
-
 
4560
 for(var i = 0; i < len ; i++){\
-
 
4561
  shape = this.shapes[i];\
-
 
4562
  for(var p = 0 ; p < shape.x.length;p++){\
-
 
4563
   shape.x[p] = x2px(shape.xorg[p]);\
-
 
4564
   shape.y[p] = y2px(shape.yorg[p]);\
-
 
4565
  }\
-
 
4566
  this.valid = false;\
-
 
4567
  shape.draw(this.ctx);\
-
 
4568
 };\
-
 
4569
};\
-
 
4570
CanvasState.prototype.getMouse = function(e,element){\
-
 
4571
 var mx,my;var offsetX = 0,offsetY = 0;\
-
 
4572
  while( ( element = element.offsetParent) ){\
-
 
4573
   offsetX += element.offsetLeft;\
-
 
4574
   offsetY += element.offsetTop;\
-
 
4575
  };\
-
 
4576
 if(isTouch){\
-
 
4577
  mx = e.pageX - offsetX;\
-
 
4578
  my = e.pageY - offsetY;\
-
 
4579
 }\
-
 
4580
 else\
-
 
4581
 {\
-
 
4582
  mx = e.clientX - offsetX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);\
-
 
4583
  my = e.clientY - offsetY + (document.documentElement.scrollTop ? document.documentElement.scrollTop :document.body.scrollTop);\
-
 
4584
 };\
-
 
4585
 return {x: mx, y: my};\
-
 
4586
};\
-
 
4587
var obj = create_canvas%d(%d,xsize,ysize);\
-
 
4588
var container_div = document.getElementById(\"canvas_div%d\");\
-
 
4589
var dragstuff = new CanvasState(obj,container_div);\
-
 
4590
read_dragdrop%d = dragstuff.read_dragdrop;\n",canvas_root_id,canvas_root_id,canvas_root_id,DRAG_CANVAS,canvas_root_id,canvas_root_id);
-
 
4591
}
-
 
4592
 
-
 
4593
 
-
 
4594
/*
-
 
4595
#define BG_CANVAS 0 may be used for floodfill
-
 
4596
#define STATIC_CANVAS 1 may be used for floodfill
-
 
4597
#define MOUSE_CANVAS 2 xx
-
 
4598
#define GRID_CANVAS 3 may be used for floodfill
-
 
4599
#define DRAG_CANVAS 4 default for floodfill
-
 
4600
#define DRAW_CANVAS 5 may be used for floodfill
-
 
4601
 
-
 
4602
*/
-
 
4603
void add_js_clickfill(FILE *js_include_file,int canvas_root_id,char *clickcolor,int opacity,int use_snap){
-
 
4604
fprintf(js_include_file,"\n/* begin command clickfill */\n\
-
 
4605
function user_drag(evt){return;};\
-
 
4606
if( typeof(fill_canvas_no) != 'object' ){ var fill_canvas_no = []; };\
-
 
4607
fill_canvas_no.push(%d);\
-
 
4608
var use_snap = %d;\
-
 
4609
function user_draw(evt){\
-
 
4610
 var mouse = dragstuff.getMouse(evt,canvas_userdraw);\
-
 
4611
 var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
-
 
4612
 var x = xy[0];\
-
 
4613
 var y = xy[1];\
-
 
4614
 var len = fill_canvas_no.length;\
-
 
4615
 var last = fill_canvas_no[len - 1];\
-
 
4616
 var color = [ %s,%d ];\
-
 
4617
 if( typeof(multifillcolors) === 'object'){\
-
 
4618
  var numx = userdraw_x.length;var numc = multifillcolors.length-1;var num = numx%%numc;\
-
 
4619
  var tc = (multifillcolors[num]).split(',');\
-
 
4620
  color = [ tc[0],tc[1],tc[2],%d ];\
-
 
4621
  if( typeof( palettecolors ) === 'object'){\
-
 
4622
   var idx = palettecolors.indexOf( multifillcolors[num]);\
-
 
4623
   userdraw_radius.push(idx);\
-
 
4624
  }else{ userdraw_radius.push(num);};\
-
 
4625
 }\
-
 
4626
 else\
-
 
4627
 {\
-
 
4628
  userdraw_radius.push(0);\
-
 
4629
 };\
-
 
4630
 document.body.style.cursor = 'wait';\
-
 
4631
 var special_ctx;\
-
 
4632
 var use_special = false;\
-
 
4633
 if( typeof(grid_fill_pattern) != 'undefined' ){\
-
 
4634
  special_ctx = grid_fill_pattern;\
-
 
4635
  use_special = true;\
-
 
4636
 };\
-
 
4637
 if( typeof(diamond_fill_pattern) != 'undefined' ){\
-
 
4638
  special_ctx = diamond_fill_pattern;\
-
 
4639
  use_special = true;\
-
 
4640
 };\
-
 
4641
 if( typeof(hatch_fill_pattern) != 'undefined' ){\
-
 
4642
  special_ctx = hatch_fill_pattern;\
-
 
4643
  use_special = true;\
-
 
4644
 };\
-
 
4645
 if( typeof(dot_fill_pattern) != 'undefined' ){\
-
 
4646
  special_ctx = dot_fill_pattern;\
-
 
4647
  use_special = true;\
-
 
4648
 };\
-
 
4649
 if( typeof(text_fill_pattern) != 'undefined' ){\
-
 
4650
  special_ctx = text_fill_pattern;\
-
 
4651
  use_special = true;\
-
 
4652
 };\
-
 
4653
 if( use_special ){\
-
 
4654
  setTimeout(function(){ filltoborder( px2x(mouse.x),px2y(mouse.y),color,color,last,true,special_ctx);},500);\
-
 
4655
 }\
-
 
4656
 else\
-
 
4657
 {\
-
 
4658
  setTimeout(function(){ filltoborder( px2x(mouse.x),px2y(mouse.y),color,color,last,false,null);},500);\
-
 
4659
 };\
-
 
4660
 fill_canvas_no.push(last+1);\
-
 
4661
 userdraw_x.push(x);\
-
 
4662
 userdraw_y.push(y);\
-
 
4663
 document.body.style.cursor = 'default';\
-
 
4664
 return;\
-
 
4665
};",CLICKFILL_CANVAS,use_snap,clickcolor,opacity,opacity);
-
 
4666
}
-
 
4667
 
1039
 
4668
/* 10/2016 does not react to border color !! just any border will stop the filling */
1040
/* 10/2016 does not react to border color !! just any border will stop the filling */
4669
void add_js_filltoborder(FILE *js_include_file,int canvas_root_id,int canvas_type){
1041
void add_js_filltoborder(int canvas_type){
4670
fprintf(js_include_file,"\n/* begin command filltoborder */\n\
1042
fprintf(js_include_file,"\n/* command filltoborder */\
4671
var filltoborder = function(xs,ys,bordercolor,color,fill_canvas_no,use_special_filling,fill_ctx){\
1043
function filltoborder(xs,ys,bordercolors,colors,fill_canvas_no,use_special_filling,fill_ctx){\
4672
 document.body.style.cursor = 'wait';\
1044
 document.body.style.cursor = 'wait';\
4673
 var canvas = document.getElementById(\"wims_canvas%d%d\");\
1045
 var canvas = document.getElementById(\"wims_canvas%d%d\");\
4674
 if( ! canvas ){ return; };\
1046
 if( ! canvas ){ return; };\
4675
 document.body.style.cursor = 'wait';\
1047
 document.body.style.cursor = 'wait';\
4676
 var ctx = canvas.getContext(\"2d\");\
1048
 var ctx = canvas.getContext(\"2d\");\
4677
 ctx.save();\
1049
 ctx.save();\
4678
 xs = x2px(xs);\
1050
 xs = x2px(xs);\
4679
 ys = y2px(ys);\
1051
 ys = y2px(ys);\
4680
 if( xs < 0 || xs > xsize || ys < 0 || ys > ysize ){ document.body.style.cursor = 'default';return; };\
1052
 if( xs <= 0 || xs >= xsize || ys <= 0 || ys >= ysize ){ document.body.style.cursor = 'default';return; };\
4681
 var image = ctx.getImageData(0, 0, xsize, ysize);\
1053
 var image = ctx.getImageData(0, 0, xsize, ysize);\
4682
 var imageData = image.data;\
1054
 var imageData = image.data;\
4683
 var pixelStack = [[xs, ys]];\
1055
 var pixelStack = [[xs, ys]];\
4684
 var px1;\
1056
 var px1;\
4685
 var newPos;\
1057
 var newPos;\
4686
 var pixelPos;\
1058
 var pixelPos;\
4687
 var found_left_border;\
1059
 var found_left_border;\
4688
 var found_right_border;\
1060
 var found_right_border;\
-
 
1061
 var fill_image;\
-
 
1062
 var fill_data;\
-
 
1063
 var _setPixel;\
-
 
1064
 function finish_filling(){\
-
 
1065
  if(document.getElementById(\"wims_canvas%d\"+fill_canvas_no)){\
-
 
1066
  console.log('dit canvas nummer '+fill_canvas_no+' bestaat al');\
-
 
1067
  }else{\
-
 
1068
   var fill_canvas = create_canvas%d(fill_canvas_no,xsize,ysize);\
-
 
1069
   var fill_canvas_ctx = fill_canvas.getContext(\"2d\");\
-
 
1070
   fill_canvas_ctx.clearRect(0,0,xsize,ysize);\
-
 
1071
   fill_canvas_ctx.putImageData(image, 0, 0);\
-
 
1072
  };\
-
 
1073
  document.body.style.cursor = 'default';\
-
 
1074
  return;\
-
 
1075
 };\
4689
 function _getPixel(pixelPos){\
1076
 function _getPixel(pixelPos){\
4690
  return {r:imageData[pixelPos], g:imageData[pixelPos+1], b:imageData[pixelPos+2], a:imageData[pixelPos+3]};\
1077
  return {r:imageData[pixelPos], g:imageData[pixelPos+1], b:imageData[pixelPos+2], a:imageData[pixelPos+3]};\
4691
 };\
1078
 };\
4692
 var _setPixel;\
-
 
4693
 if( use_special_filling ){\
1079
 if( use_special_filling ){\
4694
  var fill_image = fill_ctx.getImageData(0, 0, xsize, ysize);\
1080
  fill_image = fill_ctx.getImageData(0, 0, xsize, ysize);\
4695
  var fill_data = fill_image.data;\
1081
  fill_data = fill_image.data;\
4696
  _setPixel = function(pixelPos){\
1082
  _setPixel = function(pixelPos){\
4697
   var n;var o;\
1083
   var n;var o;\
4698
   for(var p = 0;p < 3; p++){\
1084
   for(var p = 0;p < 3; p++){\
4699
    n = fill_data[pixelPos+p];\
1085
    n = fill_data[pixelPos+p];\
4700
    o = imageData[pixelPos+p];\
1086
    o = imageData[pixelPos+p];\
Line 4715... Line 1101...
4715
 function _comparePixel(px2){\
1101
 function _comparePixel(px2){\
4716
  if(px2.r === px1.r && px2.g === px1.g && px2.b === px1.b ){ return true;};\
1102
  if(px2.r === px1.r && px2.g === px1.g && px2.b === px1.b ){ return true;};\
4717
  return false;\
1103
  return false;\
4718
 };\
1104
 };\
4719
 px1 = _getPixel(((ys * xsize) + xs) * 4);\
1105
 px1 = _getPixel(((ys * xsize) + xs) * 4);\
4720
 color = {\
1106
 var color = {\
4721
  r: parseInt(color[0], 10),\
1107
  r: parseInt(colors[0], 10),\
4722
  g: parseInt(color[1], 10),\
1108
  g: parseInt(colors[1], 10),\
4723
  b: parseInt(color[2], 10),\
1109
  b: parseInt(colors[2], 10),\
4724
  a: parseInt(color[3] || 255, 10)\
1110
  a: parseInt(colors[3] || 255, 10)\
4725
 };\
1111
 };\
4726
 bordercolor = {\
1112
 var bordercolor = {\
4727
  r: parseInt(bordercolor[0], 10),\
1113
  r: parseInt(bordercolors[0], 10),\
4728
  g: parseInt(bordercolor[1], 10),\
1114
  g: parseInt(bordercolors[1], 10),\
4729
  b: parseInt(bordercolor[2], 10),\
1115
  b: parseInt(bordercolors[2], 10),\
4730
  a: parseInt(bordercolor[3] || 255, 10)\
1116
  a: parseInt(bordercolors[3] || 255, 10)\
4731
 };\
1117
 };\
4732
 if( _comparePixel(color) ) { return true; }\
1118
 if( _comparePixel(color) ) { return true; };\
-
 
1119
var cnt=0;\
-
 
1120
var max=(xsize)*(ysize);\
-
 
1121
function fill_me_up(){\
4733
 while (pixelStack.length) {\
1122
 while (pixelStack.length) {\
4734
  newPos = pixelStack.pop();\
1123
  newPos = pixelStack.pop();\
4735
  xs = newPos[0];ys = newPos[1];\
1124
  xs = newPos[0];ys = newPos[1];\
4736
  pixelPos = (ys*xsize + xs) * 4;\
1125
  pixelPos = (ys*xsize + xs) * 4;\
4737
  while(ys >= 0 && _comparePixel(_getPixel(pixelPos))){\
1126
  while(ys >= 0 && _comparePixel(_getPixel(pixelPos))){\
4738
   ys -= 1;\
1127
   ys -= 1;\
4739
   pixelPos -= xsize * 4;\
1128
   pixelPos -= xsize * 4;\
4740
  }\
1129
  };\
4741
  pixelPos += xsize * 4;\
1130
  pixelPos += xsize * 4;\
4742
  ys += 1;\
1131
  ys += 1;\
4743
  found_left_border = false;\
1132
  found_left_border = false;\
4744
  found_right_border = false;\
1133
  found_right_border = false;\
4745
  while( ys <= ysize-1 && _comparePixel(_getPixel(pixelPos))  ){\
1134
  while( ys <= ysize-1 && _comparePixel(_getPixel(pixelPos)) ){\
-
 
1135
   cnt++;if(cnt>max){console.log('kap er mee');finish_filling();};\
4746
   ys += 1;\
1136
   ys += 1;\
4747
   _setPixel(pixelPos);\
1137
   _setPixel(pixelPos);\
4748
   if( xs > 1 ){\
1138
   if( xs > 1 ){\
4749
    if( _comparePixel(_getPixel(pixelPos - 4)) ){\
1139
    if( _comparePixel(_getPixel(pixelPos - 4)) ){\
4750
    if( !found_left_border ){\
1140
    if( !found_left_border ){\
Line 4752... Line 1142...
4752
     found_left_border = true;\
1142
     found_left_border = true;\
4753
    };\
1143
    };\
4754
   }\
1144
   }\
4755
   else if( found_left_border ){\
1145
   else if( found_left_border ){\
4756
     found_left_border = false;\
1146
     found_left_border = false;\
4757
    }\
1147
    };\
4758
   }\
1148
   };\
4759
   if( xs < xsize - 1 ){\
1149
   if( xs < xsize - 1 ){\
4760
    if( _comparePixel(_getPixel(pixelPos + 4)) ){\
1150
    if( _comparePixel(_getPixel(pixelPos + 4)) ){\
4761
     if( !found_right_border){\
1151
     if( !found_right_border){\
4762
      pixelStack.push( [xs + 1, ys] );\
1152
      pixelStack.push( [xs + 1, ys] );\
4763
      found_right_border = true;\
1153
      found_right_border = true;\
4764
     }\
1154
     };\
4765
    }\
1155
    }\
4766
    else if(found_right_border){\
1156
    else if(found_right_border){\
4767
      found_right_border = false;\
1157
      found_right_border = false;\
4768
     }\
1158
     };\
4769
    }\
1159
    };\
4770
   pixelPos += xsize * 4;\
1160
   pixelPos += xsize * 4;\
4771
  }\
1161
  };\
4772
 };\
1162
 };\
4773
 var fill_canvas = create_canvas%d(fill_canvas_no,xsize,ysize);\
-
 
-
 
1163
};\
4774
 var fill_canvas_ctx = fill_canvas.getContext(\"2d\");\
1164
fill_me_up();\
4775
 fill_canvas_ctx.clearRect(0,0,xsize,ysize);\
1165
finish_filling();\
4776
 fill_canvas_ctx.putImageData(image, 0, 0);\
1166
return;\
4777
 document.body.style.cursor = 'default';};",canvas_root_id,canvas_type,canvas_root_id);
1167
};",canvas_root_id,canvas_type,canvas_root_id,canvas_root_id);
4778
}
1168
}
4779
 
1169
 
4780
void add_js_ruler(FILE *js_include_file,
-
 
4781
int canvas_root_id,double x,double y,double sizex,double sizey,char *font,
1170
void add_js_ruler(double x,double y,double sizex,double sizey,char *font,
4782
char *stroke_color,double stroke_opacity,char *fill_color,double fill_opacity,
1171
char *stroke_color,double stroke_opacity,char *fill_color,double fill_opacity,
4783
int line_width,int dynamic,int use_snap){
1172
int line_width,int dynamic,int use_snap){
4784
 fprintf(js_include_file,"\n/* begin command ruler */\n\
1173
 fprintf(js_include_file,"\n/* command ruler */\
4785
 var ruler_data = new Array(3);\
1174
 var ruler_data = new Array(3);\
4786
 var ruler%d = function(){\
1175
 var ruler%d = function(){\
4787
  var use_snap = %d;\
1176
  var use_snap = %d;\
4788
  var full = 2*Math.PI;\
1177
  var full = 2*Math.PI;\
4789
  var once = true;\
1178
  var once = true;\
Line 4825... Line 1214...
4825
     num++;\
1214
     num++;\
4826
   };\
1215
   };\
4827
   ctx_temp.strokeStyle = \"rgba(0,0,255,0.6)\";\
1216
   ctx_temp.strokeStyle = \"rgba(0,0,255,0.6)\";\
4828
   ctx_temp.lineWidth = 2;\
1217
   ctx_temp.lineWidth = 2;\
4829
   for(var p = 0; p < size_x ; p = p+dx){\
1218
   for(var p = 0; p < size_x ; p = p+dx){\
4830
    ctx_temp.beginPath();\
1219
    ctx_temp.beginPath();\
4831
    ctx_temp.moveTo(ruler_x+p,ruler_y);\
1220
    ctx_temp.moveTo(ruler_x+p,ruler_y);\
4832
    ctx_temp.lineTo(ruler_x+p,ruler_y-0.8*dy);\
1221
    ctx_temp.lineTo(ruler_x+p,ruler_y-0.8*dy);\
4833
    ctx_temp.closePath();\
1222
    ctx_temp.closePath();\
4834
    ctx_temp.stroke();\
1223
    ctx_temp.stroke();\
4835
   };\
1224
   };\
4836
   ctx_temp.strokeStyle = \"rgba(0,0,255,0.6)\";\
1225
   ctx_temp.strokeStyle = \"rgba(0,0,255,0.6)\";\
4837
   ctx_temp.lineWidth = 1;\
1226
   ctx_temp.lineWidth = 1;\
4838
   for(var p = 0; p < size_x ; p = p+0.5*dx){\
1227
   for(var p = 0; p < size_x ; p = p+0.5*dx){\
4839
    ctx_temp.beginPath();\
1228
    ctx_temp.beginPath();\
4840
    ctx_temp.moveTo(ruler_x+p,ruler_y);\
1229
    ctx_temp.moveTo(ruler_x+p,ruler_y);\
4841
    ctx_temp.lineTo(ruler_x+p,ruler_y-0.6*dy);\
1230
    ctx_temp.lineTo(ruler_x+p,ruler_y-0.6*dy);\
4842
    ctx_temp.closePath();\
1231
    ctx_temp.closePath();\
4843
    ctx_temp.stroke();\
1232
    ctx_temp.stroke();\
4844
   };\
1233
   };\
4845
   ctx_temp.strokeStyle = \"rgba(255,0,0,0.6)\";\
1234
   ctx_temp.strokeStyle = \"rgba(255,0,0,0.6)\";\
4846
   ctx_temp.lineWidth = 0.5;\
1235
   ctx_temp.lineWidth = 0.5;\
4847
   for(var p = 0; p < size_x ; p = p+0.1*dx){\
1236
   for(var p = 0; p < size_x ; p = p+0.1*dx){\
4848
    ctx_temp.beginPath();\
1237
    ctx_temp.beginPath();\
4849
    ctx_temp.moveTo(ruler_x+p,ruler_y);\
1238
    ctx_temp.moveTo(ruler_x+p,ruler_y);\
Line 4852... Line 1241...
4852
    ctx_temp.stroke();\
1241
    ctx_temp.stroke();\
4853
   };\
1242
   };\
4854
   ctx_temp.drawImage(canvas,ruler_x,ruler_y);\
1243
   ctx_temp.drawImage(canvas,ruler_x,ruler_y);\
4855
   once = false;\
1244
   once = false;\
4856
  }",canvas_root_id,use_snap,canvas_root_id,sizex,sizey,x,y,font,stroke_color,stroke_opacity,fill_color,fill_opacity,line_width);
1245
  }",canvas_root_id,use_snap,canvas_root_id,sizex,sizey,x,y,font,stroke_color,stroke_opacity,fill_color,fill_opacity,line_width);
4857
 
1246
 
4858
 if( dynamic == -1 ){
1247
 if( dynamic == -1 ){
4859
 fprintf(js_include_file,"\
1248
 fprintf(js_include_file,"\
4860
 ctx.drawImage(canvas_temp,0,0);\
1249
 ctx.drawImage(canvas_temp,0,0);\
4861
   if(wims_status != \"done\"){\
1250
   if(wims_status != \"done\"){\
4862
    canvas_div.addEventListener( 'mouseup'   , ruler_stop,false);\
1251
    canvas_div.addEventListener( 'mouseup'   , ruler_stop,false);\
Line 4870... Line 1259...
4870
    ruler_data[0] = ruler_x;\
1259
    ruler_data[0] = ruler_x;\
4871
    ruler_data[1] = ruler_y;\
1260
    ruler_data[1] = ruler_y;\
4872
    ruler_data[2] = angle;\
1261
    ruler_data[2] = angle;\
4873
    return;\
1262
    return;\
4874
   };\
1263
   };\
4875
   var ruler_click_cnt = 0;\
1264
   var ruler_object_cnt = 0;\
4876
   function ruler_start(evt){\
1265
   function ruler_start(evt){\
4877
    var mouse = dragstuff.getMouse(evt,canvas);\
1266
    var mouse = getMouse(evt,canvas);\
4878
    var mouse_y = mouse.y;\
1267
    var mouse_y = mouse.y;\
4879
    if( mouse_y > ysize - 20 ){return;};\
1268
    if( mouse_y > ysize - 20 ){return;};\
4880
    var mouse_x = mouse.x;\
1269
    var mouse_x = mouse.x;\
4881
    if( mouse_x > ruler_x - 50 && mouse_x < ruler_x + size_x + 50){\
1270
    if( mouse_x > ruler_x - 50 && mouse_x < ruler_x + size_x + 50){\
4882
     if( mouse_y > ruler_y - 50 && mouse_y < ruler_y + size_y + 50){\
1271
     if( mouse_y > ruler_y - 50 && mouse_y < ruler_y + size_y + 50){\
4883
      ruler_click_cnt++;\
1272
      ruler_object_cnt++;\
4884
      ruler_move(evt);\
1273
      ruler_move(evt);\
4885
      return;\
1274
      return;\
4886
     };\
1275
     };\
4887
    }else{ruler_click_cnt = 0; return;};\
1276
    }else{ruler_object_cnt = 0; return;};\
4888
   };\
1277
   };\
4889
   var angle = 0;\
1278
   var angle = 0;\
4890
   function ruler_move(evt){\
1279
   function ruler_move(evt){\
4891
    var mouse = dragstuff.getMouse(evt,canvas);\
1280
    var mouse = getMouse(evt,canvas);\
4892
    switch(ruler_click_cnt){\
1281
    switch(ruler_object_cnt){\
4893
     case 1:\
1282
     case 1:\
4894
      angle = 0;\
1283
      angle = 0;\
4895
      var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
1284
      var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
4896
      ruler_y = xy[1];\
1285
      ruler_y = xy[1];\
4897
      if( ruler_y > ysize - 20 ){ruler_y = 0.5*ysize;ruler_x = 0.5*xsize;return;};\
1286
      if( ruler_y > ysize - 20 ){ruler_y = 0.5*ysize;ruler_x = 0.5*xsize;return;};\
Line 4911... Line 1300...
4911
      ctx.translate( -1*xcenter, -1*ycenter );\
1300
      ctx.translate( -1*xcenter, -1*ycenter );\
4912
      ctx.drawImage( canvas_temp,0,0 );\
1301
      ctx.drawImage( canvas_temp,0,0 );\
4913
      ctx.restore();\
1302
      ctx.restore();\
4914
      userdraw_radius[0] = 2*Math.PI - angle;\
1303
      userdraw_radius[0] = 2*Math.PI - angle;\
4915
      break;\
1304
      break;\
4916
     case 3:ruler_click_cnt = 0;break;\
1305
     case 3:ruler_object_cnt = 0;break;\
4917
     default:ruler_stop(evt);break;\
1306
     default:ruler_stop(evt);break;\
4918
    };\
1307
    };\
4919
   };\
1308
   };\
4920
  };\
1309
  };\
4921
  ruler%d();\n",canvas_root_id);
1310
  ruler%d();",canvas_root_id);
4922
 }
1311
 }
4923
 else
1312
 else
4924
 {
1313
 {
4925
  fprintf(js_include_file,"\
1314
  fprintf(js_include_file,"\
4926
   ctx.clearRect(0,0,xsize,ysize);\
1315
   ctx.clearRect(0,0,xsize,ysize);\
Line 4933... Line 1322...
4933
  };\
1322
  };\
4934
  ruler%d();",dynamic,canvas_root_id);
1323
  ruler%d();",dynamic,canvas_root_id);
4935
 }
1324
 }
4936
}
1325
}
4937
 
1326
 
4938
void add_js_protractor(FILE *js_include_file,int canvas_root_id,int type,double xcenter,double ycenter,int size,char *font,char *stroke_color,double stroke_opacity,char *fill_color,double fill_opacity,int line_width,int use_scale,int dynamic,int use_snap){
1327
void add_js_protractor(int type,double xcenter,double ycenter,int size,char *font,char *stroke_color,double stroke_opacity,char *fill_color,double fill_opacity,int line_width,int use_scale,int dynamic,int use_snap){
4939
 
1328
 
4940
/*
1329
/*
4941
use_slider_display = 2 : angle in degrees
1330
use_slider_display = 2 : angle in degrees
4942
use_slider_display = 3 : angle in radians
1331
use_slider_display = 3 : angle in radians
4943
void add_slider_display(FILE *js_include_file,int canvas_root_id,int precision,int font_size,char *font_color,double stroke_opacity){
1332
void add_slider_display(FILE *js_include_file,int canvas_root_id,int precision,int font_size,char *font_color,double stroke_opacity){
4944
*/
1333
*/
4945
 
1334
 
4946
if( type == 1 ){ /* geodriehoek */
1335
if( type == 1 ){ /* geodriehoek */
4947
 fprintf(js_include_file,"\n/* begin command protractor type 1 */\n\
1336
 fprintf(js_include_file,"\n/* command protractor type 1 */\
4948
 var protractor_data = new Array(3);\
1337
 var protractor_data = new Array(3);\
4949
 var protractor%d = function(){\
1338
 var protractor%d = function(){\
4950
  var once = true;\
1339
  var once = true;\
4951
  var use_snap = %d;\
1340
  var use_snap = %d;\
4952
  var full = 2*Math.PI;\
1341
  var full = 2*Math.PI;\
Line 5018... Line 1407...
5018
  };\
1407
  };\
5019
  ",canvas_root_id,use_snap,canvas_root_id,size,type,xcenter,ycenter,font,stroke_color,stroke_opacity,fill_color,fill_opacity,line_width,use_scale);
1408
  ",canvas_root_id,use_snap,canvas_root_id,size,type,xcenter,ycenter,font,stroke_color,stroke_opacity,fill_color,fill_opacity,line_width,use_scale);
5020
}
1409
}
5021
 
1410
 
5022
if( type != 1 ){
1411
if( type != 1 ){
5023
 fprintf(js_include_file,"\n/* begin command protractor type 0 */\n\
1412
 fprintf(js_include_file,"\n/* command protractor type 0 */\
5024
 var protractor_data = new Array(3);\
1413
 var protractor_data = new Array(3);\
5025
 var protractor%d = function(){\
1414
 var protractor%d = function(){\
5026
  var once = true;\
1415
  var once = true;\
5027
  var use_snap = %d;\
1416
  var use_snap = %d;\
5028
  var full = 2*Math.PI;\
1417
  var full = 2*Math.PI;\
Line 5085... Line 1474...
5085
     ctx_temp.stroke();\
1474
     ctx_temp.stroke();\
5086
   };\
1475
   };\
5087
   ctx_temp.drawImage(canvas,0,0);\
1476
   ctx_temp.drawImage(canvas,0,0);\
5088
   ctx_temp.save();\
1477
   ctx_temp.save();\
5089
   once = false;\
1478
   once = false;\
5090
  };\n",canvas_root_id,use_snap,canvas_root_id,size,type,xcenter,ycenter,font,stroke_color,stroke_opacity,fill_color,fill_opacity,line_width,use_scale);
1479
  };",canvas_root_id,use_snap,canvas_root_id,size,type,xcenter,ycenter,font,stroke_color,stroke_opacity,fill_color,fill_opacity,line_width,use_scale);
5091
}
1480
}
5092
if( dynamic == -1 ){ /* rotate the protractors */
1481
if( dynamic == -1 ){ /* rotate the protractors */
5093
 fprintf(js_include_file,"\
1482
 fprintf(js_include_file,"\
5094
  var protractor_x = xcenter;\
1483
  var protractor_x = xcenter;\
5095
  var protractor_y = ycenter;\
1484
  var protractor_y = ycenter;\
Line 5107... Line 1496...
5107
   protractor_data[0] = protractor_x;\
1496
   protractor_data[0] = protractor_x;\
5108
   protractor_data[1] = protractor_y;\
1497
   protractor_data[1] = protractor_y;\
5109
   protractor_data[2] = angle;\
1498
   protractor_data[2] = angle;\
5110
   return;\
1499
   return;\
5111
  };\
1500
  };\
5112
  var protractor_click_cnt = 0;\
1501
  var protractor_object_cnt = 0;\
5113
  function protractor_start(evt){\
1502
  function protractor_start(evt){\
5114
   var mouse = dragstuff.getMouse(evt,canvas);\
1503
   var mouse = getMouse(evt,canvas);\
5115
   var mouse_y = mouse.y;\
1504
   var mouse_y = mouse.y;\
5116
   if( mouse_y > ysize - 20 ){return;};\
1505
   if( mouse_y > ysize - 20 ){return;};\
5117
   var mouse_x = mouse.x;\
1506
   var mouse_x = mouse.x;\
5118
   if( mouse_x > protractor_x - half && mouse_x < protractor_x + half ){\
1507
   if( mouse_x > protractor_x - half && mouse_x < protractor_x + half ){\
5119
    if( mouse_y > protractor_y - half && mouse_y < protractor_y + half ){\
1508
    if( mouse_y > protractor_y - half && mouse_y < protractor_y + half ){\
5120
     protractor_click_cnt++;\
1509
     protractor_object_cnt++;\
5121
     protractor_move(evt);\
1510
     protractor_move(evt);\
5122
     return;\
1511
     return;\
5123
    };\
1512
    };\
5124
   }else{protractor_click_cnt = 0; return;};\
1513
   }else{protractor_object_cnt = 0; return;};\
5125
  };\
1514
  };\
5126
  function protractor_move(evt){\
1515
  function protractor_move(evt){\
5127
   var mouse = dragstuff.getMouse(evt,canvas);\
1516
   var mouse = getMouse(evt,canvas);\
5128
   switch(protractor_click_cnt){\
1517
   switch(protractor_object_cnt){\
5129
    case 1:\
1518
    case 1:\
5130
      var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
1519
      var xy = multisnap_check(mouse.x,mouse.y,use_snap);\
5131
      mouse.x = xy[0];\
1520
      mouse.x = xy[0];\
5132
      mouse.y = xy[1];\
1521
      mouse.y = xy[1];\
5133
      angle = 0;\
1522
      angle = 0;\
Line 5149... Line 1538...
5149
     ctx.translate( -1*xcenter, -1*ycenter );\
1538
     ctx.translate( -1*xcenter, -1*ycenter );\
5150
     ctx.drawImage( canvas_temp,0,0 );\
1539
     ctx.drawImage( canvas_temp,0,0 );\
5151
     ctx.restore();\
1540
     ctx.restore();\
5152
     userdraw_radius[0] =2*Math.PI- angle;\
1541
     userdraw_radius[0] =2*Math.PI- angle;\
5153
     break;\
1542
     break;\
5154
    case 3:protractor_click_cnt = 0;break;\
1543
    case 3:protractor_object_cnt = 0;break;\
5155
    default:protractor_stop(evt);\
1544
    default:protractor_stop(evt);\
5156
   };\
1545
   };\
5157
  };\
1546
  };\
5158
 };\
1547
 };\
5159
 protractor%d();\n\
-
 
5160
",canvas_root_id);
1548
 protractor%d();",canvas_root_id);
5161
}
1549
}
5162
else
1550
else
5163
{
1551
{
5164
 fprintf(js_include_file,"\
1552
 fprintf(js_include_file,"\
5165
  ctx.save();\
1553
  ctx.save();\