ultimatepp/uppsrc/Geom/Draw/path_aux.cpp
cxl 8ebdcbb0d5 uppsrc: NAMESPACE_UPP / END_UPP_NAMESPACE removed
git-svn-id: svn://ultimatepp.org/upp/trunk@10186 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2016-08-26 17:15:30 +00:00

3102 lines
68 KiB
C++

//////////////////////////////////////////////////////////////////////
// path_aux: support functions for fast line element generation.
#include "GeomDraw.h"
namespace Upp {
static void PathDraw_Output_1_1(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_1_1");
out.AddFirst(a);
out.AddNext(b);
}
static void PathDraw_Output_1_2(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_1_2");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(2, 2);
p[0].y = a.y - 0;
p[0].x = a.x + 0;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p[2].y = a.y + 1;
p[2].x = a.x + 0;
p[3].y = b.y + 0;
p[3].x = b.x + 0;
}
else
{
p = out.AddSeg(2, 2);
p[0].x = a.x - 0;
p[0].y = a.y + 0;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p[2].x = a.x + 1;
p[2].y = a.y + 0;
p[3].x = b.x + 0;
p[3].y = b.y + 0;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(2, 2);
p[0].y = a.y - 0;
p[0].x = a.x + 0;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p[2].y = a.y + 1;
p[2].x = a.x + 0;
p[3].y = b.y + 0;
p[3].x = b.x + 0;
}
else
{
p = out.AddSeg(2, 2);
p[0].x = a.x - 0;
p[0].y = a.y + 0;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p[2].x = a.x + 1;
p[2].y = a.y + 0;
p[3].x = b.x + 0;
p[3].y = b.y + 0;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(2, 2);
p[0].y = a.y - 0;
p[0].x = a.x + 0;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p[2].y = a.y + 1;
p[2].x = a.x + 0;
p[3].y = b.y + 0;
p[3].x = b.x + 0;
}
else
{
p = out.AddSeg(2, 2);
p[0].x = a.x - 0;
p[0].y = a.y + 0;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p[2].x = a.x + 1;
p[2].y = a.y + 0;
p[3].x = b.x + 0;
p[3].y = b.y + 0;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(2, 2);
p[0].y = a.y - 0;
p[0].x = a.x + 0;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p[2].y = a.y + 1;
p[2].x = a.x + 0;
p[3].y = b.y + 0;
p[3].x = b.x + 0;
}
else
{
p = out.AddSeg(2, 2);
p[0].x = a.x - 0;
p[0].y = a.y + 0;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p[2].x = a.x + 1;
p[2].y = a.y + 0;
p[3].x = b.x + 0;
p[3].y = b.y + 0;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_1_3(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_1_3");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 1);
p[2].x = p[0].x = b.x + 0;
p[1].y = a.y - 0;
p[1].x = a.x + 0;
p = out.AddSeg(2);
p[0].y = a.y + 1;
p[0].x = a.x + 0;
p[1].y = b.y + 1;
p[1].x = b.x + 0;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 1);
p[2].y = p[0].y = b.y + 0;
p[1].x = a.x - 0;
p[1].y = a.y + 0;
p = out.AddSeg(2);
p[0].x = a.x + 1;
p[0].y = a.y + 0;
p[1].x = b.x + 1;
p[1].y = b.y + 0;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 1);
p[2].x = p[0].x = b.x + 0;
p[1].y = a.y - 0;
p[1].x = a.x + 0;
p = out.AddSeg(2);
p[0].y = a.y + 1;
p[0].x = a.x + 0;
p[1].y = b.y + 1;
p[1].x = b.x + 0;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 1);
p[2].y = p[0].y = b.y + 0;
p[1].x = a.x - 0;
p[1].y = a.y + 0;
p = out.AddSeg(2);
p[0].x = a.x + 1;
p[0].y = a.y + 0;
p[1].x = b.x + 1;
p[1].y = b.y + 0;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 1);
p[2].x = p[0].x = b.x + 0;
p[1].y = a.y - 0;
p[1].x = a.x + 0;
p = out.AddSeg(2);
p[0].y = a.y + 1;
p[0].x = a.x + 0;
p[1].y = b.y + 1;
p[1].x = b.x + 0;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 1);
p[2].y = p[0].y = b.y + 0;
p[1].x = a.x - 0;
p[1].y = a.y + 0;
p = out.AddSeg(2);
p[0].x = a.x + 1;
p[0].y = a.y + 0;
p[1].x = b.x + 1;
p[1].y = b.y + 0;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 1);
p[2].x = p[0].x = b.x + 0;
p[1].y = a.y - 0;
p[1].x = a.x + 0;
p = out.AddSeg(2);
p[0].y = a.y + 1;
p[0].x = a.x + 0;
p[1].y = b.y + 1;
p[1].x = b.x + 0;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 1);
p[2].y = p[0].y = b.y + 0;
p[1].x = a.x - 0;
p[1].y = a.y + 0;
p = out.AddSeg(2);
p[0].x = a.x + 1;
p[0].y = a.y + 0;
p[1].x = b.x + 1;
p[1].y = b.y + 0;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_1_4(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_1_4");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + 1;
p[1].y = a.y - 0;
p[1].x = a.x + 0;
p = out.AddSeg(2, 2);
p[0].y = a.y - 0;
p[0].x = a.x + 0;
p[1].y = b.y - 0;
p[1].x = b.x + 1;
p[2].y = a.y + 1;
p[2].x = a.x + 0;
p[3].y = b.y + 1;
p[3].x = b.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + 1;
p[1].x = a.x - 0;
p[1].y = a.y + 0;
p = out.AddSeg(2, 2);
p[0].x = a.x - 0;
p[0].y = a.y + 0;
p[1].x = b.x - 0;
p[1].y = b.y + 1;
p[2].x = a.x + 1;
p[2].y = a.y + 0;
p[3].x = b.x + 1;
p[3].y = b.y + 1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + -1;
p[1].y = a.y - 0;
p[1].x = a.x + 0;
p = out.AddSeg(2, 2);
p[0].y = a.y - 0;
p[0].x = a.x + 0;
p[1].y = b.y - 0;
p[1].x = b.x + -1;
p[2].y = a.y + 1;
p[2].x = a.x + 0;
p[3].y = b.y + 1;
p[3].x = b.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + 1;
p[1].x = a.x - 0;
p[1].y = a.y + 0;
p = out.AddSeg(2, 2);
p[0].x = a.x - 0;
p[0].y = a.y + 0;
p[1].x = b.x - 0;
p[1].y = b.y + 1;
p[2].x = a.x + 1;
p[2].y = a.y + 0;
p[3].x = b.x + 1;
p[3].y = b.y + 1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + 1;
p[1].y = a.y - 0;
p[1].x = a.x + 0;
p = out.AddSeg(2, 2);
p[0].y = a.y - 0;
p[0].x = a.x + 0;
p[1].y = b.y - 0;
p[1].x = b.x + 1;
p[2].y = a.y + 1;
p[2].x = a.x + 0;
p[3].y = b.y + 1;
p[3].x = b.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + -1;
p[1].x = a.x - 0;
p[1].y = a.y + 0;
p = out.AddSeg(2, 2);
p[0].x = a.x - 0;
p[0].y = a.y + 0;
p[1].x = b.x - 0;
p[1].y = b.y + -1;
p[2].x = a.x + 1;
p[2].y = a.y + 0;
p[3].x = b.x + 1;
p[3].y = b.y + -1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + -1;
p[1].y = a.y - 0;
p[1].x = a.x + 0;
p = out.AddSeg(2, 2);
p[0].y = a.y - 0;
p[0].x = a.x + 0;
p[1].y = b.y - 0;
p[1].x = b.x + -1;
p[2].y = a.y + 1;
p[2].x = a.x + 0;
p[3].y = b.y + 1;
p[3].x = b.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + -1;
p[1].x = a.x - 0;
p[1].y = a.y + 0;
p = out.AddSeg(2, 2);
p[0].x = a.x - 0;
p[0].y = a.y + 0;
p[1].x = b.x - 0;
p[1].y = b.y + -1;
p[2].x = a.x + 1;
p[2].y = a.y + 0;
p[3].x = b.x + 1;
p[3].y = b.y + -1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_1_5(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_1_5");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(2, 3);
p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = b.y - 2)));
p[3].x = p[5].x = p[2].x = p[0].x = b.x + 1;
p[4].y = p[1].y = a.y - 0;
p[4].x = p[1].x = a.x + 0;
p = out.AddSeg(2);
p[0].y = a.y + 1;
p[0].x = a.x + 0;
p[1].y = b.y + 2;
p[1].x = b.x + 1;
}
else
{
p = out.AddSeg(2, 3);
p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = b.x - 2)));
p[3].y = p[5].y = p[2].y = p[0].y = b.y + 1;
p[4].x = p[1].x = a.x - 0;
p[4].y = p[1].y = a.y + 0;
p = out.AddSeg(2);
p[0].x = a.x + 1;
p[0].y = a.y + 0;
p[1].x = b.x + 2;
p[1].y = b.y + 1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(2, 3);
p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = b.y - 2)));
p[3].x = p[5].x = p[2].x = p[0].x = b.x + -1;
p[4].y = p[1].y = a.y - 0;
p[4].x = p[1].x = a.x + 0;
p = out.AddSeg(2);
p[0].y = a.y + 1;
p[0].x = a.x + 0;
p[1].y = b.y + 2;
p[1].x = b.x + -1;
}
else
{
p = out.AddSeg(2, 3);
p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = b.x - 2)));
p[3].y = p[5].y = p[2].y = p[0].y = b.y + 1;
p[4].x = p[1].x = a.x - 0;
p[4].y = p[1].y = a.y + 0;
p = out.AddSeg(2);
p[0].x = a.x + 1;
p[0].y = a.y + 0;
p[1].x = b.x + 2;
p[1].y = b.y + 1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(2, 3);
p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = b.y - 2)));
p[3].x = p[5].x = p[2].x = p[0].x = b.x + 1;
p[4].y = p[1].y = a.y - 0;
p[4].x = p[1].x = a.x + 0;
p = out.AddSeg(2);
p[0].y = a.y + 1;
p[0].x = a.x + 0;
p[1].y = b.y + 2;
p[1].x = b.x + 1;
}
else
{
p = out.AddSeg(2, 3);
p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = b.x - 2)));
p[3].y = p[5].y = p[2].y = p[0].y = b.y + -1;
p[4].x = p[1].x = a.x - 0;
p[4].y = p[1].y = a.y + 0;
p = out.AddSeg(2);
p[0].x = a.x + 1;
p[0].y = a.y + 0;
p[1].x = b.x + 2;
p[1].y = b.y + -1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(2, 3);
p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = b.y - 2)));
p[3].x = p[5].x = p[2].x = p[0].x = b.x + -1;
p[4].y = p[1].y = a.y - 0;
p[4].x = p[1].x = a.x + 0;
p = out.AddSeg(2);
p[0].y = a.y + 1;
p[0].x = a.x + 0;
p[1].y = b.y + 2;
p[1].x = b.x + -1;
}
else
{
p = out.AddSeg(2, 3);
p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = b.x - 2)));
p[3].y = p[5].y = p[2].y = p[0].y = b.y + -1;
p[4].x = p[1].x = a.x - 0;
p[4].y = p[1].y = a.y + 0;
p = out.AddSeg(2);
p[0].x = a.x + 1;
p[0].y = a.y + 0;
p[1].x = b.x + 2;
p[1].y = b.y + -1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_2_1(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_2_1");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(2, 2);
p[0].y = b.y - 0;
p[0].x = b.x + 0;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p[2].y = b.y + 1;
p[2].x = b.x + 0;
p[3].y = a.y + 0;
p[3].x = a.x + 0;
}
else
{
p = out.AddSeg(2, 2);
p[0].x = b.x - 0;
p[0].y = b.y + 0;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p[2].x = b.x + 1;
p[2].y = b.y + 0;
p[3].x = a.x + 0;
p[3].y = a.y + 0;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(2, 2);
p[0].y = b.y - 0;
p[0].x = b.x + 0;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p[2].y = b.y + 1;
p[2].x = b.x + 0;
p[3].y = a.y + 0;
p[3].x = a.x + 0;
}
else
{
p = out.AddSeg(2, 2);
p[0].x = b.x - 0;
p[0].y = b.y + 0;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p[2].x = b.x + 1;
p[2].y = b.y + 0;
p[3].x = a.x + 0;
p[3].y = a.y + 0;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(2, 2);
p[0].y = b.y - 0;
p[0].x = b.x + 0;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p[2].y = b.y + 1;
p[2].x = b.x + 0;
p[3].y = a.y + 0;
p[3].x = a.x + 0;
}
else
{
p = out.AddSeg(2, 2);
p[0].x = b.x - 0;
p[0].y = b.y + 0;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p[2].x = b.x + 1;
p[2].y = b.y + 0;
p[3].x = a.x + 0;
p[3].y = a.y + 0;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(2, 2);
p[0].y = b.y - 0;
p[0].x = b.x + 0;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p[2].y = b.y + 1;
p[2].x = b.x + 0;
p[3].y = a.y + 0;
p[3].x = a.x + 0;
}
else
{
p = out.AddSeg(2, 2);
p[0].x = b.x - 0;
p[0].y = b.y + 0;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p[2].x = b.x + 1;
p[2].y = b.y + 0;
p[3].x = a.x + 0;
p[3].y = a.y + 0;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_2_2(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_2_2");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(2, 2);
p[2].y = 1 + (p[0].y = a.y + -1);
p[2].x = p[0].x = a.x + 0;
p[3].y = 1 + (p[1].y = b.y + -1);
p[3].x = p[1].x = b.x + 0;
}
else
{
p = out.AddSeg(2, 2);
p[2].x = 1 + (p[0].x = a.x + -1);
p[2].y = p[0].y = a.y + 0;
p[3].x = 1 + (p[1].x = b.x + -1);
p[3].y = p[1].y = b.y + 0;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(2, 2);
p[2].y = 1 + (p[0].y = a.y + -1);
p[2].x = p[0].x = a.x + 0;
p[3].y = 1 + (p[1].y = b.y + -1);
p[3].x = p[1].x = b.x + 0;
}
else
{
p = out.AddSeg(2, 2);
p[2].x = 1 + (p[0].x = a.x + -1);
p[2].y = p[0].y = a.y + 0;
p[3].x = 1 + (p[1].x = b.x + -1);
p[3].y = p[1].y = b.y + 0;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(2, 2);
p[2].y = 1 + (p[0].y = a.y + -1);
p[2].x = p[0].x = a.x + 0;
p[3].y = 1 + (p[1].y = b.y + -1);
p[3].x = p[1].x = b.x + 0;
}
else
{
p = out.AddSeg(2, 2);
p[2].x = 1 + (p[0].x = a.x + -1);
p[2].y = p[0].y = a.y + 0;
p[3].x = 1 + (p[1].x = b.x + -1);
p[3].y = p[1].y = b.y + 0;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(2, 2);
p[2].y = 1 + (p[0].y = a.y + -1);
p[2].x = p[0].x = a.x + 0;
p[3].y = 1 + (p[1].y = b.y + -1);
p[3].x = p[1].x = b.x + 0;
}
else
{
p = out.AddSeg(2, 2);
p[2].x = 1 + (p[0].x = a.x + -1);
p[2].y = p[0].y = a.y + 0;
p[3].x = 1 + (p[1].x = b.x + -1);
p[3].y = p[1].y = b.y + 0;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_2_3(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_2_3");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(3, 2);
p[0].y = a.y - 1;
p[0].x = a.x + 0;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p[4].y = 1 + (p[2].y = a.y + 0);
p[4].x = p[2].x = a.x + 0;
p[5].y = 1 + (p[3].y = b.y + 0);
p[5].x = p[3].x = b.x + 0;
}
else
{
p = out.AddSeg(3, 2);
p[0].x = a.x - 1;
p[0].y = a.y + 0;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p[4].x = 1 + (p[2].x = a.x + 0);
p[4].y = p[2].y = a.y + 0;
p[5].x = 1 + (p[3].x = b.x + 0);
p[5].y = p[3].y = b.y + 0;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(3, 2);
p[0].y = a.y - 1;
p[0].x = a.x + 0;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p[4].y = 1 + (p[2].y = a.y + 0);
p[4].x = p[2].x = a.x + 0;
p[5].y = 1 + (p[3].y = b.y + 0);
p[5].x = p[3].x = b.x + 0;
}
else
{
p = out.AddSeg(3, 2);
p[0].x = a.x - 1;
p[0].y = a.y + 0;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p[4].x = 1 + (p[2].x = a.x + 0);
p[4].y = p[2].y = a.y + 0;
p[5].x = 1 + (p[3].x = b.x + 0);
p[5].y = p[3].y = b.y + 0;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(3, 2);
p[0].y = a.y - 1;
p[0].x = a.x + 0;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p[4].y = 1 + (p[2].y = a.y + 0);
p[4].x = p[2].x = a.x + 0;
p[5].y = 1 + (p[3].y = b.y + 0);
p[5].x = p[3].x = b.x + 0;
}
else
{
p = out.AddSeg(3, 2);
p[0].x = a.x - 1;
p[0].y = a.y + 0;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p[4].x = 1 + (p[2].x = a.x + 0);
p[4].y = p[2].y = a.y + 0;
p[5].x = 1 + (p[3].x = b.x + 0);
p[5].y = p[3].y = b.y + 0;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(3, 2);
p[0].y = a.y - 1;
p[0].x = a.x + 0;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p[4].y = 1 + (p[2].y = a.y + 0);
p[4].x = p[2].x = a.x + 0;
p[5].y = 1 + (p[3].y = b.y + 0);
p[5].x = p[3].x = b.x + 0;
}
else
{
p = out.AddSeg(3, 2);
p[0].x = a.x - 1;
p[0].y = a.y + 0;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p[4].x = 1 + (p[2].x = a.x + 0);
p[4].y = p[2].y = a.y + 0;
p[5].x = 1 + (p[3].x = b.x + 0);
p[5].y = p[3].y = b.y + 0;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_2_4(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_2_4");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + 1;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p = out.AddSeg(2, 2);
p[2].y = 1 + (p[0].y = a.y + 0);
p[2].x = p[0].x = a.x + 0;
p[3].y = 1 + (p[1].y = b.y + 0);
p[3].x = p[1].x = b.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + 1;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p = out.AddSeg(2, 2);
p[2].x = 1 + (p[0].x = a.x + 0);
p[2].y = p[0].y = a.y + 0;
p[3].x = 1 + (p[1].x = b.x + 0);
p[3].y = p[1].y = b.y + 1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + -1;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p = out.AddSeg(2, 2);
p[2].y = 1 + (p[0].y = a.y + 0);
p[2].x = p[0].x = a.x + 0;
p[3].y = 1 + (p[1].y = b.y + 0);
p[3].x = p[1].x = b.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + 1;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p = out.AddSeg(2, 2);
p[2].x = 1 + (p[0].x = a.x + 0);
p[2].y = p[0].y = a.y + 0;
p[3].x = 1 + (p[1].x = b.x + 0);
p[3].y = p[1].y = b.y + 1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + 1;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p = out.AddSeg(2, 2);
p[2].y = 1 + (p[0].y = a.y + 0);
p[2].x = p[0].x = a.x + 0;
p[3].y = 1 + (p[1].y = b.y + 0);
p[3].x = p[1].x = b.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + -1;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p = out.AddSeg(2, 2);
p[2].x = 1 + (p[0].x = a.x + 0);
p[2].y = p[0].y = a.y + 0;
p[3].x = 1 + (p[1].x = b.x + 0);
p[3].y = p[1].y = b.y + -1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + -1;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p = out.AddSeg(2, 2);
p[2].y = 1 + (p[0].y = a.y + 0);
p[2].x = p[0].x = a.x + 0;
p[3].y = 1 + (p[1].y = b.y + 0);
p[3].x = p[1].x = b.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + -1;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p = out.AddSeg(2, 2);
p[2].x = 1 + (p[0].x = a.x + 0);
p[2].y = p[0].y = a.y + 0;
p[3].x = 1 + (p[1].x = b.x + 0);
p[3].y = p[1].y = b.y + -1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_2_5(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_2_5");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + 1;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p = out.AddSeg(3, 2);
p[0].y = a.y - 1;
p[0].x = a.x + 0;
p[1].y = b.y - 0;
p[1].x = b.x + 1;
p[4].y = 1 + (p[2].y = a.y + 0);
p[4].x = p[2].x = a.x + 0;
p[5].y = 1 + (p[3].y = b.y + 1);
p[5].x = p[3].x = b.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + 1;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p = out.AddSeg(3, 2);
p[0].x = a.x - 1;
p[0].y = a.y + 0;
p[1].x = b.x - 0;
p[1].y = b.y + 1;
p[4].x = 1 + (p[2].x = a.x + 0);
p[4].y = p[2].y = a.y + 0;
p[5].x = 1 + (p[3].x = b.x + 1);
p[5].y = p[3].y = b.y + 1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + -1;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p = out.AddSeg(3, 2);
p[0].y = a.y - 1;
p[0].x = a.x + 0;
p[1].y = b.y - 0;
p[1].x = b.x + -1;
p[4].y = 1 + (p[2].y = a.y + 0);
p[4].x = p[2].x = a.x + 0;
p[5].y = 1 + (p[3].y = b.y + 1);
p[5].x = p[3].x = b.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + 1;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p = out.AddSeg(3, 2);
p[0].x = a.x - 1;
p[0].y = a.y + 0;
p[1].x = b.x - 0;
p[1].y = b.y + 1;
p[4].x = 1 + (p[2].x = a.x + 0);
p[4].y = p[2].y = a.y + 0;
p[5].x = 1 + (p[3].x = b.x + 1);
p[5].y = p[3].y = b.y + 1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + 1;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p = out.AddSeg(3, 2);
p[0].y = a.y - 1;
p[0].x = a.x + 0;
p[1].y = b.y - 0;
p[1].x = b.x + 1;
p[4].y = 1 + (p[2].y = a.y + 0);
p[4].x = p[2].x = a.x + 0;
p[5].y = 1 + (p[3].y = b.y + 1);
p[5].x = p[3].x = b.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + -1;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p = out.AddSeg(3, 2);
p[0].x = a.x - 1;
p[0].y = a.y + 0;
p[1].x = b.x - 0;
p[1].y = b.y + -1;
p[4].x = 1 + (p[2].x = a.x + 0);
p[4].y = p[2].y = a.y + 0;
p[5].x = 1 + (p[3].x = b.x + 1);
p[5].y = p[3].y = b.y + -1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + -1;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p = out.AddSeg(3, 2);
p[0].y = a.y - 1;
p[0].x = a.x + 0;
p[1].y = b.y - 0;
p[1].x = b.x + -1;
p[4].y = 1 + (p[2].y = a.y + 0);
p[4].x = p[2].x = a.x + 0;
p[5].y = 1 + (p[3].y = b.y + 1);
p[5].x = p[3].x = b.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + -1;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p = out.AddSeg(3, 2);
p[0].x = a.x - 1;
p[0].y = a.y + 0;
p[1].x = b.x - 0;
p[1].y = b.y + -1;
p[4].x = 1 + (p[2].x = a.x + 0);
p[4].y = p[2].y = a.y + 0;
p[5].x = 1 + (p[3].x = b.x + 1);
p[5].y = p[3].y = b.y + -1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_3_1(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_3_1");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 1);
p[2].x = p[0].x = a.x + 0;
p[1].y = b.y - 0;
p[1].x = b.x + 0;
p = out.AddSeg(2);
p[0].y = b.y + 1;
p[0].x = b.x + 0;
p[1].y = a.y + 1;
p[1].x = a.x + 0;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 1);
p[2].y = p[0].y = a.y + 0;
p[1].x = b.x - 0;
p[1].y = b.y + 0;
p = out.AddSeg(2);
p[0].x = b.x + 1;
p[0].y = b.y + 0;
p[1].x = a.x + 1;
p[1].y = a.y + 0;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 1);
p[2].x = p[0].x = a.x + 0;
p[1].y = b.y - 0;
p[1].x = b.x + 0;
p = out.AddSeg(2);
p[0].y = b.y + 1;
p[0].x = b.x + 0;
p[1].y = a.y + 1;
p[1].x = a.x + 0;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 1);
p[2].y = p[0].y = a.y + 0;
p[1].x = b.x - 0;
p[1].y = b.y + 0;
p = out.AddSeg(2);
p[0].x = b.x + 1;
p[0].y = b.y + 0;
p[1].x = a.x + 1;
p[1].y = a.y + 0;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 1);
p[2].x = p[0].x = a.x + 0;
p[1].y = b.y - 0;
p[1].x = b.x + 0;
p = out.AddSeg(2);
p[0].y = b.y + 1;
p[0].x = b.x + 0;
p[1].y = a.y + 1;
p[1].x = a.x + 0;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 1);
p[2].y = p[0].y = a.y + 0;
p[1].x = b.x - 0;
p[1].y = b.y + 0;
p = out.AddSeg(2);
p[0].x = b.x + 1;
p[0].y = b.y + 0;
p[1].x = a.x + 1;
p[1].y = a.y + 0;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 1);
p[2].x = p[0].x = a.x + 0;
p[1].y = b.y - 0;
p[1].x = b.x + 0;
p = out.AddSeg(2);
p[0].y = b.y + 1;
p[0].x = b.x + 0;
p[1].y = a.y + 1;
p[1].x = a.x + 0;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 1);
p[2].y = p[0].y = a.y + 0;
p[1].x = b.x - 0;
p[1].y = b.y + 0;
p = out.AddSeg(2);
p[0].x = b.x + 1;
p[0].y = b.y + 0;
p[1].x = a.x + 1;
p[1].y = a.y + 0;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_3_2(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_3_2");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(3, 2);
p[0].y = b.y - 1;
p[0].x = b.x + 0;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p[4].y = 1 + (p[2].y = b.y + 0);
p[4].x = p[2].x = b.x + 0;
p[5].y = 1 + (p[3].y = a.y + 0);
p[5].x = p[3].x = a.x + 0;
}
else
{
p = out.AddSeg(3, 2);
p[0].x = b.x - 1;
p[0].y = b.y + 0;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p[4].x = 1 + (p[2].x = b.x + 0);
p[4].y = p[2].y = b.y + 0;
p[5].x = 1 + (p[3].x = a.x + 0);
p[5].y = p[3].y = a.y + 0;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(3, 2);
p[0].y = b.y - 1;
p[0].x = b.x + 0;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p[4].y = 1 + (p[2].y = b.y + 0);
p[4].x = p[2].x = b.x + 0;
p[5].y = 1 + (p[3].y = a.y + 0);
p[5].x = p[3].x = a.x + 0;
}
else
{
p = out.AddSeg(3, 2);
p[0].x = b.x - 1;
p[0].y = b.y + 0;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p[4].x = 1 + (p[2].x = b.x + 0);
p[4].y = p[2].y = b.y + 0;
p[5].x = 1 + (p[3].x = a.x + 0);
p[5].y = p[3].y = a.y + 0;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(3, 2);
p[0].y = b.y - 1;
p[0].x = b.x + 0;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p[4].y = 1 + (p[2].y = b.y + 0);
p[4].x = p[2].x = b.x + 0;
p[5].y = 1 + (p[3].y = a.y + 0);
p[5].x = p[3].x = a.x + 0;
}
else
{
p = out.AddSeg(3, 2);
p[0].x = b.x - 1;
p[0].y = b.y + 0;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p[4].x = 1 + (p[2].x = b.x + 0);
p[4].y = p[2].y = b.y + 0;
p[5].x = 1 + (p[3].x = a.x + 0);
p[5].y = p[3].y = a.y + 0;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(3, 2);
p[0].y = b.y - 1;
p[0].x = b.x + 0;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p[4].y = 1 + (p[2].y = b.y + 0);
p[4].x = p[2].x = b.x + 0;
p[5].y = 1 + (p[3].y = a.y + 0);
p[5].x = p[3].x = a.x + 0;
}
else
{
p = out.AddSeg(3, 2);
p[0].x = b.x - 1;
p[0].y = b.y + 0;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p[4].x = 1 + (p[2].x = b.x + 0);
p[4].y = p[2].y = b.y + 0;
p[5].x = 1 + (p[3].x = a.x + 0);
p[5].y = p[3].y = a.y + 0;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_3_3(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_3_3");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(3, 2);
p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -1));
p[4].x = p[2].x = p[0].x = a.x + 0;
p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -1));
p[5].x = p[3].x = p[1].x = b.x + 0;
}
else
{
p = out.AddSeg(3, 2);
p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -1));
p[4].y = p[2].y = p[0].y = a.y + 0;
p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -1));
p[5].y = p[3].y = p[1].y = b.y + 0;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(3, 2);
p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -1));
p[4].x = p[2].x = p[0].x = a.x + 0;
p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -1));
p[5].x = p[3].x = p[1].x = b.x + 0;
}
else
{
p = out.AddSeg(3, 2);
p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -1));
p[4].y = p[2].y = p[0].y = a.y + 0;
p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -1));
p[5].y = p[3].y = p[1].y = b.y + 0;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(3, 2);
p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -1));
p[4].x = p[2].x = p[0].x = a.x + 0;
p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -1));
p[5].x = p[3].x = p[1].x = b.x + 0;
}
else
{
p = out.AddSeg(3, 2);
p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -1));
p[4].y = p[2].y = p[0].y = a.y + 0;
p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -1));
p[5].y = p[3].y = p[1].y = b.y + 0;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(3, 2);
p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -1));
p[4].x = p[2].x = p[0].x = a.x + 0;
p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -1));
p[5].x = p[3].x = p[1].x = b.x + 0;
}
else
{
p = out.AddSeg(3, 2);
p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -1));
p[4].y = p[2].y = p[0].y = a.y + 0;
p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -1));
p[5].y = p[3].y = p[1].y = b.y + 0;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_3_4(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_3_4");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(4, 2);
p[0].y = a.y - 1;
p[0].x = a.x + 0;
p[1].y = b.y - 2;
p[1].x = b.x + 1;
p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + 0));
p[6].x = p[4].x = p[2].x = a.x + 0;
p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1));
p[7].x = p[5].x = p[3].x = b.x + 1;
}
else
{
p = out.AddSeg(4, 2);
p[0].x = a.x - 1;
p[0].y = a.y + 0;
p[1].x = b.x - 2;
p[1].y = b.y + 1;
p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + 0));
p[6].y = p[4].y = p[2].y = a.y + 0;
p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1));
p[7].y = p[5].y = p[3].y = b.y + 1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(4, 2);
p[0].y = a.y - 1;
p[0].x = a.x + 0;
p[1].y = b.y - 2;
p[1].x = b.x + -1;
p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + 0));
p[6].x = p[4].x = p[2].x = a.x + 0;
p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1));
p[7].x = p[5].x = p[3].x = b.x + -1;
}
else
{
p = out.AddSeg(4, 2);
p[0].x = a.x - 1;
p[0].y = a.y + 0;
p[1].x = b.x - 2;
p[1].y = b.y + 1;
p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + 0));
p[6].y = p[4].y = p[2].y = a.y + 0;
p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1));
p[7].y = p[5].y = p[3].y = b.y + 1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(4, 2);
p[0].y = a.y - 1;
p[0].x = a.x + 0;
p[1].y = b.y - 2;
p[1].x = b.x + 1;
p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + 0));
p[6].x = p[4].x = p[2].x = a.x + 0;
p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1));
p[7].x = p[5].x = p[3].x = b.x + 1;
}
else
{
p = out.AddSeg(4, 2);
p[0].x = a.x - 1;
p[0].y = a.y + 0;
p[1].x = b.x - 2;
p[1].y = b.y + -1;
p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + 0));
p[6].y = p[4].y = p[2].y = a.y + 0;
p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1));
p[7].y = p[5].y = p[3].y = b.y + -1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(4, 2);
p[0].y = a.y - 1;
p[0].x = a.x + 0;
p[1].y = b.y - 2;
p[1].x = b.x + -1;
p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + 0));
p[6].x = p[4].x = p[2].x = a.x + 0;
p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1));
p[7].x = p[5].x = p[3].x = b.x + -1;
}
else
{
p = out.AddSeg(4, 2);
p[0].x = a.x - 1;
p[0].y = a.y + 0;
p[1].x = b.x - 2;
p[1].y = b.y + -1;
p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + 0));
p[6].y = p[4].y = p[2].y = a.y + 0;
p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1));
p[7].y = p[5].y = p[3].y = b.y + -1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_3_5(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_3_5");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + 1;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p = out.AddSeg(3, 2);
p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + 0));
p[4].x = p[2].x = p[0].x = a.x + 0;
p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + 0));
p[5].x = p[3].x = p[1].x = b.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + 1;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p = out.AddSeg(3, 2);
p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + 0));
p[4].y = p[2].y = p[0].y = a.y + 0;
p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + 0));
p[5].y = p[3].y = p[1].y = b.y + 1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + -1;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p = out.AddSeg(3, 2);
p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + 0));
p[4].x = p[2].x = p[0].x = a.x + 0;
p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + 0));
p[5].x = p[3].x = p[1].x = b.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + 1;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p = out.AddSeg(3, 2);
p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + 0));
p[4].y = p[2].y = p[0].y = a.y + 0;
p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + 0));
p[5].y = p[3].y = p[1].y = b.y + 1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + 1;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p = out.AddSeg(3, 2);
p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + 0));
p[4].x = p[2].x = p[0].x = a.x + 0;
p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + 0));
p[5].x = p[3].x = p[1].x = b.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + -1;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p = out.AddSeg(3, 2);
p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + 0));
p[4].y = p[2].y = p[0].y = a.y + 0;
p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + 0));
p[5].y = p[3].y = p[1].y = b.y + -1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = b.y - 2);
p[2].x = p[0].x = b.x + -1;
p[1].y = a.y - 1;
p[1].x = a.x + 0;
p = out.AddSeg(3, 2);
p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + 0));
p[4].x = p[2].x = p[0].x = a.x + 0;
p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + 0));
p[5].x = p[3].x = p[1].x = b.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = b.x - 2);
p[2].y = p[0].y = b.y + -1;
p[1].x = a.x - 1;
p[1].y = a.y + 0;
p = out.AddSeg(3, 2);
p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + 0));
p[4].y = p[2].y = p[0].y = a.y + 0;
p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + 0));
p[5].y = p[3].y = p[1].y = b.y + -1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_4_1(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_4_1");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + -1;
p[1].y = b.y - 0;
p[1].x = b.x + 0;
p = out.AddSeg(2, 2);
p[0].y = b.y - 0;
p[0].x = b.x + 0;
p[1].y = a.y - 0;
p[1].x = a.x + -1;
p[2].y = b.y + 1;
p[2].x = b.x + 0;
p[3].y = a.y + 1;
p[3].x = a.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + -1;
p[1].x = b.x - 0;
p[1].y = b.y + 0;
p = out.AddSeg(2, 2);
p[0].x = b.x - 0;
p[0].y = b.y + 0;
p[1].x = a.x - 0;
p[1].y = a.y + -1;
p[2].x = b.x + 1;
p[2].y = b.y + 0;
p[3].x = a.x + 1;
p[3].y = a.y + -1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + 1;
p[1].y = b.y - 0;
p[1].x = b.x + 0;
p = out.AddSeg(2, 2);
p[0].y = b.y - 0;
p[0].x = b.x + 0;
p[1].y = a.y - 0;
p[1].x = a.x + 1;
p[2].y = b.y + 1;
p[2].x = b.x + 0;
p[3].y = a.y + 1;
p[3].x = a.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + -1;
p[1].x = b.x - 0;
p[1].y = b.y + 0;
p = out.AddSeg(2, 2);
p[0].x = b.x - 0;
p[0].y = b.y + 0;
p[1].x = a.x - 0;
p[1].y = a.y + -1;
p[2].x = b.x + 1;
p[2].y = b.y + 0;
p[3].x = a.x + 1;
p[3].y = a.y + -1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + -1;
p[1].y = b.y - 0;
p[1].x = b.x + 0;
p = out.AddSeg(2, 2);
p[0].y = b.y - 0;
p[0].x = b.x + 0;
p[1].y = a.y - 0;
p[1].x = a.x + -1;
p[2].y = b.y + 1;
p[2].x = b.x + 0;
p[3].y = a.y + 1;
p[3].x = a.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + 1;
p[1].x = b.x - 0;
p[1].y = b.y + 0;
p = out.AddSeg(2, 2);
p[0].x = b.x - 0;
p[0].y = b.y + 0;
p[1].x = a.x - 0;
p[1].y = a.y + 1;
p[2].x = b.x + 1;
p[2].y = b.y + 0;
p[3].x = a.x + 1;
p[3].y = a.y + 1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + 1;
p[1].y = b.y - 0;
p[1].x = b.x + 0;
p = out.AddSeg(2, 2);
p[0].y = b.y - 0;
p[0].x = b.x + 0;
p[1].y = a.y - 0;
p[1].x = a.x + 1;
p[2].y = b.y + 1;
p[2].x = b.x + 0;
p[3].y = a.y + 1;
p[3].x = a.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + 1;
p[1].x = b.x - 0;
p[1].y = b.y + 0;
p = out.AddSeg(2, 2);
p[0].x = b.x - 0;
p[0].y = b.y + 0;
p[1].x = a.x - 0;
p[1].y = a.y + 1;
p[2].x = b.x + 1;
p[2].y = b.y + 0;
p[3].x = a.x + 1;
p[3].y = a.y + 1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_4_2(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_4_2");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + -1;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p = out.AddSeg(2, 2);
p[2].y = 1 + (p[0].y = b.y + 0);
p[2].x = p[0].x = b.x + 0;
p[3].y = 1 + (p[1].y = a.y + 0);
p[3].x = p[1].x = a.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + -1;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p = out.AddSeg(2, 2);
p[2].x = 1 + (p[0].x = b.x + 0);
p[2].y = p[0].y = b.y + 0;
p[3].x = 1 + (p[1].x = a.x + 0);
p[3].y = p[1].y = a.y + -1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + 1;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p = out.AddSeg(2, 2);
p[2].y = 1 + (p[0].y = b.y + 0);
p[2].x = p[0].x = b.x + 0;
p[3].y = 1 + (p[1].y = a.y + 0);
p[3].x = p[1].x = a.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + -1;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p = out.AddSeg(2, 2);
p[2].x = 1 + (p[0].x = b.x + 0);
p[2].y = p[0].y = b.y + 0;
p[3].x = 1 + (p[1].x = a.x + 0);
p[3].y = p[1].y = a.y + -1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + -1;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p = out.AddSeg(2, 2);
p[2].y = 1 + (p[0].y = b.y + 0);
p[2].x = p[0].x = b.x + 0;
p[3].y = 1 + (p[1].y = a.y + 0);
p[3].x = p[1].x = a.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + 1;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p = out.AddSeg(2, 2);
p[2].x = 1 + (p[0].x = b.x + 0);
p[2].y = p[0].y = b.y + 0;
p[3].x = 1 + (p[1].x = a.x + 0);
p[3].y = p[1].y = a.y + 1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + 1;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p = out.AddSeg(2, 2);
p[2].y = 1 + (p[0].y = b.y + 0);
p[2].x = p[0].x = b.x + 0;
p[3].y = 1 + (p[1].y = a.y + 0);
p[3].x = p[1].x = a.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + 1;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p = out.AddSeg(2, 2);
p[2].x = 1 + (p[0].x = b.x + 0);
p[2].y = p[0].y = b.y + 0;
p[3].x = 1 + (p[1].x = a.x + 0);
p[3].y = p[1].y = a.y + 1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_4_3(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_4_3");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(4, 2);
p[0].y = b.y - 1;
p[0].x = b.x + 0;
p[1].y = a.y - 2;
p[1].x = a.x + -1;
p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + 0));
p[6].x = p[4].x = p[2].x = b.x + 0;
p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1));
p[7].x = p[5].x = p[3].x = a.x + -1;
}
else
{
p = out.AddSeg(4, 2);
p[0].x = b.x - 1;
p[0].y = b.y + 0;
p[1].x = a.x - 2;
p[1].y = a.y + -1;
p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + 0));
p[6].y = p[4].y = p[2].y = b.y + 0;
p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1));
p[7].y = p[5].y = p[3].y = a.y + -1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(4, 2);
p[0].y = b.y - 1;
p[0].x = b.x + 0;
p[1].y = a.y - 2;
p[1].x = a.x + 1;
p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + 0));
p[6].x = p[4].x = p[2].x = b.x + 0;
p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1));
p[7].x = p[5].x = p[3].x = a.x + 1;
}
else
{
p = out.AddSeg(4, 2);
p[0].x = b.x - 1;
p[0].y = b.y + 0;
p[1].x = a.x - 2;
p[1].y = a.y + -1;
p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + 0));
p[6].y = p[4].y = p[2].y = b.y + 0;
p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1));
p[7].y = p[5].y = p[3].y = a.y + -1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(4, 2);
p[0].y = b.y - 1;
p[0].x = b.x + 0;
p[1].y = a.y - 2;
p[1].x = a.x + -1;
p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + 0));
p[6].x = p[4].x = p[2].x = b.x + 0;
p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1));
p[7].x = p[5].x = p[3].x = a.x + -1;
}
else
{
p = out.AddSeg(4, 2);
p[0].x = b.x - 1;
p[0].y = b.y + 0;
p[1].x = a.x - 2;
p[1].y = a.y + 1;
p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + 0));
p[6].y = p[4].y = p[2].y = b.y + 0;
p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1));
p[7].y = p[5].y = p[3].y = a.y + 1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(4, 2);
p[0].y = b.y - 1;
p[0].x = b.x + 0;
p[1].y = a.y - 2;
p[1].x = a.x + 1;
p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + 0));
p[6].x = p[4].x = p[2].x = b.x + 0;
p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1));
p[7].x = p[5].x = p[3].x = a.x + 1;
}
else
{
p = out.AddSeg(4, 2);
p[0].x = b.x - 1;
p[0].y = b.y + 0;
p[1].x = a.x - 2;
p[1].y = a.y + 1;
p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + 0));
p[6].y = p[4].y = p[2].y = b.y + 0;
p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1));
p[7].y = p[5].y = p[3].y = a.y + 1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_4_4(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_4_4");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(4, 2);
p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2)));
p[6].x = p[4].x = p[2].x = p[0].x = a.x + -1;
p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2)));
p[7].x = p[5].x = p[3].x = p[1].x = b.x + 1;
}
else
{
p = out.AddSeg(4, 2);
p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2)));
p[6].y = p[4].y = p[2].y = p[0].y = a.y + -1;
p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2)));
p[7].y = p[5].y = p[3].y = p[1].y = b.y + 1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(4, 2);
p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2)));
p[6].x = p[4].x = p[2].x = p[0].x = a.x + 1;
p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2)));
p[7].x = p[5].x = p[3].x = p[1].x = b.x + -1;
}
else
{
p = out.AddSeg(4, 2);
p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2)));
p[6].y = p[4].y = p[2].y = p[0].y = a.y + -1;
p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2)));
p[7].y = p[5].y = p[3].y = p[1].y = b.y + 1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(4, 2);
p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2)));
p[6].x = p[4].x = p[2].x = p[0].x = a.x + -1;
p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2)));
p[7].x = p[5].x = p[3].x = p[1].x = b.x + 1;
}
else
{
p = out.AddSeg(4, 2);
p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2)));
p[6].y = p[4].y = p[2].y = p[0].y = a.y + 1;
p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2)));
p[7].y = p[5].y = p[3].y = p[1].y = b.y + -1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(4, 2);
p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2)));
p[6].x = p[4].x = p[2].x = p[0].x = a.x + 1;
p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2)));
p[7].x = p[5].x = p[3].x = p[1].x = b.x + -1;
}
else
{
p = out.AddSeg(4, 2);
p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2)));
p[6].y = p[4].y = p[2].y = p[0].y = a.y + 1;
p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2)));
p[7].y = p[5].y = p[3].y = p[1].y = b.y + -1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_4_5(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_4_5");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(5, 2);
p[0].y = a.y - 2;
p[0].x = a.x + -1;
p[1].y = b.y - 2;
p[1].x = b.x + 1;
p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + -1)));
p[8].x = p[6].x = p[4].x = p[2].x = a.x + -1;
p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1)));
p[9].x = p[7].x = p[5].x = p[3].x = b.x + 1;
}
else
{
p = out.AddSeg(5, 2);
p[0].x = a.x - 2;
p[0].y = a.y + -1;
p[1].x = b.x - 2;
p[1].y = b.y + 1;
p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + -1)));
p[8].y = p[6].y = p[4].y = p[2].y = a.y + -1;
p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1)));
p[9].y = p[7].y = p[5].y = p[3].y = b.y + 1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(5, 2);
p[0].y = a.y - 2;
p[0].x = a.x + 1;
p[1].y = b.y - 2;
p[1].x = b.x + -1;
p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + -1)));
p[8].x = p[6].x = p[4].x = p[2].x = a.x + 1;
p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1)));
p[9].x = p[7].x = p[5].x = p[3].x = b.x + -1;
}
else
{
p = out.AddSeg(5, 2);
p[0].x = a.x - 2;
p[0].y = a.y + -1;
p[1].x = b.x - 2;
p[1].y = b.y + 1;
p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + -1)));
p[8].y = p[6].y = p[4].y = p[2].y = a.y + -1;
p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1)));
p[9].y = p[7].y = p[5].y = p[3].y = b.y + 1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(5, 2);
p[0].y = a.y - 2;
p[0].x = a.x + -1;
p[1].y = b.y - 2;
p[1].x = b.x + 1;
p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + -1)));
p[8].x = p[6].x = p[4].x = p[2].x = a.x + -1;
p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1)));
p[9].x = p[7].x = p[5].x = p[3].x = b.x + 1;
}
else
{
p = out.AddSeg(5, 2);
p[0].x = a.x - 2;
p[0].y = a.y + 1;
p[1].x = b.x - 2;
p[1].y = b.y + -1;
p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + -1)));
p[8].y = p[6].y = p[4].y = p[2].y = a.y + 1;
p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1)));
p[9].y = p[7].y = p[5].y = p[3].y = b.y + -1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(5, 2);
p[0].y = a.y - 2;
p[0].x = a.x + 1;
p[1].y = b.y - 2;
p[1].x = b.x + -1;
p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = a.y + -1)));
p[8].x = p[6].x = p[4].x = p[2].x = a.x + 1;
p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = b.y + -1)));
p[9].x = p[7].x = p[5].x = p[3].x = b.x + -1;
}
else
{
p = out.AddSeg(5, 2);
p[0].x = a.x - 2;
p[0].y = a.y + 1;
p[1].x = b.x - 2;
p[1].y = b.y + -1;
p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = a.x + -1)));
p[8].y = p[6].y = p[4].y = p[2].y = a.y + 1;
p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = b.x + -1)));
p[9].y = p[7].y = p[5].y = p[3].y = b.y + -1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_5_1(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_5_1");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(2, 3);
p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = a.y - 2)));
p[3].x = p[5].x = p[2].x = p[0].x = a.x + -1;
p[4].y = p[1].y = b.y - 0;
p[4].x = p[1].x = b.x + 0;
p = out.AddSeg(2);
p[0].y = b.y + 1;
p[0].x = b.x + 0;
p[1].y = a.y + 2;
p[1].x = a.x + -1;
}
else
{
p = out.AddSeg(2, 3);
p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = a.x - 2)));
p[3].y = p[5].y = p[2].y = p[0].y = a.y + -1;
p[4].x = p[1].x = b.x - 0;
p[4].y = p[1].y = b.y + 0;
p = out.AddSeg(2);
p[0].x = b.x + 1;
p[0].y = b.y + 0;
p[1].x = a.x + 2;
p[1].y = a.y + -1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(2, 3);
p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = a.y - 2)));
p[3].x = p[5].x = p[2].x = p[0].x = a.x + 1;
p[4].y = p[1].y = b.y - 0;
p[4].x = p[1].x = b.x + 0;
p = out.AddSeg(2);
p[0].y = b.y + 1;
p[0].x = b.x + 0;
p[1].y = a.y + 2;
p[1].x = a.x + 1;
}
else
{
p = out.AddSeg(2, 3);
p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = a.x - 2)));
p[3].y = p[5].y = p[2].y = p[0].y = a.y + -1;
p[4].x = p[1].x = b.x - 0;
p[4].y = p[1].y = b.y + 0;
p = out.AddSeg(2);
p[0].x = b.x + 1;
p[0].y = b.y + 0;
p[1].x = a.x + 2;
p[1].y = a.y + -1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(2, 3);
p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = a.y - 2)));
p[3].x = p[5].x = p[2].x = p[0].x = a.x + -1;
p[4].y = p[1].y = b.y - 0;
p[4].x = p[1].x = b.x + 0;
p = out.AddSeg(2);
p[0].y = b.y + 1;
p[0].x = b.x + 0;
p[1].y = a.y + 2;
p[1].x = a.x + -1;
}
else
{
p = out.AddSeg(2, 3);
p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = a.x - 2)));
p[3].y = p[5].y = p[2].y = p[0].y = a.y + 1;
p[4].x = p[1].x = b.x - 0;
p[4].y = p[1].y = b.y + 0;
p = out.AddSeg(2);
p[0].x = b.x + 1;
p[0].y = b.y + 0;
p[1].x = a.x + 2;
p[1].y = a.y + 1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(2, 3);
p[5].y = 1 + (p[3].y = 1 + (p[2].y = 1 + (p[0].y = a.y - 2)));
p[3].x = p[5].x = p[2].x = p[0].x = a.x + 1;
p[4].y = p[1].y = b.y - 0;
p[4].x = p[1].x = b.x + 0;
p = out.AddSeg(2);
p[0].y = b.y + 1;
p[0].x = b.x + 0;
p[1].y = a.y + 2;
p[1].x = a.x + 1;
}
else
{
p = out.AddSeg(2, 3);
p[5].x = 1 + (p[3].x = 1 + (p[2].x = 1 + (p[0].x = a.x - 2)));
p[3].y = p[5].y = p[2].y = p[0].y = a.y + 1;
p[4].x = p[1].x = b.x - 0;
p[4].y = p[1].y = b.y + 0;
p = out.AddSeg(2);
p[0].x = b.x + 1;
p[0].y = b.y + 0;
p[1].x = a.x + 2;
p[1].y = a.y + 1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_5_2(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_5_2");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + -1;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p = out.AddSeg(3, 2);
p[0].y = b.y - 1;
p[0].x = b.x + 0;
p[1].y = a.y - 0;
p[1].x = a.x + -1;
p[4].y = 1 + (p[2].y = b.y + 0);
p[4].x = p[2].x = b.x + 0;
p[5].y = 1 + (p[3].y = a.y + 1);
p[5].x = p[3].x = a.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + -1;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p = out.AddSeg(3, 2);
p[0].x = b.x - 1;
p[0].y = b.y + 0;
p[1].x = a.x - 0;
p[1].y = a.y + -1;
p[4].x = 1 + (p[2].x = b.x + 0);
p[4].y = p[2].y = b.y + 0;
p[5].x = 1 + (p[3].x = a.x + 1);
p[5].y = p[3].y = a.y + -1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + 1;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p = out.AddSeg(3, 2);
p[0].y = b.y - 1;
p[0].x = b.x + 0;
p[1].y = a.y - 0;
p[1].x = a.x + 1;
p[4].y = 1 + (p[2].y = b.y + 0);
p[4].x = p[2].x = b.x + 0;
p[5].y = 1 + (p[3].y = a.y + 1);
p[5].x = p[3].x = a.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + -1;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p = out.AddSeg(3, 2);
p[0].x = b.x - 1;
p[0].y = b.y + 0;
p[1].x = a.x - 0;
p[1].y = a.y + -1;
p[4].x = 1 + (p[2].x = b.x + 0);
p[4].y = p[2].y = b.y + 0;
p[5].x = 1 + (p[3].x = a.x + 1);
p[5].y = p[3].y = a.y + -1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + -1;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p = out.AddSeg(3, 2);
p[0].y = b.y - 1;
p[0].x = b.x + 0;
p[1].y = a.y - 0;
p[1].x = a.x + -1;
p[4].y = 1 + (p[2].y = b.y + 0);
p[4].x = p[2].x = b.x + 0;
p[5].y = 1 + (p[3].y = a.y + 1);
p[5].x = p[3].x = a.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + 1;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p = out.AddSeg(3, 2);
p[0].x = b.x - 1;
p[0].y = b.y + 0;
p[1].x = a.x - 0;
p[1].y = a.y + 1;
p[4].x = 1 + (p[2].x = b.x + 0);
p[4].y = p[2].y = b.y + 0;
p[5].x = 1 + (p[3].x = a.x + 1);
p[5].y = p[3].y = a.y + 1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + 1;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p = out.AddSeg(3, 2);
p[0].y = b.y - 1;
p[0].x = b.x + 0;
p[1].y = a.y - 0;
p[1].x = a.x + 1;
p[4].y = 1 + (p[2].y = b.y + 0);
p[4].x = p[2].x = b.x + 0;
p[5].y = 1 + (p[3].y = a.y + 1);
p[5].x = p[3].x = a.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + 1;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p = out.AddSeg(3, 2);
p[0].x = b.x - 1;
p[0].y = b.y + 0;
p[1].x = a.x - 0;
p[1].y = a.y + 1;
p[4].x = 1 + (p[2].x = b.x + 0);
p[4].y = p[2].y = b.y + 0;
p[5].x = 1 + (p[3].x = a.x + 1);
p[5].y = p[3].y = a.y + 1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_5_3(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_5_3");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + -1;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p = out.AddSeg(3, 2);
p[4].y = 1 + (p[2].y = 1 + (p[0].y = b.y + 0));
p[4].x = p[2].x = p[0].x = b.x + 0;
p[5].y = 1 + (p[3].y = 1 + (p[1].y = a.y + 0));
p[5].x = p[3].x = p[1].x = a.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + -1;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p = out.AddSeg(3, 2);
p[4].x = 1 + (p[2].x = 1 + (p[0].x = b.x + 0));
p[4].y = p[2].y = p[0].y = b.y + 0;
p[5].x = 1 + (p[3].x = 1 + (p[1].x = a.x + 0));
p[5].y = p[3].y = p[1].y = a.y + -1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + 1;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p = out.AddSeg(3, 2);
p[4].y = 1 + (p[2].y = 1 + (p[0].y = b.y + 0));
p[4].x = p[2].x = p[0].x = b.x + 0;
p[5].y = 1 + (p[3].y = 1 + (p[1].y = a.y + 0));
p[5].x = p[3].x = p[1].x = a.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + -1;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p = out.AddSeg(3, 2);
p[4].x = 1 + (p[2].x = 1 + (p[0].x = b.x + 0));
p[4].y = p[2].y = p[0].y = b.y + 0;
p[5].x = 1 + (p[3].x = 1 + (p[1].x = a.x + 0));
p[5].y = p[3].y = p[1].y = a.y + -1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + -1;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p = out.AddSeg(3, 2);
p[4].y = 1 + (p[2].y = 1 + (p[0].y = b.y + 0));
p[4].x = p[2].x = p[0].x = b.x + 0;
p[5].y = 1 + (p[3].y = 1 + (p[1].y = a.y + 0));
p[5].x = p[3].x = p[1].x = a.x + -1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + 1;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p = out.AddSeg(3, 2);
p[4].x = 1 + (p[2].x = 1 + (p[0].x = b.x + 0));
p[4].y = p[2].y = p[0].y = b.y + 0;
p[5].x = 1 + (p[3].x = 1 + (p[1].x = a.x + 0));
p[5].y = p[3].y = p[1].y = a.y + 1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(3);
p[2].y = 1 + (p[0].y = a.y - 2);
p[2].x = p[0].x = a.x + 1;
p[1].y = b.y - 1;
p[1].x = b.x + 0;
p = out.AddSeg(3, 2);
p[4].y = 1 + (p[2].y = 1 + (p[0].y = b.y + 0));
p[4].x = p[2].x = p[0].x = b.x + 0;
p[5].y = 1 + (p[3].y = 1 + (p[1].y = a.y + 0));
p[5].x = p[3].x = p[1].x = a.x + 1;
}
else
{
p = out.AddSeg(3);
p[2].x = 1 + (p[0].x = a.x - 2);
p[2].y = p[0].y = a.y + 1;
p[1].x = b.x - 1;
p[1].y = b.y + 0;
p = out.AddSeg(3, 2);
p[4].x = 1 + (p[2].x = 1 + (p[0].x = b.x + 0));
p[4].y = p[2].y = p[0].y = b.y + 0;
p[5].x = 1 + (p[3].x = 1 + (p[1].x = a.x + 0));
p[5].y = p[3].y = p[1].y = a.y + 1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_5_4(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_5_4");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(5, 2);
p[0].y = b.y - 2;
p[0].x = b.x + 1;
p[1].y = a.y - 2;
p[1].x = a.x + -1;
p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + -1)));
p[8].x = p[6].x = p[4].x = p[2].x = b.x + 1;
p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1)));
p[9].x = p[7].x = p[5].x = p[3].x = a.x + -1;
}
else
{
p = out.AddSeg(5, 2);
p[0].x = b.x - 2;
p[0].y = b.y + 1;
p[1].x = a.x - 2;
p[1].y = a.y + -1;
p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + -1)));
p[8].y = p[6].y = p[4].y = p[2].y = b.y + 1;
p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1)));
p[9].y = p[7].y = p[5].y = p[3].y = a.y + -1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(5, 2);
p[0].y = b.y - 2;
p[0].x = b.x + -1;
p[1].y = a.y - 2;
p[1].x = a.x + 1;
p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + -1)));
p[8].x = p[6].x = p[4].x = p[2].x = b.x + -1;
p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1)));
p[9].x = p[7].x = p[5].x = p[3].x = a.x + 1;
}
else
{
p = out.AddSeg(5, 2);
p[0].x = b.x - 2;
p[0].y = b.y + 1;
p[1].x = a.x - 2;
p[1].y = a.y + -1;
p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + -1)));
p[8].y = p[6].y = p[4].y = p[2].y = b.y + 1;
p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1)));
p[9].y = p[7].y = p[5].y = p[3].y = a.y + -1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(5, 2);
p[0].y = b.y - 2;
p[0].x = b.x + 1;
p[1].y = a.y - 2;
p[1].x = a.x + -1;
p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + -1)));
p[8].x = p[6].x = p[4].x = p[2].x = b.x + 1;
p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1)));
p[9].x = p[7].x = p[5].x = p[3].x = a.x + -1;
}
else
{
p = out.AddSeg(5, 2);
p[0].x = b.x - 2;
p[0].y = b.y + -1;
p[1].x = a.x - 2;
p[1].y = a.y + 1;
p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + -1)));
p[8].y = p[6].y = p[4].y = p[2].y = b.y + -1;
p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1)));
p[9].y = p[7].y = p[5].y = p[3].y = a.y + 1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(5, 2);
p[0].y = b.y - 2;
p[0].x = b.x + -1;
p[1].y = a.y - 2;
p[1].x = a.x + 1;
p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = b.y + -1)));
p[8].x = p[6].x = p[4].x = p[2].x = b.x + -1;
p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = a.y + -1)));
p[9].x = p[7].x = p[5].x = p[3].x = a.x + 1;
}
else
{
p = out.AddSeg(5, 2);
p[0].x = b.x - 2;
p[0].y = b.y + -1;
p[1].x = a.x - 2;
p[1].y = a.y + 1;
p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = b.x + -1)));
p[8].y = p[6].y = p[4].y = p[2].y = b.y + -1;
p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = a.x + -1)));
p[9].y = p[7].y = p[5].y = p[3].y = a.y + 1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
static void PathDraw_Output_5_5(PathDraw::Output& out, Point a, Point b)
{
//RTIMING("PathDraw_Output_5_5");
Point *p;
int dx = b.x - a.x, dy = b.y - a.y;
if(dy >= 0)
{
if(dx >= 0)
{
if(dx >= dy)
{
p = out.AddSeg(5, 2);
p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2))));
p[8].x = p[6].x = p[4].x = p[2].x = p[0].x = a.x + -1;
p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2))));
p[9].x = p[7].x = p[5].x = p[3].x = p[1].x = b.x + 1;
}
else
{
p = out.AddSeg(5, 2);
p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2))));
p[8].y = p[6].y = p[4].y = p[2].y = p[0].y = a.y + -1;
p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2))));
p[9].y = p[7].y = p[5].y = p[3].y = p[1].y = b.y + 1;
}
}
else
{
if(0 >= dx + dy)
{
p = out.AddSeg(5, 2);
p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2))));
p[8].x = p[6].x = p[4].x = p[2].x = p[0].x = a.x + 1;
p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2))));
p[9].x = p[7].x = p[5].x = p[3].x = p[1].x = b.x + -1;
}
else
{
p = out.AddSeg(5, 2);
p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2))));
p[8].y = p[6].y = p[4].y = p[2].y = p[0].y = a.y + -1;
p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2))));
p[9].y = p[7].y = p[5].y = p[3].y = p[1].y = b.y + 1;
}
}
}
else
{
if(dx >= 0)
{
if(dx + dy >= 0)
{
p = out.AddSeg(5, 2);
p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2))));
p[8].x = p[6].x = p[4].x = p[2].x = p[0].x = a.x + -1;
p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2))));
p[9].x = p[7].x = p[5].x = p[3].x = p[1].x = b.x + 1;
}
else
{
p = out.AddSeg(5, 2);
p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2))));
p[8].y = p[6].y = p[4].y = p[2].y = p[0].y = a.y + 1;
p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2))));
p[9].y = p[7].y = p[5].y = p[3].y = p[1].y = b.y + -1;
}
}
else
{
if(dy >= dx)
{
p = out.AddSeg(5, 2);
p[8].y = 1 + (p[6].y = 1 + (p[4].y = 1 + (p[2].y = 1 + (p[0].y = a.y + -2))));
p[8].x = p[6].x = p[4].x = p[2].x = p[0].x = a.x + 1;
p[9].y = 1 + (p[7].y = 1 + (p[5].y = 1 + (p[3].y = 1 + (p[1].y = b.y + -2))));
p[9].x = p[7].x = p[5].x = p[3].x = p[1].x = b.x + -1;
}
else
{
p = out.AddSeg(5, 2);
p[8].x = 1 + (p[6].x = 1 + (p[4].x = 1 + (p[2].x = 1 + (p[0].x = a.x + -2))));
p[8].y = p[6].y = p[4].y = p[2].y = p[0].y = a.y + 1;
p[9].x = 1 + (p[7].x = 1 + (p[5].x = 1 + (p[3].x = 1 + (p[1].x = b.x + -2))));
p[9].y = p[7].y = p[5].y = p[3].y = p[1].y = b.y + -1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
void (*PathDraw_Output_Thick[5][5])(PathDraw::Output& out, Point a, Point b) =
{
{
PathDraw_Output_1_1,
PathDraw_Output_1_2,
PathDraw_Output_1_3,
PathDraw_Output_1_4,
PathDraw_Output_1_5,
},
{
PathDraw_Output_2_1,
PathDraw_Output_2_2,
PathDraw_Output_2_3,
PathDraw_Output_2_4,
PathDraw_Output_2_5,
},
{
PathDraw_Output_3_1,
PathDraw_Output_3_2,
PathDraw_Output_3_3,
PathDraw_Output_3_4,
PathDraw_Output_3_5,
},
{
PathDraw_Output_4_1,
PathDraw_Output_4_2,
PathDraw_Output_4_3,
PathDraw_Output_4_4,
PathDraw_Output_4_5,
},
{
PathDraw_Output_5_1,
PathDraw_Output_5_2,
PathDraw_Output_5_3,
PathDraw_Output_5_4,
PathDraw_Output_5_5,
},
};
}