2 #include "dpreglist.h"
\r
4 unsigned DPRegionList::GetDPArea() const
\r
7 for (unsigned i = 0; i < m_uCount; ++i)
\r
9 const DPRegion &r = m_DPRegions[i];
\r
10 if (DPREGIONTYPE_Rect == r.m_Type)
\r
11 uArea += r.m_Rect.m_uLengthA*r.m_Rect.m_uLengthB;
\r
16 void DPRegionList::Add(const DPRegion &r)
\r
18 if (m_uCount == MAX_DPREGIONS)
\r
19 Quit("DPRegionList::Add, overflow %d", m_uCount);
\r
20 m_DPRegions[m_uCount] = r;
\r
24 void DPRegionList::LogMe() const
\r
26 Log("DPRegionList::LogMe, count=%u\n", m_uCount);
\r
27 Log("Region Type StartA StartB EndA EndB\n");
\r
28 Log("------ ---- ------ ------ ---- ----\n");
\r
29 for (unsigned i = 0; i < m_uCount; ++i)
\r
31 const DPRegion &r = m_DPRegions[i];
\r
33 if (DPREGIONTYPE_Diag == r.m_Type)
\r
34 Log("Diag %6u %6u %6u %6u\n",
\r
35 r.m_Diag.m_uStartPosA,
\r
36 r.m_Diag.m_uStartPosB,
\r
37 r.m_Diag.m_uStartPosA + r.m_Diag.m_uLength - 1,
\r
38 r.m_Diag.m_uStartPosB + r.m_Diag.m_uLength - 1);
\r
39 else if (DPREGIONTYPE_Rect == r.m_Type)
\r
40 Log("Rect %6u %6u %6u %6u\n",
\r
41 r.m_Rect.m_uStartPosA,
\r
42 r.m_Rect.m_uStartPosB,
\r
43 r.m_Rect.m_uStartPosA + r.m_Rect.m_uLengthA - 1,
\r
44 r.m_Rect.m_uStartPosB + r.m_Rect.m_uLengthB - 1);
\r
46 Log(" *** ERROR *** Type=%u\n", r.m_Type);
\r
50 void DiagListToDPRegionList(const DiagList &DL, DPRegionList &RL,
\r
51 unsigned uLengthA, unsigned uLengthB)
\r
53 if (g_uDiagMargin > g_uMinDiagLength/2)
\r
54 Quit("Invalid parameters, diagmargin=%d must be <= 2*diaglength=%d",
\r
55 g_uDiagMargin, g_uMinDiagLength);
\r
57 unsigned uStartPosA = 0;
\r
58 unsigned uStartPosB = 0;
\r
59 const unsigned uDiagCount = DL.GetCount();
\r
61 for (unsigned uDiagIndex = 0; uDiagIndex < uDiagCount; ++uDiagIndex)
\r
63 const Diag &d = DL.Get(uDiagIndex);
\r
64 assert(d.m_uLength >= g_uMinDiagLength);
\r
65 const unsigned uStartVertexA = d.m_uStartPosA + g_uDiagMargin - 1;
\r
66 const unsigned uStartVertexB = d.m_uStartPosB + g_uDiagMargin - 1;
\r
67 const unsigned uEndVertexA = d.m_uStartPosA + d.m_uLength - g_uDiagMargin;
\r
68 const unsigned uEndVertexB = d.m_uStartPosB + d.m_uLength - g_uDiagMargin;
\r
70 r.m_Type = DPREGIONTYPE_Rect;
\r
71 r.m_Rect.m_uStartPosA = uStartPosA;
\r
72 r.m_Rect.m_uStartPosB = uStartPosB;
\r
74 assert(uStartVertexA + 1 >= uStartPosA);
\r
75 assert(uStartVertexB + 1 >= uStartPosB);
\r
76 r.m_Rect.m_uLengthA = uStartVertexA + 1 - uStartPosA;
\r
77 r.m_Rect.m_uLengthB = uStartVertexB + 1 - uStartPosB;
\r
80 if (uEndVertexA > uStartVertexA + 1)
\r
82 const unsigned uDiagLengthMinusCaps = uEndVertexA - uStartVertexA - 1;
\r
84 r.m_Type = DPREGIONTYPE_Diag;
\r
85 r.m_Diag.m_uStartPosA = uStartVertexA + 1;
\r
86 r.m_Diag.m_uStartPosB = uStartVertexB + 1;
\r
87 assert(uEndVertexA - uStartVertexA == uEndVertexB - uStartVertexB);
\r
88 r.m_Diag.m_uLength = uEndVertexA - uStartVertexA - 1;
\r
92 uStartPosA = uEndVertexA;
\r
93 uStartPosB = uEndVertexB;
\r
96 assert((int) uLengthA - (int) uStartPosA >= (int) g_uDiagMargin);
\r
97 assert((int) uLengthB - (int) uStartPosB >= (int) g_uDiagMargin);
\r
99 r.m_Type = DPREGIONTYPE_Rect;
\r
100 r.m_Rect.m_uStartPosA = uStartPosA;
\r
101 r.m_Rect.m_uStartPosB = uStartPosB;
\r
103 assert(uLengthA >= uStartPosA);
\r
104 assert(uLengthB >= uStartPosB);
\r
105 r.m_Rect.m_uLengthA = uLengthA - uStartPosA;
\r
106 r.m_Rect.m_uLengthB = uLengthB - uStartPosB;
\r