csgeom/subrec.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 2001-2005 by Jorrit Tyberghein 00003 2003-2005 by Frank Richter 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Library General Public 00007 License as published by the Free Software Foundation; either 00008 version 2 of the License, or (at your option) any later version. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Library General Public License for more details. 00014 00015 You should have received a copy of the GNU Library General Public 00016 License along with this library; if not, write to the Free 00017 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00018 */ 00019 00020 #ifndef __CS_SUBREC_H__ 00021 #define __CS_SUBREC_H__ 00022 00030 #include "csextern.h" 00031 00032 #include "csgeom/csrect.h" 00033 00034 #include "csutil/array.h" 00035 #include "csutil/blockallocator.h" 00036 00042 class CS_CRYSTALSPACE_EXPORT csSubRectangles 00043 { 00044 public: 00048 class SubRect 00049 { 00050 protected: 00051 friend class csSubRectangles; 00052 typedef csBlockAllocator<SubRect> SubRectAlloc; 00053 friend class csBlockAllocator<SubRect>; // SubRectAlloc 00054 00055 enum SplitType 00056 { 00057 SPLIT_UNSPLIT, 00058 SPLIT_H, 00059 SPLIT_V 00060 }; 00061 enum AllocPos 00062 { 00063 ALLOC_INVALID = -1, 00064 ALLOC_RIGHT, 00065 ALLOC_BELOW, 00066 ALLOC_NEW 00067 }; 00068 struct AllocInfo 00069 { 00070 SubRect* node; 00071 int d; 00072 AllocPos allocPos; 00073 bool res; 00074 00075 AllocInfo() : node(0), d(0x7fffffff), allocPos(ALLOC_INVALID), 00076 res(false) {}; 00077 }; 00078 friend struct AllocInfo; // Give MSVC6 access to ALLOC_INVALID. 00079 00080 csRect rect; 00081 csRect allocedRect; 00082 int splitPos; 00083 SplitType splitType; 00084 00085 csSubRectangles* superrect; 00086 SubRect* parent; 00087 SubRect* children[2]; 00088 00089 SubRect (); 00090 SubRect& operator= (const SubRect& other); 00091 00093 void TestAlloc (int w, int h, AllocInfo& ai); 00095 SubRect* Alloc (int w, int h, const AllocInfo& ai, csRect& r); 00097 void Reclaim (); 00099 void TestCollapse (); 00100 00103 void DecideBestSplit (const csRect& rect, int splitX, int splitY, 00104 SubRect::SplitType& splitType); 00105 }; 00106 friend class SubRect; // Give MSVC6 access to enclosing protected scope. 00107 protected: 00109 csRect region; 00111 SubRect* root; 00112 00113 SubRect::SubRectAlloc alloc; 00114 inline SubRect* AllocSubrect () 00115 { return alloc.Alloc(); } 00116 void FreeSubrect (SubRect* sr); 00117 00119 csArray<SubRect*> leaves; 00120 inline void AddLeaf (SubRect* sr) 00121 { 00122 leaves.InsertSorted (sr); 00123 } 00124 void RemoveLeaf (SubRect* sr) 00125 { 00126 size_t index = leaves.FindSortedKey ( 00127 csArrayCmp<SubRect*, SubRect*> (sr)); 00128 leaves.DeleteIndex (index); 00129 } 00130 00131 void Grow (SubRect* sr, int ow, int oh, int nw, int nh); 00132 public: 00134 csSubRectangles (const csRect& region); 00135 csSubRectangles (const csSubRectangles& other); 00136 00138 ~csSubRectangles (); 00139 00141 const csRect& GetRectangle () const { return region; } 00142 00146 void Clear (); 00147 00151 SubRect* Alloc (int w, int h, csRect& rect); 00152 00157 void Reclaim (SubRect* subrect); 00158 00163 bool Grow (int newWidth, int newHeight); 00164 00168 void Dump (); 00169 }; 00170 00171 typedef csSubRectangles::SubRect csSubRect; 00172 00175 #endif // __CS_SUBREC_H__ 00176
Generated for Crystal Space by doxygen 1.4.7