gecko-dev/cmd/macfe/utility/StRegionHandle.h

105 строки
4.1 KiB
C++

//////////////////////////////////
//
// StRegionHandle.h
//
// by Drew Thaler, athaler@umich.edu
// released 9/21/96
//
// This source code is public domain.
//
//////////////////////////////////
// MGY: renamed to StRegionHandle (from StRegion) to avoid conflict with
// existing StRegion.
#ifndef _StRegionHandle_H_
#define _StRegionHandle_H_
#pragma mark -- StRegionHandle --
// -------------------------------------------------------------------------
// ¥ StRegionHandle
// -------------------------------------------------------------------------
//
// This class is an abstraction of the Macintosh Region data structure,
// implemented entirely with inline functions. It's meant to provide an
// easy-to-use interface to most of the standard region operations -- copying,
// adding, subtracting, xor'ing, intersecting, converting to/from rectangles,
// etc -- while using the magic of C++ to protect the user from the gory details.
//
// Benefits: ¥ Automatic memory management -- say goodbye to NewRgn, DisposeRgn, etc!
// ¥ Standard operators like +=, -=, &=, ==, etc for both Rects and RgnHandles
// ¥ Automatic coercion operators, can use directly in Toolbox calls
// ¥ No extra function calls: feels like C++, generates code like C.
//
class StRegionHandle
{
public:
StRegionHandle() { mRegion = ::NewRgn(); }
StRegionHandle(const RgnHandle fromRgn) { mRegion = ::NewRgn(); ::CopyRgn( fromRgn, mRegion ); }
StRegionHandle(const Rect &fromRect) { mRegion = ::NewRgn(); ::RectRgn( mRegion, &fromRect ); }
~StRegionHandle() { if (mRegion) ::DisposeRgn(mRegion); }
Rect bbox() const { return (**mRegion).rgnBBox; }
void GetBounds(Rect &outRect) const { outRect = (**mRegion).rgnBBox; }
void Clear() { ::SetEmptyRgn(mRegion); }
Boolean IsEmpty() const { return ::EmptyRgn(mRegion); }
RgnHandle Detach() { RgnHandle oldRegion = mRegion; mRegion = ::NewRgn(); return oldRegion; }
Boolean IsValid() { return (mRegion!=nil); }
operator RgnHandle() const { return mRegion; }
operator Handle() const { return (Handle)mRegion; }
RgnHandle & operator += ( RgnHandle r ) { ::UnionRgn(mRegion,r,mRegion); return mRegion; }
RgnHandle & operator -= ( RgnHandle r ) { ::DiffRgn(mRegion,r,mRegion); return mRegion; }
RgnHandle & operator |= ( RgnHandle r ) { ::UnionRgn(mRegion,r,mRegion); return mRegion; }
RgnHandle & operator &= ( RgnHandle r ) { ::SectRgn(mRegion,r,mRegion); return mRegion; }
RgnHandle & operator ^= ( RgnHandle r ) { ::XorRgn(mRegion,r,mRegion); return mRegion; }
RgnHandle & operator = ( RgnHandle r ) { ::CopyRgn(r,mRegion); return mRegion; }
RgnHandle & operator += ( Rect & rect ) { StRegionHandle r(rect); ::UnionRgn(mRegion,r,mRegion); return mRegion; }
RgnHandle & operator -= ( Rect & rect ) { StRegionHandle r(rect); ::DiffRgn(mRegion,r,mRegion); return mRegion; }
RgnHandle & operator |= ( Rect & rect ) { StRegionHandle r(rect); ::UnionRgn(mRegion,r,mRegion); return mRegion; }
RgnHandle & operator &= ( Rect & rect ) { StRegionHandle r(rect); ::SectRgn(mRegion,r,mRegion); return mRegion; }
RgnHandle & operator ^= ( Rect & rect ) { StRegionHandle r(rect); ::XorRgn(mRegion,r,mRegion); return mRegion; }
RgnHandle & operator = ( Rect &r ) { ::RectRgn(mRegion,&r); return mRegion; }
Boolean operator == ( RgnHandle r ) { return ::EqualRgn(r,mRegion); }
Boolean operator != ( RgnHandle r ) { return !::EqualRgn(r,mRegion); }
Boolean operator == ( Rect & rect ) { StRegionHandle r(rect); return ::EqualRgn(r,mRegion); }
Boolean operator != ( Rect & rect ) { StRegionHandle r(rect); return !::EqualRgn(r,mRegion); }
// why not, so you can do "if rgn == 0", right?
RgnHandle & operator = ( int x ) { ::SetEmptyRgn(mRegion); return mRegion; }
Boolean operator == ( int x ) { return ( (x==0) && ::EmptyRgn(mRegion) ); }
Boolean operator != ( int x ) { return ( (x!=0) || !::EmptyRgn(mRegion) ); }
private:
RgnHandle mRegion;
};
//////////////////////////////////
#pragma mark -- StTempRegion --
typedef class StRegionHandle StTempRegion;
#endif // _StRegionHandle_H_