mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-08 12:37:37 +00:00
105 lines
4.1 KiB
C++
105 lines
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_
|
|
|