void DiagList::Copy(const DiagList &DL) { Clear(); unsigned uCount = DL.GetCount(); for (unsigned i = 0; i < uCount; ++i) Add(DL.Get(i)); }
void DiagListToDPRegionList(const DiagList &DL, DPRegionList &RL, unsigned uLengthA, unsigned uLengthB) { if (g_uDiagMargin > g_uMinDiagLength/2) Quit("Invalid parameters, diagmargin=%d must be <= 2*diaglength=%d", g_uDiagMargin, g_uMinDiagLength); unsigned uStartPosA = 0; unsigned uStartPosB = 0; const unsigned uDiagCount = DL.GetCount(); DPRegion r; for (unsigned uDiagIndex = 0; uDiagIndex < uDiagCount; ++uDiagIndex) { const Diag &d = DL.Get(uDiagIndex); assert(d.m_uLength >= g_uMinDiagLength); const unsigned uStartVertexA = d.m_uStartPosA + g_uDiagMargin - 1; const unsigned uStartVertexB = d.m_uStartPosB + g_uDiagMargin - 1; const unsigned uEndVertexA = d.m_uStartPosA + d.m_uLength - g_uDiagMargin; const unsigned uEndVertexB = d.m_uStartPosB + d.m_uLength - g_uDiagMargin; r.m_Type = DPREGIONTYPE_Rect; r.m_Rect.m_uStartPosA = uStartPosA; r.m_Rect.m_uStartPosB = uStartPosB; assert(uStartVertexA + 1 >= uStartPosA); assert(uStartVertexB + 1 >= uStartPosB); r.m_Rect.m_uLengthA = uStartVertexA + 1 - uStartPosA; r.m_Rect.m_uLengthB = uStartVertexB + 1 - uStartPosB; RL.Add(r); if (uEndVertexA > uStartVertexA + 1) { const unsigned uDiagLengthMinusCaps = uEndVertexA - uStartVertexA - 1; r.m_Type = DPREGIONTYPE_Diag; r.m_Diag.m_uStartPosA = uStartVertexA + 1; r.m_Diag.m_uStartPosB = uStartVertexB + 1; assert(uEndVertexA - uStartVertexA == uEndVertexB - uStartVertexB); r.m_Diag.m_uLength = uEndVertexA - uStartVertexA - 1; RL.Add(r); } uStartPosA = uEndVertexA; uStartPosB = uEndVertexB; } assert((int) uLengthA - (int) uStartPosA >= (int) g_uDiagMargin); assert((int) uLengthB - (int) uStartPosB >= (int) g_uDiagMargin); r.m_Type = DPREGIONTYPE_Rect; r.m_Rect.m_uStartPosA = uStartPosA; r.m_Rect.m_uStartPosB = uStartPosB; assert(uLengthA >= uStartPosA); assert(uLengthB >= uStartPosB); r.m_Rect.m_uLengthA = uLengthA - uStartPosA; r.m_Rect.m_uLengthB = uLengthB - uStartPosB; RL.Add(r); }
// Merge diagonals that are continuations of each other with // short breaks of up to length g_uMaxDiagBreak. // In a sorted list of diagonals, we only have to check // consecutive entries. void MergeDiags(DiagList &DL) { unsigned &g_uMaxDiagBreak = getMuscleContext()->params.g_uMaxDiagBreak; return; #if DEBUG if (!DL.IsSorted()) Quit("MergeDiags: !IsSorted"); #endif // TODO: Fix this! // Breaks must be with no offset (no gaps) const unsigned uCount = DL.GetCount(); if (uCount <= 1) return; DiagList NewList; Diag MergedDiag; const Diag *ptrPrev = &DL.Get(0); for (unsigned i = 1; i < uCount; ++i) { const Diag *ptrDiag = &DL.Get(i); unsigned uBreakLength = DiagBreak(*ptrPrev, *ptrDiag); if (uBreakLength <= g_uMaxDiagBreak) { MergedDiag.m_uStartPosA = ptrPrev->m_uStartPosA; MergedDiag.m_uStartPosB = ptrPrev->m_uStartPosB; MergedDiag.m_uLength = ptrPrev->m_uLength + ptrDiag->m_uLength + uBreakLength; ptrPrev = &MergedDiag; } else { NewList.Add(*ptrPrev); ptrPrev = ptrDiag; } } NewList.Add(*ptrPrev); DL.Copy(NewList); }