#ifndef NME_EXTENT_H #define NME_EXTENT_H namespace nme { template struct Extent2D { T_ minX,maxX; T_ minY,maxY; bool validX,validY; Extent2D() : validX(false), validY(false) { minX = minY = maxX = maxY = 0; } template inline void AddX(P_ inX) { if (validX) { if (inXmaxX) maxX = (T_)inX; } else { minX = maxX = (T_)inX; validX = true; } } template inline void AddY(P_ inY) { if (validY) { if (inYmaxY) maxY = (T_)inY; } else { minY = maxY = (T_)inY; validY = true; } } template inline void Add(P_ inX, P_ inY) { AddX(inX); AddY(inY); } template inline void Add(const P_ &inPoint) { AddX(inPoint.x); AddY(inPoint.y); } inline void Add(const Extent2D &inExtent) { if (inExtent.validX) { AddX(inExtent.minX); AddX(inExtent.maxX); } if (inExtent.validY) { AddY(inExtent.minY); AddY(inExtent.maxY); } } bool Intersect(T_ inX0,T_ inY0, T_ inX1, T_ inY1) { if (!validX) { minX = inX0; maxX = inX1; validX = true; } else { if (inX0 > minX) minX = inX0; if (inX1 < maxX) maxX = inX1; } if (!validY) { minY = inY0; maxY = inY1; validY = true; } else { if (inY0 > minY) minY = inY0; if (inY1 < maxY) maxY = inY1; } return minX bool Contains(const O_ &inOther) const { return validX && validY && inOther.x>=minX && inOther.x=minY && inOther.y Rect() const { if (!Valid()) return TRect(0,0,0,0); return TRect(minX,minY,maxX,maxY,true); } template bool GetRect(RECT &outRect,double inExtraX=0,double inExtraY=0) { if (!Valid()) { outRect = RECT(0,0,0,0); return false; } outRect = RECT(minX,minY,maxX+inExtraX,maxY+inExtraY,true); return true; } inline bool Valid() const { return validX && validY; } void Invalidate() { validX = validY = false; } T_ Width() const { return maxX-minX; } T_ Height() const { return maxY-minY; } }; typedef Extent2D Extent2DI; typedef Extent2D Extent2DF; } // end namespace nme #endif