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