Techwiki:Win32k/XCLIPOBJ
Windows XP version of REGION
typedef struct
{
LONG scnPntTop; // top line (inclusive)
LONG scnPntBottom; // bottom line (exclusive)
LONG scnPntX[2]; // v-length array of x pairs
} SCAN2;
// REGION Object minimum size of 0x70, 3 cScan
typedef struct
{
LONG scnPntCnt; // 038 count of x coordinates
SCAN2 scnPnt[3]; // 03C
LONG scnPntCntToo; // 108 same as scnPntCnt;
} SCAN1;
// REGION Object minimum size of 0x4C, 1 cScan
typedef struct
{
LONG scnPntCnt; // 38 count of x coordinates
LONG scnPntTop; // 3c top line (inclusive)
LONG scnPntBottom; // 40 bottom line (exclusive)
LONG scnPntX[2]; // 44 48 v-length array of x pairs
} SCAN;
typedef struct _RGN
{
BASEOBJECT BaseObject;
unsigned sizeObj;
ULONG iUniq; // from Clip object
DWORD nRefCount // inc/dec Ref count if 0 deleteRGNOBJ
SCAN * pscnTail;
unsigned sizeRgn;
unsigned cScans;
RECTL rcl;
SCAN scnHead[1]; // 038 + 1 = 0x4C
SCAN1 scnHead[1]; // 038 + 1 = 0x70
} RGN, *PRGN;
sizeRgn reports 2 minimum sizes, 0x4C and 0x70.
Windows XP version of CLIPOBJ or WNDOBJ
typedef struct _CLIPOBJ
{
ULONG iUniq;
RECTL rclBounds;
BYTE iDComplexity;
BYTE iFComplexity;
BYTE iMode;
BYTE fjOptions;
} CLIPOBJ;
typedef struct _WNDOBJ
{
CLIPOBJ coClient;
PVOID pvConsumer;
RECTL rclClient;
SURFOBJ *psoOwner;
} WNDOBJ, *PWNDOBJ;
EXtended CLip and Window Region Object Multipurpose E/X/CLIPOBJ and E/WNDOBJ structure
typedef struct _XCLIPOBJ
{
WNDOBJ exClipWnd; // 000
PVOID pClipRgn; // 030
RECTL rclClipRgn; // 034
PVOID pscanClipRgn; // 044
DWORD cScans; // 048
DWORD Unknown1; // 04C
ULONG ulBSize; // 050
LONG lscnSize; // 054
ULONG ulObjSize; // 058
ULONG iDirection; // 05C
ULONG ClipType; // 060
DWORD Unknown2; // 064 init z
LONG lUpDown; // 068
DWORD Unknown3; // 06C init z
BOOL ShouldDoAll; // 070
DWORD nComplexity; // 074
PVOID pUnknown; // 078
} XCLIPOBJ, *PXCLIPOBJ; // Size is 0x7C or 124
- exClipWnd
- pClipRgn
prgnRao or (prgnVis if prgnRao == 0)
- rclClipRgn
if ShouldDoAll is TRUE: Copy of clip prgn.rcl if ShouldDoAll is FALSE: from exClipWnd.co.rclBounds.
- pscanClipRgn
based on iDirection, ulUpDown -1 *Tail up, 1 *Head down
- cScans
from clip rgn cScans.
- ulBSize
recomputed buffer size.
- lscnSize
Add (+-)size for pointer based on size of SCAN & iDirection.
- ulObjSize
Specifies the size, in bytes, of the enum output buffer.
- iDirection
CD_ANY CD_LEFTDOWN CD_LEFTUP CD_LEFTWARDS CD_RIGHTDOWN CD_RIGHTUP CD_UPWARDS
- ClipType
always CT_RECTANGLES aka 0
- lUpDown
-1 up, 1 down, based on "iDirection" of reading SCAN list.
- ShouldDoAll
Specifies whether the entire region should be enumerated.
- nComplexity
count/mode based on # of rect in regions SCAN.
- pUnknown
pointer to a large DDA based drawing structure. See Note.
Signed lUpDown is not used, but is a notification which direction the scan list is read.
Note:
On a raster-based device, such as a screen display or a printer, the line drawing uses a class of algorithms called DDA (digital differential analyzer) to select the pixels to paint to represent a line. The Bresenham algorithm is a classical incremental DDA algorithm. The Windows NT/2000 graphics engine uses 28.4 fixed-point coordinate space on physical device surfaces. Lines are drawn following the so-called GIQ (Grid Intersection Quantization) diamond convention, in which each pixel is thought of as having a 1-by-1 pixel size diamond shape around it. A pixel is painted if its diamond shape touches a line segment. From section 8.4 of Windows Graphics Programming Win32 GDI and DirectDraw.