1 //////////////////////////////////////////////////////////////////////
2 // path_aux: support functions for fast line element generation.
3 
4 #include "GeomDraw.h"
5 
6 namespace Upp {
7 
PathDraw_Output_1_1(PathDraw::Output & out,Point a,Point b)8 static void PathDraw_Output_1_1(PathDraw::Output& out, Point a, Point b)
9 {
10 	//RTIMING("PathDraw_Output_1_1");
11 	out.AddFirst(a);
12 	out.AddNext(b);
13 }
14 
PathDraw_Output_1_2(PathDraw::Output & out,Point a,Point b)15 static void PathDraw_Output_1_2(PathDraw::Output& out, Point a, Point b)
16 {
17 	//RTIMING("PathDraw_Output_1_2");
18 	Point *p;
19 	int dx = b.x - a.x, dy = b.y - a.y;
20 	if(dy >= 0)
21 	{
22 		if(dx >= 0)
23 		{
24 			if(dx >= dy)
25 			{
26 				p = out.AddSeg(2, 2);
27 				p[0].y = a.y - 0;
28 				p[0].x = a.x + 0;
29 				p[1].y = b.y - 1;
30 				p[1].x = b.x + 0;
31 				p[2].y = a.y + 1;
32 				p[2].x = a.x + 0;
33 				p[3].y = b.y + 0;
34 				p[3].x = b.x + 0;
35 			}
36 			else
37 			{
38 				p = out.AddSeg(2, 2);
39 				p[0].x = a.x - 0;
40 				p[0].y = a.y + 0;
41 				p[1].x = b.x - 1;
42 				p[1].y = b.y + 0;
43 				p[2].x = a.x + 1;
44 				p[2].y = a.y + 0;
45 				p[3].x = b.x + 0;
46 				p[3].y = b.y + 0;
47 			}
48 		}
49 		else
50 		{
51 			if(0 >= dx + dy)
52 			{
53 				p = out.AddSeg(2, 2);
54 				p[0].y = a.y - 0;
55 				p[0].x = a.x + 0;
56 				p[1].y = b.y - 1;
57 				p[1].x = b.x + 0;
58 				p[2].y = a.y + 1;
59 				p[2].x = a.x + 0;
60 				p[3].y = b.y + 0;
61 				p[3].x = b.x + 0;
62 			}
63 			else
64 			{
65 				p = out.AddSeg(2, 2);
66 				p[0].x = a.x - 0;
67 				p[0].y = a.y + 0;
68 				p[1].x = b.x - 1;
69 				p[1].y = b.y + 0;
70 				p[2].x = a.x + 1;
71 				p[2].y = a.y + 0;
72 				p[3].x = b.x + 0;
73 				p[3].y = b.y + 0;
74 			}
75 		}
76 	}
77 	else
78 	{
79 		if(dx >= 0)
80 		{
81 			if(dx + dy >= 0)
82 			{
83 				p = out.AddSeg(2, 2);
84 				p[0].y = a.y - 0;
85 				p[0].x = a.x + 0;
86 				p[1].y = b.y - 1;
87 				p[1].x = b.x + 0;
88 				p[2].y = a.y + 1;
89 				p[2].x = a.x + 0;
90 				p[3].y = b.y + 0;
91 				p[3].x = b.x + 0;
92 			}
93 			else
94 			{
95 				p = out.AddSeg(2, 2);
96 				p[0].x = a.x - 0;
97 				p[0].y = a.y + 0;
98 				p[1].x = b.x - 1;
99 				p[1].y = b.y + 0;
100 				p[2].x = a.x + 1;
101 				p[2].y = a.y + 0;
102 				p[3].x = b.x + 0;
103 				p[3].y = b.y + 0;
104 			}
105 		}
106 		else
107 		{
108 			if(dy >= dx)
109 			{
110 				p = out.AddSeg(2, 2);
111 				p[0].y = a.y - 0;
112 				p[0].x = a.x + 0;
113 				p[1].y = b.y - 1;
114 				p[1].x = b.x + 0;
115 				p[2].y = a.y + 1;
116 				p[2].x = a.x + 0;
117 				p[3].y = b.y + 0;
118 				p[3].x = b.x + 0;
119 			}
120 			else
121 			{
122 				p = out.AddSeg(2, 2);
123 				p[0].x = a.x - 0;
124 				p[0].y = a.y + 0;
125 				p[1].x = b.x - 1;
126 				p[1].y = b.y + 0;
127 				p[2].x = a.x + 1;
128 				p[2].y = a.y + 0;
129 				p[3].x = b.x + 0;
130 				p[3].y = b.y + 0;
131 			}
132 		}
133 	}
134 }
135 
136 //////////////////////////////////////////////////////////////////////
137 
PathDraw_Output_1_3(PathDraw::Output & out,Point a,Point b)138 static void PathDraw_Output_1_3(PathDraw::Output& out, Point a, Point b)
139 {
140 	//RTIMING("PathDraw_Output_1_3");
141 	Point *p;
142 	int dx = b.x - a.x, dy = b.y - a.y;
143 	if(dy >= 0)
144 	{
145 		if(dx >= 0)
146 		{
147 			if(dx >= dy)
148 			{
149 				p = out.AddSeg(3);
150 				p[2].y = 1 + (p[0].y = b.y - 1);
151 				p[2].x = p[0].x = b.x + 0;
152 				p[1].y = a.y - 0;
153 				p[1].x = a.x + 0;
154 				p = out.AddSeg(2);
155 				p[0].y = a.y + 1;
156 				p[0].x = a.x + 0;
157 				p[1].y = b.y + 1;
158 				p[1].x = b.x + 0;
159 			}
160 			else
161 			{
162 				p = out.AddSeg(3);
163 				p[2].x = 1 + (p[0].x = b.x - 1);
164 				p[2].y = p[0].y = b.y + 0;
165 				p[1].x = a.x - 0;
166 				p[1].y = a.y + 0;
167 				p = out.AddSeg(2);
168 				p[0].x = a.x + 1;
169 				p[0].y = a.y + 0;
170 				p[1].x = b.x + 1;
171 				p[1].y = b.y + 0;
172 			}
173 		}
174 		else
175 		{
176 			if(0 >= dx + dy)
177 			{
178 				p = out.AddSeg(3);
179 				p[2].y = 1 + (p[0].y = b.y - 1);
180 				p[2].x = p[0].x = b.x + 0;
181 				p[1].y = a.y - 0;
182 				p[1].x = a.x + 0;
183 				p = out.AddSeg(2);
184 				p[0].y = a.y + 1;
185 				p[0].x = a.x + 0;
186 				p[1].y = b.y + 1;
187 				p[1].x = b.x + 0;
188 			}
189 			else
190 			{
191 				p = out.AddSeg(3);
192 				p[2].x = 1 + (p[0].x = b.x - 1);
193 				p[2].y = p[0].y = b.y + 0;
194 				p[1].x = a.x - 0;
195 				p[1].y = a.y + 0;
196 				p = out.AddSeg(2);
197 				p[0].x = a.x + 1;
198 				p[0].y = a.y + 0;
199 				p[1].x = b.x + 1;
200 				p[1].y = b.y + 0;
201 			}
202 		}
203 	}
204 	else
205 	{
206 		if(dx >= 0)
207 		{
208 			if(dx + dy >= 0)
209 			{
210 				p = out.AddSeg(3);
211 				p[2].y = 1 + (p[0].y = b.y - 1);
212 				p[2].x = p[0].x = b.x + 0;
213 				p[1].y = a.y - 0;
214 				p[1].x = a.x + 0;
215 				p = out.AddSeg(2);
216 				p[0].y = a.y + 1;
217 				p[0].x = a.x + 0;
218 				p[1].y = b.y + 1;
219 				p[1].x = b.x + 0;
220 			}
221 			else
222 			{
223 				p = out.AddSeg(3);
224 				p[2].x = 1 + (p[0].x = b.x - 1);
225 				p[2].y = p[0].y = b.y + 0;
226 				p[1].x = a.x - 0;
227 				p[1].y = a.y + 0;
228 				p = out.AddSeg(2);
229 				p[0].x = a.x + 1;
230 				p[0].y = a.y + 0;
231 				p[1].x = b.x + 1;
232 				p[1].y = b.y + 0;
233 			}
234 		}
235 		else
236 		{
237 			if(dy >= dx)
238 			{
239 				p = out.AddSeg(3);
240 				p[2].y = 1 + (p[0].y = b.y - 1);
241 				p[2].x = p[0].x = b.x + 0;
242 				p[1].y = a.y - 0;
243 				p[1].x = a.x + 0;
244 				p = out.AddSeg(2);
245 				p[0].y = a.y + 1;
246 				p[0].x = a.x + 0;
247 				p[1].y = b.y + 1;
248 				p[1].x = b.x + 0;
249 			}
250 			else
251 			{
252 				p = out.AddSeg(3);
253 				p[2].x = 1 + (p[0].x = b.x - 1);
254 				p[2].y = p[0].y = b.y + 0;
255 				p[1].x = a.x - 0;
256 				p[1].y = a.y + 0;
257 				p = out.AddSeg(2);
258 				p[0].x = a.x + 1;
259 				p[0].y = a.y + 0;
260 				p[1].x = b.x + 1;
261 				p[1].y = b.y + 0;
262 			}
263 		}
264 	}
265 }
266 
267 //////////////////////////////////////////////////////////////////////
268 
PathDraw_Output_1_4(PathDraw::Output & out,Point a,Point b)269 static void PathDraw_Output_1_4(PathDraw::Output& out, Point a, Point b)
270 {
271 	//RTIMING("PathDraw_Output_1_4");
272 	Point *p;
273 	int dx = b.x - a.x, dy = b.y - a.y;
274 	if(dy >= 0)
275 	{
276 		if(dx >= 0)
277 		{
278 			if(dx >= dy)
279 			{
280 				p = out.AddSeg(3);
281 				p[2].y = 1 + (p[0].y = b.y - 2);
282 				p[2].x = p[0].x = b.x + 1;
283 				p[1].y = a.y - 0;
284 				p[1].x = a.x + 0;
285 				p = out.AddSeg(2, 2);
286 				p[0].y = a.y - 0;
287 				p[0].x = a.x + 0;
288 				p[1].y = b.y - 0;
289 				p[1].x = b.x + 1;
290 				p[2].y = a.y + 1;
291 				p[2].x = a.x + 0;
292 				p[3].y = b.y + 1;
293 				p[3].x = b.x + 1;
294 			}
295 			else
296 			{
297 				p = out.AddSeg(3);
298 				p[2].x = 1 + (p[0].x = b.x - 2);
299 				p[2].y = p[0].y = b.y + 1;
300 				p[1].x = a.x - 0;
301 				p[1].y = a.y + 0;
302 				p = out.AddSeg(2, 2);
303 				p[0].x = a.x - 0;
304 				p[0].y = a.y + 0;
305 				p[1].x = b.x - 0;
306 				p[1].y = b.y + 1;
307 				p[2].x = a.x + 1;
308 				p[2].y = a.y + 0;
309 				p[3].x = b.x + 1;
310 				p[3].y = b.y + 1;
311 			}
312 		}
313 		else
314 		{
315 			if(0 >= dx + dy)
316 			{
317 				p = out.AddSeg(3);
318 				p[2].y = 1 + (p[0].y = b.y - 2);
319 				p[2].x = p[0].x = b.x + -1;
320 				p[1].y = a.y - 0;
321 				p[1].x = a.x + 0;
322 				p = out.AddSeg(2, 2);
323 				p[0].y = a.y - 0;
324 				p[0].x = a.x + 0;
325 				p[1].y = b.y - 0;
326 				p[1].x = b.x + -1;
327 				p[2].y = a.y + 1;
328 				p[2].x = a.x + 0;
329 				p[3].y = b.y + 1;
330 				p[3].x = b.x + -1;
331 			}
332 			else
333 			{
334 				p = out.AddSeg(3);
335 				p[2].x = 1 + (p[0].x = b.x - 2);
336 				p[2].y = p[0].y = b.y + 1;
337 				p[1].x = a.x - 0;
338 				p[1].y = a.y + 0;
339 				p = out.AddSeg(2, 2);
340 				p[0].x = a.x - 0;
341 				p[0].y = a.y + 0;
342 				p[1].x = b.x - 0;
343 				p[1].y = b.y + 1;
344 				p[2].x = a.x + 1;
345 				p[2].y = a.y + 0;
346 				p[3].x = b.x + 1;
347 				p[3].y = b.y + 1;
348 			}
349 		}
350 	}
351 	else
352 	{
353 		if(dx >= 0)
354 		{
355 			if(dx + dy >= 0)
356 			{
357 				p = out.AddSeg(3);
358 				p[2].y = 1 + (p[0].y = b.y - 2);
359 				p[2].x = p[0].x = b.x + 1;
360 				p[1].y = a.y - 0;
361 				p[1].x = a.x + 0;
362 				p = out.AddSeg(2, 2);
363 				p[0].y = a.y - 0;
364 				p[0].x = a.x + 0;
365 				p[1].y = b.y - 0;
366 				p[1].x = b.x + 1;
367 				p[2].y = a.y + 1;
368 				p[2].x = a.x + 0;
369 				p[3].y = b.y + 1;
370 				p[3].x = b.x + 1;
371 			}
372 			else
373 			{
374 				p = out.AddSeg(3);
375 				p[2].x = 1 + (p[0].x = b.x - 2);
376 				p[2].y = p[0].y = b.y + -1;
377 				p[1].x = a.x - 0;
378 				p[1].y = a.y + 0;
379 				p = out.AddSeg(2, 2);
380 				p[0].x = a.x - 0;
381 				p[0].y = a.y + 0;
382 				p[1].x = b.x - 0;
383 				p[1].y = b.y + -1;
384 				p[2].x = a.x + 1;
385 				p[2].y = a.y + 0;
386 				p[3].x = b.x + 1;
387 				p[3].y = b.y + -1;
388 			}
389 		}
390 		else
391 		{
392 			if(dy >= dx)
393 			{
394 				p = out.AddSeg(3);
395 				p[2].y = 1 + (p[0].y = b.y - 2);
396 				p[2].x = p[0].x = b.x + -1;
397 				p[1].y = a.y - 0;
398 				p[1].x = a.x + 0;
399 				p = out.AddSeg(2, 2);
400 				p[0].y = a.y - 0;
401 				p[0].x = a.x + 0;
402 				p[1].y = b.y - 0;
403 				p[1].x = b.x + -1;
404 				p[2].y = a.y + 1;
405 				p[2].x = a.x + 0;
406 				p[3].y = b.y + 1;
407 				p[3].x = b.x + -1;
408 			}
409 			else
410 			{
411 				p = out.AddSeg(3);
412 				p[2].x = 1 + (p[0].x = b.x - 2);
413 				p[2].y = p[0].y = b.y + -1;
414 				p[1].x = a.x - 0;
415 				p[1].y = a.y + 0;
416 				p = out.AddSeg(2, 2);
417 				p[0].x = a.x - 0;
418 				p[0].y = a.y + 0;
419 				p[1].x = b.x - 0;
420 				p[1].y = b.y + -1;
421 				p[2].x = a.x + 1;
422 				p[2].y = a.y + 0;
423 				p[3].x = b.x + 1;
424 				p[3].y = b.y + -1;
425 			}
426 		}
427 	}
428 }
429 
430 //////////////////////////////////////////////////////////////////////
431 
PathDraw_Output_1_5(PathDraw::Output & out,Point a,Point b)432 static void PathDraw_Output_1_5(PathDraw::Output& out, Point a, Point b)
433 {
434 	//RTIMING("PathDraw_Output_1_5");
435 	Point *p;
436 	int dx = b.x - a.x, dy = b.y - a.y;
437 	if(dy >= 0)
438 	{
439 		if(dx >= 0)
440 		{
441 			if(dx >= dy)
442 			{
443 				p = out.AddSeg(2, 3);
444 				p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = b.y - 2)));
445 				p[3].x = p[5].x = p[2].x = p[0].x = b.x + 1;
446 				p[4].y = p[1].y = a.y - 0;
447 				p[4].x = p[1].x = a.x + 0;
448 				p = out.AddSeg(2);
449 				p[0].y = a.y + 1;
450 				p[0].x = a.x + 0;
451 				p[1].y = b.y + 2;
452 				p[1].x = b.x + 1;
453 			}
454 			else
455 			{
456 				p = out.AddSeg(2, 3);
457 				p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = b.x - 2)));
458 				p[3].y = p[5].y = p[2].y = p[0].y = b.y + 1;
459 				p[4].x = p[1].x = a.x - 0;
460 				p[4].y = p[1].y = a.y + 0;
461 				p = out.AddSeg(2);
462 				p[0].x = a.x + 1;
463 				p[0].y = a.y + 0;
464 				p[1].x = b.x + 2;
465 				p[1].y = b.y + 1;
466 			}
467 		}
468 		else
469 		{
470 			if(0 >= dx + dy)
471 			{
472 				p = out.AddSeg(2, 3);
473 				p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = b.y - 2)));
474 				p[3].x = p[5].x = p[2].x = p[0].x = b.x + -1;
475 				p[4].y = p[1].y = a.y - 0;
476 				p[4].x = p[1].x = a.x + 0;
477 				p = out.AddSeg(2);
478 				p[0].y = a.y + 1;
479 				p[0].x = a.x + 0;
480 				p[1].y = b.y + 2;
481 				p[1].x = b.x + -1;
482 			}
483 			else
484 			{
485 				p = out.AddSeg(2, 3);
486 				p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = b.x - 2)));
487 				p[3].y = p[5].y = p[2].y = p[0].y = b.y + 1;
488 				p[4].x = p[1].x = a.x - 0;
489 				p[4].y = p[1].y = a.y + 0;
490 				p = out.AddSeg(2);
491 				p[0].x = a.x + 1;
492 				p[0].y = a.y + 0;
493 				p[1].x = b.x + 2;
494 				p[1].y = b.y + 1;
495 			}
496 		}
497 	}
498 	else
499 	{
500 		if(dx >= 0)
501 		{
502 			if(dx + dy >= 0)
503 			{
504 				p = out.AddSeg(2, 3);
505 				p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = b.y - 2)));
506 				p[3].x = p[5].x = p[2].x = p[0].x = b.x + 1;
507 				p[4].y = p[1].y = a.y - 0;
508 				p[4].x = p[1].x = a.x + 0;
509 				p = out.AddSeg(2);
510 				p[0].y = a.y + 1;
511 				p[0].x = a.x + 0;
512 				p[1].y = b.y + 2;
513 				p[1].x = b.x + 1;
514 			}
515 			else
516 			{
517 				p = out.AddSeg(2, 3);
518 				p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = b.x - 2)));
519 				p[3].y = p[5].y = p[2].y = p[0].y = b.y + -1;
520 				p[4].x = p[1].x = a.x - 0;
521 				p[4].y = p[1].y = a.y + 0;
522 				p = out.AddSeg(2);
523 				p[0].x = a.x + 1;
524 				p[0].y = a.y + 0;
525 				p[1].x = b.x + 2;
526 				p[1].y = b.y + -1;
527 			}
528 		}
529 		else
530 		{
531 			if(dy >= dx)
532 			{
533 				p = out.AddSeg(2, 3);
534 				p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = b.y - 2)));
535 				p[3].x = p[5].x = p[2].x = p[0].x = b.x + -1;
536 				p[4].y = p[1].y = a.y - 0;
537 				p[4].x = p[1].x = a.x + 0;
538 				p = out.AddSeg(2);
539 				p[0].y = a.y + 1;
540 				p[0].x = a.x + 0;
541 				p[1].y = b.y + 2;
542 				p[1].x = b.x + -1;
543 			}
544 			else
545 			{
546 				p = out.AddSeg(2, 3);
547 				p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = b.x - 2)));
548 				p[3].y = p[5].y = p[2].y = p[0].y = b.y + -1;
549 				p[4].x = p[1].x = a.x - 0;
550 				p[4].y = p[1].y = a.y + 0;
551 				p = out.AddSeg(2);
552 				p[0].x = a.x + 1;
553 				p[0].y = a.y + 0;
554 				p[1].x = b.x + 2;
555 				p[1].y = b.y + -1;
556 			}
557 		}
558 	}
559 }
560 
561 //////////////////////////////////////////////////////////////////////
562 
PathDraw_Output_2_1(PathDraw::Output & out,Point a,Point b)563 static void PathDraw_Output_2_1(PathDraw::Output& out, Point a, Point b)
564 {
565 	//RTIMING("PathDraw_Output_2_1");
566 	Point *p;
567 	int dx = b.x - a.x, dy = b.y - a.y;
568 	if(dy >= 0)
569 	{
570 		if(dx >= 0)
571 		{
572 			if(dx >= dy)
573 			{
574 				p = out.AddSeg(2, 2);
575 				p[0].y = b.y - 0;
576 				p[0].x = b.x + 0;
577 				p[1].y = a.y - 1;
578 				p[1].x = a.x + 0;
579 				p[2].y = b.y + 1;
580 				p[2].x = b.x + 0;
581 				p[3].y = a.y + 0;
582 				p[3].x = a.x + 0;
583 			}
584 			else
585 			{
586 				p = out.AddSeg(2, 2);
587 				p[0].x = b.x - 0;
588 				p[0].y = b.y + 0;
589 				p[1].x = a.x - 1;
590 				p[1].y = a.y + 0;
591 				p[2].x = b.x + 1;
592 				p[2].y = b.y + 0;
593 				p[3].x = a.x + 0;
594 				p[3].y = a.y + 0;
595 			}
596 		}
597 		else
598 		{
599 			if(0 >= dx + dy)
600 			{
601 				p = out.AddSeg(2, 2);
602 				p[0].y = b.y - 0;
603 				p[0].x = b.x + 0;
604 				p[1].y = a.y - 1;
605 				p[1].x = a.x + 0;
606 				p[2].y = b.y + 1;
607 				p[2].x = b.x + 0;
608 				p[3].y = a.y + 0;
609 				p[3].x = a.x + 0;
610 			}
611 			else
612 			{
613 				p = out.AddSeg(2, 2);
614 				p[0].x = b.x - 0;
615 				p[0].y = b.y + 0;
616 				p[1].x = a.x - 1;
617 				p[1].y = a.y + 0;
618 				p[2].x = b.x + 1;
619 				p[2].y = b.y + 0;
620 				p[3].x = a.x + 0;
621 				p[3].y = a.y + 0;
622 			}
623 		}
624 	}
625 	else
626 	{
627 		if(dx >= 0)
628 		{
629 			if(dx + dy >= 0)
630 			{
631 				p = out.AddSeg(2, 2);
632 				p[0].y = b.y - 0;
633 				p[0].x = b.x + 0;
634 				p[1].y = a.y - 1;
635 				p[1].x = a.x + 0;
636 				p[2].y = b.y + 1;
637 				p[2].x = b.x + 0;
638 				p[3].y = a.y + 0;
639 				p[3].x = a.x + 0;
640 			}
641 			else
642 			{
643 				p = out.AddSeg(2, 2);
644 				p[0].x = b.x - 0;
645 				p[0].y = b.y + 0;
646 				p[1].x = a.x - 1;
647 				p[1].y = a.y + 0;
648 				p[2].x = b.x + 1;
649 				p[2].y = b.y + 0;
650 				p[3].x = a.x + 0;
651 				p[3].y = a.y + 0;
652 			}
653 		}
654 		else
655 		{
656 			if(dy >= dx)
657 			{
658 				p = out.AddSeg(2, 2);
659 				p[0].y = b.y - 0;
660 				p[0].x = b.x + 0;
661 				p[1].y = a.y - 1;
662 				p[1].x = a.x + 0;
663 				p[2].y = b.y + 1;
664 				p[2].x = b.x + 0;
665 				p[3].y = a.y + 0;
666 				p[3].x = a.x + 0;
667 			}
668 			else
669 			{
670 				p = out.AddSeg(2, 2);
671 				p[0].x = b.x - 0;
672 				p[0].y = b.y + 0;
673 				p[1].x = a.x - 1;
674 				p[1].y = a.y + 0;
675 				p[2].x = b.x + 1;
676 				p[2].y = b.y + 0;
677 				p[3].x = a.x + 0;
678 				p[3].y = a.y + 0;
679 			}
680 		}
681 	}
682 }
683 
684 //////////////////////////////////////////////////////////////////////
685 
PathDraw_Output_2_2(PathDraw::Output & out,Point a,Point b)686 static void PathDraw_Output_2_2(PathDraw::Output& out, Point a, Point b)
687 {
688 	//RTIMING("PathDraw_Output_2_2");
689 	Point *p;
690 	int dx = b.x - a.x, dy = b.y - a.y;
691 	if(dy >= 0)
692 	{
693 		if(dx >= 0)
694 		{
695 			if(dx >= dy)
696 			{
697 				p = out.AddSeg(2, 2);
698 				p[2].y = 1 + (p[0].y = a.y + -1);
699 				p[2].x = p[0].x = a.x + 0;
700 				p[3].y = 1 + (p[1].y = b.y + -1);
701 				p[3].x = p[1].x = b.x + 0;
702 			}
703 			else
704 			{
705 				p = out.AddSeg(2, 2);
706 				p[2].x = 1 + (p[0].x = a.x + -1);
707 				p[2].y = p[0].y = a.y + 0;
708 				p[3].x = 1 + (p[1].x = b.x + -1);
709 				p[3].y = p[1].y = b.y + 0;
710 			}
711 		}
712 		else
713 		{
714 			if(0 >= dx + dy)
715 			{
716 				p = out.AddSeg(2, 2);
717 				p[2].y = 1 + (p[0].y = a.y + -1);
718 				p[2].x = p[0].x = a.x + 0;
719 				p[3].y = 1 + (p[1].y = b.y + -1);
720 				p[3].x = p[1].x = b.x + 0;
721 			}
722 			else
723 			{
724 				p = out.AddSeg(2, 2);
725 				p[2].x = 1 + (p[0].x = a.x + -1);
726 				p[2].y = p[0].y = a.y + 0;
727 				p[3].x = 1 + (p[1].x = b.x + -1);
728 				p[3].y = p[1].y = b.y + 0;
729 			}
730 		}
731 	}
732 	else
733 	{
734 		if(dx >= 0)
735 		{
736 			if(dx + dy >= 0)
737 			{
738 				p = out.AddSeg(2, 2);
739 				p[2].y = 1 + (p[0].y = a.y + -1);
740 				p[2].x = p[0].x = a.x + 0;
741 				p[3].y = 1 + (p[1].y = b.y + -1);
742 				p[3].x = p[1].x = b.x + 0;
743 			}
744 			else
745 			{
746 				p = out.AddSeg(2, 2);
747 				p[2].x = 1 + (p[0].x = a.x + -1);
748 				p[2].y = p[0].y = a.y + 0;
749 				p[3].x = 1 + (p[1].x = b.x + -1);
750 				p[3].y = p[1].y = b.y + 0;
751 			}
752 		}
753 		else
754 		{
755 			if(dy >= dx)
756 			{
757 				p = out.AddSeg(2, 2);
758 				p[2].y = 1 + (p[0].y = a.y + -1);
759 				p[2].x = p[0].x = a.x + 0;
760 				p[3].y = 1 + (p[1].y = b.y + -1);
761 				p[3].x = p[1].x = b.x + 0;
762 			}
763 			else
764 			{
765 				p = out.AddSeg(2, 2);
766 				p[2].x = 1 + (p[0].x = a.x + -1);
767 				p[2].y = p[0].y = a.y + 0;
768 				p[3].x = 1 + (p[1].x = b.x + -1);
769 				p[3].y = p[1].y = b.y + 0;
770 			}
771 		}
772 	}
773 }
774 
775 //////////////////////////////////////////////////////////////////////
776 
PathDraw_Output_2_3(PathDraw::Output & out,Point a,Point b)777 static void PathDraw_Output_2_3(PathDraw::Output& out, Point a, Point b)
778 {
779 	//RTIMING("PathDraw_Output_2_3");
780 	Point *p;
781 	int dx = b.x - a.x, dy = b.y - a.y;
782 	if(dy >= 0)
783 	{
784 		if(dx >= 0)
785 		{
786 			if(dx >= dy)
787 			{
788 				p = out.AddSeg(3, 2);
789 				p[0].y = a.y - 1;
790 				p[0].x = a.x + 0;
791 				p[1].y = b.y - 1;
792 				p[1].x = b.x + 0;
793 				p[4].y = 1 + (p[2].y = a.y + 0);
794 				p[4].x = p[2].x = a.x + 0;
795 				p[5].y = 1 + (p[3].y = b.y + 0);
796 				p[5].x = p[3].x = b.x + 0;
797 			}
798 			else
799 			{
800 				p = out.AddSeg(3, 2);
801 				p[0].x = a.x - 1;
802 				p[0].y = a.y + 0;
803 				p[1].x = b.x - 1;
804 				p[1].y = b.y + 0;
805 				p[4].x = 1 + (p[2].x = a.x + 0);
806 				p[4].y = p[2].y = a.y + 0;
807 				p[5].x = 1 + (p[3].x = b.x + 0);
808 				p[5].y = p[3].y = b.y + 0;
809 			}
810 		}
811 		else
812 		{
813 			if(0 >= dx + dy)
814 			{
815 				p = out.AddSeg(3, 2);
816 				p[0].y = a.y - 1;
817 				p[0].x = a.x + 0;
818 				p[1].y = b.y - 1;
819 				p[1].x = b.x + 0;
820 				p[4].y = 1 + (p[2].y = a.y + 0);
821 				p[4].x = p[2].x = a.x + 0;
822 				p[5].y = 1 + (p[3].y = b.y + 0);
823 				p[5].x = p[3].x = b.x + 0;
824 			}
825 			else
826 			{
827 				p = out.AddSeg(3, 2);
828 				p[0].x = a.x - 1;
829 				p[0].y = a.y + 0;
830 				p[1].x = b.x - 1;
831 				p[1].y = b.y + 0;
832 				p[4].x = 1 + (p[2].x = a.x + 0);
833 				p[4].y = p[2].y = a.y + 0;
834 				p[5].x = 1 + (p[3].x = b.x + 0);
835 				p[5].y = p[3].y = b.y + 0;
836 			}
837 		}
838 	}
839 	else
840 	{
841 		if(dx >= 0)
842 		{
843 			if(dx + dy >= 0)
844 			{
845 				p = out.AddSeg(3, 2);
846 				p[0].y = a.y - 1;
847 				p[0].x = a.x + 0;
848 				p[1].y = b.y - 1;
849 				p[1].x = b.x + 0;
850 				p[4].y = 1 + (p[2].y = a.y + 0);
851 				p[4].x = p[2].x = a.x + 0;
852 				p[5].y = 1 + (p[3].y = b.y + 0);
853 				p[5].x = p[3].x = b.x + 0;
854 			}
855 			else
856 			{
857 				p = out.AddSeg(3, 2);
858 				p[0].x = a.x - 1;
859 				p[0].y = a.y + 0;
860 				p[1].x = b.x - 1;
861 				p[1].y = b.y + 0;
862 				p[4].x = 1 + (p[2].x = a.x + 0);
863 				p[4].y = p[2].y = a.y + 0;
864 				p[5].x = 1 + (p[3].x = b.x + 0);
865 				p[5].y = p[3].y = b.y + 0;
866 			}
867 		}
868 		else
869 		{
870 			if(dy >= dx)
871 			{
872 				p = out.AddSeg(3, 2);
873 				p[0].y = a.y - 1;
874 				p[0].x = a.x + 0;
875 				p[1].y = b.y - 1;
876 				p[1].x = b.x + 0;
877 				p[4].y = 1 + (p[2].y = a.y + 0);
878 				p[4].x = p[2].x = a.x + 0;
879 				p[5].y = 1 + (p[3].y = b.y + 0);
880 				p[5].x = p[3].x = b.x + 0;
881 			}
882 			else
883 			{
884 				p = out.AddSeg(3, 2);
885 				p[0].x = a.x - 1;
886 				p[0].y = a.y + 0;
887 				p[1].x = b.x - 1;
888 				p[1].y = b.y + 0;
889 				p[4].x = 1 + (p[2].x = a.x + 0);
890 				p[4].y = p[2].y = a.y + 0;
891 				p[5].x = 1 + (p[3].x = b.x + 0);
892 				p[5].y = p[3].y = b.y + 0;
893 			}
894 		}
895 	}
896 }
897 
898 //////////////////////////////////////////////////////////////////////
899 
PathDraw_Output_2_4(PathDraw::Output & out,Point a,Point b)900 static void PathDraw_Output_2_4(PathDraw::Output& out, Point a, Point b)
901 {
902 	//RTIMING("PathDraw_Output_2_4");
903 	Point *p;
904 	int dx = b.x - a.x, dy = b.y - a.y;
905 	if(dy >= 0)
906 	{
907 		if(dx >= 0)
908 		{
909 			if(dx >= dy)
910 			{
911 				p = out.AddSeg(3);
912 				p[2].y = 1 + (p[0].y = b.y - 2);
913 				p[2].x = p[0].x = b.x + 1;
914 				p[1].y = a.y - 1;
915 				p[1].x = a.x + 0;
916 				p = out.AddSeg(2, 2);
917 				p[2].y = 1 + (p[0].y = a.y + 0);
918 				p[2].x = p[0].x = a.x + 0;
919 				p[3].y = 1 + (p[1].y = b.y + 0);
920 				p[3].x = p[1].x = b.x + 1;
921 			}
922 			else
923 			{
924 				p = out.AddSeg(3);
925 				p[2].x = 1 + (p[0].x = b.x - 2);
926 				p[2].y = p[0].y = b.y + 1;
927 				p[1].x = a.x - 1;
928 				p[1].y = a.y + 0;
929 				p = out.AddSeg(2, 2);
930 				p[2].x = 1 + (p[0].x = a.x + 0);
931 				p[2].y = p[0].y = a.y + 0;
932 				p[3].x = 1 + (p[1].x = b.x + 0);
933 				p[3].y = p[1].y = b.y + 1;
934 			}
935 		}
936 		else
937 		{
938 			if(0 >= dx + dy)
939 			{
940 				p = out.AddSeg(3);
941 				p[2].y = 1 + (p[0].y = b.y - 2);
942 				p[2].x = p[0].x = b.x + -1;
943 				p[1].y = a.y - 1;
944 				p[1].x = a.x + 0;
945 				p = out.AddSeg(2, 2);
946 				p[2].y = 1 + (p[0].y = a.y + 0);
947 				p[2].x = p[0].x = a.x + 0;
948 				p[3].y = 1 + (p[1].y = b.y + 0);
949 				p[3].x = p[1].x = b.x + -1;
950 			}
951 			else
952 			{
953 				p = out.AddSeg(3);
954 				p[2].x = 1 + (p[0].x = b.x - 2);
955 				p[2].y = p[0].y = b.y + 1;
956 				p[1].x = a.x - 1;
957 				p[1].y = a.y + 0;
958 				p = out.AddSeg(2, 2);
959 				p[2].x = 1 + (p[0].x = a.x + 0);
960 				p[2].y = p[0].y = a.y + 0;
961 				p[3].x = 1 + (p[1].x = b.x + 0);
962 				p[3].y = p[1].y = b.y + 1;
963 			}
964 		}
965 	}
966 	else
967 	{
968 		if(dx >= 0)
969 		{
970 			if(dx + dy >= 0)
971 			{
972 				p = out.AddSeg(3);
973 				p[2].y = 1 + (p[0].y = b.y - 2);
974 				p[2].x = p[0].x = b.x + 1;
975 				p[1].y = a.y - 1;
976 				p[1].x = a.x + 0;
977 				p = out.AddSeg(2, 2);
978 				p[2].y = 1 + (p[0].y = a.y + 0);
979 				p[2].x = p[0].x = a.x + 0;
980 				p[3].y = 1 + (p[1].y = b.y + 0);
981 				p[3].x = p[1].x = b.x + 1;
982 			}
983 			else
984 			{
985 				p = out.AddSeg(3);
986 				p[2].x = 1 + (p[0].x = b.x - 2);
987 				p[2].y = p[0].y = b.y + -1;
988 				p[1].x = a.x - 1;
989 				p[1].y = a.y + 0;
990 				p = out.AddSeg(2, 2);
991 				p[2].x = 1 + (p[0].x = a.x + 0);
992 				p[2].y = p[0].y = a.y + 0;
993 				p[3].x = 1 + (p[1].x = b.x + 0);
994 				p[3].y = p[1].y = b.y + -1;
995 			}
996 		}
997 		else
998 		{
999 			if(dy >= dx)
1000 			{
1001 				p = out.AddSeg(3);
1002 				p[2].y = 1 + (p[0].y = b.y - 2);
1003 				p[2].x = p[0].x = b.x + -1;
1004 				p[1].y = a.y - 1;
1005 				p[1].x = a.x + 0;
1006 				p = out.AddSeg(2, 2);
1007 				p[2].y = 1 + (p[0].y = a.y + 0);
1008 				p[2].x = p[0].x = a.x + 0;
1009 				p[3].y = 1 + (p[1].y = b.y + 0);
1010 				p[3].x = p[1].x = b.x + -1;
1011 			}
1012 			else
1013 			{
1014 				p = out.AddSeg(3);
1015 				p[2].x = 1 + (p[0].x = b.x - 2);
1016 				p[2].y = p[0].y = b.y + -1;
1017 				p[1].x = a.x - 1;
1018 				p[1].y = a.y + 0;
1019 				p = out.AddSeg(2, 2);
1020 				p[2].x = 1 + (p[0].x = a.x + 0);
1021 				p[2].y = p[0].y = a.y + 0;
1022 				p[3].x = 1 + (p[1].x = b.x + 0);
1023 				p[3].y = p[1].y = b.y + -1;
1024 			}
1025 		}
1026 	}
1027 }
1028 
1029 //////////////////////////////////////////////////////////////////////
1030 
PathDraw_Output_2_5(PathDraw::Output & out,Point a,Point b)1031 static void PathDraw_Output_2_5(PathDraw::Output& out, Point a, Point b)
1032 {
1033 	//RTIMING("PathDraw_Output_2_5");
1034 	Point *p;
1035 	int dx = b.x - a.x, dy = b.y - a.y;
1036 	if(dy >= 0)
1037 	{
1038 		if(dx >= 0)
1039 		{
1040 			if(dx >= dy)
1041 			{
1042 				p = out.AddSeg(3);
1043 				p[2].y = 1 + (p[0].y = b.y - 2);
1044 				p[2].x = p[0].x = b.x + 1;
1045 				p[1].y = a.y - 1;
1046 				p[1].x = a.x + 0;
1047 				p = out.AddSeg(3, 2);
1048 				p[0].y = a.y - 1;
1049 				p[0].x = a.x + 0;
1050 				p[1].y = b.y - 0;
1051 				p[1].x = b.x + 1;
1052 				p[4].y = 1 + (p[2].y = a.y + 0);
1053 				p[4].x = p[2].x = a.x + 0;
1054 				p[5].y = 1 + (p[3].y = b.y + 1);
1055 				p[5].x = p[3].x = b.x + 1;
1056 			}
1057 			else
1058 			{
1059 				p = out.AddSeg(3);
1060 				p[2].x = 1 + (p[0].x = b.x - 2);
1061 				p[2].y = p[0].y = b.y + 1;
1062 				p[1].x = a.x - 1;
1063 				p[1].y = a.y + 0;
1064 				p = out.AddSeg(3, 2);
1065 				p[0].x = a.x - 1;
1066 				p[0].y = a.y + 0;
1067 				p[1].x = b.x - 0;
1068 				p[1].y = b.y + 1;
1069 				p[4].x = 1 + (p[2].x = a.x + 0);
1070 				p[4].y = p[2].y = a.y + 0;
1071 				p[5].x = 1 + (p[3].x = b.x + 1);
1072 				p[5].y = p[3].y = b.y + 1;
1073 			}
1074 		}
1075 		else
1076 		{
1077 			if(0 >= dx + dy)
1078 			{
1079 				p = out.AddSeg(3);
1080 				p[2].y = 1 + (p[0].y = b.y - 2);
1081 				p[2].x = p[0].x = b.x + -1;
1082 				p[1].y = a.y - 1;
1083 				p[1].x = a.x + 0;
1084 				p = out.AddSeg(3, 2);
1085 				p[0].y = a.y - 1;
1086 				p[0].x = a.x + 0;
1087 				p[1].y = b.y - 0;
1088 				p[1].x = b.x + -1;
1089 				p[4].y = 1 + (p[2].y = a.y + 0);
1090 				p[4].x = p[2].x = a.x + 0;
1091 				p[5].y = 1 + (p[3].y = b.y + 1);
1092 				p[5].x = p[3].x = b.x + -1;
1093 			}
1094 			else
1095 			{
1096 				p = out.AddSeg(3);
1097 				p[2].x = 1 + (p[0].x = b.x - 2);
1098 				p[2].y = p[0].y = b.y + 1;
1099 				p[1].x = a.x - 1;
1100 				p[1].y = a.y + 0;
1101 				p = out.AddSeg(3, 2);
1102 				p[0].x = a.x - 1;
1103 				p[0].y = a.y + 0;
1104 				p[1].x = b.x - 0;
1105 				p[1].y = b.y + 1;
1106 				p[4].x = 1 + (p[2].x = a.x + 0);
1107 				p[4].y = p[2].y = a.y + 0;
1108 				p[5].x = 1 + (p[3].x = b.x + 1);
1109 				p[5].y = p[3].y = b.y + 1;
1110 			}
1111 		}
1112 	}
1113 	else
1114 	{
1115 		if(dx >= 0)
1116 		{
1117 			if(dx + dy >= 0)
1118 			{
1119 				p = out.AddSeg(3);
1120 				p[2].y = 1 + (p[0].y = b.y - 2);
1121 				p[2].x = p[0].x = b.x + 1;
1122 				p[1].y = a.y - 1;
1123 				p[1].x = a.x + 0;
1124 				p = out.AddSeg(3, 2);
1125 				p[0].y = a.y - 1;
1126 				p[0].x = a.x + 0;
1127 				p[1].y = b.y - 0;
1128 				p[1].x = b.x + 1;
1129 				p[4].y = 1 + (p[2].y = a.y + 0);
1130 				p[4].x = p[2].x = a.x + 0;
1131 				p[5].y = 1 + (p[3].y = b.y + 1);
1132 				p[5].x = p[3].x = b.x + 1;
1133 			}
1134 			else
1135 			{
1136 				p = out.AddSeg(3);
1137 				p[2].x = 1 + (p[0].x = b.x - 2);
1138 				p[2].y = p[0].y = b.y + -1;
1139 				p[1].x = a.x - 1;
1140 				p[1].y = a.y + 0;
1141 				p = out.AddSeg(3, 2);
1142 				p[0].x = a.x - 1;
1143 				p[0].y = a.y + 0;
1144 				p[1].x = b.x - 0;
1145 				p[1].y = b.y + -1;
1146 				p[4].x = 1 + (p[2].x = a.x + 0);
1147 				p[4].y = p[2].y = a.y + 0;
1148 				p[5].x = 1 + (p[3].x = b.x + 1);
1149 				p[5].y = p[3].y = b.y + -1;
1150 			}
1151 		}
1152 		else
1153 		{
1154 			if(dy >= dx)
1155 			{
1156 				p = out.AddSeg(3);
1157 				p[2].y = 1 + (p[0].y = b.y - 2);
1158 				p[2].x = p[0].x = b.x + -1;
1159 				p[1].y = a.y - 1;
1160 				p[1].x = a.x + 0;
1161 				p = out.AddSeg(3, 2);
1162 				p[0].y = a.y - 1;
1163 				p[0].x = a.x + 0;
1164 				p[1].y = b.y - 0;
1165 				p[1].x = b.x + -1;
1166 				p[4].y = 1 + (p[2].y = a.y + 0);
1167 				p[4].x = p[2].x = a.x + 0;
1168 				p[5].y = 1 + (p[3].y = b.y + 1);
1169 				p[5].x = p[3].x = b.x + -1;
1170 			}
1171 			else
1172 			{
1173 				p = out.AddSeg(3);
1174 				p[2].x = 1 + (p[0].x = b.x - 2);
1175 				p[2].y = p[0].y = b.y + -1;
1176 				p[1].x = a.x - 1;
1177 				p[1].y = a.y + 0;
1178 				p = out.AddSeg(3, 2);
1179 				p[0].x = a.x - 1;
1180 				p[0].y = a.y + 0;
1181 				p[1].x = b.x - 0;
1182 				p[1].y = b.y + -1;
1183 				p[4].x = 1 + (p[2].x = a.x + 0);
1184 				p[4].y = p[2].y = a.y + 0;
1185 				p[5].x = 1 + (p[3].x = b.x + 1);
1186 				p[5].y = p[3].y = b.y + -1;
1187 			}
1188 		}
1189 	}
1190 }
1191 
1192 //////////////////////////////////////////////////////////////////////
1193 
PathDraw_Output_3_1(PathDraw::Output & out,Point a,Point b)1194 static void PathDraw_Output_3_1(PathDraw::Output& out, Point a, Point b)
1195 {
1196 	//RTIMING("PathDraw_Output_3_1");
1197 	Point *p;
1198 	int dx = b.x - a.x, dy = b.y - a.y;
1199 	if(dy >= 0)
1200 	{
1201 		if(dx >= 0)
1202 		{
1203 			if(dx >= dy)
1204 			{
1205 				p = out.AddSeg(3);
1206 				p[2].y = 1 + (p[0].y = a.y - 1);
1207 				p[2].x = p[0].x = a.x + 0;
1208 				p[1].y = b.y - 0;
1209 				p[1].x = b.x + 0;
1210 				p = out.AddSeg(2);
1211 				p[0].y = b.y + 1;
1212 				p[0].x = b.x + 0;
1213 				p[1].y = a.y + 1;
1214 				p[1].x = a.x + 0;
1215 			}
1216 			else
1217 			{
1218 				p = out.AddSeg(3);
1219 				p[2].x = 1 + (p[0].x = a.x - 1);
1220 				p[2].y = p[0].y = a.y + 0;
1221 				p[1].x = b.x - 0;
1222 				p[1].y = b.y + 0;
1223 				p = out.AddSeg(2);
1224 				p[0].x = b.x + 1;
1225 				p[0].y = b.y + 0;
1226 				p[1].x = a.x + 1;
1227 				p[1].y = a.y + 0;
1228 			}
1229 		}
1230 		else
1231 		{
1232 			if(0 >= dx + dy)
1233 			{
1234 				p = out.AddSeg(3);
1235 				p[2].y = 1 + (p[0].y = a.y - 1);
1236 				p[2].x = p[0].x = a.x + 0;
1237 				p[1].y = b.y - 0;
1238 				p[1].x = b.x + 0;
1239 				p = out.AddSeg(2);
1240 				p[0].y = b.y + 1;
1241 				p[0].x = b.x + 0;
1242 				p[1].y = a.y + 1;
1243 				p[1].x = a.x + 0;
1244 			}
1245 			else
1246 			{
1247 				p = out.AddSeg(3);
1248 				p[2].x = 1 + (p[0].x = a.x - 1);
1249 				p[2].y = p[0].y = a.y + 0;
1250 				p[1].x = b.x - 0;
1251 				p[1].y = b.y + 0;
1252 				p = out.AddSeg(2);
1253 				p[0].x = b.x + 1;
1254 				p[0].y = b.y + 0;
1255 				p[1].x = a.x + 1;
1256 				p[1].y = a.y + 0;
1257 			}
1258 		}
1259 	}
1260 	else
1261 	{
1262 		if(dx >= 0)
1263 		{
1264 			if(dx + dy >= 0)
1265 			{
1266 				p = out.AddSeg(3);
1267 				p[2].y = 1 + (p[0].y = a.y - 1);
1268 				p[2].x = p[0].x = a.x + 0;
1269 				p[1].y = b.y - 0;
1270 				p[1].x = b.x + 0;
1271 				p = out.AddSeg(2);
1272 				p[0].y = b.y + 1;
1273 				p[0].x = b.x + 0;
1274 				p[1].y = a.y + 1;
1275 				p[1].x = a.x + 0;
1276 			}
1277 			else
1278 			{
1279 				p = out.AddSeg(3);
1280 				p[2].x = 1 + (p[0].x = a.x - 1);
1281 				p[2].y = p[0].y = a.y + 0;
1282 				p[1].x = b.x - 0;
1283 				p[1].y = b.y + 0;
1284 				p = out.AddSeg(2);
1285 				p[0].x = b.x + 1;
1286 				p[0].y = b.y + 0;
1287 				p[1].x = a.x + 1;
1288 				p[1].y = a.y + 0;
1289 			}
1290 		}
1291 		else
1292 		{
1293 			if(dy >= dx)
1294 			{
1295 				p = out.AddSeg(3);
1296 				p[2].y = 1 + (p[0].y = a.y - 1);
1297 				p[2].x = p[0].x = a.x + 0;
1298 				p[1].y = b.y - 0;
1299 				p[1].x = b.x + 0;
1300 				p = out.AddSeg(2);
1301 				p[0].y = b.y + 1;
1302 				p[0].x = b.x + 0;
1303 				p[1].y = a.y + 1;
1304 				p[1].x = a.x + 0;
1305 			}
1306 			else
1307 			{
1308 				p = out.AddSeg(3);
1309 				p[2].x = 1 + (p[0].x = a.x - 1);
1310 				p[2].y = p[0].y = a.y + 0;
1311 				p[1].x = b.x - 0;
1312 				p[1].y = b.y + 0;
1313 				p = out.AddSeg(2);
1314 				p[0].x = b.x + 1;
1315 				p[0].y = b.y + 0;
1316 				p[1].x = a.x + 1;
1317 				p[1].y = a.y + 0;
1318 			}
1319 		}
1320 	}
1321 }
1322 
1323 //////////////////////////////////////////////////////////////////////
1324 
PathDraw_Output_3_2(PathDraw::Output & out,Point a,Point b)1325 static void PathDraw_Output_3_2(PathDraw::Output& out, Point a, Point b)
1326 {
1327 	//RTIMING("PathDraw_Output_3_2");
1328 	Point *p;
1329 	int dx = b.x - a.x, dy = b.y - a.y;
1330 	if(dy >= 0)
1331 	{
1332 		if(dx >= 0)
1333 		{
1334 			if(dx >= dy)
1335 			{
1336 				p = out.AddSeg(3, 2);
1337 				p[0].y = b.y - 1;
1338 				p[0].x = b.x + 0;
1339 				p[1].y = a.y - 1;
1340 				p[1].x = a.x + 0;
1341 				p[4].y = 1 + (p[2].y = b.y + 0);
1342 				p[4].x = p[2].x = b.x + 0;
1343 				p[5].y = 1 + (p[3].y = a.y + 0);
1344 				p[5].x = p[3].x = a.x + 0;
1345 			}
1346 			else
1347 			{
1348 				p = out.AddSeg(3, 2);
1349 				p[0].x = b.x - 1;
1350 				p[0].y = b.y + 0;
1351 				p[1].x = a.x - 1;
1352 				p[1].y = a.y + 0;
1353 				p[4].x = 1 + (p[2].x = b.x + 0);
1354 				p[4].y = p[2].y = b.y + 0;
1355 				p[5].x = 1 + (p[3].x = a.x + 0);
1356 				p[5].y = p[3].y = a.y + 0;
1357 			}
1358 		}
1359 		else
1360 		{
1361 			if(0 >= dx + dy)
1362 			{
1363 				p = out.AddSeg(3, 2);
1364 				p[0].y = b.y - 1;
1365 				p[0].x = b.x + 0;
1366 				p[1].y = a.y - 1;
1367 				p[1].x = a.x + 0;
1368 				p[4].y = 1 + (p[2].y = b.y + 0);
1369 				p[4].x = p[2].x = b.x + 0;
1370 				p[5].y = 1 + (p[3].y = a.y + 0);
1371 				p[5].x = p[3].x = a.x + 0;
1372 			}
1373 			else
1374 			{
1375 				p = out.AddSeg(3, 2);
1376 				p[0].x = b.x - 1;
1377 				p[0].y = b.y + 0;
1378 				p[1].x = a.x - 1;
1379 				p[1].y = a.y + 0;
1380 				p[4].x = 1 + (p[2].x = b.x + 0);
1381 				p[4].y = p[2].y = b.y + 0;
1382 				p[5].x = 1 + (p[3].x = a.x + 0);
1383 				p[5].y = p[3].y = a.y + 0;
1384 			}
1385 		}
1386 	}
1387 	else
1388 	{
1389 		if(dx >= 0)
1390 		{
1391 			if(dx + dy >= 0)
1392 			{
1393 				p = out.AddSeg(3, 2);
1394 				p[0].y = b.y - 1;
1395 				p[0].x = b.x + 0;
1396 				p[1].y = a.y - 1;
1397 				p[1].x = a.x + 0;
1398 				p[4].y = 1 + (p[2].y = b.y + 0);
1399 				p[4].x = p[2].x = b.x + 0;
1400 				p[5].y = 1 + (p[3].y = a.y + 0);
1401 				p[5].x = p[3].x = a.x + 0;
1402 			}
1403 			else
1404 			{
1405 				p = out.AddSeg(3, 2);
1406 				p[0].x = b.x - 1;
1407 				p[0].y = b.y + 0;
1408 				p[1].x = a.x - 1;
1409 				p[1].y = a.y + 0;
1410 				p[4].x = 1 + (p[2].x = b.x + 0);
1411 				p[4].y = p[2].y = b.y + 0;
1412 				p[5].x = 1 + (p[3].x = a.x + 0);
1413 				p[5].y = p[3].y = a.y + 0;
1414 			}
1415 		}
1416 		else
1417 		{
1418 			if(dy >= dx)
1419 			{
1420 				p = out.AddSeg(3, 2);
1421 				p[0].y = b.y - 1;
1422 				p[0].x = b.x + 0;
1423 				p[1].y = a.y - 1;
1424 				p[1].x = a.x + 0;
1425 				p[4].y = 1 + (p[2].y = b.y + 0);
1426 				p[4].x = p[2].x = b.x + 0;
1427 				p[5].y = 1 + (p[3].y = a.y + 0);
1428 				p[5].x = p[3].x = a.x + 0;
1429 			}
1430 			else
1431 			{
1432 				p = out.AddSeg(3, 2);
1433 				p[0].x = b.x - 1;
1434 				p[0].y = b.y + 0;
1435 				p[1].x = a.x - 1;
1436 				p[1].y = a.y + 0;
1437 				p[4].x = 1 + (p[2].x = b.x + 0);
1438 				p[4].y = p[2].y = b.y + 0;
1439 				p[5].x = 1 + (p[3].x = a.x + 0);
1440 				p[5].y = p[3].y = a.y + 0;
1441 			}
1442 		}
1443 	}
1444 }
1445 
1446 //////////////////////////////////////////////////////////////////////
1447 
PathDraw_Output_3_3(PathDraw::Output & out,Point a,Point b)1448 static void PathDraw_Output_3_3(PathDraw::Output& out, Point a, Point b)
1449 {
1450 	//RTIMING("PathDraw_Output_3_3");
1451 	Point *p;
1452 	int dx = b.x - a.x, dy = b.y - a.y;
1453 	if(dy >= 0)
1454 	{
1455 		if(dx >= 0)
1456 		{
1457 			if(dx >= dy)
1458 			{
1459 				p = out.AddSeg(3, 2);
1460 				p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -1));
1461 				p[4].x = p[2].x = p[0].x = a.x + 0;
1462 				p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -1));
1463 				p[5].x = p[3].x = p[1].x = b.x + 0;
1464 			}
1465 			else
1466 			{
1467 				p = out.AddSeg(3, 2);
1468 				p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -1));
1469 				p[4].y = p[2].y = p[0].y = a.y + 0;
1470 				p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -1));
1471 				p[5].y = p[3].y = p[1].y = b.y + 0;
1472 			}
1473 		}
1474 		else
1475 		{
1476 			if(0 >= dx + dy)
1477 			{
1478 				p = out.AddSeg(3, 2);
1479 				p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -1));
1480 				p[4].x = p[2].x = p[0].x = a.x + 0;
1481 				p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -1));
1482 				p[5].x = p[3].x = p[1].x = b.x + 0;
1483 			}
1484 			else
1485 			{
1486 				p = out.AddSeg(3, 2);
1487 				p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -1));
1488 				p[4].y = p[2].y = p[0].y = a.y + 0;
1489 				p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -1));
1490 				p[5].y = p[3].y = p[1].y = b.y + 0;
1491 			}
1492 		}
1493 	}
1494 	else
1495 	{
1496 		if(dx >= 0)
1497 		{
1498 			if(dx + dy >= 0)
1499 			{
1500 				p = out.AddSeg(3, 2);
1501 				p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -1));
1502 				p[4].x = p[2].x = p[0].x = a.x + 0;
1503 				p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -1));
1504 				p[5].x = p[3].x = p[1].x = b.x + 0;
1505 			}
1506 			else
1507 			{
1508 				p = out.AddSeg(3, 2);
1509 				p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -1));
1510 				p[4].y = p[2].y = p[0].y = a.y + 0;
1511 				p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -1));
1512 				p[5].y = p[3].y = p[1].y = b.y + 0;
1513 			}
1514 		}
1515 		else
1516 		{
1517 			if(dy >= dx)
1518 			{
1519 				p = out.AddSeg(3, 2);
1520 				p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -1));
1521 				p[4].x = p[2].x = p[0].x = a.x + 0;
1522 				p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -1));
1523 				p[5].x = p[3].x = p[1].x = b.x + 0;
1524 			}
1525 			else
1526 			{
1527 				p = out.AddSeg(3, 2);
1528 				p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -1));
1529 				p[4].y = p[2].y = p[0].y = a.y + 0;
1530 				p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -1));
1531 				p[5].y = p[3].y = p[1].y = b.y + 0;
1532 			}
1533 		}
1534 	}
1535 }
1536 
1537 //////////////////////////////////////////////////////////////////////
1538 
PathDraw_Output_3_4(PathDraw::Output & out,Point a,Point b)1539 static void PathDraw_Output_3_4(PathDraw::Output& out, Point a, Point b)
1540 {
1541 	//RTIMING("PathDraw_Output_3_4");
1542 	Point *p;
1543 	int dx = b.x - a.x, dy = b.y - a.y;
1544 	if(dy >= 0)
1545 	{
1546 		if(dx >= 0)
1547 		{
1548 			if(dx >= dy)
1549 			{
1550 				p = out.AddSeg(4, 2);
1551 				p[0].y = a.y - 1;
1552 				p[0].x = a.x + 0;
1553 				p[1].y = b.y - 2;
1554 				p[1].x = b.x + 1;
1555 				p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + 0));
1556 				p[6].x = p[4].x = p[2].x = a.x + 0;
1557 				p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1));
1558 				p[7].x = p[5].x = p[3].x = b.x + 1;
1559 			}
1560 			else
1561 			{
1562 				p = out.AddSeg(4, 2);
1563 				p[0].x = a.x - 1;
1564 				p[0].y = a.y + 0;
1565 				p[1].x = b.x - 2;
1566 				p[1].y = b.y + 1;
1567 				p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + 0));
1568 				p[6].y = p[4].y = p[2].y = a.y + 0;
1569 				p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1));
1570 				p[7].y = p[5].y = p[3].y = b.y + 1;
1571 			}
1572 		}
1573 		else
1574 		{
1575 			if(0 >= dx + dy)
1576 			{
1577 				p = out.AddSeg(4, 2);
1578 				p[0].y = a.y - 1;
1579 				p[0].x = a.x + 0;
1580 				p[1].y = b.y - 2;
1581 				p[1].x = b.x + -1;
1582 				p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + 0));
1583 				p[6].x = p[4].x = p[2].x = a.x + 0;
1584 				p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1));
1585 				p[7].x = p[5].x = p[3].x = b.x + -1;
1586 			}
1587 			else
1588 			{
1589 				p = out.AddSeg(4, 2);
1590 				p[0].x = a.x - 1;
1591 				p[0].y = a.y + 0;
1592 				p[1].x = b.x - 2;
1593 				p[1].y = b.y + 1;
1594 				p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + 0));
1595 				p[6].y = p[4].y = p[2].y = a.y + 0;
1596 				p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1));
1597 				p[7].y = p[5].y = p[3].y = b.y + 1;
1598 			}
1599 		}
1600 	}
1601 	else
1602 	{
1603 		if(dx >= 0)
1604 		{
1605 			if(dx + dy >= 0)
1606 			{
1607 				p = out.AddSeg(4, 2);
1608 				p[0].y = a.y - 1;
1609 				p[0].x = a.x + 0;
1610 				p[1].y = b.y - 2;
1611 				p[1].x = b.x + 1;
1612 				p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + 0));
1613 				p[6].x = p[4].x = p[2].x = a.x + 0;
1614 				p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1));
1615 				p[7].x = p[5].x = p[3].x = b.x + 1;
1616 			}
1617 			else
1618 			{
1619 				p = out.AddSeg(4, 2);
1620 				p[0].x = a.x - 1;
1621 				p[0].y = a.y + 0;
1622 				p[1].x = b.x - 2;
1623 				p[1].y = b.y + -1;
1624 				p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + 0));
1625 				p[6].y = p[4].y = p[2].y = a.y + 0;
1626 				p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1));
1627 				p[7].y = p[5].y = p[3].y = b.y + -1;
1628 			}
1629 		}
1630 		else
1631 		{
1632 			if(dy >= dx)
1633 			{
1634 				p = out.AddSeg(4, 2);
1635 				p[0].y = a.y - 1;
1636 				p[0].x = a.x + 0;
1637 				p[1].y = b.y - 2;
1638 				p[1].x = b.x + -1;
1639 				p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + 0));
1640 				p[6].x = p[4].x = p[2].x = a.x + 0;
1641 				p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1));
1642 				p[7].x = p[5].x = p[3].x = b.x + -1;
1643 			}
1644 			else
1645 			{
1646 				p = out.AddSeg(4, 2);
1647 				p[0].x = a.x - 1;
1648 				p[0].y = a.y + 0;
1649 				p[1].x = b.x - 2;
1650 				p[1].y = b.y + -1;
1651 				p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + 0));
1652 				p[6].y = p[4].y = p[2].y = a.y + 0;
1653 				p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1));
1654 				p[7].y = p[5].y = p[3].y = b.y + -1;
1655 			}
1656 		}
1657 	}
1658 }
1659 
1660 //////////////////////////////////////////////////////////////////////
1661 
PathDraw_Output_3_5(PathDraw::Output & out,Point a,Point b)1662 static void PathDraw_Output_3_5(PathDraw::Output& out, Point a, Point b)
1663 {
1664 	//RTIMING("PathDraw_Output_3_5");
1665 	Point *p;
1666 	int dx = b.x - a.x, dy = b.y - a.y;
1667 	if(dy >= 0)
1668 	{
1669 		if(dx >= 0)
1670 		{
1671 			if(dx >= dy)
1672 			{
1673 				p = out.AddSeg(3);
1674 				p[2].y = 1 + (p[0].y = b.y - 2);
1675 				p[2].x = p[0].x = b.x + 1;
1676 				p[1].y = a.y - 1;
1677 				p[1].x = a.x + 0;
1678 				p = out.AddSeg(3, 2);
1679 				p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + 0));
1680 				p[4].x = p[2].x = p[0].x = a.x + 0;
1681 				p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + 0));
1682 				p[5].x = p[3].x = p[1].x = b.x + 1;
1683 			}
1684 			else
1685 			{
1686 				p = out.AddSeg(3);
1687 				p[2].x = 1 + (p[0].x = b.x - 2);
1688 				p[2].y = p[0].y = b.y + 1;
1689 				p[1].x = a.x - 1;
1690 				p[1].y = a.y + 0;
1691 				p = out.AddSeg(3, 2);
1692 				p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + 0));
1693 				p[4].y = p[2].y = p[0].y = a.y + 0;
1694 				p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + 0));
1695 				p[5].y = p[3].y = p[1].y = b.y + 1;
1696 			}
1697 		}
1698 		else
1699 		{
1700 			if(0 >= dx + dy)
1701 			{
1702 				p = out.AddSeg(3);
1703 				p[2].y = 1 + (p[0].y = b.y - 2);
1704 				p[2].x = p[0].x = b.x + -1;
1705 				p[1].y = a.y - 1;
1706 				p[1].x = a.x + 0;
1707 				p = out.AddSeg(3, 2);
1708 				p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + 0));
1709 				p[4].x = p[2].x = p[0].x = a.x + 0;
1710 				p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + 0));
1711 				p[5].x = p[3].x = p[1].x = b.x + -1;
1712 			}
1713 			else
1714 			{
1715 				p = out.AddSeg(3);
1716 				p[2].x = 1 + (p[0].x = b.x - 2);
1717 				p[2].y = p[0].y = b.y + 1;
1718 				p[1].x = a.x - 1;
1719 				p[1].y = a.y + 0;
1720 				p = out.AddSeg(3, 2);
1721 				p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + 0));
1722 				p[4].y = p[2].y = p[0].y = a.y + 0;
1723 				p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + 0));
1724 				p[5].y = p[3].y = p[1].y = b.y + 1;
1725 			}
1726 		}
1727 	}
1728 	else
1729 	{
1730 		if(dx >= 0)
1731 		{
1732 			if(dx + dy >= 0)
1733 			{
1734 				p = out.AddSeg(3);
1735 				p[2].y = 1 + (p[0].y = b.y - 2);
1736 				p[2].x = p[0].x = b.x + 1;
1737 				p[1].y = a.y - 1;
1738 				p[1].x = a.x + 0;
1739 				p = out.AddSeg(3, 2);
1740 				p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + 0));
1741 				p[4].x = p[2].x = p[0].x = a.x + 0;
1742 				p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + 0));
1743 				p[5].x = p[3].x = p[1].x = b.x + 1;
1744 			}
1745 			else
1746 			{
1747 				p = out.AddSeg(3);
1748 				p[2].x = 1 + (p[0].x = b.x - 2);
1749 				p[2].y = p[0].y = b.y + -1;
1750 				p[1].x = a.x - 1;
1751 				p[1].y = a.y + 0;
1752 				p = out.AddSeg(3, 2);
1753 				p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + 0));
1754 				p[4].y = p[2].y = p[0].y = a.y + 0;
1755 				p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + 0));
1756 				p[5].y = p[3].y = p[1].y = b.y + -1;
1757 			}
1758 		}
1759 		else
1760 		{
1761 			if(dy >= dx)
1762 			{
1763 				p = out.AddSeg(3);
1764 				p[2].y = 1 + (p[0].y = b.y - 2);
1765 				p[2].x = p[0].x = b.x + -1;
1766 				p[1].y = a.y - 1;
1767 				p[1].x = a.x + 0;
1768 				p = out.AddSeg(3, 2);
1769 				p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + 0));
1770 				p[4].x = p[2].x = p[0].x = a.x + 0;
1771 				p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + 0));
1772 				p[5].x = p[3].x = p[1].x = b.x + -1;
1773 			}
1774 			else
1775 			{
1776 				p = out.AddSeg(3);
1777 				p[2].x = 1 + (p[0].x = b.x - 2);
1778 				p[2].y = p[0].y = b.y + -1;
1779 				p[1].x = a.x - 1;
1780 				p[1].y = a.y + 0;
1781 				p = out.AddSeg(3, 2);
1782 				p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + 0));
1783 				p[4].y = p[2].y = p[0].y = a.y + 0;
1784 				p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + 0));
1785 				p[5].y = p[3].y = p[1].y = b.y + -1;
1786 			}
1787 		}
1788 	}
1789 }
1790 
1791 //////////////////////////////////////////////////////////////////////
1792 
PathDraw_Output_4_1(PathDraw::Output & out,Point a,Point b)1793 static void PathDraw_Output_4_1(PathDraw::Output& out, Point a, Point b)
1794 {
1795 	//RTIMING("PathDraw_Output_4_1");
1796 	Point *p;
1797 	int dx = b.x - a.x, dy = b.y - a.y;
1798 	if(dy >= 0)
1799 	{
1800 		if(dx >= 0)
1801 		{
1802 			if(dx >= dy)
1803 			{
1804 				p = out.AddSeg(3);
1805 				p[2].y = 1 + (p[0].y = a.y - 2);
1806 				p[2].x = p[0].x = a.x + -1;
1807 				p[1].y = b.y - 0;
1808 				p[1].x = b.x + 0;
1809 				p = out.AddSeg(2, 2);
1810 				p[0].y = b.y - 0;
1811 				p[0].x = b.x + 0;
1812 				p[1].y = a.y - 0;
1813 				p[1].x = a.x + -1;
1814 				p[2].y = b.y + 1;
1815 				p[2].x = b.x + 0;
1816 				p[3].y = a.y + 1;
1817 				p[3].x = a.x + -1;
1818 			}
1819 			else
1820 			{
1821 				p = out.AddSeg(3);
1822 				p[2].x = 1 + (p[0].x = a.x - 2);
1823 				p[2].y = p[0].y = a.y + -1;
1824 				p[1].x = b.x - 0;
1825 				p[1].y = b.y + 0;
1826 				p = out.AddSeg(2, 2);
1827 				p[0].x = b.x - 0;
1828 				p[0].y = b.y + 0;
1829 				p[1].x = a.x - 0;
1830 				p[1].y = a.y + -1;
1831 				p[2].x = b.x + 1;
1832 				p[2].y = b.y + 0;
1833 				p[3].x = a.x + 1;
1834 				p[3].y = a.y + -1;
1835 			}
1836 		}
1837 		else
1838 		{
1839 			if(0 >= dx + dy)
1840 			{
1841 				p = out.AddSeg(3);
1842 				p[2].y = 1 + (p[0].y = a.y - 2);
1843 				p[2].x = p[0].x = a.x + 1;
1844 				p[1].y = b.y - 0;
1845 				p[1].x = b.x + 0;
1846 				p = out.AddSeg(2, 2);
1847 				p[0].y = b.y - 0;
1848 				p[0].x = b.x + 0;
1849 				p[1].y = a.y - 0;
1850 				p[1].x = a.x + 1;
1851 				p[2].y = b.y + 1;
1852 				p[2].x = b.x + 0;
1853 				p[3].y = a.y + 1;
1854 				p[3].x = a.x + 1;
1855 			}
1856 			else
1857 			{
1858 				p = out.AddSeg(3);
1859 				p[2].x = 1 + (p[0].x = a.x - 2);
1860 				p[2].y = p[0].y = a.y + -1;
1861 				p[1].x = b.x - 0;
1862 				p[1].y = b.y + 0;
1863 				p = out.AddSeg(2, 2);
1864 				p[0].x = b.x - 0;
1865 				p[0].y = b.y + 0;
1866 				p[1].x = a.x - 0;
1867 				p[1].y = a.y + -1;
1868 				p[2].x = b.x + 1;
1869 				p[2].y = b.y + 0;
1870 				p[3].x = a.x + 1;
1871 				p[3].y = a.y + -1;
1872 			}
1873 		}
1874 	}
1875 	else
1876 	{
1877 		if(dx >= 0)
1878 		{
1879 			if(dx + dy >= 0)
1880 			{
1881 				p = out.AddSeg(3);
1882 				p[2].y = 1 + (p[0].y = a.y - 2);
1883 				p[2].x = p[0].x = a.x + -1;
1884 				p[1].y = b.y - 0;
1885 				p[1].x = b.x + 0;
1886 				p = out.AddSeg(2, 2);
1887 				p[0].y = b.y - 0;
1888 				p[0].x = b.x + 0;
1889 				p[1].y = a.y - 0;
1890 				p[1].x = a.x + -1;
1891 				p[2].y = b.y + 1;
1892 				p[2].x = b.x + 0;
1893 				p[3].y = a.y + 1;
1894 				p[3].x = a.x + -1;
1895 			}
1896 			else
1897 			{
1898 				p = out.AddSeg(3);
1899 				p[2].x = 1 + (p[0].x = a.x - 2);
1900 				p[2].y = p[0].y = a.y + 1;
1901 				p[1].x = b.x - 0;
1902 				p[1].y = b.y + 0;
1903 				p = out.AddSeg(2, 2);
1904 				p[0].x = b.x - 0;
1905 				p[0].y = b.y + 0;
1906 				p[1].x = a.x - 0;
1907 				p[1].y = a.y + 1;
1908 				p[2].x = b.x + 1;
1909 				p[2].y = b.y + 0;
1910 				p[3].x = a.x + 1;
1911 				p[3].y = a.y + 1;
1912 			}
1913 		}
1914 		else
1915 		{
1916 			if(dy >= dx)
1917 			{
1918 				p = out.AddSeg(3);
1919 				p[2].y = 1 + (p[0].y = a.y - 2);
1920 				p[2].x = p[0].x = a.x + 1;
1921 				p[1].y = b.y - 0;
1922 				p[1].x = b.x + 0;
1923 				p = out.AddSeg(2, 2);
1924 				p[0].y = b.y - 0;
1925 				p[0].x = b.x + 0;
1926 				p[1].y = a.y - 0;
1927 				p[1].x = a.x + 1;
1928 				p[2].y = b.y + 1;
1929 				p[2].x = b.x + 0;
1930 				p[3].y = a.y + 1;
1931 				p[3].x = a.x + 1;
1932 			}
1933 			else
1934 			{
1935 				p = out.AddSeg(3);
1936 				p[2].x = 1 + (p[0].x = a.x - 2);
1937 				p[2].y = p[0].y = a.y + 1;
1938 				p[1].x = b.x - 0;
1939 				p[1].y = b.y + 0;
1940 				p = out.AddSeg(2, 2);
1941 				p[0].x = b.x - 0;
1942 				p[0].y = b.y + 0;
1943 				p[1].x = a.x - 0;
1944 				p[1].y = a.y + 1;
1945 				p[2].x = b.x + 1;
1946 				p[2].y = b.y + 0;
1947 				p[3].x = a.x + 1;
1948 				p[3].y = a.y + 1;
1949 			}
1950 		}
1951 	}
1952 }
1953 
1954 //////////////////////////////////////////////////////////////////////
1955 
PathDraw_Output_4_2(PathDraw::Output & out,Point a,Point b)1956 static void PathDraw_Output_4_2(PathDraw::Output& out, Point a, Point b)
1957 {
1958 	//RTIMING("PathDraw_Output_4_2");
1959 	Point *p;
1960 	int dx = b.x - a.x, dy = b.y - a.y;
1961 	if(dy >= 0)
1962 	{
1963 		if(dx >= 0)
1964 		{
1965 			if(dx >= dy)
1966 			{
1967 				p = out.AddSeg(3);
1968 				p[2].y = 1 + (p[0].y = a.y - 2);
1969 				p[2].x = p[0].x = a.x + -1;
1970 				p[1].y = b.y - 1;
1971 				p[1].x = b.x + 0;
1972 				p = out.AddSeg(2, 2);
1973 				p[2].y = 1 + (p[0].y = b.y + 0);
1974 				p[2].x = p[0].x = b.x + 0;
1975 				p[3].y = 1 + (p[1].y = a.y + 0);
1976 				p[3].x = p[1].x = a.x + -1;
1977 			}
1978 			else
1979 			{
1980 				p = out.AddSeg(3);
1981 				p[2].x = 1 + (p[0].x = a.x - 2);
1982 				p[2].y = p[0].y = a.y + -1;
1983 				p[1].x = b.x - 1;
1984 				p[1].y = b.y + 0;
1985 				p = out.AddSeg(2, 2);
1986 				p[2].x = 1 + (p[0].x = b.x + 0);
1987 				p[2].y = p[0].y = b.y + 0;
1988 				p[3].x = 1 + (p[1].x = a.x + 0);
1989 				p[3].y = p[1].y = a.y + -1;
1990 			}
1991 		}
1992 		else
1993 		{
1994 			if(0 >= dx + dy)
1995 			{
1996 				p = out.AddSeg(3);
1997 				p[2].y = 1 + (p[0].y = a.y - 2);
1998 				p[2].x = p[0].x = a.x + 1;
1999 				p[1].y = b.y - 1;
2000 				p[1].x = b.x + 0;
2001 				p = out.AddSeg(2, 2);
2002 				p[2].y = 1 + (p[0].y = b.y + 0);
2003 				p[2].x = p[0].x = b.x + 0;
2004 				p[3].y = 1 + (p[1].y = a.y + 0);
2005 				p[3].x = p[1].x = a.x + 1;
2006 			}
2007 			else
2008 			{
2009 				p = out.AddSeg(3);
2010 				p[2].x = 1 + (p[0].x = a.x - 2);
2011 				p[2].y = p[0].y = a.y + -1;
2012 				p[1].x = b.x - 1;
2013 				p[1].y = b.y + 0;
2014 				p = out.AddSeg(2, 2);
2015 				p[2].x = 1 + (p[0].x = b.x + 0);
2016 				p[2].y = p[0].y = b.y + 0;
2017 				p[3].x = 1 + (p[1].x = a.x + 0);
2018 				p[3].y = p[1].y = a.y + -1;
2019 			}
2020 		}
2021 	}
2022 	else
2023 	{
2024 		if(dx >= 0)
2025 		{
2026 			if(dx + dy >= 0)
2027 			{
2028 				p = out.AddSeg(3);
2029 				p[2].y = 1 + (p[0].y = a.y - 2);
2030 				p[2].x = p[0].x = a.x + -1;
2031 				p[1].y = b.y - 1;
2032 				p[1].x = b.x + 0;
2033 				p = out.AddSeg(2, 2);
2034 				p[2].y = 1 + (p[0].y = b.y + 0);
2035 				p[2].x = p[0].x = b.x + 0;
2036 				p[3].y = 1 + (p[1].y = a.y + 0);
2037 				p[3].x = p[1].x = a.x + -1;
2038 			}
2039 			else
2040 			{
2041 				p = out.AddSeg(3);
2042 				p[2].x = 1 + (p[0].x = a.x - 2);
2043 				p[2].y = p[0].y = a.y + 1;
2044 				p[1].x = b.x - 1;
2045 				p[1].y = b.y + 0;
2046 				p = out.AddSeg(2, 2);
2047 				p[2].x = 1 + (p[0].x = b.x + 0);
2048 				p[2].y = p[0].y = b.y + 0;
2049 				p[3].x = 1 + (p[1].x = a.x + 0);
2050 				p[3].y = p[1].y = a.y + 1;
2051 			}
2052 		}
2053 		else
2054 		{
2055 			if(dy >= dx)
2056 			{
2057 				p = out.AddSeg(3);
2058 				p[2].y = 1 + (p[0].y = a.y - 2);
2059 				p[2].x = p[0].x = a.x + 1;
2060 				p[1].y = b.y - 1;
2061 				p[1].x = b.x + 0;
2062 				p = out.AddSeg(2, 2);
2063 				p[2].y = 1 + (p[0].y = b.y + 0);
2064 				p[2].x = p[0].x = b.x + 0;
2065 				p[3].y = 1 + (p[1].y = a.y + 0);
2066 				p[3].x = p[1].x = a.x + 1;
2067 			}
2068 			else
2069 			{
2070 				p = out.AddSeg(3);
2071 				p[2].x = 1 + (p[0].x = a.x - 2);
2072 				p[2].y = p[0].y = a.y + 1;
2073 				p[1].x = b.x - 1;
2074 				p[1].y = b.y + 0;
2075 				p = out.AddSeg(2, 2);
2076 				p[2].x = 1 + (p[0].x = b.x + 0);
2077 				p[2].y = p[0].y = b.y + 0;
2078 				p[3].x = 1 + (p[1].x = a.x + 0);
2079 				p[3].y = p[1].y = a.y + 1;
2080 			}
2081 		}
2082 	}
2083 }
2084 
2085 //////////////////////////////////////////////////////////////////////
2086 
PathDraw_Output_4_3(PathDraw::Output & out,Point a,Point b)2087 static void PathDraw_Output_4_3(PathDraw::Output& out, Point a, Point b)
2088 {
2089 	//RTIMING("PathDraw_Output_4_3");
2090 	Point *p;
2091 	int dx = b.x - a.x, dy = b.y - a.y;
2092 	if(dy >= 0)
2093 	{
2094 		if(dx >= 0)
2095 		{
2096 			if(dx >= dy)
2097 			{
2098 				p = out.AddSeg(4, 2);
2099 				p[0].y = b.y - 1;
2100 				p[0].x = b.x + 0;
2101 				p[1].y = a.y - 2;
2102 				p[1].x = a.x + -1;
2103 				p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + 0));
2104 				p[6].x = p[4].x = p[2].x = b.x + 0;
2105 				p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1));
2106 				p[7].x = p[5].x = p[3].x = a.x + -1;
2107 			}
2108 			else
2109 			{
2110 				p = out.AddSeg(4, 2);
2111 				p[0].x = b.x - 1;
2112 				p[0].y = b.y + 0;
2113 				p[1].x = a.x - 2;
2114 				p[1].y = a.y + -1;
2115 				p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + 0));
2116 				p[6].y = p[4].y = p[2].y = b.y + 0;
2117 				p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1));
2118 				p[7].y = p[5].y = p[3].y = a.y + -1;
2119 			}
2120 		}
2121 		else
2122 		{
2123 			if(0 >= dx + dy)
2124 			{
2125 				p = out.AddSeg(4, 2);
2126 				p[0].y = b.y - 1;
2127 				p[0].x = b.x + 0;
2128 				p[1].y = a.y - 2;
2129 				p[1].x = a.x + 1;
2130 				p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + 0));
2131 				p[6].x = p[4].x = p[2].x = b.x + 0;
2132 				p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1));
2133 				p[7].x = p[5].x = p[3].x = a.x + 1;
2134 			}
2135 			else
2136 			{
2137 				p = out.AddSeg(4, 2);
2138 				p[0].x = b.x - 1;
2139 				p[0].y = b.y + 0;
2140 				p[1].x = a.x - 2;
2141 				p[1].y = a.y + -1;
2142 				p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + 0));
2143 				p[6].y = p[4].y = p[2].y = b.y + 0;
2144 				p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1));
2145 				p[7].y = p[5].y = p[3].y = a.y + -1;
2146 			}
2147 		}
2148 	}
2149 	else
2150 	{
2151 		if(dx >= 0)
2152 		{
2153 			if(dx + dy >= 0)
2154 			{
2155 				p = out.AddSeg(4, 2);
2156 				p[0].y = b.y - 1;
2157 				p[0].x = b.x + 0;
2158 				p[1].y = a.y - 2;
2159 				p[1].x = a.x + -1;
2160 				p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + 0));
2161 				p[6].x = p[4].x = p[2].x = b.x + 0;
2162 				p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1));
2163 				p[7].x = p[5].x = p[3].x = a.x + -1;
2164 			}
2165 			else
2166 			{
2167 				p = out.AddSeg(4, 2);
2168 				p[0].x = b.x - 1;
2169 				p[0].y = b.y + 0;
2170 				p[1].x = a.x - 2;
2171 				p[1].y = a.y + 1;
2172 				p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + 0));
2173 				p[6].y = p[4].y = p[2].y = b.y + 0;
2174 				p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1));
2175 				p[7].y = p[5].y = p[3].y = a.y + 1;
2176 			}
2177 		}
2178 		else
2179 		{
2180 			if(dy >= dx)
2181 			{
2182 				p = out.AddSeg(4, 2);
2183 				p[0].y = b.y - 1;
2184 				p[0].x = b.x + 0;
2185 				p[1].y = a.y - 2;
2186 				p[1].x = a.x + 1;
2187 				p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + 0));
2188 				p[6].x = p[4].x = p[2].x = b.x + 0;
2189 				p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1));
2190 				p[7].x = p[5].x = p[3].x = a.x + 1;
2191 			}
2192 			else
2193 			{
2194 				p = out.AddSeg(4, 2);
2195 				p[0].x = b.x - 1;
2196 				p[0].y = b.y + 0;
2197 				p[1].x = a.x - 2;
2198 				p[1].y = a.y + 1;
2199 				p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + 0));
2200 				p[6].y = p[4].y = p[2].y = b.y + 0;
2201 				p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1));
2202 				p[7].y = p[5].y = p[3].y = a.y + 1;
2203 			}
2204 		}
2205 	}
2206 }
2207 
2208 //////////////////////////////////////////////////////////////////////
2209 
PathDraw_Output_4_4(PathDraw::Output & out,Point a,Point b)2210 static void PathDraw_Output_4_4(PathDraw::Output& out, Point a, Point b)
2211 {
2212 	//RTIMING("PathDraw_Output_4_4");
2213 	Point *p;
2214 	int dx = b.x - a.x, dy = b.y - a.y;
2215 	if(dy >= 0)
2216 	{
2217 		if(dx >= 0)
2218 		{
2219 			if(dx >= dy)
2220 			{
2221 				p = out.AddSeg(4, 2);
2222 				p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2)));
2223 				p[6].x = p[4].x = p[2].x = p[0].x = a.x + -1;
2224 				p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2)));
2225 				p[7].x = p[5].x = p[3].x = p[1].x = b.x + 1;
2226 			}
2227 			else
2228 			{
2229 				p = out.AddSeg(4, 2);
2230 				p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2)));
2231 				p[6].y = p[4].y = p[2].y = p[0].y = a.y + -1;
2232 				p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2)));
2233 				p[7].y = p[5].y = p[3].y = p[1].y = b.y + 1;
2234 			}
2235 		}
2236 		else
2237 		{
2238 			if(0 >= dx + dy)
2239 			{
2240 				p = out.AddSeg(4, 2);
2241 				p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2)));
2242 				p[6].x = p[4].x = p[2].x = p[0].x = a.x + 1;
2243 				p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2)));
2244 				p[7].x = p[5].x = p[3].x = p[1].x = b.x + -1;
2245 			}
2246 			else
2247 			{
2248 				p = out.AddSeg(4, 2);
2249 				p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2)));
2250 				p[6].y = p[4].y = p[2].y = p[0].y = a.y + -1;
2251 				p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2)));
2252 				p[7].y = p[5].y = p[3].y = p[1].y = b.y + 1;
2253 			}
2254 		}
2255 	}
2256 	else
2257 	{
2258 		if(dx >= 0)
2259 		{
2260 			if(dx + dy >= 0)
2261 			{
2262 				p = out.AddSeg(4, 2);
2263 				p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2)));
2264 				p[6].x = p[4].x = p[2].x = p[0].x = a.x + -1;
2265 				p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2)));
2266 				p[7].x = p[5].x = p[3].x = p[1].x = b.x + 1;
2267 			}
2268 			else
2269 			{
2270 				p = out.AddSeg(4, 2);
2271 				p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2)));
2272 				p[6].y = p[4].y = p[2].y = p[0].y = a.y + 1;
2273 				p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2)));
2274 				p[7].y = p[5].y = p[3].y = p[1].y = b.y + -1;
2275 			}
2276 		}
2277 		else
2278 		{
2279 			if(dy >= dx)
2280 			{
2281 				p = out.AddSeg(4, 2);
2282 				p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2)));
2283 				p[6].x = p[4].x = p[2].x = p[0].x = a.x + 1;
2284 				p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2)));
2285 				p[7].x = p[5].x = p[3].x = p[1].x = b.x + -1;
2286 			}
2287 			else
2288 			{
2289 				p = out.AddSeg(4, 2);
2290 				p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2)));
2291 				p[6].y = p[4].y = p[2].y = p[0].y = a.y + 1;
2292 				p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2)));
2293 				p[7].y = p[5].y = p[3].y = p[1].y = b.y + -1;
2294 			}
2295 		}
2296 	}
2297 }
2298 
2299 //////////////////////////////////////////////////////////////////////
2300 
PathDraw_Output_4_5(PathDraw::Output & out,Point a,Point b)2301 static void PathDraw_Output_4_5(PathDraw::Output& out, Point a, Point b)
2302 {
2303 	//RTIMING("PathDraw_Output_4_5");
2304 	Point *p;
2305 	int dx = b.x - a.x, dy = b.y - a.y;
2306 	if(dy >= 0)
2307 	{
2308 		if(dx >= 0)
2309 		{
2310 			if(dx >= dy)
2311 			{
2312 				p = out.AddSeg(5, 2);
2313 				p[0].y = a.y - 2;
2314 				p[0].x = a.x + -1;
2315 				p[1].y = b.y - 2;
2316 				p[1].x = b.x + 1;
2317 				p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + -1)));
2318 				p[8].x = p[6].x = p[4].x = p[2].x = a.x + -1;
2319 				p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1)));
2320 				p[9].x = p[7].x = p[5].x = p[3].x = b.x + 1;
2321 			}
2322 			else
2323 			{
2324 				p = out.AddSeg(5, 2);
2325 				p[0].x = a.x - 2;
2326 				p[0].y = a.y + -1;
2327 				p[1].x = b.x - 2;
2328 				p[1].y = b.y + 1;
2329 				p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + -1)));
2330 				p[8].y = p[6].y = p[4].y = p[2].y = a.y + -1;
2331 				p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1)));
2332 				p[9].y = p[7].y = p[5].y = p[3].y = b.y + 1;
2333 			}
2334 		}
2335 		else
2336 		{
2337 			if(0 >= dx + dy)
2338 			{
2339 				p = out.AddSeg(5, 2);
2340 				p[0].y = a.y - 2;
2341 				p[0].x = a.x + 1;
2342 				p[1].y = b.y - 2;
2343 				p[1].x = b.x + -1;
2344 				p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + -1)));
2345 				p[8].x = p[6].x = p[4].x = p[2].x = a.x + 1;
2346 				p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1)));
2347 				p[9].x = p[7].x = p[5].x = p[3].x = b.x + -1;
2348 			}
2349 			else
2350 			{
2351 				p = out.AddSeg(5, 2);
2352 				p[0].x = a.x - 2;
2353 				p[0].y = a.y + -1;
2354 				p[1].x = b.x - 2;
2355 				p[1].y = b.y + 1;
2356 				p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + -1)));
2357 				p[8].y = p[6].y = p[4].y = p[2].y = a.y + -1;
2358 				p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1)));
2359 				p[9].y = p[7].y = p[5].y = p[3].y = b.y + 1;
2360 			}
2361 		}
2362 	}
2363 	else
2364 	{
2365 		if(dx >= 0)
2366 		{
2367 			if(dx + dy >= 0)
2368 			{
2369 				p = out.AddSeg(5, 2);
2370 				p[0].y = a.y - 2;
2371 				p[0].x = a.x + -1;
2372 				p[1].y = b.y - 2;
2373 				p[1].x = b.x + 1;
2374 				p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + -1)));
2375 				p[8].x = p[6].x = p[4].x = p[2].x = a.x + -1;
2376 				p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1)));
2377 				p[9].x = p[7].x = p[5].x = p[3].x = b.x + 1;
2378 			}
2379 			else
2380 			{
2381 				p = out.AddSeg(5, 2);
2382 				p[0].x = a.x - 2;
2383 				p[0].y = a.y + 1;
2384 				p[1].x = b.x - 2;
2385 				p[1].y = b.y + -1;
2386 				p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + -1)));
2387 				p[8].y = p[6].y = p[4].y = p[2].y = a.y + 1;
2388 				p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1)));
2389 				p[9].y = p[7].y = p[5].y = p[3].y = b.y + -1;
2390 			}
2391 		}
2392 		else
2393 		{
2394 			if(dy >= dx)
2395 			{
2396 				p = out.AddSeg(5, 2);
2397 				p[0].y = a.y - 2;
2398 				p[0].x = a.x + 1;
2399 				p[1].y = b.y - 2;
2400 				p[1].x = b.x + -1;
2401 				p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + -1)));
2402 				p[8].x = p[6].x = p[4].x = p[2].x = a.x + 1;
2403 				p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1)));
2404 				p[9].x = p[7].x = p[5].x = p[3].x = b.x + -1;
2405 			}
2406 			else
2407 			{
2408 				p = out.AddSeg(5, 2);
2409 				p[0].x = a.x - 2;
2410 				p[0].y = a.y + 1;
2411 				p[1].x = b.x - 2;
2412 				p[1].y = b.y + -1;
2413 				p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + -1)));
2414 				p[8].y = p[6].y = p[4].y = p[2].y = a.y + 1;
2415 				p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1)));
2416 				p[9].y = p[7].y = p[5].y = p[3].y = b.y + -1;
2417 			}
2418 		}
2419 	}
2420 }
2421 
2422 //////////////////////////////////////////////////////////////////////
2423 
PathDraw_Output_5_1(PathDraw::Output & out,Point a,Point b)2424 static void PathDraw_Output_5_1(PathDraw::Output& out, Point a, Point b)
2425 {
2426 	//RTIMING("PathDraw_Output_5_1");
2427 	Point *p;
2428 	int dx = b.x - a.x, dy = b.y - a.y;
2429 	if(dy >= 0)
2430 	{
2431 		if(dx >= 0)
2432 		{
2433 			if(dx >= dy)
2434 			{
2435 				p = out.AddSeg(2, 3);
2436 				p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = a.y - 2)));
2437 				p[3].x = p[5].x = p[2].x = p[0].x = a.x + -1;
2438 				p[4].y = p[1].y = b.y - 0;
2439 				p[4].x = p[1].x = b.x + 0;
2440 				p = out.AddSeg(2);
2441 				p[0].y = b.y + 1;
2442 				p[0].x = b.x + 0;
2443 				p[1].y = a.y + 2;
2444 				p[1].x = a.x + -1;
2445 			}
2446 			else
2447 			{
2448 				p = out.AddSeg(2, 3);
2449 				p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = a.x - 2)));
2450 				p[3].y = p[5].y = p[2].y = p[0].y = a.y + -1;
2451 				p[4].x = p[1].x = b.x - 0;
2452 				p[4].y = p[1].y = b.y + 0;
2453 				p = out.AddSeg(2);
2454 				p[0].x = b.x + 1;
2455 				p[0].y = b.y + 0;
2456 				p[1].x = a.x + 2;
2457 				p[1].y = a.y + -1;
2458 			}
2459 		}
2460 		else
2461 		{
2462 			if(0 >= dx + dy)
2463 			{
2464 				p = out.AddSeg(2, 3);
2465 				p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = a.y - 2)));
2466 				p[3].x = p[5].x = p[2].x = p[0].x = a.x + 1;
2467 				p[4].y = p[1].y = b.y - 0;
2468 				p[4].x = p[1].x = b.x + 0;
2469 				p = out.AddSeg(2);
2470 				p[0].y = b.y + 1;
2471 				p[0].x = b.x + 0;
2472 				p[1].y = a.y + 2;
2473 				p[1].x = a.x + 1;
2474 			}
2475 			else
2476 			{
2477 				p = out.AddSeg(2, 3);
2478 				p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = a.x - 2)));
2479 				p[3].y = p[5].y = p[2].y = p[0].y = a.y + -1;
2480 				p[4].x = p[1].x = b.x - 0;
2481 				p[4].y = p[1].y = b.y + 0;
2482 				p = out.AddSeg(2);
2483 				p[0].x = b.x + 1;
2484 				p[0].y = b.y + 0;
2485 				p[1].x = a.x + 2;
2486 				p[1].y = a.y + -1;
2487 			}
2488 		}
2489 	}
2490 	else
2491 	{
2492 		if(dx >= 0)
2493 		{
2494 			if(dx + dy >= 0)
2495 			{
2496 				p = out.AddSeg(2, 3);
2497 				p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = a.y - 2)));
2498 				p[3].x = p[5].x = p[2].x = p[0].x = a.x + -1;
2499 				p[4].y = p[1].y = b.y - 0;
2500 				p[4].x = p[1].x = b.x + 0;
2501 				p = out.AddSeg(2);
2502 				p[0].y = b.y + 1;
2503 				p[0].x = b.x + 0;
2504 				p[1].y = a.y + 2;
2505 				p[1].x = a.x + -1;
2506 			}
2507 			else
2508 			{
2509 				p = out.AddSeg(2, 3);
2510 				p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = a.x - 2)));
2511 				p[3].y = p[5].y = p[2].y = p[0].y = a.y + 1;
2512 				p[4].x = p[1].x = b.x - 0;
2513 				p[4].y = p[1].y = b.y + 0;
2514 				p = out.AddSeg(2);
2515 				p[0].x = b.x + 1;
2516 				p[0].y = b.y + 0;
2517 				p[1].x = a.x + 2;
2518 				p[1].y = a.y + 1;
2519 			}
2520 		}
2521 		else
2522 		{
2523 			if(dy >= dx)
2524 			{
2525 				p = out.AddSeg(2, 3);
2526 				p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = a.y - 2)));
2527 				p[3].x = p[5].x = p[2].x = p[0].x = a.x + 1;
2528 				p[4].y = p[1].y = b.y - 0;
2529 				p[4].x = p[1].x = b.x + 0;
2530 				p = out.AddSeg(2);
2531 				p[0].y = b.y + 1;
2532 				p[0].x = b.x + 0;
2533 				p[1].y = a.y + 2;
2534 				p[1].x = a.x + 1;
2535 			}
2536 			else
2537 			{
2538 				p = out.AddSeg(2, 3);
2539 				p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = a.x - 2)));
2540 				p[3].y = p[5].y = p[2].y = p[0].y = a.y + 1;
2541 				p[4].x = p[1].x = b.x - 0;
2542 				p[4].y = p[1].y = b.y + 0;
2543 				p = out.AddSeg(2);
2544 				p[0].x = b.x + 1;
2545 				p[0].y = b.y + 0;
2546 				p[1].x = a.x + 2;
2547 				p[1].y = a.y + 1;
2548 			}
2549 		}
2550 	}
2551 }
2552 
2553 //////////////////////////////////////////////////////////////////////
2554 
PathDraw_Output_5_2(PathDraw::Output & out,Point a,Point b)2555 static void PathDraw_Output_5_2(PathDraw::Output& out, Point a, Point b)
2556 {
2557 	//RTIMING("PathDraw_Output_5_2");
2558 	Point *p;
2559 	int dx = b.x - a.x, dy = b.y - a.y;
2560 	if(dy >= 0)
2561 	{
2562 		if(dx >= 0)
2563 		{
2564 			if(dx >= dy)
2565 			{
2566 				p = out.AddSeg(3);
2567 				p[2].y = 1 + (p[0].y = a.y - 2);
2568 				p[2].x = p[0].x = a.x + -1;
2569 				p[1].y = b.y - 1;
2570 				p[1].x = b.x + 0;
2571 				p = out.AddSeg(3, 2);
2572 				p[0].y = b.y - 1;
2573 				p[0].x = b.x + 0;
2574 				p[1].y = a.y - 0;
2575 				p[1].x = a.x + -1;
2576 				p[4].y = 1 + (p[2].y = b.y + 0);
2577 				p[4].x = p[2].x = b.x + 0;
2578 				p[5].y = 1 + (p[3].y = a.y + 1);
2579 				p[5].x = p[3].x = a.x + -1;
2580 			}
2581 			else
2582 			{
2583 				p = out.AddSeg(3);
2584 				p[2].x = 1 + (p[0].x = a.x - 2);
2585 				p[2].y = p[0].y = a.y + -1;
2586 				p[1].x = b.x - 1;
2587 				p[1].y = b.y + 0;
2588 				p = out.AddSeg(3, 2);
2589 				p[0].x = b.x - 1;
2590 				p[0].y = b.y + 0;
2591 				p[1].x = a.x - 0;
2592 				p[1].y = a.y + -1;
2593 				p[4].x = 1 + (p[2].x = b.x + 0);
2594 				p[4].y = p[2].y = b.y + 0;
2595 				p[5].x = 1 + (p[3].x = a.x + 1);
2596 				p[5].y = p[3].y = a.y + -1;
2597 			}
2598 		}
2599 		else
2600 		{
2601 			if(0 >= dx + dy)
2602 			{
2603 				p = out.AddSeg(3);
2604 				p[2].y = 1 + (p[0].y = a.y - 2);
2605 				p[2].x = p[0].x = a.x + 1;
2606 				p[1].y = b.y - 1;
2607 				p[1].x = b.x + 0;
2608 				p = out.AddSeg(3, 2);
2609 				p[0].y = b.y - 1;
2610 				p[0].x = b.x + 0;
2611 				p[1].y = a.y - 0;
2612 				p[1].x = a.x + 1;
2613 				p[4].y = 1 + (p[2].y = b.y + 0);
2614 				p[4].x = p[2].x = b.x + 0;
2615 				p[5].y = 1 + (p[3].y = a.y + 1);
2616 				p[5].x = p[3].x = a.x + 1;
2617 			}
2618 			else
2619 			{
2620 				p = out.AddSeg(3);
2621 				p[2].x = 1 + (p[0].x = a.x - 2);
2622 				p[2].y = p[0].y = a.y + -1;
2623 				p[1].x = b.x - 1;
2624 				p[1].y = b.y + 0;
2625 				p = out.AddSeg(3, 2);
2626 				p[0].x = b.x - 1;
2627 				p[0].y = b.y + 0;
2628 				p[1].x = a.x - 0;
2629 				p[1].y = a.y + -1;
2630 				p[4].x = 1 + (p[2].x = b.x + 0);
2631 				p[4].y = p[2].y = b.y + 0;
2632 				p[5].x = 1 + (p[3].x = a.x + 1);
2633 				p[5].y = p[3].y = a.y + -1;
2634 			}
2635 		}
2636 	}
2637 	else
2638 	{
2639 		if(dx >= 0)
2640 		{
2641 			if(dx + dy >= 0)
2642 			{
2643 				p = out.AddSeg(3);
2644 				p[2].y = 1 + (p[0].y = a.y - 2);
2645 				p[2].x = p[0].x = a.x + -1;
2646 				p[1].y = b.y - 1;
2647 				p[1].x = b.x + 0;
2648 				p = out.AddSeg(3, 2);
2649 				p[0].y = b.y - 1;
2650 				p[0].x = b.x + 0;
2651 				p[1].y = a.y - 0;
2652 				p[1].x = a.x + -1;
2653 				p[4].y = 1 + (p[2].y = b.y + 0);
2654 				p[4].x = p[2].x = b.x + 0;
2655 				p[5].y = 1 + (p[3].y = a.y + 1);
2656 				p[5].x = p[3].x = a.x + -1;
2657 			}
2658 			else
2659 			{
2660 				p = out.AddSeg(3);
2661 				p[2].x = 1 + (p[0].x = a.x - 2);
2662 				p[2].y = p[0].y = a.y + 1;
2663 				p[1].x = b.x - 1;
2664 				p[1].y = b.y + 0;
2665 				p = out.AddSeg(3, 2);
2666 				p[0].x = b.x - 1;
2667 				p[0].y = b.y + 0;
2668 				p[1].x = a.x - 0;
2669 				p[1].y = a.y + 1;
2670 				p[4].x = 1 + (p[2].x = b.x + 0);
2671 				p[4].y = p[2].y = b.y + 0;
2672 				p[5].x = 1 + (p[3].x = a.x + 1);
2673 				p[5].y = p[3].y = a.y + 1;
2674 			}
2675 		}
2676 		else
2677 		{
2678 			if(dy >= dx)
2679 			{
2680 				p = out.AddSeg(3);
2681 				p[2].y = 1 + (p[0].y = a.y - 2);
2682 				p[2].x = p[0].x = a.x + 1;
2683 				p[1].y = b.y - 1;
2684 				p[1].x = b.x + 0;
2685 				p = out.AddSeg(3, 2);
2686 				p[0].y = b.y - 1;
2687 				p[0].x = b.x + 0;
2688 				p[1].y = a.y - 0;
2689 				p[1].x = a.x + 1;
2690 				p[4].y = 1 + (p[2].y = b.y + 0);
2691 				p[4].x = p[2].x = b.x + 0;
2692 				p[5].y = 1 + (p[3].y = a.y + 1);
2693 				p[5].x = p[3].x = a.x + 1;
2694 			}
2695 			else
2696 			{
2697 				p = out.AddSeg(3);
2698 				p[2].x = 1 + (p[0].x = a.x - 2);
2699 				p[2].y = p[0].y = a.y + 1;
2700 				p[1].x = b.x - 1;
2701 				p[1].y = b.y + 0;
2702 				p = out.AddSeg(3, 2);
2703 				p[0].x = b.x - 1;
2704 				p[0].y = b.y + 0;
2705 				p[1].x = a.x - 0;
2706 				p[1].y = a.y + 1;
2707 				p[4].x = 1 + (p[2].x = b.x + 0);
2708 				p[4].y = p[2].y = b.y + 0;
2709 				p[5].x = 1 + (p[3].x = a.x + 1);
2710 				p[5].y = p[3].y = a.y + 1;
2711 			}
2712 		}
2713 	}
2714 }
2715 
2716 //////////////////////////////////////////////////////////////////////
2717 
PathDraw_Output_5_3(PathDraw::Output & out,Point a,Point b)2718 static void PathDraw_Output_5_3(PathDraw::Output& out, Point a, Point b)
2719 {
2720 	//RTIMING("PathDraw_Output_5_3");
2721 	Point *p;
2722 	int dx = b.x - a.x, dy = b.y - a.y;
2723 	if(dy >= 0)
2724 	{
2725 		if(dx >= 0)
2726 		{
2727 			if(dx >= dy)
2728 			{
2729 				p = out.AddSeg(3);
2730 				p[2].y = 1 + (p[0].y = a.y - 2);
2731 				p[2].x = p[0].x = a.x + -1;
2732 				p[1].y = b.y - 1;
2733 				p[1].x = b.x + 0;
2734 				p = out.AddSeg(3, 2);
2735 				p[4].y = 1 + (p[2].y = 1 + (p[0].y = b.y + 0));
2736 				p[4].x = p[2].x = p[0].x = b.x + 0;
2737 				p[5].y = 1 + (p[3].y = 1 + (p[1].y = a.y + 0));
2738 				p[5].x = p[3].x = p[1].x = a.x + -1;
2739 			}
2740 			else
2741 			{
2742 				p = out.AddSeg(3);
2743 				p[2].x = 1 + (p[0].x = a.x - 2);
2744 				p[2].y = p[0].y = a.y + -1;
2745 				p[1].x = b.x - 1;
2746 				p[1].y = b.y + 0;
2747 				p = out.AddSeg(3, 2);
2748 				p[4].x = 1 + (p[2].x = 1 + (p[0].x = b.x + 0));
2749 				p[4].y = p[2].y = p[0].y = b.y + 0;
2750 				p[5].x = 1 + (p[3].x = 1 + (p[1].x = a.x + 0));
2751 				p[5].y = p[3].y = p[1].y = a.y + -1;
2752 			}
2753 		}
2754 		else
2755 		{
2756 			if(0 >= dx + dy)
2757 			{
2758 				p = out.AddSeg(3);
2759 				p[2].y = 1 + (p[0].y = a.y - 2);
2760 				p[2].x = p[0].x = a.x + 1;
2761 				p[1].y = b.y - 1;
2762 				p[1].x = b.x + 0;
2763 				p = out.AddSeg(3, 2);
2764 				p[4].y = 1 + (p[2].y = 1 + (p[0].y = b.y + 0));
2765 				p[4].x = p[2].x = p[0].x = b.x + 0;
2766 				p[5].y = 1 + (p[3].y = 1 + (p[1].y = a.y + 0));
2767 				p[5].x = p[3].x = p[1].x = a.x + 1;
2768 			}
2769 			else
2770 			{
2771 				p = out.AddSeg(3);
2772 				p[2].x = 1 + (p[0].x = a.x - 2);
2773 				p[2].y = p[0].y = a.y + -1;
2774 				p[1].x = b.x - 1;
2775 				p[1].y = b.y + 0;
2776 				p = out.AddSeg(3, 2);
2777 				p[4].x = 1 + (p[2].x = 1 + (p[0].x = b.x + 0));
2778 				p[4].y = p[2].y = p[0].y = b.y + 0;
2779 				p[5].x = 1 + (p[3].x = 1 + (p[1].x = a.x + 0));
2780 				p[5].y = p[3].y = p[1].y = a.y + -1;
2781 			}
2782 		}
2783 	}
2784 	else
2785 	{
2786 		if(dx >= 0)
2787 		{
2788 			if(dx + dy >= 0)
2789 			{
2790 				p = out.AddSeg(3);
2791 				p[2].y = 1 + (p[0].y = a.y - 2);
2792 				p[2].x = p[0].x = a.x + -1;
2793 				p[1].y = b.y - 1;
2794 				p[1].x = b.x + 0;
2795 				p = out.AddSeg(3, 2);
2796 				p[4].y = 1 + (p[2].y = 1 + (p[0].y = b.y + 0));
2797 				p[4].x = p[2].x = p[0].x = b.x + 0;
2798 				p[5].y = 1 + (p[3].y = 1 + (p[1].y = a.y + 0));
2799 				p[5].x = p[3].x = p[1].x = a.x + -1;
2800 			}
2801 			else
2802 			{
2803 				p = out.AddSeg(3);
2804 				p[2].x = 1 + (p[0].x = a.x - 2);
2805 				p[2].y = p[0].y = a.y + 1;
2806 				p[1].x = b.x - 1;
2807 				p[1].y = b.y + 0;
2808 				p = out.AddSeg(3, 2);
2809 				p[4].x = 1 + (p[2].x = 1 + (p[0].x = b.x + 0));
2810 				p[4].y = p[2].y = p[0].y = b.y + 0;
2811 				p[5].x = 1 + (p[3].x = 1 + (p[1].x = a.x + 0));
2812 				p[5].y = p[3].y = p[1].y = a.y + 1;
2813 			}
2814 		}
2815 		else
2816 		{
2817 			if(dy >= dx)
2818 			{
2819 				p = out.AddSeg(3);
2820 				p[2].y = 1 + (p[0].y = a.y - 2);
2821 				p[2].x = p[0].x = a.x + 1;
2822 				p[1].y = b.y - 1;
2823 				p[1].x = b.x + 0;
2824 				p = out.AddSeg(3, 2);
2825 				p[4].y = 1 + (p[2].y = 1 + (p[0].y = b.y + 0));
2826 				p[4].x = p[2].x = p[0].x = b.x + 0;
2827 				p[5].y = 1 + (p[3].y = 1 + (p[1].y = a.y + 0));
2828 				p[5].x = p[3].x = p[1].x = a.x + 1;
2829 			}
2830 			else
2831 			{
2832 				p = out.AddSeg(3);
2833 				p[2].x = 1 + (p[0].x = a.x - 2);
2834 				p[2].y = p[0].y = a.y + 1;
2835 				p[1].x = b.x - 1;
2836 				p[1].y = b.y + 0;
2837 				p = out.AddSeg(3, 2);
2838 				p[4].x = 1 + (p[2].x = 1 + (p[0].x = b.x + 0));
2839 				p[4].y = p[2].y = p[0].y = b.y + 0;
2840 				p[5].x = 1 + (p[3].x = 1 + (p[1].x = a.x + 0));
2841 				p[5].y = p[3].y = p[1].y = a.y + 1;
2842 			}
2843 		}
2844 	}
2845 }
2846 
2847 //////////////////////////////////////////////////////////////////////
2848 
PathDraw_Output_5_4(PathDraw::Output & out,Point a,Point b)2849 static void PathDraw_Output_5_4(PathDraw::Output& out, Point a, Point b)
2850 {
2851 	//RTIMING("PathDraw_Output_5_4");
2852 	Point *p;
2853 	int dx = b.x - a.x, dy = b.y - a.y;
2854 	if(dy >= 0)
2855 	{
2856 		if(dx >= 0)
2857 		{
2858 			if(dx >= dy)
2859 			{
2860 				p = out.AddSeg(5, 2);
2861 				p[0].y = b.y - 2;
2862 				p[0].x = b.x + 1;
2863 				p[1].y = a.y - 2;
2864 				p[1].x = a.x + -1;
2865 				p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + -1)));
2866 				p[8].x = p[6].x = p[4].x = p[2].x = b.x + 1;
2867 				p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1)));
2868 				p[9].x = p[7].x = p[5].x = p[3].x = a.x + -1;
2869 			}
2870 			else
2871 			{
2872 				p = out.AddSeg(5, 2);
2873 				p[0].x = b.x - 2;
2874 				p[0].y = b.y + 1;
2875 				p[1].x = a.x - 2;
2876 				p[1].y = a.y + -1;
2877 				p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + -1)));
2878 				p[8].y = p[6].y = p[4].y = p[2].y = b.y + 1;
2879 				p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1)));
2880 				p[9].y = p[7].y = p[5].y = p[3].y = a.y + -1;
2881 			}
2882 		}
2883 		else
2884 		{
2885 			if(0 >= dx + dy)
2886 			{
2887 				p = out.AddSeg(5, 2);
2888 				p[0].y = b.y - 2;
2889 				p[0].x = b.x + -1;
2890 				p[1].y = a.y - 2;
2891 				p[1].x = a.x + 1;
2892 				p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + -1)));
2893 				p[8].x = p[6].x = p[4].x = p[2].x = b.x + -1;
2894 				p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1)));
2895 				p[9].x = p[7].x = p[5].x = p[3].x = a.x + 1;
2896 			}
2897 			else
2898 			{
2899 				p = out.AddSeg(5, 2);
2900 				p[0].x = b.x - 2;
2901 				p[0].y = b.y + 1;
2902 				p[1].x = a.x - 2;
2903 				p[1].y = a.y + -1;
2904 				p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + -1)));
2905 				p[8].y = p[6].y = p[4].y = p[2].y = b.y + 1;
2906 				p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1)));
2907 				p[9].y = p[7].y = p[5].y = p[3].y = a.y + -1;
2908 			}
2909 		}
2910 	}
2911 	else
2912 	{
2913 		if(dx >= 0)
2914 		{
2915 			if(dx + dy >= 0)
2916 			{
2917 				p = out.AddSeg(5, 2);
2918 				p[0].y = b.y - 2;
2919 				p[0].x = b.x + 1;
2920 				p[1].y = a.y - 2;
2921 				p[1].x = a.x + -1;
2922 				p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + -1)));
2923 				p[8].x = p[6].x = p[4].x = p[2].x = b.x + 1;
2924 				p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1)));
2925 				p[9].x = p[7].x = p[5].x = p[3].x = a.x + -1;
2926 			}
2927 			else
2928 			{
2929 				p = out.AddSeg(5, 2);
2930 				p[0].x = b.x - 2;
2931 				p[0].y = b.y + -1;
2932 				p[1].x = a.x - 2;
2933 				p[1].y = a.y + 1;
2934 				p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + -1)));
2935 				p[8].y = p[6].y = p[4].y = p[2].y = b.y + -1;
2936 				p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1)));
2937 				p[9].y = p[7].y = p[5].y = p[3].y = a.y + 1;
2938 			}
2939 		}
2940 		else
2941 		{
2942 			if(dy >= dx)
2943 			{
2944 				p = out.AddSeg(5, 2);
2945 				p[0].y = b.y - 2;
2946 				p[0].x = b.x + -1;
2947 				p[1].y = a.y - 2;
2948 				p[1].x = a.x + 1;
2949 				p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + -1)));
2950 				p[8].x = p[6].x = p[4].x = p[2].x = b.x + -1;
2951 				p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1)));
2952 				p[9].x = p[7].x = p[5].x = p[3].x = a.x + 1;
2953 			}
2954 			else
2955 			{
2956 				p = out.AddSeg(5, 2);
2957 				p[0].x = b.x - 2;
2958 				p[0].y = b.y + -1;
2959 				p[1].x = a.x - 2;
2960 				p[1].y = a.y + 1;
2961 				p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + -1)));
2962 				p[8].y = p[6].y = p[4].y = p[2].y = b.y + -1;
2963 				p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1)));
2964 				p[9].y = p[7].y = p[5].y = p[3].y = a.y + 1;
2965 			}
2966 		}
2967 	}
2968 }
2969 
2970 //////////////////////////////////////////////////////////////////////
2971 
PathDraw_Output_5_5(PathDraw::Output & out,Point a,Point b)2972 static void PathDraw_Output_5_5(PathDraw::Output& out, Point a, Point b)
2973 {
2974 	//RTIMING("PathDraw_Output_5_5");
2975 	Point *p;
2976 	int dx = b.x - a.x, dy = b.y - a.y;
2977 	if(dy >= 0)
2978 	{
2979 		if(dx >= 0)
2980 		{
2981 			if(dx >= dy)
2982 			{
2983 				p = out.AddSeg(5, 2);
2984 				p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2))));
2985 				p[8].x = p[6].x = p[4].x = p[2].x = p[0].x = a.x + -1;
2986 				p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2))));
2987 				p[9].x = p[7].x = p[5].x = p[3].x = p[1].x = b.x + 1;
2988 			}
2989 			else
2990 			{
2991 				p = out.AddSeg(5, 2);
2992 				p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2))));
2993 				p[8].y = p[6].y = p[4].y = p[2].y = p[0].y = a.y + -1;
2994 				p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2))));
2995 				p[9].y = p[7].y = p[5].y = p[3].y = p[1].y = b.y + 1;
2996 			}
2997 		}
2998 		else
2999 		{
3000 			if(0 >= dx + dy)
3001 			{
3002 				p = out.AddSeg(5, 2);
3003 				p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2))));
3004 				p[8].x = p[6].x = p[4].x = p[2].x = p[0].x = a.x + 1;
3005 				p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2))));
3006 				p[9].x = p[7].x = p[5].x = p[3].x = p[1].x = b.x + -1;
3007 			}
3008 			else
3009 			{
3010 				p = out.AddSeg(5, 2);
3011 				p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2))));
3012 				p[8].y = p[6].y = p[4].y = p[2].y = p[0].y = a.y + -1;
3013 				p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2))));
3014 				p[9].y = p[7].y = p[5].y = p[3].y = p[1].y = b.y + 1;
3015 			}
3016 		}
3017 	}
3018 	else
3019 	{
3020 		if(dx >= 0)
3021 		{
3022 			if(dx + dy >= 0)
3023 			{
3024 				p = out.AddSeg(5, 2);
3025 				p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2))));
3026 				p[8].x = p[6].x = p[4].x = p[2].x = p[0].x = a.x + -1;
3027 				p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2))));
3028 				p[9].x = p[7].x = p[5].x = p[3].x = p[1].x = b.x + 1;
3029 			}
3030 			else
3031 			{
3032 				p = out.AddSeg(5, 2);
3033 				p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2))));
3034 				p[8].y = p[6].y = p[4].y = p[2].y = p[0].y = a.y + 1;
3035 				p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2))));
3036 				p[9].y = p[7].y = p[5].y = p[3].y = p[1].y = b.y + -1;
3037 			}
3038 		}
3039 		else
3040 		{
3041 			if(dy >= dx)
3042 			{
3043 				p = out.AddSeg(5, 2);
3044 				p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2))));
3045 				p[8].x = p[6].x = p[4].x = p[2].x = p[0].x = a.x + 1;
3046 				p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2))));
3047 				p[9].x = p[7].x = p[5].x = p[3].x = p[1].x = b.x + -1;
3048 			}
3049 			else
3050 			{
3051 				p = out.AddSeg(5, 2);
3052 				p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2))));
3053 				p[8].y = p[6].y = p[4].y = p[2].y = p[0].y = a.y + 1;
3054 				p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2))));
3055 				p[9].y = p[7].y = p[5].y = p[3].y = p[1].y = b.y + -1;
3056 			}
3057 		}
3058 	}
3059 }
3060 
3061 //////////////////////////////////////////////////////////////////////
3062 
3063 void (*PathDraw_Output_Thick[5][5])(PathDraw::Output& out, Point a, Point b) =
3064 {
3065 	{
3066 		PathDraw_Output_1_1,
3067 		PathDraw_Output_1_2,
3068 		PathDraw_Output_1_3,
3069 		PathDraw_Output_1_4,
3070 		PathDraw_Output_1_5,
3071 	},
3072 	{
3073 		PathDraw_Output_2_1,
3074 		PathDraw_Output_2_2,
3075 		PathDraw_Output_2_3,
3076 		PathDraw_Output_2_4,
3077 		PathDraw_Output_2_5,
3078 	},
3079 	{
3080 		PathDraw_Output_3_1,
3081 		PathDraw_Output_3_2,
3082 		PathDraw_Output_3_3,
3083 		PathDraw_Output_3_4,
3084 		PathDraw_Output_3_5,
3085 	},
3086 	{
3087 		PathDraw_Output_4_1,
3088 		PathDraw_Output_4_2,
3089 		PathDraw_Output_4_3,
3090 		PathDraw_Output_4_4,
3091 		PathDraw_Output_4_5,
3092 	},
3093 	{
3094 		PathDraw_Output_5_1,
3095 		PathDraw_Output_5_2,
3096 		PathDraw_Output_5_3,
3097 		PathDraw_Output_5_4,
3098 		PathDraw_Output_5_5,
3099 	},
3100 };
3101 
3102 }
3103