#include "stdafx.h" #include "reclay.h" void CReserveCheck::AddRange(int i,int j) { set >::iterator it1,it2,it3; if (i > j) swap(i,j); it1 = find_if(m_rsrv.begin(),m_rsrv.end(),FCompMap1(i)); it2 = it3 = find_if(it1,m_rsrv.end(),FCompMap2(j)); if (it1 != m_rsrv.end()) i = _MIN(i,it1->first); if (it3 != m_rsrv.begin()) j = _MAX(j,(--it3)->second); m_rsrv.erase(it1,it2); m_rsrv.insert(make_pair(i,j)); } int CReserveCheck::GetPos(int st,int len) { set >::iterator it1,it2 = m_rsrv.begin(); while (true) { it1 = it2 = find_if(it2,m_rsrv.end(),FCompMap3(st + len)); if (it1 != m_rsrv.begin()) --it1, st = _MAX(st,it1->second); if (it2 == m_rsrv.end() || it2->first - st >= len) break; st = it2->second; ++it2; } return st; } void CLayoutRect::AddRect(const CRect& r0,int i) { CRect r = r0; int k = Check(r,i); AddRect(r); } void CLayoutRect::AddRectMinMove(const CRect& r0) { int i,k, mn = -1; CRect r,rr; for (i=0;i<4;++i) { r = r0; k = Check(r,i); if (mn < 0 || mn > k) {mn = k; rr = r;} } AddRect(rr); } int CLayoutRect::Check(CRect& r0,int i)const { CARect& r = *(CARect*)&r0; i = ((unsigned int)i)%4; int w, sg = i<2 ? 1 : -1, j = (i+2)%4; CReserveCheck rc; list::const_iterator it; w = 1 - i%2; for (it=m_data.begin();it!=m_data.end();++it) { const CARect& ar = *it; if (r.v[w] < ar.v[w+2] && r.v[w+2] > ar.v[w]) rc.AddRange(ar.v[i]*sg,ar.v[j]*sg); } int k = rc.GetPos(r.v[i]*sg,(r.v[j] - r.v[i])*sg)*sg - r.v[i]; r.v[i] += k; r.v[j] += k; return k*sg; }