CrystalSpace

Public API Reference

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