|
|
/******************************Module*Header*******************************\
* Module Name: rgnobj.hxx * * Region user object * * Created: 27-Jun-1990 12:39:38 * Author: Donald Sidoroff [donalds] * * Copyright (c) 1990-1999 Microsoft Corporation \**************************************************************************/
#ifndef _RGNOBJ_HXX
#define _RGNOBJ_HXX 1
// Constants for bSubtract
#define SR_LEFT_NOTCH 0x00
#define SR_HORIZ_CLIP 0x01
#define SR_HORIZ_NOTCH 0x02
#define SR_RIGHT_NOTCH 0x03
#define SR_TOP_NOTCH 0x00
#define SR_VERT_CLIP 0x04
#define SR_VERT_NOTCH 0x08
#define SR_BOTTOM_NOTCH 0x0c
class EPATHOBJ; class STACKOBJ; class PDEVOBJ;
#include "region.hxx"
class EDGE; typedef EDGE *PEDGE;
/*********************************Class************************************\
* class RGNOBJ * * User object for REGION class. * * Public Interface: * * RGNOBJ Constructor for derived classes * ~RGNOBJ() Destructor * * BOOL bValid Validator * HRGN hrgn Get handle to region * VOID vCopy Copy region (source <= target) * BOOL bCopy Copy region * BOOL bSwap Swap region * BOOL bDelete Delete region * BOOL bExpand Expand region * VOID vGet_rcl Get bounding rectangle of region * COUNT cGet_cRefs Get reference count * VOID vSelect Select region into this HDC * VOID vUnselect Unselect region * PSCAN pscnGet Get next scan * PSCAN pscnGot Get previous scan * LONG iComplexity Get region complexity * BOOL bBounded Is point in bounding rectangle * VOID vTighten Tighten the bounding rectandle * LONG xGet Get X coordinate * BOOL bInside Is point in region * BOOL bInside Is rectangle in regon * BOOL bEqual Is region equal * BOOL bOffset Offset region * VOID vSet Set region to NULL region * VOID vSet Set region to SINGLE rectangle * BOOL bSet Set region to OR of rectangles * PSCAN pscnMerge Merge scans * BOOL bMerge Merge regions * LONG iCombine Combine regions * LONG iCombine Combine rect and region * * History: * 05-Apr-1991 -by- Wendy Wu [wendywu] * Added protected member functions used by RGNMEMOBJ to convert paths into * regions. * * 09-Jul-1990 -by- Donald Sidoroff [donalds] * Wrote it. \**************************************************************************/
class RGNOBJ /* ro */ {
public: REGION *prgn;
protected:
public: RGNOBJ() {}
RGNOBJ(REGION *prgn_) { prgn = prgn_; } ~RGNOBJ() {}
REGION *prgnGet() { return(prgn); } VOID vSetRgn(REGION *prgn_) { prgn = prgn_; } HRGN hrgnAssociate() { #if DBG
RGNLOG rl(prgn,"RGNOBJ::hrgnAssociate"); HRGN hrgn = (HRGN)HmgInsertObject(prgn,0,RGN_TYPE); rl.vRet((ULONG_PTR)(hrgn)); return(hrgn); #else
return((HRGN)HmgInsertObject(prgn,0,RGN_TYPE)); #endif
}
VOID vCopy(RGNOBJ&); BOOL bCopy(RGNOBJ&); BOOL bSwap(RGNOBJ *); BOOL bExpand(ULONGSIZE_T); VOID vStamp() {prgn->vStamp();}
BOOL bValid() { return(prgn != (REGION *) NULL); }
VOID vDeleteRGNOBJ();
//
// The compiler is smart enough to optimize out the
// return TRUE and if it's left inline the compiler
// can optimize out constant conditionals based on bDelete.
//
BOOL bDeleteRGNOBJ() { vDeleteRGNOBJ(); return(TRUE); }
LONG xGet(SCAN *pscn, PTRDIFF i) { return(pscn->ai_x[i].x); } ULONGSIZE_T sizeRgn() { return(prgn->sizeRgn); } VOID vGet_rcl(RECTL *prcl) { *prcl = prgn->rcl; }
SCAN *pscnGet(SCAN *pscn) {return((SCAN *) ((BYTE *) pscn + pscn->sizeGet()));} SCAN *pscnGot(SCAN *pscn) { pscn = (SCAN *) &((COUNT *) pscn)[-1]; return((SCAN *) ((BYTE *) pscn - (pscn->sizeGet() - sizeof(COUNT)))); }
// Return rectangle that lies completely within region. Essentially
// enumerate first rectange in region.
VOID vGetSubRect(RECTL *prcl); BOOL bIsRectEntirelyInRegion(RECTL *prcl);
COUNT cGet_cRefs() { return(prgn->cRefs); }
VOID vSelect(HDC hdc_) { RGNLOG rl(prgn,"RGNOBJ::vSelect",PtrToUlong(hdc_),prgn->cRefs);
prgn->cRefs++; }
VOID vUnselect() { RGNLOG rl(prgn,"RGNOBJ::vUnselect",(LONG)prgn->cRefs);
ASSERTGDI(prgn->cRefs, "Invalid ref count\n");
prgn->cRefs--; }
LONG iComplexity() { if (prgn->cScans == 1) return(NULLREGION); else if (prgn->sizeRgn <= SINGLE_REGION_SIZE) return(SIMPLEREGION); else return(COMPLEXREGION); }
BOOL bRectl() {return(prgn->sizeRgn == SINGLE_REGION_SIZE);}
BOOL bBounded(POINTL *pptl) { return((pptl->x >= prgn->rcl.left) && (pptl->y < prgn->rcl.bottom) && (pptl->x < prgn->rcl.right) && (pptl->y >= prgn->rcl.top)); }
BOOL bContain(RGNOBJ& ro) { return((prgn->rcl.left <= ro.prgn->rcl.left)&& (prgn->rcl.right >= ro.prgn->rcl.right)&& (prgn->rcl.top <= ro.prgn->rcl.top)&& (prgn->rcl.bottom >= ro.prgn->rcl.bottom)); }
BOOL bContain(RECTL& rcl) { return((prgn->rcl.left <= rcl.left)&& (prgn->rcl.right >= rcl.right)&& (prgn->rcl.top <= rcl.top)&& (prgn->rcl.bottom >= rcl.bottom)); }
VOID vTighten(); // RGNOBJ.CXX
ULONGSIZE_T sizeSave();
BOOL bCreate(EPATHOBJ&, EXFORMOBJ *); // RGNOBJ.CXX
BOOL bOutline(EPATHOBJ&, EXFORMOBJ *); // RGNOBJ.CXX
LONG xMyGet(SCAN*, LONG, LONG); // RGNOBJ.CXX
BOOL bInside(POINTL *); BOOL bInside(RECTL *); BOOL bEqual(RGNOBJ&); BOOL bOffset(POINTL *);
VOID vSet(); VOID vSet(RECTL *); BOOL bMerge(RGNOBJ&, RGNOBJ&, FCHAR); LONG iCombine(RGNOBJ&, RGNOBJ&, LONG);
VOID vDownload(VOID *); VOID vComputeUncoveredSpriteRegion(PDEVOBJ&);
BOOL SyncUserRgn(); VOID UpdateUserRgn();
BOOL bSet(ULONG cRect, RECTL *prcl);
#if DBG
VOID vPrintScans(); BOOL bValidateFramedRegion(); #endif
};
/*********************************Class************************************\
* class RGNOBJAPI : public RGNOBJ * * User object for REGION class for API regions. * * History: * 27-Oct-1992 -by- Donald Sidoroff [donalds] * Wrote it. \**************************************************************************/
class RGNOBJAPI : public RGNOBJ { private: BOOL bSubtractComplex(RECTL *, RECTL *, int);
public: HRGN hrgn_; BOOL bSelect_;
RGNOBJAPI(HRGN hrgn,BOOL bSelect);
~RGNOBJAPI() { RGNLOG rl(hrgn_,prgn,"RGNOBJAPI::~RGNOBJAPI"); if (!bSelect_) { UpdateUserRgn(); } if (prgn != (REGION *)NULL) { DEC_EXCLUSIVE_REF_CNT(prgn); } }
BOOL bCopy(RGNOBJ& roSrc);
BOOL bSwap(RGNOBJ *pro); BOOL bDeleteRGNOBJAPI(); BOOL bDeleteHandle();
BOOL bSubtract(RECTL *, RECTL *, int);
HRGN hrgn() { return(hrgn_); }
LONG iCombine(RGNOBJ& roSrc1,RGNOBJ& roSrc2,LONG iMode); };
/*********************************Class************************************\
* class RGNMEMOBJ : public RGNOBJ * * Memory object for REGION class. * * Public Interface: * * RGNMEMOBJ Constructor for derived classes * RGNMEMOBJ(EPATHOBJ&, FLONG) Constructor for converting paths to regions. * ~RGNMEMOBJ() Destructor * * VOID vInit Initialize memory object * * History: * 05-Apr-1991 -by- Wendy Wu [wendywu] * Added RGNMEMOBJ constructor for converting paths into regions. * * 09-Jul-1990 -by- Donald Sidoroff [donalds] * Wrote it. \**************************************************************************/
class RGNMEMOBJ : public RGNOBJ /* rmo */ { public: RGNMEMOBJ(); RGNMEMOBJ(ULONGSIZE_T); RGNMEMOBJ(BOOL); RGNMEMOBJ(EPATHOBJ& po, FLONG fl = ALTERNATE, RECTL *pb = NULL ) {vCreate(po,fl,pb);}
VOID vInitialize(ULONGSIZE_T);
~RGNMEMOBJ() {}
VOID vCreate(EPATHOBJ& epo, FLONG fl, RECTL *pBound = NULL);
VOID vInit(ULONGSIZE_T size) { vSet(); prgn->sizeObj = size; prgn->cRefs = 0; prgn->iUnique = 0; }
LONG iReduce(RGNOBJ& roSrc); // only because bBuster is so bad
BOOL bMergeScanline(STACKOBJ& sto);
private:
BOOL bFastFillWrapper(EPATHOBJ&); BOOL bFastFill(EPATHOBJ&,LONG,POINTFIX*);
BOOL bAddScans(LONG, PEDGE, FLONG); BOOL bAddNullScan(LONG, LONG); };
/*********************************Class************************************\
* * Public Interface: * * History: * 22-Oct-1993 -by- Eric Kutter [erick] * Wrote it. \**************************************************************************/
class RGNMEMOBJTMP : public RGNMEMOBJ /* rmo */ { public: RGNMEMOBJTMP() : RGNMEMOBJ() {} RGNMEMOBJTMP(ULONGSIZE_T s) : RGNMEMOBJ(s) {} RGNMEMOBJTMP(BOOL b) : RGNMEMOBJ(b) {}
RGNMEMOBJTMP(EPATHOBJ& po, FLONG fl = ALTERNATE, RECTL *pb = NULL) : RGNMEMOBJ(po,fl,pb) {}
~RGNMEMOBJTMP() { RGNLOG rl(prgn,"RGNMEMOBJTMP::~RGNMEMOBJTMP");
bDeleteRGNOBJ(); } };
int GreExtSelectClipRgnLocked( XDCOBJ &dco, PRECTL prcl, int iMode);
extern FCHAR gafjRgnOp[]; // Table of op-codes for bMerge
#endif // #ifndef _RGNOBJ_HXX
|