public SortableSize AllocateSize(int width, int height, int id) { if (m_SortableSizeStack.Count > 0) { SortableSize size = m_SortableSizeStack.Pop(); size.width = width; size.height = height; size.id = id; return(size); } return(new SortableSize(width, height, id)); }
public int packRectangles(bool sort = true) { if (sort) { mInsertList.Sort((emp1, emp2) => emp1.width.CompareTo(emp2.width)); } while (mInsertList.Count > 0) { SortableSize sortableSize = mInsertList.Pop(); int width = sortableSize.width; int height = sortableSize.height; int index = getFreeAreaIndex(width, height); if (index >= 0) { IntegerRectangle freeArea = mFreeAreas[index]; IntegerRectangle target = allocateRectangle(freeArea.x, freeArea.y, width, height); target.id = sortableSize.id; // Generate the new free areas, these are parts of the old ones intersected or touched by the target generateNewFreeAreas(target, mFreeAreas, mNewFreeAreas); while (mNewFreeAreas.Count > 0) { mFreeAreas.Add(mNewFreeAreas.Pop()); } mInsertedRectangles.Add(target); if (target.right > mPackedWidth) { mPackedWidth = target.right; } if (target.bottom > mPackedHeight) { mPackedHeight = target.bottom; } } freeSize(sortableSize); } return(rectangleCount); }
public int PackRectangles(bool sort = true) { if (sort) { m_InsertList.Sort((emp1, emp2) => emp1.width.CompareTo(emp2.width)); } while (m_InsertList.Count > 0) { SortableSize sortableSize = m_InsertList.Pop(); int width = sortableSize.width; int height = sortableSize.height; int index = GetFreeAreaIndex(width, height);//根据W,H 得到下标 if (index >= 0) { IntegerRectangle freeArea = m_FreeAreas[index];//得到一个可以容纳target的Area IntegerRectangle target = RectanglePackerMgr.S.AllocateIntegerRectangle(freeArea.x, freeArea.y, width, height); target.id = sortableSize.id; // Generate the new free areas, these are parts of the old ones intersected or touched by the target GenerateNewFreeAreas(target, m_TempFreeAreas); while (m_TempFreeAreas.Count > 0) { m_FreeAreas.Add(m_TempFreeAreas.Pop()); } m_InsertedRectangles.Add(target); if (target.right > m_PackedWidth) { m_PackedWidth = target.right; } if (target.top > m_PackedHeight) { m_PackedHeight = target.top; } } RectanglePackerMgr.S.ReleaseSize(sortableSize); } return(rectangleCount); }
private void freeSize(SortableSize size) { mSortableSizeStack.Add(size); }
public void insertRectangle(int width, int height, int id) { SortableSize sortableSize = allocateSize(width, height, id); mInsertList.Add(sortableSize); }
public void ReleaseSize(SortableSize size) { m_SortableSizeStack.Add(size); }
public void InsertRectangle(int width, int height, int id) { SortableSize sortableSize = RectanglePackerMgr.S.AllocateSize(width, height, id); m_InsertList.Add(sortableSize); }