Next version of JABA
[jabaws.git] / binaries / src / muscle / dpreglist.cpp
1 #include "muscle.h"\r
2 #include "dpreglist.h"\r
3 \r
4 unsigned DPRegionList::GetDPArea() const\r
5         {\r
6         unsigned uArea = 0;\r
7         for (unsigned i = 0; i < m_uCount; ++i)\r
8                 {\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
12                 }\r
13         return uArea;\r
14         }\r
15 \r
16 void DPRegionList::Add(const DPRegion &r)\r
17         {\r
18         if (m_uCount == MAX_DPREGIONS)\r
19                 Quit("DPRegionList::Add, overflow %d", m_uCount);\r
20         m_DPRegions[m_uCount] = r;\r
21         ++m_uCount;\r
22         }\r
23 \r
24 void DPRegionList::LogMe() const\r
25         {\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
30                 {\r
31                 const DPRegion &r = m_DPRegions[i];\r
32                 Log("%6u  ", 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
45                 else\r
46                         Log(" *** ERROR *** Type=%u\n", r.m_Type);\r
47                 }\r
48         }\r
49 \r
50 void DiagListToDPRegionList(const DiagList &DL, DPRegionList &RL,\r
51   unsigned uLengthA, unsigned uLengthB)\r
52         {\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
56 \r
57         unsigned uStartPosA = 0;\r
58         unsigned uStartPosB = 0;\r
59         const unsigned uDiagCount = DL.GetCount();\r
60         DPRegion r;\r
61         for (unsigned uDiagIndex = 0; uDiagIndex < uDiagCount; ++uDiagIndex)\r
62                 {\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
69 \r
70                 r.m_Type = DPREGIONTYPE_Rect;\r
71                 r.m_Rect.m_uStartPosA = uStartPosA;\r
72                 r.m_Rect.m_uStartPosB = uStartPosB;\r
73 \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
78                 RL.Add(r);\r
79 \r
80                 if (uEndVertexA > uStartVertexA + 1)\r
81                         {\r
82                         const unsigned uDiagLengthMinusCaps = uEndVertexA - uStartVertexA - 1;\r
83 \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
89                         RL.Add(r);\r
90                         }\r
91 \r
92                 uStartPosA = uEndVertexA;\r
93                 uStartPosB = uEndVertexB;\r
94                 }\r
95 \r
96         assert((int) uLengthA - (int) uStartPosA >= (int) g_uDiagMargin);\r
97         assert((int) uLengthB - (int) uStartPosB >= (int) g_uDiagMargin);\r
98 \r
99         r.m_Type = DPREGIONTYPE_Rect;\r
100         r.m_Rect.m_uStartPosA = uStartPosA;\r
101         r.m_Rect.m_uStartPosB = uStartPosB;\r
102 \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
107         RL.Add(r);\r
108         }\r