2000-03-17 21:44:02 +00:00
|
|
|
/*
|
2003-05-18 17:16:18 +00:00
|
|
|
* ReactOS W32 Subsystem
|
|
|
|
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
*/
|
2003-07-11 15:59:37 +00:00
|
|
|
/* $Id: clip.c,v 1.13 2003/07/11 15:59:37 royce Exp $
|
2003-05-18 17:16:18 +00:00
|
|
|
*
|
2000-03-17 21:44:02 +00:00
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS kernel
|
|
|
|
* PURPOSE: GDI Clipping Functions
|
|
|
|
* FILE: subsys/win32k/eng/clip.c
|
|
|
|
* PROGRAMER: Jason Filby
|
|
|
|
* REVISION HISTORY:
|
|
|
|
* 21/8/1999: Created
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <ddk/winddi.h>
|
|
|
|
#include <ddk/ntddk.h>
|
|
|
|
#include "objects.h"
|
|
|
|
#include "clip.h"
|
2002-01-13 22:52:08 +00:00
|
|
|
#include <include/object.h>
|
2000-03-17 21:44:02 +00:00
|
|
|
|
2003-02-15 19:16:34 +00:00
|
|
|
#define NDEBUG
|
2002-08-18 07:02:57 +00:00
|
|
|
#include <win32k/debug1.h>
|
|
|
|
|
2003-05-18 17:16:18 +00:00
|
|
|
VOID STDCALL IntEngDeleteClipRegion(CLIPOBJ *ClipObj)
|
2000-03-17 21:44:02 +00:00
|
|
|
{
|
2001-03-31 15:35:08 +00:00
|
|
|
HCLIP HClip = AccessHandleFromUserObject(ClipObj);
|
|
|
|
FreeGDIHandle(HClip);
|
2000-03-17 21:44:02 +00:00
|
|
|
}
|
|
|
|
|
2003-05-18 17:16:18 +00:00
|
|
|
CLIPOBJ STDCALL * IntEngCreateClipRegion( ULONG count, PRECTL pRect, RECTL rcBounds )
|
2002-08-18 07:02:57 +00:00
|
|
|
{
|
|
|
|
HCLIP hClip;
|
|
|
|
CLIPGDI* clipInt;
|
|
|
|
CLIPOBJ* clipUser;
|
|
|
|
DPRINT("IntEngCreateClipRegion count: %d\n", count);
|
|
|
|
if( count > 1 ){
|
|
|
|
hClip = (HCLIP)CreateGDIHandle( sizeof( CLIPGDI ) + count*sizeof(RECTL),
|
|
|
|
sizeof( CLIPOBJ ) );
|
|
|
|
|
|
|
|
if( hClip ){
|
|
|
|
clipInt = (CLIPGDI*)AccessInternalObject( hClip );
|
|
|
|
RtlCopyMemory( clipInt->EnumRects.arcl, pRect, count*sizeof(RECTL));
|
|
|
|
clipInt->EnumRects.c=count;
|
|
|
|
|
|
|
|
clipUser = (CLIPOBJ*)AccessUserObject( hClip );
|
|
|
|
ASSERT( clipUser );
|
|
|
|
|
|
|
|
clipUser->iDComplexity = DC_COMPLEX;
|
|
|
|
clipUser->iFComplexity = (count <= 4)? FC_RECT4: FC_COMPLEX;
|
|
|
|
clipUser->iMode = TC_RECTANGLES;
|
|
|
|
RtlCopyMemory( &(clipUser->rclBounds), &rcBounds, sizeof( RECTL ) );
|
|
|
|
|
|
|
|
return clipUser;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
hClip = (HCLIP)CreateGDIHandle( sizeof( CLIPGDI ),
|
|
|
|
sizeof( CLIPOBJ ) );
|
|
|
|
if( hClip ){
|
|
|
|
clipInt = (CLIPGDI*)AccessInternalObject( hClip );
|
|
|
|
RtlCopyMemory( clipInt->EnumRects.arcl, &rcBounds, sizeof( RECTL ));
|
|
|
|
clipInt->EnumRects.c = 1;
|
|
|
|
|
|
|
|
clipUser = (CLIPOBJ*)AccessUserObject( hClip );
|
|
|
|
ASSERT( clipUser );
|
|
|
|
|
|
|
|
clipUser->iDComplexity = ((rcBounds.top==rcBounds.bottom)&&(rcBounds.left==rcBounds.right))?
|
|
|
|
DC_TRIVIAL:DC_RECT;
|
|
|
|
clipUser->iFComplexity = FC_RECT;
|
|
|
|
clipUser->iMode = TC_RECTANGLES;
|
|
|
|
DPRINT("IntEngCreateClipRegion: iDComplexity: %d\n", clipUser->iDComplexity);
|
|
|
|
RtlCopyMemory( &(clipUser->rclBounds), &rcBounds, sizeof( RECTL ) );
|
|
|
|
return clipUser;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
2000-03-17 21:44:02 +00:00
|
|
|
|
2003-07-11 15:59:37 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2002-06-15 21:44:08 +00:00
|
|
|
CLIPOBJ * STDCALL
|
|
|
|
EngCreateClip(VOID)
|
2000-03-17 21:44:02 +00:00
|
|
|
{
|
2001-06-25 09:30:45 +00:00
|
|
|
return EngAllocMem(FL_ZERO_MEMORY, sizeof(CLIPOBJ), 0);
|
2000-03-17 21:44:02 +00:00
|
|
|
}
|
|
|
|
|
2003-07-11 15:59:37 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2002-06-15 21:44:08 +00:00
|
|
|
VOID STDCALL
|
|
|
|
EngDeleteClip(CLIPOBJ *ClipRegion)
|
2000-03-17 21:44:02 +00:00
|
|
|
{
|
2001-03-31 15:35:08 +00:00
|
|
|
EngFreeMem(ClipRegion);
|
2000-03-17 21:44:02 +00:00
|
|
|
}
|
|
|
|
|
2003-07-11 15:59:37 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
2002-06-15 21:44:08 +00:00
|
|
|
ULONG STDCALL
|
2002-09-08 10:23:54 +00:00
|
|
|
CLIPOBJ_cEnumStart(IN PCLIPOBJ ClipObj,
|
2002-06-15 21:44:08 +00:00
|
|
|
IN BOOL ShouldDoAll,
|
|
|
|
IN ULONG ClipType,
|
|
|
|
IN ULONG BuildOrder,
|
|
|
|
IN ULONG MaxRects)
|
2000-03-17 21:44:02 +00:00
|
|
|
{
|
2001-06-25 09:30:45 +00:00
|
|
|
CLIPGDI *ClipGDI = (CLIPGDI*)AccessInternalObjectFromUserObject(ClipObj);
|
2000-03-17 21:44:02 +00:00
|
|
|
|
2001-03-31 15:35:08 +00:00
|
|
|
ClipGDI->EnumPos = 0;
|
2002-08-18 07:02:57 +00:00
|
|
|
ClipGDI->EnumMax = (MaxRects>0)? MaxRects : ClipGDI->EnumRects.c;
|
|
|
|
|
|
|
|
if( !((BuildOrder == CD_ANY) || (BuildOrder == CD_LEFTDOWN ))){
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
}
|
|
|
|
ClipGDI->EnumOrder = BuildOrder;
|
2000-03-17 21:44:02 +00:00
|
|
|
|
2001-03-31 15:35:08 +00:00
|
|
|
// Return the number of rectangles enumerated
|
2002-08-18 07:02:57 +00:00
|
|
|
if( (MaxRects > 0) && (ClipGDI->EnumRects.c>MaxRects) )
|
2001-03-31 15:35:08 +00:00
|
|
|
{
|
2002-08-18 07:02:57 +00:00
|
|
|
return 0xFFFFFFFF;
|
2001-03-31 15:35:08 +00:00
|
|
|
}
|
2000-03-17 21:44:02 +00:00
|
|
|
|
2001-03-31 15:35:08 +00:00
|
|
|
return ClipGDI->EnumRects.c;
|
2000-03-17 21:44:02 +00:00
|
|
|
}
|
|
|
|
|
2003-07-11 15:59:37 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2002-06-15 21:44:08 +00:00
|
|
|
BOOL STDCALL
|
2002-09-08 10:23:54 +00:00
|
|
|
CLIPOBJ_bEnum(IN PCLIPOBJ ClipObj,
|
2002-06-15 21:44:08 +00:00
|
|
|
IN ULONG ObjSize,
|
|
|
|
OUT ULONG *EnumRects)
|
2000-03-17 21:44:02 +00:00
|
|
|
{
|
2001-06-25 09:30:45 +00:00
|
|
|
CLIPGDI *ClipGDI = (CLIPGDI*)AccessInternalObjectFromUserObject(ClipObj);
|
2002-08-18 07:02:57 +00:00
|
|
|
ULONG nCopy;
|
|
|
|
PENUMRECTS pERects = (PENUMRECTS)EnumRects;
|
2000-03-17 21:44:02 +00:00
|
|
|
|
2002-08-18 07:02:57 +00:00
|
|
|
//calculate how many rectangles we should copy
|
2003-02-15 19:16:34 +00:00
|
|
|
nCopy = MIN( ClipGDI->EnumMax - ClipGDI->EnumPos,
|
|
|
|
MIN( ClipGDI->EnumRects.c - ClipGDI->EnumPos,
|
|
|
|
(ObjSize - sizeof(ULONG)) / sizeof(RECTL)));
|
2002-08-18 07:02:57 +00:00
|
|
|
|
2003-02-15 19:16:34 +00:00
|
|
|
RtlCopyMemory( pERects->arcl, ClipGDI->EnumRects.arcl + ClipGDI->EnumPos,
|
|
|
|
nCopy * sizeof(RECTL) );
|
2002-08-18 07:02:57 +00:00
|
|
|
pERects->c = nCopy;
|
|
|
|
|
|
|
|
ClipGDI->EnumPos+=nCopy;
|
2000-03-17 21:44:02 +00:00
|
|
|
|
2003-02-15 19:16:34 +00:00
|
|
|
return ClipGDI->EnumPos < ClipGDI->EnumRects.c;
|
2000-03-17 21:44:02 +00:00
|
|
|
}
|
2003-05-18 17:16:18 +00:00
|
|
|
/* EOF */
|