Subversion Repositories wimsdev

Rev

Rev 16722 | Details | Compare with Previous | Last modification | View Log | RSS feed

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